<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb"><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://www.adamsdesk.com/feed/blog.xml" rel="self" type="application/atom+xml" /><link href="https://www.adamsdesk.com/" rel="alternate" type="text/html" hreflang="en-gb" /><updated>2024-02-22T23:05:43-06:00</updated><id>https://www.adamsdesk.com/feed/blog.xml</id><title type="html">Adamsdesk</title><subtitle>A hub for technology users to navigate the misleading, outdated, and inaccurate product information online for what is honest, clear, and up-to-date.</subtitle><author><name>Adam Douglas</name></author><entry><title type="html">My Journey of Shaving</title><link href="https://www.adamsdesk.com/posts/shaving-journey/" rel="alternate" type="text/html" title="My Journey of Shaving" /><published>2024-02-22T00:00:00-06:00</published><updated>2024-02-22T23:05:22-06:00</updated><id>https://www.adamsdesk.com/posts/shaving-journey</id><content type="html" xml:base="https://www.adamsdesk.com/posts/shaving-journey/"><![CDATA[<p>I started to shave my face around the age of 11 and was done about every two weeks or so. My experience of shaving has
not been very enjoyable let alone desirable, but I did what I knew at the time to get the job done. As the years have
past I’ve learned a lot more about my skin, shaving and how to achieve an enjoyable shave that makes you feel fresh and
clean. This is my shaving journey.</p>

<h2 id="what-is-a-cartridge-razor">What is a Cartridge Razor?</h2>

<p>An implement to shave or cut hair from skin designed with razor blade(s) surrounded by a casing that has a single edge
exposed per blade. The design is made for simplicity, ease of use and safety.</p>

<p>Variations of this shaving implement is sold with one or more razor blades in a detachable cartridge razor from the
razor handle or as a disposable.</p>

<figure class="figure text-center mx-auto d-block">
    <img src="/assets/img/posts/cartridge-razor-illustration.avif" width="365" height="280" class="figure-img img-fluid rounded mx-auto d-block" alt="Three views of a cartridge razor, razor cartridge detached shown from top/bottom view and then with the razor cartridge attached to the handle." loading="lazy" />
    <figcaption class="figure-caption text-center">Illustration a Razor Cartridge Attached/Detached</figcaption>
</figure>

<h2 id="what-is-a-safety-razor">What is a Safety Razor?</h2>

<p>A razor designed to protect the skin while shaving or cutting hair with only the very edge of the razor blade being
exposed.</p>

<p>Safety razors can come in three main design styles, two-piece, three-piece or butterfly. The razor blade itself can be
used in two forms, single edge (SE) or double edge (DE) and comes in a variety of different brands each having their
own benefits. This means shaving can be done using one or two sides of the razor blade. As well there are different
types of razor combs and aggressiveness.</p>

<figure class="figure text-center mx-auto d-block">
    <img src="/assets/img/posts/safety-razor-3-piece-illustration.avif" width="540" height="280" class="figure-img img-fluid mx-auto d-block" alt="A three piece safety razor laying on its side colored in a two tone blues with the bottom half shadowed." loading="lazy" />
    <figcaption class="figure-caption text-center">Illustration of a Three Piece Safety Razor</figcaption>
</figure>

<h2 id="the-beginning">The Beginning</h2>

<p>In the beginning to the best of my memory, I started using a cartridge razor called Gillette Sensor with two razor
blades. After a year or so I ended up being gifted an electric razor, Philips Philishave 555. For some time I did use
the electric razor, but I eventually switched back to the Gillette Sensor. The reason was due to the electric razor
would produce worse razor burn and bumps. This issue became even worse when all my whiskers grew in. I don’t ever recall
being taught very much about the process or even how to resolve common issues. What I do remember is receiving
statements that just acknowledge that the problem is common amongst the family. I continued to use Gillette Sensor into
my early adult years and then at some point I moved on to using another cartridge razor called Gillette Sensor Excel. At
this point I knew my skin is quite sensitive and even more problematic under my chin.</p>

<figure class="figure text-center mx-auto d-block">
    <img src="/assets/img/posts/electric-cartridge-razor-lineup.avif" width="720" height="405" class="figure-img img-fluid mx-auto d-block" alt="My electric and cartridge razors lined up side by side on display against a brown wood grain background." loading="lazy" />
    <figcaption class="figure-caption text-center">A Lineup of My Electric &amp; Cartridge Razors<br />From Left to Right: Philips Philishave 555, Braun Series 1 190,<br />Philips Series 7000, Gillette Mach3, Gillette Sensor Excel</figcaption>
</figure>

<p>Around my mid 20s I moved on to yet another cartridge razor, Gillette Mach3 with three razor blades. As usual the
marketing was selling it as an even smoother shave. No matter the amount water and shaving cream used I
just couldn’t get a smooth shave. At times, I admit I could avoid the razor burn and bumps, but not entirely. Thinking
about this now I’m not sure why I never looked into this more and asked more people to figure it all out. In either case
I just kept on using Gillette Mach3 for many years to come as it was discontinued, but one could get the cartridge
razors for a reasonable price. I would guess around my late 20s to early 30s I was gifted an electric razor, Braun
Series 1 190. I would have to say this electric razor is amazing in getting a closer shave without missing a whisker,
but the issues still remained. Let me be clear my issues were not enjoyable, but they were never severe like some
stories I’ve been told.</p>

<p>The last item I purchased was a Philips Series 7000 about seven years ago before I decided for a major change. Now
you’re maybe thinking at this stage why on earth did I do that? Well this implement is a shaving trimmer. You see as
I’ve aged I’ve noticed more and more hair growing in places I wish I never had. So I use this trimmer to keep the nose
and ear hair under control. Though I completely admit when I’m being lazy I use it to trim down the beard to stubble.</p>

<figure class="figure text-center mx-auto d-block">
    <img src="/assets/img/posts/safety-razor-shavette-lineup.avif" width="720" height="405" class="figure-img img-fluid mx-auto d-block" alt="My safety razors and shavette lined up side by side on display against a brown wood grain background." loading="lazy" />
    <figcaption class="figure-caption text-center">A Lineup of My Safety Razors and Shavette<br />From Left to Right: Rockwell R1, Rockwell 6C, Gillette Tech,<br />Gillette AutoStrop Valet VC4, Pascalina Shavette</figcaption>
</figure>

<p>After all these many years what amazes me is I still own each and ever shaving implement except the Gillette Sensor.
Several months ago I started to think why do I have all these shaving implements when I don’t use the majority of them.
I set aside a few of them to be disposed of, but now I’m starting to think I shouldn’t do this as some have shockingly
become a collectable.</p>

<h2 id="acquiring-the-safety-razor">Acquiring The Safety Razor</h2>

<p>Around mid 2018 my brother was talking to me about safety razors as he was looking into them due his even worse
experience of shaving. The talks about using a safety razor really got me curious, so I started looking into them a bit
too. We even watch videos of people shaving to try to figure out where to start with brands and what people used. We
both spent more time researching than I believe either of us care to admit to. I did find it quite difficult to figure
out and there was not a lot of information online for beginners. Since then popularity has increased again making more
information available. At one point we drove around the city going to ever place we could find seeing what locally was
available, but unfortunately most places don’t have a good selection or anything at all. However, I was able to locally
purchase an alum block and collection bank for used razor blades. After building up some understanding we made the
decision to purchase our safety razor and the other accessories online through Fendrihan Canada in February 2019. Below
lists each item I purchased along with some details.</p>

<table class="table table-striped table-hover mb-4">
    <caption class="text-center">Initial Shaving Related Purchases</caption>
    <thead>
        <tr>
            <th scope="col">Name</th>
            <th scope="col">Description</th>
            <th scope="col">Cost</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>60 Piece Razor Blade Sampler</td>
            <td>Brands included, Derby, Astra Platinum, Astra Stainless, Feather, Wilkinson, Black Feather</td>
            <td>$24.00</td>
        </tr>
        <tr>
            <td>D.R. Harris Arlington Shaving Soap</td>
            <td>Mahogany color wood bowl with soap.</td>
            <td>$58.00</td>
        </tr>
        <tr>
            <td>Fendrihan Pure Badger Shaving Brush</td>
            <td>Black handle.</td>
            <td>$25.50</td>
        </tr>
        <tr>
            <td>Fendrihan Safety Razor &amp; Shaving Brush Stand</td>
            <td>Black anodized finish.</td>
            <td>$26.50</td>
        </tr>
        <tr>
            <td>Laboratoires Osma Alum Block</td>
            <td>Soothes shaving irritation.</td>
            <td>$10.00</td>
        </tr>
        <tr>
            <td>Rockwell R1 Safety Razor</td>
            <td>Butterfly style double-edge razor.</td>
            <td>~$24.00</td>
        </tr>
        <tr>
            <td>Pure Badger Collection Blade Bank</td>
            <td>Save storage of used razor blades. Black in color.</td>
            <td>$5.00</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th scope="row" colspan="2" class="text-end">
                Total
            </th>
            <th scope="col">
                $184.50
            </th>
        </tr>
        <tr>
            <td scope="row" colspan="3" class="text-center">
                Cost listed in Canadian funds without taxes
            </td>
        </tr>
    </tfoot>
</table>

<p>I’m sure a lot of people would be shocked to see the cost compared to a cartridge razor, but don’t be fooled by the
initial investment. The items required to purchase can be done cheaper if desired, but I’m doing this a long term
investment. In the end you only need a safety razor, razor blades, shaving soap and brush to get started. In the long
run it is far cheaper and does a better shave than any cartridge razor could ever dream of achieving.</p>

<h2 id="the-first-shave">The First Shave</h2>

<p>My first shave using a safety razor was not ideal nor a few afterwards that lead to one nasty cut and then minor cuts.
However, this was due to being a novice and not taking more care of the angle of the razor on my skin. I later learned
it was also due to the safety razor I choose to purchase, the Rockwell R1. To me, it is not a novices safety razor as it
is more aggressive than expected, too lightweight and for whatever reason I found as I shaved the knob to tight the
butterfly razor closed fixing the razor blade in place would loosen over time when shaving. I never did figure this
issue out, I just simply moved on to using another safety razor.</p>

<h2 id="does-it-become-an-addiction">Does it Become an Addiction?</h2>

<p>As the years have pasted by I have picked up more shaving products. Some to replenish my supply, some to solve issues
and others to feed my curiosity of the shaving craft. I would like to say it is not an addiction, but I have to admit
when I see an old safety razor at garage sale or flea market it’s hard to not want purchase it and learn more about the
past. I suppose one could say this is in a sense become not just an act of caring for myself, but a hobby. So is it an
addiction? At this stage I don’t think so though I can see how it can be a balancing act. Below is what I have further
acquired since the initial investment in early 2019.</p>

<table class="table table-striped table-hover mb-4">
    <caption class="text-center">Recent Shaving Related Purchases</caption>
    <thead>
        <tr>
            <th scope="col">Name</th>
            <th scope="col">Description</th>
            <th scope="col">Cost</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Feather Double Edge Blades</td>
            <td>50 pack of razor blades. Purchased in 2020.</td>
            <td>$26.70</td>
        </tr>
        <tr>
            <td>D.R. Harris &amp; Co Almond Shaving Soap</td>
            <td>Triple-Milled refill, 100g. Purchased in 2021.</td>
            <td>$35.46</td>
        </tr>
        <tr>
            <td>Dr. Bronner's Lemongrass Lime Organic Shaving Soap</td>
            <td>207 ml (7.28 oz)</td>
            <td>~$12.00</td>
        </tr>
        <tr>
            <td>Gillette Tech Safety Razor</td>
            <td>Double edge, nickle plated (late 1950s)</td>
            <td>~$5.00</td>
        </tr>
        <tr>
            <td>Gillette AutoStrop Valet VC4 Safety Razor</td>
            <td>Single edge, edition from Montreal, Canada (1940-1946?)</td>
            <td>~$10.00</td>
        </tr>
        <tr>
            <td>Rockwell 6C Safety Razor</td>
            <td>Double edge, gunmetal chrome plated with 6 aggressive settings. Received as a gift.</td>
            <td>$0.00</td>
        </tr>
        <tr>
            <td>Pascalina Shavette Straight Razor</td>
            <td>Stainless steel. Received as a gift.</td>
            <td>$0.00</td>
        </tr>
        <tr>
            <td>Thayers Facial Toner</td>
            <td>Original with witch hazel and aloe vera, 255 ml (12 oz)</td>
            <td>$12.35</td>
        </tr>
        <tr>
            <td>Uncle Mike's Shave Soap</td>
            <td>50g</td>
            <td>~$7.00</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th scope="row" colspan="2" class="text-end">
                Total
            </th>
            <th scope="col">
                $108.51
            </th>
        </tr>
        <tr>
            <td scope="row" colspan="3" class="text-center">
                Cost listed in Canadian funds without taxes
            </td>
        </tr>
    </tfoot>
</table>

<h2 id="conclusion">Conclusion</h2>

<p>Gathering the information for this post made me realize how much I own as well as how I truly enjoy and appreciate
shaving now since switching to using a safety razor. I’ve settled into shaving with a safety razor using Rockwell Razors
6C, Feather double edge razor blades, D.R. Harris &amp; Co shaving bowl and soap, Thayers facial toner for skin care,
Laboratoires Osma alum block for cuts, and a Fendrihan pure badger shaving brush. With the gained experience and routine
I’ve been able to shave as fast as fifteen minutes now instead of thirty minutes. Using a safety razor is without a doubt
a skill that is learned over time by experience no matter how much you gain about the process previously. If you’re
willing to do the initial investment into your own self-care it will pay off in the end, and you won’t regret it. We all
deserve self-care, so allow your self to enjoy the process.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[A journey of shaving with a rough uncomfortable experience that ends up with a fresh clean smooth shave using modern to old fashioned methods.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/shaving-journey.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/shaving-journey.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Master The Essential GNU/Linux Keyboard Shortcuts</title><link href="https://www.adamsdesk.com/posts/gnu-linux-keyboard-shortcuts/" rel="alternate" type="text/html" title="Master The Essential GNU/Linux Keyboard Shortcuts" /><published>2024-02-16T00:00:00-06:00</published><updated>2024-02-19T11:46:47-06:00</updated><id>https://www.adamsdesk.com/posts/gnu-linux-keyboard-shortcuts</id><content type="html" xml:base="https://www.adamsdesk.com/posts/gnu-linux-keyboard-shortcuts/"><![CDATA[<p>The GNU/Linux is without a doubt one of the most used, flexible and robust operating system in the world today. To
unlock the power, and its full potential lies in mastering the keyboard shortcuts. This guide is designed to provide a
good starting point in learning the most essential keyboard shortcuts available that will not just help in using a
GNU/Linux graphical environment, but also in the command line. Once this has been achieved the benefit is in saving
time and enhancing one’s own efficiency.</p>

<h2 id="what-is-a-keyboard-shortcut">What is a Keyboard Shortcut?</h2>

<p>In computing a keyboard shortcut or also known as a hotkey or a key binding is done by pressing one or more keys to
preform a specific action. The actions can be built into a given application, operating system or added in by using
another application or scripting language.</p>

<p>For a complete explanation about keyboard shortcuts please refer to,
<a href="/posts/keyboard-shortcuts-explained/">What are Keyboard Shortcuts?</a></p>

<h2 id="general-application-shortcuts">General Application Shortcuts</h2>

<p>Actions preformed in a graphical user interface (GUI) by a keyboard shortcut maybe common between each application, but
the keyboard shortcut used can vary from application to application. However, there are still some that are commonly
used that we can look at to help have a general understanding of where to begin and what one can experiment with to
determine how to achieve a desired action. With this said it is always recommended referring to the application itself
or the documentation to determine the correct keyboard shortcut for the desired action.</p>

<dl>
  <dt>Close Window</dt>
  <dd>Close a window within an application, also known as a child window.</dd>
  <dd>Shortcuts: <kbd>Ctrl</kbd> + <kbd>W</kbd> or <kbd>Ctrl</kbd> + <kbd>F4</kbd></dd>
  <dt>Close/Quit Application</dt>
  <dd>Quit or end an application’s session, also known as a parent window.</dd>
  <dd>Shortcuts: <kbd>Ctrl</kbd> + <kbd>Q</kbd>, <kbd>Alt</kbd> + <kbd>F4</kbd></dd>
  <dt>Copy</dt>
  <dd>Duplicate text or an object (e.g. image file) into the clipboard with the intention to place (paste) at another location.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>C</kbd></dd>
  <dt>Cut</dt>
  <dd>Remove text or an object (e.g. image file) into the clipboard with the intention to place (paste) at a new location.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>X</kbd></dd>
  <dt>Find</dt>
  <dd>Locate text within the contents of an application window or document.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>F</kbd></dd>
  <dt>Find &amp; Replace</dt>
  <dd>Locate text within the contents of an application window or document and then replace with predefined text.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>H</kbd></dd>
  <dt>Full Screen</dt>
  <dd>Maximize the application window size to use the entire screen.</dd>
  <dd>Shortcut: <kbd>F11</kbd></dd>
  <dt>Go To</dt>
  <dd>Move the cursor to a specific line number.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>G</kbd></dd>
  <dt>New Tab</dt>
  <dd>Create or open a new tab within an application’s parent window.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>T</kbd></dd>
  <dt>New Window or Document</dt>
  <dd>Create a new parent window or child window (document) within an application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>N</kbd></dd>
  <dt>Open File</dt>
  <dd>Open a document or file within the application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>O</kbd></dd>
  <dt>Paste</dt>
  <dd>Output what has been cut or copied into the clipboard to be placed at another location. This usually provides the ability to paste multiple time as required.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>V</kbd></dd>
  <dt>Print</dt>
  <dd>Open the print dialog to set printing properties and to send a document to be printed.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>P</kbd></dd>
  <dt>Redo</dt>
  <dd>Reverse an undo action that has been completed previously.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Y</kbd></dd>
  <dt>Select All</dt>
  <dd>Select all text or objects within an active application window.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>A</kbd></dd>
  <dt>Undo</dt>
  <dd>Reverse the last action that was completed previously.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Z</kbd></dd>
  <dt>Zoom In</dt>
  <dd>Increase focus inward to make text or objects appear larger.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>+</kbd></dd>
  <dt>Zoom Out</dt>
  <dd>Decrease focus outward to make text or objects appear smaller.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>-</kbd></dd>
</dl>

<h2 id="desktop-environment-shortcuts">Desktop Environment Shortcuts</h2>

<p>There are quite a few GNU/Linux desktop environments to choose from that are made up of a group of components that
produce the graphical user interface (GUI). There is even the option to change out components for another. This allows
for a user to have the perfect tailored environment. With this custom ability comes with varying keyboard shortcuts from
each another, therefore instead of an exhausted list the most popular based environments are shown below.</p>

<h3 id="gnome">GNOME</h3>

<dl>
  <dt>Lock Screen</dt>
  <dd>Lock the graphical user interface.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>L</kbd></dd>
  <dt>Logout / Restart</dt>
  <dd>Show the power off / restart dialog.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Del</kbd> (delete)</dd>
  <dt>Maximize Window</dt>
  <dd>Increase the active application window size to maximum.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↑</kbd></dd>
  <dt>Move to Workspace Above</dt>
  <dd>Switch to the workspace above.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Page Up</kbd></dd>
  <dt>Move to Workspace Down</dt>
  <dd>Switch to the workspace down.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Page Down</kbd></dd>
  <dt>Move Window One Monitor Down</dt>
  <dd>Move the active window down one monitor.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↓</kbd></dd>
  <dt>Move Window One Monitor Up</dt>
  <dd>Move the active window up one monitor.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↑</kbd></dd>
  <dt>Move Window One Monitor Left</dt>
  <dd>Move the active window left one monitor.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>←</kbd></dd>
  <dt>Move Window One Monitor Right</dt>
  <dd>Move the active window right one monitor.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>→</kbd></dd>
  <dt>Restore Window</dt>
  <dd>Restore the active application window size.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↓</kbd></dd>
  <dt>Run Command</dt>
  <dd>Show the run command prompt.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>F2</kbd></dd>
  <dt>Show Activities Overview</dt>
  <dd>Display the activities overview of open applications, search and Dash.</dd>
  <dd>Shortcut: <kbd>Super</kbd></dd>
  <dt>Switch Applications</dt>
  <dd>Switch to an open application.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Tab</kbd></dd>
  <dt>Screenshot Interactively</dt>
  <dd>Capture the desktop to an image interactively.</dd>
  <dd>Shortcut: <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot</dt>
  <dd>Capture the entire desktop to an image.</dd>
  <dd>Shortcut: <kbd>Shift</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot Active Window</dt>
  <dd>Capture the active window to an image interactively.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Tile Window Left</dt>
  <dd>Move the active window to the left on current the screen and then select desired application to fill the rest.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>←</kbd></dd>
  <dt>Title Window Right</dt>
  <dd>Move the active window to the right on current the screen and then select desired application to fill the rest.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>→</kbd></dd>
</dl>

<h3 id="kde-plasma">KDE Plasma</h3>

<dl>
  <dt>Emoji Selector</dt>
  <dd>Open the Emoji Selector application.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>.</kbd> (period)</dd>
  <dt>File Manager</dt>
  <dd>Open the file manager application.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>E</kbd></dd>
  <dt>KRunner</dt>
  <dd>Open the command-line launcher application.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>F2</kbd> or <kbd>Alt</kbd> + <kbd>Space bar</kbd></dd>
  <dt>Lock Screen</dt>
  <dd>Lock the graphical user interface.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>L</kbd></dd>
  <dt>Logout / Restart / Shutdown</dt>
  <dd>Show the logout / restart / shut down dialog.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Del</kbd> (delete)</dd>
  <dt>Maximize Window</dt>
  <dd>Increase the active application window size to maximum.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Page Up</kbd></dd>
  <dt>Minimize Window</dt>
  <dd>Increase the active application window size to maximum.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Page Down</kbd></dd>
  <dt>Tile Window Left</dt>
  <dd>Move and tile the active window to the left on the current screen.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>←</kbd></dd>
  <dt>Tile Window Right</dt>
  <dd>Move and tile the active window to the right on the current screen.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>→</kbd></dd>
  <dt>Tile Window Top</dt>
  <dd>Move and tile the active window to the top on the current screen.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↑</kbd></dd>
  <dt>Tile Window Bottom</dt>
  <dd>Move and tile the active window to the bottom on the current screen.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>↓</kbd></dd>
  <dt>Screenshot Interactively</dt>
  <dd>Capture the desktop to an image interactively.</dd>
  <dd>Shortcut: <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot</dt>
  <dd>Capture the entire desktop to an image.</dd>
  <dd>Shortcut: <kbd>Shift</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot Active Window</dt>
  <dd>Capture the active window to an image interactively.</dd>
  <dd>Shortcut: <kbd>Super</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Switch Applications</dt>
  <dd>Switch to an open application.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>Tab</kbd></dd>
  <dt>Terminal</dt>
  <dd>Open the terminal emulator application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd></dd>
</dl>

<h3 id="xfce">XFCE</h3>

<dl>
  <dt>Application Launcher</dt>
  <dd>Open the application launcher Whisker Menu.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>F1</kbd></dd>
  <dt>Display Settings</dt>
  <dd>Open the monitor display settings.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>P</kbd></dd>
  <dt>File Manager</dt>
  <dd>Open the file manager application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>F</kbd></dd>
  <dt>Find Application</dt>
  <dd>Locate an application with the Application Finder.</dd>
  <dd>Shortcut: <kbd>Alt</kbd> + <kbd>F2</kbd></dd>
  <dt>Lock Screen</dt>
  <dd>Lock the graphical user interface.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Del</kbd> (delete)</dd>
  <dt>Screenshot</dt>
  <dd>Capture the entire desktop screen to an image interactively.</dd>
  <dd>Shortcut: <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot Selected Area</dt>
  <dd>Capture a selected area of the screen to an image interactively.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Screenshot Active Window</dt>
  <dd>Capture the active window to an image interactively.</dd>
  <dd>Shortcut: <kbd>Shift</kbd> + <kbd>Print Screen</kbd> (Print Scrn)</dd>
  <dt>Stop Application</dt>
  <dd>Abruptly stop or kill a selected application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>X</kbd></dd>
  <dt>Task Manager</dt>
  <dd>Open the task manager.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>M</kbd></dd>
  <dt>Terminal</dt>
  <dd>Open the terminal emulator application.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd></dd>
</dl>

<h2 id="command-line-shortcuts">Command Line Shortcuts</h2>

<p>How one chooses to access the command line interface (CLI) and which command-line interpreter (shell) is used determines
what keyboard shortcuts are made available. For instances accessing via the console would be quite limiting compared to
accessing via a terminal emulator (e.g. GNOME Console/Terminal). It is best to refer to the documentation for the shell,
and terminal used in order to unleash the full potential. In either case, here are a few keyboard shortcuts one would
prefer to not live without that will work with Bash or Bash compatible shells.</p>

<dl>
  <dt>Break Command</dt>
  <dd>Abruptly stop the current foreground running process.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>C</kbd></dd>
  <dt>Clear Screen</dt>
  <dd>Clear the screen contents and redraw the current line, leaving current line at the top of screen. This shortcut when used executes the <code class="language-plaintext highlighter-rouge">clear</code> command.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>L</kbd></dd>
  <dt>Complete Typing</dt>
  <dd>Type a partial text to complete the command, directory or file name.</dd>
  <dd>Shortcut: <kbd>Tab</kbd></dd>
  <dt>Copy Text</dt>
  <dd>Duplicate text into the clipboard with the intention to place (paste) at another location (if supported).</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd></dd>
  <dt>Delete To Start</dt>
  <dd>Delete from the current cursor position to the start of the line.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>U</kbd></dd>
  <dt>Delete To End</dt>
  <dd>Delete from the current cursor position to the end of the line.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>K</kbd></dd>
  <dt>Delete Word</dt>
  <dd>Delete the word before the current cursor position.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>W</kbd></dd>
  <dt>Delete Undo</dt>
  <dd>Restore the last deleted text from <kbd>Ctrl</kbd> + <kbd>K</kbd>, <kbd>Ctrl</kbd> + <kbd>U</kbd> or <kbd>Ctrl</kbd> + <kbd>W</kbd>.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Y</kbd></dd>
  <dt>Exit</dt>
  <dd>Shortcut for the command <code class="language-plaintext highlighter-rouge">exit</code>. The command line must be empty to work.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>D</kbd></dd>
  <dt>History Search</dt>
  <dd>Search the entire command history using a provided keyword or string.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>R</kbd></dd>
  <dt>Move To Start of Line</dt>
  <dd>Move the cursor to the beginning of the current line.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>A</kbd></dd>
  <dt>Move To End of Line</dt>
  <dd>Move the cursor to the end of the current line.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>E</kbd></dd>
  <dt>Paste Text</dt>
  <dd>Output what has been copied from the clipboard at the current cursor location. This usually provides the ability to paste multiple time as required.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd></dd>
  <dt>Run In Background</dt>
  <dd>Suspend the current command/process in the background. Refer to commands <a href="https://man.archlinux.org/man/bg.1p">bg</a> and <a href="https://man.archlinux.org/man/fg.1p">fg</a>.</dd>
  <dd>Shortcut: <kbd>Ctrl</kbd> + <kbd>Z</kbd></dd>
</dl>

<p>For a more complete list of keyboard shortcuts considering reading <a href="https://kb.adamsdesk.com/command-line/bash-terminal-shortcuts/">Bash Terminal Keyboard Shortcuts</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Accelerate your productivity by mastering efficiency with these essential Linux keyboard shortcuts that every GNU/Linux user should learn.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/essential-linux-keyboard-shortcuts.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/essential-linux-keyboard-shortcuts.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Day To Show Appreciation: I Love Free Software Day</title><link href="https://www.adamsdesk.com/posts/appreciation-love-free-software-day/" rel="alternate" type="text/html" title="A Day To Show Appreciation: I Love Free Software Day" /><published>2024-02-14T00:00:00-06:00</published><updated>2024-02-14T17:49:29-06:00</updated><id>https://www.adamsdesk.com/posts/appreciation-love-free-software-day</id><content type="html" xml:base="https://www.adamsdesk.com/posts/appreciation-love-free-software-day/"><![CDATA[<p>The time has come, and I felt the need to expression my gratitude and appreciation to the wonderful software developers,
organizations and contributors at this special time of year for the “I Love Free Software Day”. These people are what
make our free open source software community possible and grant us our freedoms to run, copy, distribute, study and
modify.</p>

<h2 id="a-thankless-job">A Thankless Job</h2>

<p>To part take in the development process of a community driven project and that uses a free open source license seems to
not be overly appreciated enough in our society. Free software is what runs the majority of our lives and if it wasn’t
for the great people that make this possible our world would be a very different place. In these challenging times that
we are in and what may come we can lean on our community to support us which allows for our freedoms to be respected.
So let us all take a step back and remember to give thanks to the endless people that make our world a better place.</p>

<h2 id="being-in-the-public-eye">Being In The Public Eye</h2>

<p>Many may not be aware, but being in the public eye has its own challenges in itself let alone all the other
overwhelmingly endless tasks that need to be completed in a project. Often I read about or hear people talk about their
own experiences of being mistreated with ungrateful and disrespecting comments when all they are trying to do is help to
empower people. Nothing is perfect, but we can strive to be better people and improve our communication. Let us start to
show respect, gratitude and appreciation for all by giving thanks.</p>

<h2 id="show-appreciation">Show Appreciation</h2>

<p>There are many ways one can show your support and appreciation that is not just in financial terms. Help spread
awareness, donate required resources, educate people, and above all else why not just simply send a nice thoughtful
message showing that you appreciate the hard work.</p>

<p>I’m thankful and appreciate each individual that contributes to the projects listed below of what is on my mind at the
moment that I use on a day-to-day basis. As well take a look at the <a href="https://www.adamsdesk.com/legal/attribution/">attribution</a>
page to see what I use to make this website possible.</p>

<ul>
  <li><a href="https://www.android.com/">Android</a></li>
  <li><a href="https://antennapod.org/">AntennaPod</a></li>
  <li><a href="https://archlinux.org/">Arch Linux</a></li>
  <li><a href="https://calibre-ebook.com/">Calibre</a></li>
  <li><a href="https://curl.se/">curl</a></li>
  <li><a href="https://fishshell.com/">Fish</a></li>
  <li><a href="https://freetubeapp.io/">FreeTube</a></li>
  <li><a href="https://github.com/junegunn/fzf">fzf</a></li>
  <li><a href="https://www.gimp.org/">GIMP</a></li>
  <li><a href="https://git-scm.com/">Git</a></li>
  <li><a href="https://www.gnome.org/">GNOME</a></li>
  <li><a href="https://www.gnu.org/software/bash/">GNU Bash</a></li>
  <li><a href="https://www.gnu.org/">GNU/Linux</a></li>
  <li><a href="https://imagemagick.org/">ImageMagick</a></li>
  <li><a href="https://inkscape.org/">Inkscape</a></li>
  <li><a href="https://jekyllrb.com/">Jekyll</a></li>
  <li><a href="https://www.mozilla.org/firefox/">Mozilla Firefox</a></li>
  <li><a href="https://www.thunderbird.net/">Mozilla Thunderbird</a></li>
  <li><a href="https://mpv.io/">mpv</a></li>
  <li><a href="https://pandoc.org/">Pandoc</a></li>
  <li><a href="https://github.com/jeff-hughes/shellcaster">Shellcaster</a></li>
  <li><a href="https://tusky.app/">Tusky</a></li>
  <li><a href="https://github.com/vscodium/vscodium/">VSCodium</a></li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>In the end of it all I believe the world will be a better place if we give thanks, show how gracious we are and aim to
work better in our communication between each other. Showing love just encourages more love. To me there is nothing
wrong with that.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Time to show gratitude and appreciation on this special day to the wonderful people that make free software possible and that grants us our freedoms.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/appreciation-love-free-software-day-2024.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/appreciation-love-free-software-day-2024.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Fill Your Curiosity</title><link href="https://www.adamsdesk.com/posts/discover-fediverse-curiosity/" rel="alternate" type="text/html" title="Discover The Fediverse: Fill Your Curiosity" /><published>2024-02-09T00:00:00-06:00</published><updated>2024-02-09T17:03:00-06:00</updated><id>https://www.adamsdesk.com/posts/discover-fediverse-curiosity</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-fediverse-curiosity/"><![CDATA[<p>The diverse world of open source software allows for the ability to create pretty much anything one can dream of with
limited restrictions. However, with a mass selection of software to sift through it can be daunting to fill your
curiosity and find the ideal solution that can get you started. Hopefully you can find what you are looking for and
start your own software development in this week’s Discover The Fediverse project highlights.</p>

<p>Please remember to show your love for the projects with donations, help spread awareness and to follow these projects
on the fediverse.</p>

<h2 id="fediverse-open-source-highlights">Fediverse Open Source Highlights</h2>

<ul>
  <li>
    <p><a href="https://circuitpython.org/">CircuitPython</a> (<a href="https://fosstodon.org/@circuitpython">@circuitpython@fosstodon.org</a>)</p>

    <p>A Python programming language targeted toward students and beginners for microcontrollers.</p>
  </li>
  <li>
    <p><a href="https://pnpm.io/">pnpm</a> (<a href="https://fosstodon.org/@pnpm">@pnpm@fosstodon.org</a>)</p>

    <p>Fast, disk space efficient web development package manager.</p>
  </li>
  <li>
    <p><a href="https://mojolicious.org/">Mojolicious</a> (<a href="https://fosstodon.org/@mojolicious">@mojolicious@fosstodon.org</a>)</p>

    <p>A real-time web development framework for Perl or Node.js.</p>
  </li>
  <li>
    <p><a href="https://tuist.io/">Tuist.swift</a> (<a href="https://fosstodon.org/@tuist">@tuist@fosstodon.org</a>)</p>

    <p>A command line tool written in Swift that helps to generate, maintain and interact with Xcode projects.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Sift through the noise and fill your curiosity with free open source software in this weeks software development project highlights.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-curiosity.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-curiosity.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Don’t Be a Grumpy Kitty</title><link href="https://www.adamsdesk.com/posts/discover-fediverse-grumpy-kitty/" rel="alternate" type="text/html" title="Discover The Fediverse: Don’t Be a Grumpy Kitty" /><published>2024-02-02T00:00:00-06:00</published><updated>2024-02-02T08:52:05-06:00</updated><id>https://www.adamsdesk.com/posts/discover-fediverse-grumpy-kitty</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-fediverse-grumpy-kitty/"><![CDATA[<p>I often find we get ourselves into situations that make us grumpy or unhappy just like Grumpy Kitty, yet we don’t seem
to proactively look at what actions can be done to change our circumstances. This can then lead to becoming accepting
of what is, instead of working towards building a world that we want to be present in. Every action we take should be
one that is desired and what is best for you. This even applies to the software we choose to use each and every day of
our life. Let’s start making a change to turn that frown upside down by discovering freedom, creativity and community by
using open source software projects that respects your freedoms to run, copy, distribute, study and modify.</p>

<p>Please consider showing your support with donations, help spread awareness and to follow these projects on the
fediverse.</p>

<h2 id="fediverse-open-source-highlights">Fediverse Open Source Highlights</h2>

<ul>
  <li>
    <p><a href="https://pandas.pydata.org/">pandas</a> (<a href="https://fosstodon.org/@pandas_dev">@pandas_dev@fosstodon.org</a>)</p>

    <p>A fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python
  programming language.</p>
  </li>
  <li>
    <p><a href="https://www.medshake.app/">MedShake</a> (<a href="https://fosstodon.org/@medshake">@medshake@fosstodon.org</a>)</p>

    <p>A modern modular medical software for electronic health record (EHR) and electronic data capture (EDC).</p>
  </li>
  <li>
    <p><a href="https://ddev.com/">DDEV</a> (<a href="https://fosstodon.org/@ddev">@ddev@fosstodon.org</a>)</p>

    <p>A Docker-based web development tool for PHP and Node.js websites.</p>
  </li>
  <li>
    <p><a href="https://cratedb.com/">CrateDB</a> (<a href="https://fosstodon.org/@cratedb">@cratedb@fosstodon.org</a>)</p>

    <p>A multi-model, distributed and containerized database that runs queries in milliseconds, regardless of data complexity, volume and velocity.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Don't be a Grumpy Kitty, find open source solutions that respects your freedoms to run, copy, distribute, study and modify in this weeks highlights.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-grumpy-kitty.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-grumpy-kitty.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Full Steam Ahead!</title><link href="https://www.adamsdesk.com/posts/discover-fediverse-full-steam-ahead/" rel="alternate" type="text/html" title="Discover The Fediverse: Full Steam Ahead!" /><published>2024-01-26T00:00:00-06:00</published><updated>2024-01-26T13:48:19-06:00</updated><id>https://www.adamsdesk.com/posts/discover-fediverse-full-steam-ahead</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-fediverse-full-steam-ahead/"><![CDATA[<p>It’s full steam ahead for open source on this Follow Friday on the fediverse, so let’s help these projects along with
some boosts and follows!</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<ul>
  <li>
    <p><a href="https://www.simutrans.com/">Simutrans</a> (<a href="https://fosstodon.org/@simutrans">@simutrans@fosstodon.org</a>)</p>

    <p>A transportation simulator available on Linux, macOS, Windows and Android to achieve a successful transport company by
  building a transport network you always dreamed of.</p>
  </li>
  <li>
    <p><a href="https://cinny.in/">Cinny</a> (<a href="https://fosstodon.org/@cinnyapp">@cinnyapp@fosstodon.org</a>)</p>

    <p>Enjoy the conversation on Matrix using simple, elegant and secure interface protected by E2EE (End-to-End Encryption).</p>
  </li>
  <li>
    <p><a href="https://salixos.org/">Salix</a> (<a href="https://fosstodon.org/@salix">@salix@fosstodon.org</a>)</p>

    <p>A GNU/Linux distribution based on Slackware that is fully backwards compatible with the added benefits of being
  lightweight, simple and easy to use.</p>
  </li>
  <li>
    <p><a href="https://mailinabox.email/">Mail-in-a-Box</a> (<a href="https://fosstodon.org/@MailInABox">@MailInABox@fosstodon.org</a>)</p>

    <p>Take back control of your email by becoming your own mail service provider in an easy-to-deploy solution.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[It's full steam ahead to freedom in this weeks Follow Friday on the fediverse with open source software project highlights.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-full-steam-ahead.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-fediverse-full-steam-ahead.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Experiencing Enthusiasm From Other People</title><link href="https://www.adamsdesk.com/posts/experience-enthusiasm-other-people/" rel="alternate" type="text/html" title="Experiencing Enthusiasm From Other People" /><published>2024-01-25T00:00:00-06:00</published><updated>2024-01-26T15:59:29-06:00</updated><id>https://www.adamsdesk.com/posts/experience-enthusiasm-other-people</id><content type="html" xml:base="https://www.adamsdesk.com/posts/experience-enthusiasm-other-people/"><![CDATA[<p>I was going through my backlog of RSS (Really Simple Syndication) feed posts from Kev Quirk and realized that I missed a
post back in October 2023 entitled <a href="https://kevquirk.com/other-peoples-enthusiasm">“Other People’s Enthusiasm”</a> which
then lead me to <a href="https://baty.net/2023/10/other-people-s-enthusiasm">Jack Baty’s</a> post with the same title and subject.
I realize three things, why am I not following Jack Baty’s RSS feed, why do I not have Jack’s blog listed on my
<a href="/blogroll/">Blogroll</a> and I believe I have something to contribute to this discussion. So the first
two realizations I have already fixed, and as for the last one, I ask you, dear reader, to allow me to explain my
experience with other people’s enthusiasm by starting with a review of the meaning of the word enthusiasm.</p>

<h2 id="the-meaning-of-enthusiasm">The Meaning of Enthusiasm</h2>

<p>noun “Intensity of feeling; excited interest or eagerness.”
from <a href="https://en.wiktionary.org/wiki/enthusiasm">Wiktionary</a>, Creative Commons Attribution/Share-Alike License.</p>

<h2 id="experiencing-others-enthusiasm">Experiencing Other’s Enthusiasm</h2>

<p>I consume a lot through reading, watching and listening that covers vast topics, not just technology and as a result I’m
often experience other’s enthusiasm. This leads me going down deep rabbit holes of recommendations or curiosity to learn
more on something I was not aware of. If I require purchasing a new item, I spend more time than I want to admit
researching out which is going to be the best option for my budget, requirements and quality. My reasoning is that I work
hard for what I earn, and I wish to use the money I spend to go towards a company and product I want to support (my
vote). Often someone will mention a particular item, software, device, etc. that is being used and if I haven’t heard of
it off I go absorbing as much as I can about the exciting new thing.</p>

<p>What I’ve discovered about myself over the years is that my curiosity to learn is quite strong. This desire to explore
and learn is a wonderful thing and I believe we should embrace this. However, many times I’ve gotten myself into
situations that has made me feel overwhelmed, distracted, defeated and counterproductive. When this happens things start
to move to an unhealthy territory that doesn’t benefit you nor those that might get caught up in your excitement. In
these cases where it becomes unhealthy, we need to find a way to get it under control and understand why we are doing
this to ourselves.</p>

<h2 id="turning-bad-into-good">Turning Bad Into Good</h2>

<p>Upon reflection, I realized that this unhealthy side to curiosity was a deeper issue about wanting to be in the know of
knowledge. To not be the person that is not aware and that it is ultimately a low self-esteem. Just like Jack and
Kev stated, I too feel that it is not about the fear of missing out (FOMO). I have no issue doing my own thing without
having to be a part of something or have the latest gadget on the market. Often I would bully myself to the point that
I would convince myself that I was not good enough as a person, to do a job or that my perspective doesn’t matter. These
of course are all lies. I realize now that my perspective holds value and that is what makes me unique. It’s why we
follow our curiosity into what someone else has done or said, to gain another perspective that leads to more knowledge
and awareness.</p>

<p>So for me what I needed to do was change how I viewed myself and how I talked to myself. I also framed my mind around
being productive not busy and each time I’m curious about something, I must stop and think first. Can I do this right
now? Do I have other tasks or projects that should have priority first? Quite often I would just take notes or add a
task so that I can come back later to fill my curiosity. What also helped was I started to say no more often and not to
take on another project or task before I completed what I’m currently focused on. To help all these new processes I
adopted the use of a task manager called Task Warrior. I then changed how I organize my files by using the PARA
(project, area, resource, archive) method. Thus far these changes have been a game changer for me. I feel more in
control of everything and I no longer feel overwhelmed, distracted, defeated and counterproductive. With my curiosity
now being managed by my new thought process and filling I have noticed that like Kev mentioned enthusiasm fizzles over
time and those tasks or notes I took to do later end up just getting deleted. So in a sense I’ve created a filter for
myself.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The changes I’ve taken on is a work in progress, but I do know now that I am more aware of what is going on with in my
own head. We should all give ourselves more grace and love our self. The conclusion for me of course may not be same
for anyone else, but I do think it is worth the time to reflect on why one’s curiosity is turning into an unhealthy
situation. Curiosity is meant to be wonderful and a powerful quality, don’t allow it to cause harm in your life.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="mentalhealth" /><summary type="html"><![CDATA[Kev Quirk and Jack Baty lead me into exploring how I react to experiencing of enthusiasm from other people and how I turned bad into good.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/experience-enthusiasm-other-people.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/experience-enthusiasm-other-people.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Remove Package without Dependency Checks Using Pacman</title><link href="https://www.adamsdesk.com/posts/pacman-remove-package-dependency-checks/" rel="alternate" type="text/html" title="Remove Package without Dependency Checks Using Pacman" /><published>2024-01-20T00:00:00-06:00</published><updated>2024-01-20T12:35:39-06:00</updated><id>https://www.adamsdesk.com/posts/pacman-remove-package-dependency-checks</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pacman-remove-package-dependency-checks/"><![CDATA[<p>At some point in time there will come a situation when using Arch Linux that a package becomes broken due to a system
upgrade, or it has been replaced. It’s not the fault of anything necessarily, but rather changes have occurred, and now
a package needs to be removed in order to fix related issues. The first thought most will think is not a problem
at all and attempt to remove the problem package using Pacman to find out that the package cannot be removed due to
it breaks dependencies. Allow me to explain why a system package cannot to be removed and how to remove it without
checking for dependencies.</p>

<h2 id="what-are-system-package-dependencies">What Are System Package Dependencies?</h2>

<p>System packages are written in a modular form to create efficiencies and to allow another software project to build upon.
In order to make a system package complete often they require another package in order to function and this is what is
referred to as a package dependency. However, not all dependencies are created equal. Some dependencies can be set as
optional and are therefore only required when a certain feature is desired.</p>

<h2 id="why-you-cannot-remove-the-system-package">Why You Cannot Remove The System Package</h2>

<p>If the package was attempted to be removed using either <code class="language-plaintext highlighter-rouge">pacman -R &lt;package-name&gt;</code> or <code class="language-plaintext highlighter-rouge">pacman -Rd &lt;package-name&gt;</code>,
pacman will fail to remove the package due to dependency checks. A dependency check involves checking for version,
conflicts and required packages. The failure to remove the package due to it breaking dependency is done
intentionally to help protect the system package from becoming broken.</p>

<p>In this example using the “-R” operation all dependency checks will occur and therefore will fail to remove the package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pacman <span class="nt">-R</span> nodejs
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">checking dependencies...
error: failed to prepare transaction (could not satisfy dependencies)
:: removing nodejs breaks dependency 'nodejs' required by asar
:: removing nodejs breaks dependency 'nodejs' required by coffeescript
:: removing nodejs breaks dependency 'nodejs' required by grunt-cli
:: removing nodejs breaks dependency 'nodejs' required by node-gyp
:: removing nodejs breaks dependency 'nodejs' required by nodejs-nopt
:: removing nodejs breaks dependency 'nodejs' required by npm
:: removing nodejs breaks dependency 'nodejs' required by semver
:: removing nodejs breaks dependency 'nodejs' required by uglify-js
:: removing nodejs breaks dependency 'nodejs' required by yarn
</span></code></pre></div></div>

<p>If the “-Rd” operations are used then version dependency check is skipped, but conflicts and required packages will
still be checked. This is why in the example below the package fails to be removed.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pacman <span class="nt">-Rd</span> nodejs
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">checking dependencies...
error: failed to prepare transaction (could not satisfy dependencies)
:: removing nodejs breaks dependency 'nodejs' required by asar
:: removing nodejs breaks dependency 'nodejs' required by coffeescript
:: removing nodejs breaks dependency 'nodejs' required by grunt-cli
:: removing nodejs breaks dependency 'nodejs' required by node-gyp
:: removing nodejs breaks dependency 'nodejs' required by nodejs-nopt
:: removing nodejs breaks dependency 'nodejs' required by npm
:: removing nodejs breaks dependency 'nodejs' required by semver
:: removing nodejs breaks dependency 'nodejs' required by uglify-js
:: removing nodejs breaks dependency 'nodejs' required by yarn
</span></code></pre></div></div>

<h2 id="how-to-remove-a-package-without-dependency-checks">How to Remove a Package without Dependency Checks</h2>

<p>In order to force a removal of a package and skip all dependency checks (version, conflicts, required packages) an
operation of “-Rdd” must be applied as shown below in the example.</p>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        Forcing the removal of a system package can result in broken functionality. Therefore, this should be avoided unless absolutely necessary and done by someone that has a good understanding of the package system.
    </p>
</div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pacman <span class="nt">-Rdd</span> nodejs
</code></pre></div></div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[How to force removal of a system package without checking for dependencies using Pacman on the Arch Linux operating system.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pacman-force-package-removal.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pacman-force-package-removal.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Foundation</title><link href="https://www.adamsdesk.com/posts/discover-fediverse-foundation/" rel="alternate" type="text/html" title="Discover The Fediverse: Foundation" /><published>2024-01-19T00:00:00-06:00</published><updated>2024-02-01T16:42:08-06:00</updated><id>https://www.adamsdesk.com/posts/discover-fediverse-foundation</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-fediverse-foundation/"><![CDATA[<p>The power of one can only go so far, but with the power of many amazing achievements can be accomplished. Let us use the
power of our community to build a strong foundation to push each one of us forward in life. Using open source software
and projects allows for each one of us to move forward as a collective community. Harness this power by browsing this
week’s fediverse highlights.</p>

<p>Please remember to give your support with donations, help spread awareness and to follow these projects on the
fediverse.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<ul>
  <li>
    <p><a href="https://excalidraw.com/">Excalidraw</a> (<a href="https://mastodon.social/@excalidraw">@excalidraw@mastodon.social</a>)</p>

    <p>A collaborative end-to-end encrypted virtual whiteboard for sketching hand-drawn like diagrams, wireframes and more.</p>
  </li>
  <li>
    <p><a href="https://theta.limited/">Theta</a> (<a href="https://fosstodon.org/@theta">@theta@fosstodon.org</a>)</p>

    <p>OpenAthena, a free and open source unmanned aircraft system (UAS) geodesy platform to instantly obtain the exact
  location of any point within drone images. Available for Android and iOS operating systems.</p>
  </li>
  <li>
    <p><a href="https://pipewire.org/">PipeWire Project</a> (<a href="https://fosstodon.org/@pipewire">@pipewire@fosstodon.org</a>)</p>

    <p>An audio and video server for Linux systems handling everything from video capture, pro-audio and consumer audio.</p>
  </li>
  <li>
    <p><a href="https://wiremock.org/">WireMock</a> (<a href="https://fosstodon.org/@wiremock">@wiremock@fosstodon.org</a>)</p>

    <p>A flexible open source tool for building mock application programming interfaces (APIs) and testing the client application.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[A strong foundation is built with the power of community. So why not harness this power in exploring this weeks highlights of open source projects?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-foundation.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-foundation.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Doors of Opportunities</title><link href="https://www.adamsdesk.com/posts/discover-fediverse-doors-opportunities/" rel="alternate" type="text/html" title="Discover The Fediverse: Doors of Opportunities" /><published>2024-01-12T00:00:00-06:00</published><updated>2024-01-12T20:30:42-06:00</updated><id>https://www.adamsdesk.com/posts/discover-fediverse-doors-opportunities</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-fediverse-doors-opportunities/"><![CDATA[<p>Over the years, I’ve begun to realize that it is better to speak less and observe one’s surroundings more. I haven’t
gotten this down quite right yet, but I have come to one conclusion that I may have missed in the past. When observing
with intention I’ve discovered that we are quite often presented with many opportunities that can pass right by without
even a thought. Who knows what these opportunities could bring if we just paid attention and allowed ourselves to
embrace some of them. To me this is no different from the doors of opportunities with open source that allow and protect
your freedoms from the support of our community. So let’s take some time to discover new projects on the fediverse while
remembering to help spread awareness and support of these projects in this week’s Follow Friday highlights.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<ul>
  <li>
    <p><a href="https://alovoa.com/">Alovoa</a> (<a href="https://mastodon.social/@alovoa_love">@alovoa_love@mastodon.social</a>)</p>

    <p>An ad-free dating platform that respects your privacy without turning you into a product.</p>
  </li>
  <li>
    <p><a href="https://biomejs.dev/">Biome</a> (<a href="https://fosstodon.org/@biomejs">@biomejs@fosstodon.org</a>)</p>

    <p>A toolchain for web projects as a formatter and linter that is usable via the command-line interface (CLI) and Language Server Protocol (LSP).</p>
  </li>
  <li>
    <p><a href="https://airflow.apache.org/">Apache Airflow</a> (<a href="https://fosstodon.org/@airflow">@airflow@fosstodon.org</a>)</p>

    <p>A platform created by the community to programmatically author, schedule and monitor workflows.</p>
  </li>
  <li>
    <p><a href="https://directory.apache.org/">ApacheDS</a> (<a href="https://fosstodon.org/@apacheds">@apacheds@fosstodon.org</a>)</p>

    <p>A modern certified LDAPv3 extensible and embeddable directory server with support of Kerveros 5 and Change Password Protocol.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Peruse this week fediverse highlights of open source and all the doors of opportunities each project may bring.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-doors-opportunities.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-doors-opportunities.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Solve the Puzzle</title><link href="https://www.adamsdesk.com/posts/discover-the-fediverse-solve-puzzle/" rel="alternate" type="text/html" title="Discover The Fediverse: Solve the Puzzle" /><published>2024-01-05T00:00:00-06:00</published><updated>2024-01-05T23:44:56-06:00</updated><id>https://www.adamsdesk.com/posts/discover-the-fediverse-solve-puzzle</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-the-fediverse-solve-puzzle/"><![CDATA[<p>Solving the puzzle of life can be challenging, but we can discover solutions using two powers. What are those powers you
may ask, community and freedom of rights. This is no different when it comes to open source, we must use our
power to bring each of us together and ensure our freedoms are protected. When some of us are down, we need others to
lift us back up. We can all do this! So on today’s Follow Friday I need your help to lift up these projects by spreading
awareness to open source and our freedom of rights (run, copy, distribute, study, and modify) with shares, boosts and
follows on the Fediverse.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<ul>
  <li>
    <p><a href="https://asciinema.org/">asciinema</a> (<a href="https://fosstodon.org/@asciinema">@asciinema@fosstodon.org</a>)</p>

    <p>Record and share your terminal sessions, the simple way. Forget screen recording apps and blurry video. Experience a
lightweight, text-based approach to terminal recording.</p>
  </li>
  <li>
    <p><a href="https://www.asuralinux.org/">Asura Linux</a> (<a href="https://fosstodon.org/@asuralinux">@asuralinux@fosstodon.org</a>)</p>

    <p>A project to experiment with different ways of building and running modern general-purpose Linux systems—and to share
what we learn along the way.</p>
  </li>
  <li>
    <p><a href="https://www.django-unicorn.com/">Unicorn</a> (<a href="https://fosstodon.org/@unicorn">@unicorn@fosstodon.org</a>)</p>

    <p>Add modern reactive component functionality to Django templates with easy.</p>
  </li>
  <li>
    <p><a href="">Open-Meteo</a> (<a href="https://fosstodon.org/@openmeteo">@openmeteo@fosstodon.org</a>)</p>

    <p>A open-source weather application programming interface (API) that offers free access for non-commercial use without an API key.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Solving a puzzle can be challenging, but with two powers we can discover solutions that lead to endless possibilities we never dreamed was achievable.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-solve-puzzle.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-solve-puzzle.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Build Freedom</title><link href="https://www.adamsdesk.com/posts/discover-the-fediverse-build-freedom/" rel="alternate" type="text/html" title="Discover The Fediverse: Build Freedom" /><published>2023-12-29T00:00:00-06:00</published><updated>2023-12-29T14:37:29-06:00</updated><id>https://www.adamsdesk.com/posts/discover-the-fediverse-build-freedom</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-the-fediverse-build-freedom/"><![CDATA[<p>As the year comes to an end and a new one soon will begin, we can reflect on the positive influences open source has had
on our individual lives and also our community as a whole. I recall the times when open source was not as prevalent as
it is today and I can assure you that it was not as open and free as so many of us have become a custom to. We must
remain humble and not take this for granted, but build upon this for the greater doors of opportunity that we cannot
even begin to imagine. For now let’s take a look at four great opportunities in open source for this week’s Follow
Friday and remember to show your support and appreciation with boosts, shares, and follows on the Fediverse.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<ul>
  <li>
    <p><a href="https://www.flatpress.org/">FlatPress</a> (<a href="https://fosstodon.org/@flatpress">@flatpress@fosstodon.org</a>)</p>

    <p>A simple lightweight, easy-to-set-up blogging engine using PHP with no database required.</p>
  </li>
  <li>
    <p><a href="https://overload.pablos.cloud/">overloadapp</a> (<a href="https://fosstodon.org/@overloadapp">@overloadapp@fosstodon.org</a>)</p>

    <p>A user-friendly native app for Android designed to facilitate time tracking for everyone.
  The application can be installed via F-Droid, Google Play or Codeberg (Git repository release).</p>
  </li>
  <li>
    <p><a href="https://getmammoth.app/">Mammoth</a> (<a href="https://fosstodon.org/@mammoth@moth.social">@mammoth@moth.social</a>)</p>

    <p>A beautiful iOS or MacOS client application for Mastodon.</p>
  </li>
  <li>
    <p><a href="https://memos.moe/">Moe Memos</a> (<a href="https://fosstodon.org/@moememos">@moememos@fosstodon.org</a>)</p>

    <p>Capture thoughts and ideas, works with memos on Android and iOS via F-Droid, Apple App Store, Google Play and GitHub (Git repository release).</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Reminding each of us to be humble and not take for granted the benefits that open source grants us and continue to build freedom of opportunities.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-build-freedom.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-build-freedom.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Merry Christmas and Happy Holidays!</title><link href="https://www.adamsdesk.com/posts/merry-christmas-and-happy-holidays-2023/" rel="alternate" type="text/html" title="Merry Christmas and Happy Holidays!" /><published>2023-12-24T00:00:00-06:00</published><updated>2023-12-24T16:31:05-06:00</updated><id>https://www.adamsdesk.com/posts/merry-christmas-and-happy-holidays-2023</id><content type="html" xml:base="https://www.adamsdesk.com/posts/merry-christmas-and-happy-holidays-2023/"><![CDATA[<p>It’s the time of year that many people from around the world come together to celebrate and show appreciation through
the act of giving. No matter what you celebrate let us not forget that we come together to enjoy and connect with one
another. For those that are in challenging times or find this time of year hard, consider reaching out to at least one
person to show you care and that they matter. In the end of it all, remember to stay safe and have a wonderful time.</p>

<p>Merry Christmas and Happy Holidays from Adamsdesk!</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><summary type="html"><![CDATA[A positive message reminding everyone to embrace the connection with people through celebration and the act of giving.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/merry-christmas-happy-holidays-2023.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/merry-christmas-happy-holidays-2023.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Light Up Our Community</title><link href="https://www.adamsdesk.com/posts/discover-the-fediverse-light-up-our-community/" rel="alternate" type="text/html" title="Discover The Fediverse: Light Up Our Community" /><published>2023-12-22T00:00:00-06:00</published><updated>2023-12-22T16:01:58-06:00</updated><id>https://www.adamsdesk.com/posts/discover-the-fediverse-light-up-our-community</id><content type="html" xml:base="https://www.adamsdesk.com/posts/discover-the-fediverse-light-up-our-community/"><![CDATA[<p>It’s the time of giving, let us not forget that it is our community of volunteers that has empowered open source. To
keep our favourite software applications, projects or even services operating these volunteers require our support not
just monetarily, but also through hardware donations, writing documentation or even spreading awareness. So let us
spread the joy of open source with the energy of community by shedding some light this Follow Friday with boosts,
shares, and follows on the Fediverse and beyond.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<p>Today brings Follow Friday in the Fediverse, so let’s shed some light on our community in open source with boots and follows.</p>

<ul>
  <li>
    <p><a href="https://www.selenium.dev/">Selenium</a> (<a href="https://fosstodon.org/@seleniumHQ">@seleniumHQ@fosstodon.org</a>)</p>

    <p>A suite of tools for automating web browsers. Automation can be done for web application testing, common repeated
  tasks and more.</p>
  </li>
  <li>
    <p><a href="https://numba.pydata.org/">Numba</a> (<a href="https://fosstodon.org/@numba">@numba@fosstodon.org</a>)</p>

    <p>A Just-In-Time compiler that translate a subset of Python and NumPy code into fast machine code.</p>
  </li>
  <li>
    <p><a href="https://github.com/casimir/frigoligo">Frigoligo</a> (<a href="https://fosstodon.org/@frigoligo">@frigoligo@fosstodon.org</a>)</p>

    <p>A universal Wallabag client made with Flutter for your mobile and desktop devices. Available to download for
  AppImage, Linux and Windows.</p>
  </li>
  <li>
    <p><a href="https://wallabag.org/">Wallabag</a> (<a href="https://social.tcit.fr/@wallabag">@wallabag@social.tcit.fr</a>)</p>

    <p>Freely save and classify articles to read them later. Available to download for Android, iOS, Chrome, Firefox,
  Opera, PocketBook, Kobo and Kidle.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[It's the time of giving, let us not forget our community of volunteers with this weeks fediverse highlights of open source initiatives.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-light-up-our-community.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-light-up-our-community.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">I Messed Up Arching The Privacy, Security and OSINT Show</title><link href="https://www.adamsdesk.com/posts/archiving-privacy-security-osint-show/" rel="alternate" type="text/html" title="I Messed Up Arching The Privacy, Security and OSINT Show" /><published>2023-12-16T00:00:00-06:00</published><updated>2023-12-16T18:07:18-06:00</updated><id>https://www.adamsdesk.com/posts/archiving-privacy-security-osint-show</id><content type="html" xml:base="https://www.adamsdesk.com/posts/archiving-privacy-security-osint-show/"><![CDATA[<p>I know without a doubt that I love to solve technical challenges and to help people through the use of technology. The
post I made entitled
<a href="/posts/farewell-privacy-security-and-osint-show/">Farewell to The Privacy, Security, and OSINT Show</a>,
was to inform the public of this grave news, and then soon after helped by providing a source for archived episodes. I
normally don’t rush into anything and take my time to make sound decisions, unfortunately this time is not one of them.
This is my experience and thoughts reflecting upon my haste decision.</p>

<div class="admonition warning rounded">
    <p class="admonition-title">Disclaimer</p>
    <p>
        I'm not a lawyer and do not pretend to be one. Therefore, these are my opinions only.
    </p>
</div>

<h2 id="the-fallout">The Fallout</h2>

<p>I launched the podcast archive page on December 5th, 2023 along with asking people to help complete the archive of
episodes. Not thinking much more about it, I left the page as is and moved my focus on to other tasks. On December 11th,
2023 I received an email from <a href="https://inteltechniques.com/">IntelTechniques</a> requesting the removal of all podcast
episodes per the Digital Millennium Copyright Act (DMCA). Now my first thought seeing this email
was, is this legitimate? Everything checked out for what little I could confirm. Then my thoughts moved to, DMCA doesn’t
apply to citizens outside the United States. However, I’m not interested in battling this out let alone burning any
bridges. At the end of the day this not my decision to make, so I replied stating that I have removed all podcast
episodes and said that I didn’t intend to cause any harm. I did try and plea my case to restore the podcast episodes. I
even offered to help get them back online. After a few emails back and forth, it fully hit home how serious of a
decision this was, and I didn’t even take the time to properly think this through. There might be perspectives I may not
have thought of or are aware of. As a result I began to think deep on this matter that lead me to a few areas that I
should have thought about in the first place.</p>

<h2 id="storage-and-bandwidth">Storage and Bandwidth</h2>

<p>I have no idea why I never took the time to think this decision through. It’s not as if I’m new to the world of how the
Internet works let alone a website. The truth of the matter is this situation could have been a lot worse. For instance,
the amount of storage required for all podcast episodes is not small by any means. I estimate for the entire podcast
episodes I would need about 1.5 to 2 gigabytes of storage space at least. Then there is the whole bandwidth issue that
could add up to substantial amount depending on how many people choose to download episodes. Now yes, I have the storage
space but that still requires responsibility to manage that, and I also have technically unlimited bandwidth with my web
hosting provider. However, I’m on a shared hosting plan, and I’m pretty sure if I started to get 100s of gigabytes or
terabytes my hosting provider would start knocking on my door.</p>

<h2 id="archiving">Archiving</h2>

<p>Then there is the entire legal aspect. I legally obtained the podcast episodes, but do I have right to have them on my
website? Where is the legal line drawn for the right to archive?</p>

<p>Let’s set the legal aspect aside and let me explain my view on archiving.
Our culture is intertwined within our movies, music, TV shows, fashion, art, etc. and is an important part of our
heritage. Being able to examine these areas and more allows us the ability to study, learn, research or even bring
inspiration. All media embodies knowledge and I, for one, am a strong believer that we need places like libraries,
<a href="https://archive.org/">Internet Archive</a>, <a href="https://www.gutenberg.org/">Project Gutenberg</a>,
<a href="https://library-archives.canada.ca/">Library and Archives Canada</a>, <a href="https://www.openculture.com/">Open Culture</a>,
<a href="https://www.softwareheritage.org/">Software Heritage</a>, <a href="https://www.wikipedia.org/">Wikipedia</a> and more to archive our
past. Without archiving we lose knowledge and humanity cannot afford the risk of losing it.</p>

<p>With this all said, this is my view and values and not necessarily of someone else like IntelTechniques or Michael
Bazzell’s. As much as I believe my view and values, that doesn’t give me the right to disrespect someone’s elses. I feel
we all at times need to be reminded of this.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Unfortunately the podcast episodes have been removed along with the archive page. As well as of the day writing this the
episodes are not available from IntelTechniques either. In the end in this particular case it is up to the owner to make
the decision. We are not entitled to have access forever, it just unfortunate events that took down the podcast episodes
too soon. I would like to give thanks to Michael Bazzell and his team for being so understanding as well as those that
took time out of their day to help me. Let us all look forward to whatever IntelTechniques comes up with next.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[A fallout leads to reflection of my haste decision to archive past episodes of The Privacy, Security and OSINT Show and the removal of the archive page.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/archiving-privacy-security-osint-show.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/archiving-privacy-security-osint-show.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Open Source Community Comfort</title><link href="https://www.adamsdesk.com/posts/fediverse-open-source-community-comfort/" rel="alternate" type="text/html" title="Discover The Fediverse: Open Source Community Comfort" /><published>2023-12-15T00:00:00-06:00</published><updated>2023-12-15T15:03:36-06:00</updated><id>https://www.adamsdesk.com/posts/fediverse-open-source-community-comfort</id><content type="html" xml:base="https://www.adamsdesk.com/posts/fediverse-open-source-community-comfort/"><![CDATA[<p>Today I’m pondering the presentation by <a href="https://blog.izs.me/">Isaac Z. Schlueter.</a>
(<a href="https://fosstodon.org/@isaacs">@isaacs@fosstodon.org </a>) at the first
<a href="https://hub.fosstodon.org/fosstodon-meetup">Fosstodon Community Meetup</a>
about the issue of funding and protecting our open source community projects. I don’t have all the answers, but
what I feel we need to do at the very least is work on educating and uniting the strength of our community. We all
generally seek comfort in community and in community we can unite with our values and ideals, yet far too long we’ve
been investing in corporations instead of into our community. This is no different for the open source community. Each
time one goes to make a decision to purchase or donate, use software, use computer hardware, etc. all of us are actually
casting a vote of support that affects more than just ourselves. This is especially amplified when it comes to where
each of us invest our money into. Where the money goes is where the growth builds. One way I’m contributing to change is
by promoting awareness of the open source community not just on the World Wide Web, but also on the Fediverse. Please
consider these highlights for this Follow Friday with boosts, shares, and follows on the Fediverse and beyond.</p>

<h2 id="fediverse-highlights">Fediverse Highlights</h2>

<p>Discover and support our community with these wonderful open source initiatives on the Fediverse.</p>

<ul>
  <li>
    <p><a href="https://lemonldap-ng.org/">LemonLDAP::NG</a> (<a href="https://fosstodon.org/@lemonldapng">@lemonldapng@fosstodon.org</a>)</p>

    <p>A complete and modular Web-SSO (single sign-on) system that can run with reverse-proxies or directly on application
web servers. It can be used in conjunction with OpenID-Connect, CAS and SAML systems as identity or service provider.</p>
  </li>
  <li>
    <p><a href="https://www.keila.io/">Keila</a> (<a href="https://fosstodon.org/@keila">@keila@fosstodon.org</a>)</p>

    <p>A powerful email mailing list newsletter tool built for privacy with such features as contact segmentation, campaigns,
automate/integrate with API (application program interface), markdown support, importing contacts and much more.</p>
  </li>
  <li>
    <p><a href="https://citation.js.org/">Citation.js</a> (<a href="https://fosstodon.org/@citationjs">@citationjs@fosstodon.org</a>)</p>

    <p>Convert variety different file formats as input or output. Here are just a few formats supported, BibTeX, BibJSON,
DOI, Wikidata to CSL-JSON to convert to styles like APA, Vancouver and to BibTeX and RIS.</p>
  </li>
  <li>
    <p><a href="https://qunitjs.com/">QUnit</a> (<a href="https://fosstodon.org/@qunit">@qunit@fosstodon.org</a>)</p>

    <p>Take the complexity out of unit testing by using the powerful JavaScript testing framework QUnit. Originally
developed for the jQuery project, it is now evolved into its own dependency for many JavaScript libraries.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[See my pondering thoughts on finding comfort in our community and this weeks fediverse highlights on open source initiatives.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-community-comfort.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-community-comfort.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Open Source (November 2023)</title><link href="https://www.adamsdesk.com/posts/fediverse-open-source-november-2023/" rel="alternate" type="text/html" title="Discover The Fediverse: Open Source (November 2023)" /><published>2023-12-14T00:00:00-06:00</published><updated>2023-12-14T19:49:34-06:00</updated><id>https://www.adamsdesk.com/posts/fediverse-open-source-november-2023</id><content type="html" xml:base="https://www.adamsdesk.com/posts/fediverse-open-source-november-2023/"><![CDATA[<p>The month of November has passed bye to me in a blink of an eye. It doesn’t feel like it is December already and only
weeks away from many of us attending or hosting celebrations. I hope everyone stays safe and enjoys these great times
connecting with people. For now let’s make some connections with open source discoveries by taking a look at the
wonderful possibilities each one of these sixteen curated projects can bring. Please remember to support these projects
you love and to follow them on the Fediverse.</p>

<h2 id="love-and-appreciation-week-44">Love and Appreciation (week 44)</h2>

<p><img src="/assets/img/posts/fediverse-open-source-love-appreciation-week-44-2023.webp" alt="A forest of tress against a partly cloudy sky as a little fox stands in the middle smiling as it takes in the love and appreciation from the open source community." width="540" height="540" class="img-fluid" /></p>

<p>Follow Friday is here, and it’s time to show your love and appreciation for Open Source software with a boost and follows!</p>

<ul>
  <li>
    <p><a href="https://github.com/infuseai/piperider">PipeRider</a> (<a href="https://fosstodon.org/@piperider">@piperider@fosstodon.org</a>)</p>

    <p>Code review for data in dbt.</p>
  </li>
  <li>
    <p><a href="https://github.com/pachli/pachli-android">Pachli</a> (<a href="https://mastodon.social/@pachli">@pachli@mastodon.social</a>)</p>

    <p>A full-featured Android Mastodon client.</p>
  </li>
  <li>
    <p><a href="https://github.com/dino/dino">Dino</a> (<a href="https://fosstodon.org/@dino">@dino@fosstodon.org</a>)</p>

    <p>A modern open-source chat client for the desktop Linux.</p>
  </li>
  <li>
    <p><a href="https://nxos.org/">Nitrux</a> (<a href="https://mastodon.cloud/@Nitrux_NX">@Nitrux_NX@mastodon.cloud</a>)</p>

    <p>Linux operating system powered by Debian, KDE Plasma, Frameworks, and AppImages.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/vectors/fox-little-fox-love-happy-smiling-7633557/">Illustration</a> by Hansuan_Fabregas</li>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li><a href="https://www.fontsquirrel.com/fonts/gentium-basic">Gentium Basic</a> font by SIL International</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, delete background, add backgrounds, add text, add lines, add drop shadows</li>
</ul>

<h2 id="open-source-pursuit-week-45">Open Source Pursuit (week 45)</h2>

<p><img src="/assets/img/posts/fediverse-open-source-pursuit-week-45-2023.webp" alt="A cartoon illustration of a light and dark brown coloured cat pursuing a mechanical mouse with excitement as it leaps about. Text above says, pursue open source and software freedom. Below text says, run, copy, distribute, study, modify." width="540" height="540" loading="lazy" class="img-fluid" /></p>

<p>Show your pursuit for Open Source and Software Freedom on this Follow Friday with boosts and follows!</p>

<ul>
  <li>
    <p><a href="https://beavernotes.com/">Beaver Notes</a> (<a href="https://mastodon.social/@Beavernotes">@Beavernotes@mastodon.social</a>)</p>

    <p>A private and organized note-taking app.</p>
  </li>
  <li>
    <p><a href="https://www.openmediavault.org/">openmediavault</a> (<a href="https://fosstodon.org/@openmediavault">@openmediavault@fosstodon.org</a>)</p>

    <p>The open network attached storage solution.</p>
  </li>
  <li>
    <p><a href="https://openscad.org/">OpenSCAD</a> (<a href="https://fosstodon.org/@OpenSCAD">@OpenSCAD@fosstodon.org</a>)</p>

    <p>The programmers solid 3D CAD modeller.</p>
  </li>
  <li>
    <p><a href="https://castopod.org/">Castopod</a> (<a href="https://podlibre.social/@Castopod">@Castopod@podlibre.social</a>)</p>

    <p>A hosting platform made for podcasters who want to engage on the Fediverse.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/vectors/cat-chasing-mouse-toy-playing-1456878/">Cat &amp; mouse illustration</a> by GraphicMama-team</li>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li><a href="https://www.fontsquirrel.com/fonts/gentium-basic">Gentium Basic</a> font by SIL International</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, add background, add text, add lines</li>
</ul>

<h2 id="black-friday-week-47">Black Friday (week 47)</h2>

<p><img src="/assets/img/posts/fediverse-open-source-black-friday-week-47-2023.webp" alt="A white banner with black text at the top reads, &quot;It's Black Friday&quot; followed by white text centered below of &quot;All year round with open source&quot;. In the center of the page is a rounded yellow background with a white silhouette of a person moving fast with a shopping cart. Below this white text reads, &quot;Discover software freedom&quot;." width="540" height="540" loading="lazy" class="img-fluid" /></p>

<p>It’s Black Friday all year around with open source. Discover software freedom on this Follow Friday with boosts and follows!</p>

<ul>
  <li>
    <p><a href="https://www.phylum.io/">Phylum</a> (<a href="https://infosec.exchange/@phylum">@phylum@infosec.exchange</a>)</p>

    <p>Automatically detect and block software supply chain attacks.</p>
  </li>
  <li>
    <p><a href="https://codeberg.org/MagpieMarket/magpie-market-prototype">Magpie Market</a> (<a href="https://fosstodon.org/@magpiemarket">@magpiemarket@fosstodon.org</a>)</p>

    <p>An Etsy alternative to promote and sell good/services leveraging the #Fediverse.</p>
  </li>
  <li>
    <p><a href="https://maplibre.org/">MapLibre</a> (<a href="https://mastodon.social/@maplibre">@maplibre@mastodon.social</a>)</p>

    <p>Mapping libraries for web and mobile app developers.</p>
  </li>
  <li>
    <p><a href="https://apps.kde.org/kasts/">Kasts</a> (<a href="https://fosstodon.org/@kasts">@kasts@fosstodon.org</a>)</p>

    <p>A podcast player developed by <a href="https://floss.social/@kde">@kde@floss.social</a>  community.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/vectors/silhouette-man-cart-shopping-full-3139806/">Shopping illustration</a> by Mohamed_hassan</li>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, add backgrounds, add text, add lines, add drop shadow, add round corner</li>
</ul>

<h2 id="sweet-chocolatey-goodness-week-48">Sweet Chocolatey Goodness (week 48)</h2>

<p><img src="/assets/img/posts/fediverse-open-source-sweet-chocolatey-goodness-48-2023.webp" alt="Focus is drawn inwards towards the center of a chocolate globe melting against a light brown background with a dark brown twisted sunbursts. Above the globe stands a bold message of &quot;Taste The Freedom of The Sweet Chocolatey Goodness of Open Source&quot; and beneath two lines of &quot;Spread Awareness&quot; and &quot;Donate Today&quot;." width="540" height="540" loading="lazy" class="img-fluid" /></p>

<p>Taste the FREEDOM of the Sweet Chocolatey Goodness of Open Source for this Follow Friday.
Show your support and spread awareness with boosts and follows!</p>

<ul>
  <li>
    <p><a href="https://codeberg.org/tblock">TBlock</a> (<a href="https://floss.social/@tblock">@tblock@floss.social</a>)</p>

    <p>System wide ad blocker using hosts file from the command-line or as a GTK application.</p>
  </li>
  <li>
    <p><a href="https://maunalinux.top/">Mauna Linux</a> (<a href="https://mastodon.social/@maunalinux">@maunalinux@mastodon.social</a>)</p>

    <p>A simple, elegant and robust Debian-based operating system.</p>
  </li>
  <li>
    <p><a href="https://openrtx.org/">OpenRTX</a> (<a href="https://mastodon.radio/@openrtx">@openrtx@mastodon.radio</a>)</p>

    <p>Firmware for digital ham radios.</p>
  </li>
  <li>
    <p><a href="https://mobile.schmidhuberj.de/">Schmiddi on Mobile</a> (<a href="https://fosstodon.org/@schmiddionmobile">@schmiddionmobile@fosstodon.org</a>)</p>

    <p>Beautiful apps for mobile Linux devices.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/illustrations/chocolate-caramel-sweetness-1713872/">Chocolate world</a> by 51581</li>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a></li>
  <li>Modified chocolate world in <a href="https://www.gimp.org/">GIMP</a></li>
  <li>Created new image in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Remove background, remove pooled melted chocolate, add background, add sunburst, add text, add line, add drop shadow, add text stroke</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Another month has gone by and with that brings sixteen more wonderful free open source discoveries of possibilities on the Fediverse.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-november-2023.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-november-2023.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #9</title><link href="https://www.adamsdesk.com/posts/little-bits-9/" rel="alternate" type="text/html" title="Little Bits: Issue #9" /><published>2023-12-13T00:00:00-06:00</published><updated>2024-01-14T20:14:27-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-9</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-9/"><![CDATA[<p>It’s a never ending exploration of knowledge out there and I have to say I quite enjoy the process. Each time I go
out exploring I am astonished by the level of creativity and the endless talent people have. The majority of what I seek
for is creations made by human beings and preferably DRM-free. Here are the little bits I gathered and explored in the
month of November 2023.</p>

<h2 id="art">Art</h2>

<ul>
  <li><a href="https://www.artstation.com/artwork/Ke9Dkx">Fire Clouds</a> (3840 x 3072 px) by Philipp A. Urlich</li>
</ul>

<h2 id="books--magazines">Books / Magazines</h2>

<ul>
  <li><a href="https://www.ebooks.com/en-ca/book/210497580/efficient-linux-at-the-command-line/daniel-j-barrett/">Efficient Linux at the Command Line</a> (2022, ISBN: 9781098113377, DRM-Free) by Daniel J. Barrett</li>
  <li><a href="https://www.ebooks.com/en-ca/book/211115554/practical-cloud-security/chris-dotson/">Practical Cloud Security (2nd ed.)</a> by Chris Dotson (2023, ISBN: 9781098148140, DRM-Free)</li>
  <li><a href="https://www.ebooks.com/en-ca/book/211158970/the-language-of-deception/justin-hutchens/">The Language of Deception Weaponizing Next Generation AI</a> by Justin Hutchens; Stuart McClure (2023, ISBN: 9781394222568)</li>
</ul>

<h2 id="blog">Blog</h2>

<ul>
  <li><a href="https://rldane.space/dont-use-what-works-for-you.html"><em>Don’t</em> use what works for you</a> by R.L. Dane</li>
  <li><a href="https://zerokspot.com/weblog/2023/11/28/20-years-of-zerokspot/">20 years of zerokspot</a> by Horst Gutmann</li>
  <li><a href="https://0xdstn.site/thoughts/merry-november/">A Very Merry November</a> by Dustin</li>
  <li><a href="https://claytonerrington.com/blog/almost-there/">Almost there - 100DaysToOffload</a> by Clayton Errington</li>
  <li><a href="https://baty.net/posts/2023/11/app-defaults">App Defaults (2023 Edition)</a> by Jack Baty</li>
  <li><a href="https://joelchrono.xyz/blog/as-many-posts-as-last-year/">As many posts as last year</a> by Joel</li>
  <li><a href="https://www.brycewray.com/posts/2023/11/back-up-jack-current-setup/">Back up, Jack: my current setup</a> by Bryce Wray</li>
  <li><a href="https://claytonerrington.com/blog/default-apps/">Default apps</a> by Clayton Errington</li>
  <li><a href="https://makoism.com/defaults/">Defaults</a> by Steve Makofsky</li>
  <li><a href="https://claytonerrington.com/blog/git-status/">Git Status</a> by Clayton Errington</li>
  <li><a href="https://baty.net/posts/2023/11/gitea">Gitea</a> by Jack Baty</li>
  <li><a href="https://82mhz.net/posts/2023/11/good-bye-raspberry-pi/">Good Bye, Raspberry Pi</a> by Andreas</li>
  <li><a href="https://neilzone.co.uk/2023/11/im-not-sure-that-i-can-trust-bitwarden-with-my-totp-codes-anymore/">I’m not sure that I can trust Bitwarden with my TOTP codes anymore</a> by Neil Brown</li>
  <li><a href="https://claytonerrington.com/blog/knowing-the-long-way/">Knowing the long way</a> by Clayton Errington</li>
  <li><a href="https://claytonerrington.com/blog/2023-11-3-lessons-learned-backup/">Lessons learned, backup</a> by Clayton Errington</li>
  <li><a href="https://claytonerrington.com/blog/migrating-2fa-apps/">Migrating 2FA apps</a> by Clayton Errington</li>
  <li><a href="https://joelchrono.xyz/blog/default-apps-2023/">My Default Apps (2023)</a> by Joel</li>
  <li><a href="https://kevquirk.com/my-default-apps-at-the-end-of-2023">My Default Apps at the End of 2023</a> by Kev Quirk</li>
  <li><a href="https://taonaw.com/2023/11/11/my-new-printer.html">My new printer is here, and it’s fantastic.</a> by JTR</li>
  <li><a href="https://joelchrono.xyz/blog/new-phone-experience/">New Phone Experience</a> by Joel</li>
  <li><a href="https://lazybear.io/posts/october-2023/">October 2023</a> by Hyde Stevenson</li>
  <li><a href="https://joelchrono.xyz/blog/on-subscriptions/">On Subscriptions</a> by Joel</li>
  <li><a href="https://www.kytta.dev/blog/one-month-full-time/">One month of full-time job</a> by Nikita</li>
  <li><a href="https://wbrawner.com/2023/11/11/pico-8-game-development/">PICO-8 Game Development</a> by William Brawner</li>
  <li><a href="https://0xdstn.site/thoughts/reading-goals/">Reading Goals</a> by Dustin</li>
  <li><a href="https://claytonerrington.com/blog/reducing-the-noise/">Reducing the noise</a> by Clayton Errington</li>
  <li><a href="https://blog.cloudflare.com/rfc8482-saying-goodbye-to-any/">RFC8482 - Saying goodbye to ANY</a> by Marek Majkowski</li>
  <li><a href="https://www.brycewray.com/posts/2023/11/riding-trend-my-defaults/">Riding a trend: my defaults</a> by Bryce Wray</li>
  <li><a href="https://joelchrono.xyz/blog/the-calm-before-the-unknown/">The calm before the unknown</a> by Joel</li>
  <li><a href="https://berglyd.net/blog/2023/03/mastodon-comments/">Threaded Mastodon Comments</a> by Veronica Berglyd Olsen</li>
  <li><a href="https://drewdevault.com/2020/05/05/We-are-complicit-in-our-employers-deeds.html">We are complicit in our employer’s deeds </a> by Drew DeVault</li>
  <li><a href="https://ctmiller.net/2023/11/26/winter-is-coming.html">Winter is Coming</a> by Chris Miller</li>
  <li><a href="https://andadinosaur.com/youtube-s-anti-adblock-and-ublock-origin">Youtube’s Anti-adblock and uBlock Origin</a> by Zhenyi Tan</li>
</ul>

<h2 id="design">Design</h2>

<ul>
  <li><a href="https://www.nmtype.com/movement/">Movement</a> font by NM Type (License, CC BY-ND 4.0)</li>
  <li><a href="https://observatory.db.erau.edu/generators/signs/">Safety Sign Generator</a> by Damon</li>
</ul>

<h2 id="events">Events</h2>

<ul>
  <li><a href="https://news.perlfoundation.org/post/yapc-hiroshima-2024">Invitation to YAPC::Hiroshima 2024 in Japan - The Perl Foundation)</a> by Makoto Nozaki</li>
</ul>

<h2 id="gaming">Gaming</h2>

<ul>
  <li>
    <p><a href="https://arcanepad.com/">Arcanepad</a></p>

    <p>A new way of playing.</p>
  </li>
  <li>
    <p><a href="https://manuferhi.itch.io/bomb-jack-zx-spectrum-next-n-go">Bomb Jack</a></p>

    <p>Bomb Jack port for ZX Spectrum Next and compatibles.</p>
  </li>
  <li>
    <p><a href="https://fully-bugged.itch.io/boohablox">BoohaBlox Arcade</a> by Fully Bugged, Gouellie</p>

    <p>A puzzle league/panel de Pon/Tetris Attack/ variation.</p>
  </li>
  <li><a href="https://arlagames.itch.io/burger-time">Burger Time (C64)</a> by Arlasoft</li>
  <li>
    <p><a href="https://dosdeck.com/">DOS_deck</a></p>

    <p>Classic games with modern convenience using nothing more than a web browser.</p>
  </li>
  <li>
    <p><a href="https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher">Heroic Games Launcher</a></p>

    <p>A Native GOG, Amazon and Epic Games Launcher for Linux, Windows and Mac.</p>
  </li>
  <li>
    <p><a href="https://github.com/deathkiller/jazz2-native">Jazz² Resurrection </a></p>

    <p>Jazz² Resurrection: Native C++ reimplementation of Jazz Jackrabbit 2.</p>
  </li>
  <li><a href="https://www.indieretronews.com/2023/11/super-bagman-jotds-latest-arcade-to.html">Super Bagman - JOTD’s latest Arcade to Amiga conversion!</a></li>
  <li><a href="https://shellsharks.com/notes/2023/11/03/super-mario-wonder">Super Mario Wonder</a> by Mike Sass</li>
  <li>
    <p><a href="https://sgadrat.itch.io/super-tilt-bro">Super Tilt Bro.</a></p>

    <p>A demake of the Super Smash Bros. series compatible with the good old Nintendo Entertainment System from the 1980s.
  Featuring online play, thanks to a Wi-Fi chip in the cartridge. Available for Linux, macOS, NES or Windows.</p>
  </li>
  <li><a href="https://vitno.org/2023/11/09/toki-commodore-64-remastered-version-new-video/">Toki Commodore 64 Remastered Version, New Video</a></li>
</ul>

<h2 id="hardware">Hardware</h2>

<ul>
  <li><a href="https://www.nitrokey.com/news/2023/after-8-years-development-nethsm-10-available-first-open-source-hardware-security-module">After 8 Years of Development: NetHSM 1.0 is Available! The First Open Source Hardware Security Module</a></li>
  <li><a href="https://hackaday.com/2023/11/08/an-open-source-ebike-motor-controller/">An Open-Source Ebike Motor Controller</a> by Bryan Cockfield</li>
  <li>
    <p><a href="https://www.apertus.org/axiom-beta">AXIOM Beta</a></p>

    <p>A professional digital cinema camera built around FOSS and open hardware licenses.</p>
  </li>
  <li><a href="https://www.hackster.io/news/eben-upton-hints-at-an-rp2040-successor-promises-a-raspberry-pi-compute-module-5-in-2024-ec331994aca3">Eben Upton Hints at an RP2040 Successor, Promises a Raspberry Pi Compute Module 5 in 2024</a> by Gareth Halfacree</li>
  <li>
    <p><a href="https://www.tindie.com/products/eternalsunshine/hestiapi-one-silent/">HestiaPi ONE (Silent)</a></p>

    <p>An open source smart thermostat that can be connected to your wifi. Control of the thermostat is done using a
  smartphone or with a touch screen.</p>
  </li>
  <li><a href="https://indestructables.private.coffee/Make-LED-Finger-Ring-at-Home/">Make LED Finger Ring at Home</a> by ROBO HUB</li>
  <li><a href="https://9to5linux.com/tuxedo-sirius-16-unveiled-as-tuxedos-first-all-amd-linux-gaming-laptop">TUXEDO Sirius 16 Unveiled as TUXEDO Computers’ First All-AMD Linux Gaming Laptop</a> by Marius Nestor</li>
</ul>

<h2 id="knowledge">Knowledge</h2>

<ul>
  <li><a href="https://www.joshwcomeau.com/css/interactive-guide-to-grid/">An Interactive Guide to CSS Grid</a> by Josh Comeau</li>
  <li><a href="https://klemet.github.io/Workshop-Organization-EN/">Open-source and organization workshop</a> by Clément Hardy</li>
  <li>
    <p><a href="https://github.com/TidierOrg/TidierCourse">Tidier Course</a></p>

    <p>Interactive course materials to learn Tidier data analysis in Julia.</p>
  </li>
  <li><a href="https://www.fosslife.org/understanding-opendocument-format">Understanding the OpenDocument Format</a> by Italo Vignoli</li>
</ul>

<h2 id="misc">Misc</h2>

<ul>
  <li><a href="https://blog.thunderbird.net/2023/11/the-untold-history-of-thunderbird/">An Untold History of Thunderbird</a> by Ryan Sipes</li>
  <li><a href="https://www.shareable.net/artisans-cooperative-an-etsy-alternative-owned-and-run-by-artists-and-makers/">Artisans Cooperative: An Etsy alternative, owned and run by artists and makers</a> (<a href="https://artisans.coop/">website</a>, <a href="https://social.coop/@coopartisans">Mastodon</a>) by Jennifer Foley</li>
  <li><a href="https://www.developing.dev/p/efficient-communication">Efficient Communication</a> by Ryan Peterman</li>
  <li><a href="https://fedoramagazine.org/pipewire-1-0-an-interview-with-pipewire-creator-wim-taymans/">PipeWire 1.0 – An interview with PipeWire creator Wim Taymans</a> by Christian Fredrik Schaller</li>
  <li>
    <p><a href="https://mediahist.org/">Media History Digital Library</a> (Mastodon <a href="https://hcommons.social/@mhdl">@mhdl@hcommons.social</a>)</p>

    <p>A free online resource, featuring millions of pages of books and magazines from the histories of film, broadcasting, and recorded sound.</p>
  </li>
</ul>

<h2 id="news">News</h2>

<ul>
  <li><a href="https://alpinelinux.org/posts/Alpine-3.15.11-3.16.8-3.17.6-3.18.5-released.html">Alpine Linux 3.15.11, 3.16.8, 3.17.6 and 3.18.5 have been released</a></li>
  <li><a href="https://github.com/Donnnno/Arcticons/releases/tag/8.2.0">Articons - 8.2.0 Release - The Renamening</a></li>
  <li><a href="https://forgejo.org/2023-11-release-v1211-0/">Forgejo v1.21 is available</a></li>
  <li><a href="https://www.freebsd.org/releases/14.0R/relnotes/">FreeBSD 14.0-RELEASE Release Notes</a></li>
  <li><a href="https://librearts.org/2023/11/gimp-3-0-roadmap/">GIMP 3.0 finally has a release schedule </a></li>
  <li><a href="https://godotengine.org/article/godot-4-2-arrives-in-style/">Godot 4.2 arrives in style!</a></li>
  <li><a href="https://blog.nightly.mozilla.org/2023/11/02/i-can-has-browser-improvements-these-weeks-in-firefox-issue-148/">I Can :has Browser Improvements – These Weeks in Firefox: Issue 148</a> by Mike Conley</li>
  <li><a href="https://www.theverge.com/2023/11/8/23952928/maine-right-to-repair-law-passed-auto-repair-diagnostics">Maine’s right-to-repair law for cars wins with 84 percent of the vote</a> by  Wes Davis</li>
  <li><a href="https://dcanalysts.net/mastodon-takes-on-the-reply-guys/">Mastodon takes on the “reply guys”</a> by MajorLinux</li>
  <li><a href="https://www.theregister.com/2023/11/28/microsoft_opens_sources_threadx/">Microsoft opens sources ThreadX under MIT license</a> by Liam Proven</li>
  <li><a href="https://blog.documentfoundation.org/blog/2023/11/24/libreoffice-viewer-app-for-android/">More info about LibreOffice Viewer app for Android in the Google Play Store</a> By Italo Vignoli</li>
  <li><a href="https://www.404media.co/omegle-shut-down-offline/">Omegle, the Site That Paired Strangers for Video Chats, Is Dead</a> by Samantha Cole</li>
  <li><a href="https://9to5linux.com/openmandriva-lx-5-0-is-out-as-the-last-kde-plasma-5-release-powered-by-linux-6-6-lts">OpenMandriva Lx 5.0 Is Out as the Last KDE Plasma 5 Release, Powered by Linux 6.6 LTS</a> by Marius Nestor</li>
  <li><a href="https://nextcloud.com/blog/open-source-email-pioneer-roundcube-comes-aboard-nextcloud/">Open source email pioneer Roundcube joins the Nextcloud family</a> by Mikhail Korotaev</li>
  <li><a href="https://organicmaps.app/news/2023-11-22/organic-maps-november-2023-release-with-outdoor-map-style-preview/">Organic Maps November 2023 Release with outdoor map style preview</a></li>
  <li><a href="https://framablog.org/2023/11/28/peertube-v6-is-out-and-powered-by-your-ideas/">PeerTube v6 is out, and powered by your ideas !</a></li>
  <li><a href="https://www.php.net/releases/8.3/">PHP v8.3 Released!</a></li>
  <li><a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/releases/1.0.0">PipeWire first stable release</a></li>
  <li><a href="https://rockylinux.org/news/rocky-linux-8-9-ga-release/">Rocky Linux 8.9 Available Now</a></li>
  <li><a href="https://arstechnica.com/gadgets/2023/11/steve-wozniak-suffers-minor-stroke-in-mexico-city-before-scheduled-talk/">Steve Wozniak suffers minor stroke in Mexico City before scheduled talk</a> by Benj Edwards</li>
  <li><a href="https://thisweek.gnome.org/posts/2023/11/twig-123/">This Week In Gnome: #123 Infrastructure Work</a></li>
  <li><a href="https://pointieststick.com/2023/11/24/this-week-in-kde-the-plasma-6-feature-freeze-approaches/">This week in KDE: the Plasma 6 feature freeze approaches</a></li>
  <li><a href="https://www.gamingonlinux.com/2023/11/xorg-is-dead-long-live-wayland-red-hat-enterprise-linux-rhel-dropping-xorg/">Xorg is dead, long live Wayland - Red Hat Enterprise Linux (RHEL) dropping Xorg</a> by Liam Dawe</li>
  <li><a href="https://www.androidauthority.com/youtube-reportedly-slowing-down-videos-firefox-3387206/">YouTube is reportedly slowing down videos for Firefox users (Update: Statement)</a> by Aamir Siddiqui</li>
</ul>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li>
    <p><a href="https://github.com/Donnnno/Arcticons-Linux">Arcticons Freedesktop Theme</a></p>

    <p>This is an adoption of the arcticons icons for Linux desktop managers like GNOME and KDE.</p>

    <p>Language: Shell, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://gist.sbcloud.cc/sb/a02a14d440c641bc8cc27590e650532f">Cloudflare PHP CLI DNS</a></p>

    <p>A simple PHP CLI script to list zones and list/add/update/delete DNS records.</p>

    <p>Language: PHP, License: Unknown</p>
  </li>
  <li>
    <p><a href="https://github.com/haileys/doslinux">DOS Subsystem for Linux</a></p>

    <p>Run Linux programs on DOS.</p>

    <p>Language: C, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://codeberg.org/grindhold/flohmarkt">flohmarkt</a></p>

    <p>Federated decentral classified ad software using ActivityPub.</p>

    <p>Language: Python, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/FontManager/font-manager">Font Manager</a></p>

    <p>A simple font management application for GTK Desktop Environments.</p>

    <p>Language: C, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/fanzeyi/giblefs">GibleFS</a></p>

    <p>Mapping a Git repository as a virtual filesystem.</p>

    <p>Language: Rust, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/goniszewski/grimoire">Grimoire</a></p>

    <p>Bookmark manager for the wizards.</p>

    <p>Language: Svelte, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/lite-xl/lite-xl">Lite XL</a></p>

    <p>A lightweight text editor.</p>

    <p>Language: Lua, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/laamaa/m8c/">m8c</a></p>

    <p>Cross-platform Dirtywave M8 Tracker headless client.</p>

    <p>Language: C, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/staniel359/muffon">muffon</a></p>

    <p>Advanced multi-source music streaming + discovery client for desktop. Free, clean, no login, no ads.</p>

    <p>Language: Vue, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://codeberg.org/mo8it/oxitraffic">OxiTraffic</a></p>

    <p>Self-hosted, simple and privacy respecting website traffic tracker.</p>

    <p>Language: Rust, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/mbnuqw/sidebery">Sidebery</a></p>

    <p>Firefox extension for managing tabs and bookmarks in sidebar.</p>

    <p>Language: TypeScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/zeldaret/tp">The Legend of Zelda: Twilight Princess</a></p>

    <p>Decompilation of The Legend of Zelda: Twilight Princess (GCN, USA).</p>

    <p>Language: Assembly, License: CC0 1.0 Universal</p>
  </li>
  <li>
    <p><a href="https://github.com/inv2004/ttop">ttop</a></p>

    <p>System monitoring tool with historical data service, triggers and top-like TUI.</p>

    <p>Language: Nim, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/azymohliad/watchmate">Watchmate</a></p>

    <p>PineTime smart watch companion app for Linux phone and desktop</p>

    <p>Language: Rust, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/weewx/weewx">WeeWx</a></p>

    <p>Weather station system is written in Python and runs on Linux, MacOSX, Solaris, and *BSD.</p>

    <p>Language: Python, License: GNU GPL v3.0</p>
  </li>
</ul>

<h2 id="privacy">Privacy</h2>

<ul>
  <li><a href="https://www.eff.org/deeplinks/2023/10/privacy-badger-learns-block-ever-more-trackers">Introducing Badger Swarm: New Project Helps Privacy Badger Block Ever More Trackers</a> by Alexei Miagkov &amp; Daly Barnett</li>
  <li><a href="https://www.heise.de/news/Microsoft-lays-hands-on-login-data-Beware-of-the-new-Outlook-9358925.html">Microsoft lays hands on login data: Beware of the new Outlook</a></li>
</ul>

<h2 id="security">Security</h2>

<ul>
  <li><a href="https://forgejo.org/2023-11-release-v1-20-5-1/">Forgejo Security Release 1.20.5-1</a></li>
  <li><a href="https://forgejo.org/2023-11-release-v1-20-6-0/">Forgejo Security Release 1.20.6-0</a></li>
  <li><a href="https://arstechnica.com/security/2023/11/owncloud-vulnerability-with-a-maximum-10-severity-rating-comes-under-mass-exploitation/">ownCloud vulnerability with maximum 10 severity score comes under “mass” exploitation</a> by Dan Goodin</li>
  <li><a href="https://www.bleepingcomputer.com/news/security/wp-fastest-cache-plugin-bug-exposes-600k-wordpress-sites-to-attacks/">WP Fastest Cache plugin bug exposes 600K WordPress sites to attacks</a> by Bill Toulas</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Enjoy the little bits of discovered creativity for gaming, privacy, open source, security and more in issue number 9 for the month of November 2023.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-9.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-9.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building the Mario Brothers One Brick at a Time</title><link href="https://www.adamsdesk.com/posts/build-mario-brothers-2d-lego-model/" rel="alternate" type="text/html" title="Building the Mario Brothers One Brick at a Time" /><published>2023-12-12T00:00:00-06:00</published><updated>2024-01-14T20:12:20-06:00</updated><id>https://www.adamsdesk.com/posts/build-mario-brothers-2d-lego-model</id><content type="html" xml:base="https://www.adamsdesk.com/posts/build-mario-brothers-2d-lego-model/"><![CDATA[<p>Around 1985 when I was about 7 years old I received my very first Lego set and as the years went by I received more
sets. I have strong memories of spending endless time with my imagination building and creating masterpieces at least
in my mind. One in particular that I recall well is a hockey rink with two goals and hockey sticks built on top of
multiple baseplates (grey 48x48 studs or 38 cm (15”) x 38 cm (15”)). The puck oddly enough was a large marble. You see
the marble rolls well over top of the Lego studs of the baseplate. The main thing I recall was the hockey sticks
breaking and having to rebuild them frequently. I’m not sure why hitting plastic bricks against a glass marble would
cause so much repair (smirk). I’ve never stopped appreciating and loving to build anything out of Lego over the years.
Heck I’m still dreaming of purchasing more kits once I can afford them.</p>

<p>One year I had a dream or idea to build a 2D model of Mario and Luigi from the Mario Bros. video game with my youngest
son. My son and I built Mario, but never did build a 2D Luigi. So I decided even though this would be easy, let’s build
an 2D Luigi. Now I’m not going to keep it that simple. We are in modern times with unbelievable possibilities
I only dreamed of as a child. What I will also do is create the 2D model of Mario and Luigi while improving upon the
structure using a computer-aided design (CAD) software. I’ve never learned CAD before, but I can’t see it being that
hard. After that I will create build instructions and provide all of it for others to build or expand upon.</p>

<h2 id="find-lego-cad-software">Find Lego CAD Software</h2>

<p>First thought I had is to use the LEGO Digital Designer, but found out quickly that it is not open source, and doesn’t
run on Linux and the software has been discontinued. I began my search for an open source computer-aided design (CAD)
solution that would allow me to build Lego. I came across one that piqued my interest called
<a href="https://www.leocad.org/">LeoCAD</a> that allows for creating virtual Lego models. The bonus of this software is it has an
open source license (GNU GPL v2.0) and can be used on the majority of operating systems such as Linux, macOS and
Windows. As well the application can be obtained as a Snap, AppImage or Flatpak. LeoCAD is not new to the market at all
and makes me feel like I’m catching up with lost time since it has been around since 1997. The only unfortunate part I
first noticed was the website lacks fully explaining the software features and capabilities. Thankfully there were some
good screenshots that illustrated a lot of what it was capable of.</p>

<p>I’m sure there is other CAD software to use, but I just went with LeoCAD because it interested me and looked like it
would do exactly what I’m looking for to accomplish the two model builds.</p>

<h2 id="install-leocad">Install LeoCAD</h2>

<p>LeoCAD is quite easy to install since it is widely available. Here are just a few examples of how to install the
software. I chose to go with installing LeoCAD using Arch Linux’s package system.</p>

<p>Here are a few assumptions in the installation examples shown below.</p>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
</ul>

<p><strong>Arch Linux</strong></p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Sy</span> leocad
</code></pre></div></div>

<p><strong>Flatpak</strong></p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>flatpak <span class="nb">install </span>flathub org.leocad.LeoCAD
</code></pre></div></div>

<p><strong>Debian</strong></p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>apt-get <span class="nb">install </span>leocad
</code></pre></div></div>

<p><strong>Snap</strong></p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>snap <span class="nb">install </span>leocad
</code></pre></div></div>

<h2 id="building-the-lego-models">Building The Lego Models</h2>

<p>I launched LeoCAD and was presented with a virtual workspace to build a model and a side panel to access parts,
properties, timeline, part preview and a color palette. I quickly began to play around with the parts list to locate my
first brick to build a 2D Mario. Parts are located by type and keyword search. It is a dream to have endless parts
available to me. Each part can be dragged onto the workspace to the desired location. The color of a part can be chosen
before or after it has been added to the workspace. I proceeded to add part by part, and before I knew it I had the
model built. At this point I realized that I could organize the parts into steps within the timeline. As a result this
caused more work than necessary if I would have just done this from the start. The advantage of organizing parts into
steps is that you can now generate model build instructions to be printed as a hard copy or PDF (portable document
format). With this model completed I duplicated the file and modified the color scheme to match Luigi. The color
schemes used for each model were chosen to give an old nostalgic look at the same time using more common colors one
would have on hand.</p>

<p><img src="/assets/img/posts/leocad-2d-mario-screenshot.webp" alt="A screenshot of the LeoCAD application using the dark theme with the Mario 2D Lego model loaded." width="540" height="460" loading="lazy" class="img-fluid m-2" />
<img src="/assets/img/posts/leocad-2d-luigi-screenshot.webp" alt="A screenshot of the LeoCAD application using the dark theme with the Luigi 2D Lego model loaded." width="540" height="460" loading="lazy" class="img-fluid m-2" /></p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>Overall I’m impressed with how easy this was and honestly how this can lead to endless creativity. The LeoCAD
interface is quite intuitive to use, and I love how wonderful it is to quickly locate parts. The only area that I never
did figure out is why the build instructions when printed to PDF is so pixelated/blurry and have a border on the page.
The regular print mode outputs beautifully, but lacks the steps numbers with parts list. In the end I enjoyed this
adventure and who knows there maybe more models to come.</p>

<p>Here are the build instructions, model files and parts lists.</p>

<ul>
  <li><a href="/assets/mario-2d-lego-build-instructions.pdf">Build instructions for 2D Mario</a> (pdf)</li>
  <li><a href="/assets/luigi-2d-lego-build-instructions.pdf">Build instructions for 2D Luigi</a> (pdf)</li>
  <li><a href="/assets/mario-2d-lego-model.ldr">Model file for 2D Mario</a> (ldr)</li>
  <li><a href="/assets/luigi-2d-lego-model.ldr">Model file for 2D Luigi</a> (ldr)</li>
  <li><a href="/assets/mario-2d-lego-model-parts-list.csv">Parts list for 2D Mario</a> (csv)</li>
  <li><a href="/assets/luigi-2d-lego-model-parts-list.csv">Parts list for 2D Luigi</a> (csv)</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[How I built 2D virtual Lego models and build instructions of the Mario Brothers one brick at a time with the use of computer-aided design software.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/build-mario-brothers-2d-lego-model.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/build-mario-brothers-2d-lego-model.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Farewell to The Privacy, Security, and OSINT Show</title><link href="https://www.adamsdesk.com/posts/farewell-privacy-security-and-osint-show/" rel="alternate" type="text/html" title="Farewell to The Privacy, Security, and OSINT Show" /><published>2023-12-05T00:00:00-06:00</published><updated>2023-12-16T18:02:35-06:00</updated><id>https://www.adamsdesk.com/posts/farewell-privacy-security-and-osint-show</id><content type="html" xml:base="https://www.adamsdesk.com/posts/farewell-privacy-security-and-osint-show/"><![CDATA[<p>Finding quality technology podcasts let alone one that covers privacy, security and open-source intelligence (OSINT) to
me is challenging. The one I’ve really enjoyed the most is The Privacy, Security, and OSINT Show with Michael Bazzell. I
never missed an episode and always looked forward to listening to the next one. I noticed the show was no longer
releasing episodes as usual and became concerned, but thought to myself the show is on a break or will return once work
load reduces. As time passed I finally discovered what truly was going on, a series of unforeseen events that lead to
this conclusion.</p>

<h2 id="the-podcast-farewell">The Podcast Farewell</h2>

<p>The last episode that showed up in my feed via AtennaPod was September 8th, 2023 - “305-Revisiting VPNs &amp; Firewalls”.
Then on September 22, 2023 I received a new episode entitled “Intermission” that seem to confirm to me that the show
would return. I later found out that the last full episode was on September 22th, 2023 called “306-Six New Privacy
Strategies” which I never ended up receiving. So I’m not sure if this episode was ever released or not. However, reality
hit home when a farewell episode was released on November 20th, 2023 entitled
“<a href="https://inteltechniques.com/blog/2023/11/20/my-irish-exit/">My Irish Exit</a>”. It was finally officially confirmed that
the podcast has reached an end. I cannot tell you how disappointed I was. I get it, Michael and his team have many other
things to focus on. In the end Michael took a vacation and realized from being unplugged from everything how much time
the podcast, blogs, and constant communications were eating up his life. Then on top of that the podcast hosting
provider refused to allow a renewal of the subscription. As an outsider I took this as I no longer want
to put time into doing the podcast and I want to focus on what matters most. So the podcast was cancelled.</p>

<h2 id="the-podcast-archives">The Podcast Archives</h2>

<p>The biggest issue was the unfortunate situation with the podcast hosting provider, SoundCloud. I don’t know the entire
story behind it, but ultimately the podcast archives were removed. SoundCloud refused to allow them to renew the annual
subscription, and they dropped the account to the free tier. As a result this prevents being able to offer old episodes
on this platform and causes all other podcast apps and services that were updated from this feed to no longer be able
to download an episode. The archives could have been hosted else where, but as reported by Michael he didn’t see the
point.</p>

<p>I myself usually keep old episodes, but for some reason I never got around to archiving this podcast. Now I really wish
I had. Michael has his reasons and I respect that, but I feel for the listeners.</p>

<h2 id="unredacted-magazine">UNREDACTED Magazine</h2>

<p>Another area that Michael Bazzell produces with his team is an amazing magazine called
“<a href="https://inteltechniques.com/magazine.html">UNREDACTED</a>” which also is all about privacy, security and
open-source intelligence (OSINT). Unfortunately there has not been a new issue since January, 2023. My understanding is
the magazine comes out every quarter. This reason I mention all this is because I’ve not found any information on the
status of this magazine including the farewell message. Has this to been discontinued? It is again another amazing
resource that honestly I would even be willing to pay for. Hopefully we will learn soon what is happening.</p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>Everything has a life span and at some point will cease to exist. It is hard at times to accept this. I feel though this
is just unfortunate as both the podcast and the magazine just was getting to a point of maturity with huge
potential at least from my own perspective. It was a very enjoyable and insightful podcast that will be greatly missed
by I’m sure many more than just me. We can only hope that something will change, and these wonderful resources will
return. I do wish and thank Michael and his team for the wonderful work they have done and continue to do.</p>

<p>I should be clear to mention that it’s not as if all things have stopped. Training, services, and books are still
available for purchase. For those that cannot afford these, there is always the free tools, resources and blog posts all
provided via <a href="https://inteltechniques.com/">inteltechniques.com</a> website.</p>

<p>Does anyone have podcast recommendations that cover the topics of privacy, security, and OSINT? Please let me know
by leaving a comment.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Find out why a series of events leads to the end of the insightful and enjoyable podcast The Privacy, Security, and OSINT Show that fans will dearly miss.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/farewell-privacy-security-osint-show-podcast.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/farewell-privacy-security-osint-show-podcast.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What’s New for Mozilla Firefox Release 120.0</title><link href="https://www.adamsdesk.com/posts/mozilla-firefox-whats-new-120/" rel="alternate" type="text/html" title="What’s New for Mozilla Firefox Release 120.0" /><published>2023-11-27T00:00:00-06:00</published><updated>2023-11-27T18:21:49-06:00</updated><id>https://www.adamsdesk.com/posts/mozilla-firefox-whats-new-120</id><content type="html" xml:base="https://www.adamsdesk.com/posts/mozilla-firefox-whats-new-120/"><![CDATA[<p>The Mozilla team has released version 120.0 of Firefox on November 21, 2023 that is packed with more privacy and
security fixes that I feel should improve ones own web browsing experience. I’ve been using the gecko based web browser
since it’s inception back in the Netscape days and have for the most part enjoyed keeping up with exciting new changes.
Over years though I’ve fallen behind due to the explosion of technology growth, but I’m determined to do my best so
let’s take a dive into what’s new.</p>

<h2 id="whats-new-for-end-users">What’s New for End Users</h2>

<ul>
  <li>
    <p>URL Query Parameter Stripping</p>

    <p>The context menu gets a new feature by right-clicking on a link and clicking on “Copy Link Without Tracking”.
  When used this will remove those pesky <a href="/posts/remove-tracking-parameters/">tracking query parameters</a>
  that are often found to be used for tracking purposes.</p>

    <p>Currently, this is only enabled under the Strict security mode setting or when in private mode.</p>
  </li>
  <li>
    <p>Global Privacy Control Support</p>

    <p>A new op-in feature to inform websites the user doesn’t wish their data to be shared or sold. While using private
  browsing this feature is enabled by default. The <a href="https://globalprivacycontrol.org/">Global Privacy Control</a> is
  located within “Preferences” &gt; “Privacy &amp; Security” &gt; “Website Privacy Preferences”. Two options can be turned on,
  <a href="https://support.mozilla.org/en-US/kb/global-privacy-control">“Tell websites not to sell or share my data”</a> and
  <a href="https://support.mozilla.org/en-US/kb/how-do-i-turn-do-not-track-feature?as=u&amp;utm_source=inproduct">“Send websites a “Do Not Track” request”</a>.</p>
  </li>
  <li>
    <p>Anti-Fingerprinting Technology Enhancements</p>

    <p>When using a private mode or <a href="https://support.mozilla.org/en-US/kb/enhanced-tracking-protection-firefox-desktop">enhanced tracking protection</a>
  (ETP) strict mode configuration has enhanced the HTML Canvas APIs (application programming interfaces) with
  <a href="https://www.mozilla.org/en-US/firefox/features/block-fingerprinting/">fingerprinting protection</a>.</p>
  </li>
  <li>
    <p>Cookie Banner Blocking</p>

    <p>By default, while in private mode it will automatically refuse cookies and dismiss annoying cookie banners for
  supported sites. This is achieved by using two method, injecting an “opt-out” cookie when possible or automatically
  clicks on the decline or reject option that mimics the behaviour done manually. If you what to know the exact
  details on how this is all done, take a look at the <a href="https://github.com/mozilla/cookie-banner-rules-list">Cookie Banner Rule List</a>
  repository.</p>

    <p>Unfortunately at this time the feature is only available to Germany residents. Learn more about
  <a href="https://support.mozilla.org/en-US/kb/cookie-banner-reduction">block cookie banners on Firefox</a>.</p>
  </li>
  <li>
    <p>Import TLS Certificates</p>

    <p>TLS (Transport Layer Security) certificates (trust anchors) from the operating system root store will now be
  imported by default on Windows, macOS, and Android. This feature can be disabled if desired under “Preferences” &gt;
  “Privacy &amp; Security” &gt; “Certificates”.</p>
  </li>
  <li>
    <p>Keyboard Shortcuts for Logins</p>

    <p>Keyboard shortcuts have been added for editing and deleting selected credentials within the “about:logins” screen.
  Editing can be achieved by pressing <kbd>Alt</kbd> + <kbd>Enter</kbd> (<kbd>Option</kbd> + <kbd>return</kbd> on macOS)
  and deleting by pressing <kbd>Alt</kbd> + <kbd>Backspace</kbd> (<kbd>Option</kbd> + <kbd>Delete</kbd> on macOS).</p>
  </li>
  <li>
    <p>Import from Chromium</p>

    <p>Users of Ubuntu Linux now have the ability to import from Chromium when both Firefox and Chromium are installed as
  Snap packages.</p>
  </li>
  <li>
    <p>Picture-in-Picture</p>

    <p>On Windows and Linux operating systems Picture-in-Picture now supports corner snapping by holding the
  <kbd>Ctrl</kbd> key while moving the Picture-in-Picture window.</p>
  </li>
</ul>

<h2 id="security-fixes">Security Fixes</h2>

<p>A total of 10 common vulnerabilities and exposures (CVEs) have been fixed. The details of each one can be reviewed by
reading <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2023-49/">Security Vulnerabilities fixed in Firefox 120</a>.</p>

<h2 id="whats-new-for-enterprise">What’s New for Enterprise</h2>

<p>All policies changes apply to <a href="https://support.mozilla.org/en-US/kb/firefox-enterprise-120-release-notes">Firefox ESR</a>
version 120 and version 115.5.</p>

<ul>
  <li>Disable printing with <a href="https://mozilla.github.io/policy-templates/#printingenabled">PrintingEnabled</a></li>
  <li>Set <a href="https://mozilla.github.io/policy-templates/#preferences">Preferences</a> that have a prefix of <code class="language-plaintext highlighter-rouge">pref</code></li>
</ul>

<h2 id="whats-new-for-developers">What’s New for Developers</h2>

<p>For those interested, there is a list of changes that affects web developers,
<a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/120">Firefox 120 for developers</a></p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I’m excited and pleased to see further steps have been taken to help protect the end user with good defaults and
allowing the user to have the power to control what they desire. I automatically remove
<a href="/posts/remove-tracking-parameters/">tracking query parameters</a> and have for some time thanks to uBlock
Origin custom filters, so I will be not affected by the new copy link feature. Once testing is done in Germany, hopefully
we will see the Cookie Banner Blocker. The cookie banner is the worst idea from a user’s experience, and this solution
should make it easy for most users to improve their own browsing experience. One other feature I do believe I will enjoy
is the Picture-in-Picture corner snapping, I will see how this goes once I have more time to use it. Overall I feel this
is all good news. Happy browsing!</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Explore and discover the latest changes for Mozilla Firefox release version 120.0 covering changes for end users, enterprise and developers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mozilla-firefox-whats-new-120.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mozilla-firefox-whats-new-120.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover The Fediverse: Open Source (October 2023)</title><link href="https://www.adamsdesk.com/posts/fediverse-open-source-october-2023/" rel="alternate" type="text/html" title="Discover The Fediverse: Open Source (October 2023)" /><published>2023-11-26T00:00:00-06:00</published><updated>2023-12-14T19:40:15-06:00</updated><id>https://www.adamsdesk.com/posts/fediverse-open-source-october-2023</id><content type="html" xml:base="https://www.adamsdesk.com/posts/fediverse-open-source-october-2023/"><![CDATA[<p>In the pursuit to promote awareness for software freedom by using free open source software I came up with an idea
to make a post on the Fediverse each week for Follow Friday that showcases four open source based Fediverse accounts to
help people with discovery of accounts to follow. So far there has been 26 posts made to date with a total of 17
already drafted up for the upcoming weeks. Thus far these posts have been quite successful and seem to be growing in
popularity each week.</p>

<p>With the Fediverse being such a large place, it is easy to get lost amongst it. To broaden the exposure further I’ve
wanted to have these posts on my website, but I couldn’t figure out what to call it and how to organize it all.
Thanks to my wonderful dear readers and followers on Mastodon a poll was done to determine the name of these posts. The
result came back with 39% of voters choosing “Discover The Fediverse: &lt;subtitle-here&gt;”. With the title chosen it is
now up to me to figure out how to organize it all into a website post. I’m trying to keep it simple, but adding a little
extra verbosity. Without further ado, here is the first website post of the posts I’ve made in the month of October 2023
organized by the week number along with the image I created.</p>

<p><img src="/assets/img/posts/mastodon-poll-follow-friday-post-title.webp" alt="Screenshot of a Mastodon poll results on choosing a title for the weekly Follow Friday post for open source discovery." width="540" height="446" loading="lazy" class="img-fluid" /></p>

<h2 id="software-freedom-week-40">Software Freedom (week 40)</h2>

<p><img src="/assets/img/posts/discover-the-fediverse-week-40-2023.webp" alt="A woman stands next to a tree with arms held up in the air absorbing the autumn sun beaming over the landscape to embrace and celebrate the joys of software freedom to run, copy, distribute, study and modify." width="540" height="540" class="img-fluid" /></p>

<p>Support Software Freedom to, run, copy, distribute, study and modify for Follow Friday on the Fediverse with a boost and follows!</p>

<ul>
  <li>
    <p><a href="https://snikket.org/">Snikket</a> (<a href="https://fosstodon.org/@snikket_im">@snikket_im@fosstodon.org</a>)</p>

    <p>Easy-to-use privacy-friendly XMPP (Extensible Messaging and Presence Protocol) messaging platform.</p>
  </li>
  <li>
    <p><a href="https://github.com/NickColley/semaphore">Semaphore</a> (<a href="https://fosstodon.org/@semaphore">@semaphore@fosstodon.org</a>)</p>

    <p>Accessible, simple and fast web client for Mastodon.</p>
  </li>
  <li>
    <p><a href="https://github.com/pulsar-edit/pulsar">Pulsar Edit</a> (<a href="https://fosstodon.org/@pulsaredit">@pulsaredit@fosstodon.org</a>)</p>

    <p>Community-led hyper-hackable text editor forked from the discontinued <a href="https://www.adamsdesk.com/posts/atom-text-editor-project-ends/">Atom text editor</a>.</p>

    <p>For more information consider reading my <a href="https://www.adamsdesk.com/posts/pulsar-project-text-editor/">review</a>.</p>
  </li>
  <li>
    <p><a href="https://github.com/altstoreio/AltStore">AltStore</a> (<a href="https://fosstodon.org/@altstore">@altstore@fosstodon.org</a>)</p>

    <p>A home for apps that push the boundaries of iOS, no jailbreak required.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li><a href="https://pixabay.com/illustrations/landscape-illustration-fall-woman-4572804/">Background</a> by aalmeidah</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, add text, add vertical line</li>
</ul>

<h2 id="software-freedom-movement-week-41">Software Freedom Movement (week 41)</h2>

<p><img src="/assets/img/posts/discover-the-fediverse-week-41-2023.webp" alt="An autumn scene at dust with stars in the sky, a field of grass with one tree loosing its leaves gravitate toward a person running in the fresh air of freedom movement." width="540" height="540" class="img-fluid" loading="lazy" /></p>

<p>Keep the Software Freedom movement going with a boost and follows on Follow Friday for Open Source on the Fediverse!</p>

<ul>
  <li>
    <p><a href="https://github.com/scummvm/scummvm">ScummVM</a> (<a href="https://corteximplant.com/@scummvm">@scummvm@corteximplant.com</a>)</p>

    <p>Run classic graphical point-and-click adventure games and RPGs (role-playing games).</p>
  </li>
  <li>
    <p><a href="https://podman.io/">Podman</a> (<a href="https://fosstodon.org/@Podman_io">@Podman_io@fosstodon.org</a>)</p>

    <p>Manage containers, pods, and images from your local environment.</p>
  </li>
  <li>
    <p><a href="https://github.com/zulip/zulip">Zulip</a> (<a href="https://fosstodon.org/@zulip">@zulip@fosstodon.org </a>)</p>

    <p>Team chat designed to help people collaborate.</p>
  </li>
  <li>
    <p><a href="https://www.yoctoproject.org/">Yocto Project</a> (<a href="https://fosstodon.org/@yoctoproject">@yoctoproject@fosstodon.org </a>)</p>

    <p>Improve software development process for embedded Linux distributions.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li><a href="https://pixabay.com/illustrations/landscape-moon-moonlight-night-4119365/">Background</a> by aalmeidah</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, crop, add text, add vertical line, add background</li>
</ul>

<h2 id="open-source-game-development-week-42">Open Source Game Development (week 42)</h2>

<p><img src="/assets/img/posts/discover-the-fediverse-week-42-2023.webp" alt="A top overview background of rainbow colored blocks of varying heights with a game controller cord dividing text. The left side text says, build games with software freedom. The right side says, run, copy, distribute, study and modify. Bottom right corner of text says, support open source software." width="540" height="540" class="img-fluid" loading="lazy" /></p>

<p>Support Open Source game development for this Follow Friday on the Fediverse with a boost and follows!</p>

<ul>
  <li>
    <p><a href="https://github.com/le-doux/bitsy">bitsy</a> (<a href="https://digipres.club/@bitsy">@bitsy@digipres.club</a>)</p>

    <p>A little engine for little games, worlds, and stories.</p>
  </li>
  <li>
    <p><a href="https://www.solarus-games.org/">Solarus</a> (<a href="https://mastodon.gamedev.place/@solarus">@solarus@mastodon.gamedev.place</a>)</p>

    <p>2D RPG (role-playing game) engine for Linux, Mac, Windows, Switch.</p>
  </li>
  <li>
    <p><a href="https://www.minetest.net/">Minetest</a> (<a href="https://fosstodon.org/@Minetest">@Minetest@fosstodon.org</a>)</p>

    <p>A voxel game engine with Minecraft style graphics by default.</p>
  </li>
  <li>
    <p><a href="https://www.stride3d.net/">Stride</a> (<a href="https://mastodon.gamedev.place/@xenko">@xenko@mastodon.gamedev.place </a>)</p>

    <p>A modern open-source cross-platform game engine written in C#.</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/illustrations/blocks-rainbow-lego-pattern-5992280/">Background</a> by Egonetix_xyz</li>
  <li><a href="https://pixabay.com/vectors/nes-nintendo-mario-computer-game-5213859/">Game controller</a> by everesd_design</li>
  <li><a href="https://www.theleagueofmoveabletype.com/th">The Neue Black</a> font by Tré Seals</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, crop, add text, add line, add background</li>
</ul>

<h2 id="join-the-ride-week-43">Join The Ride (week 43)</h2>

<p><img src="/assets/img/posts/discover-the-fediverse-week-43-2023.webp" alt="The horizon is filled with mountains as two people travel in a van with their heads sticking out the windows smiling as they enjoy software freedom. Text above the van reads, Join the ride for software freedom. The van license plate reads, #OpenSource." width="540" height="540" class="img-fluid" loading="lazy" /></p>

<p>Join the ride on this Follow Friday by creating awareness and support for Software Freedom by providing a boost and follows for Open Source on the Fediverse!</p>

<ul>
  <li>
    <p><a href="https://chocolatey.org/">Chocolatey Software</a> (<a href="https://fosstodon.org/@chocolatey">@chocolatey@fosstodon.org </a>)</p>

    <p>The package manager for Windows.</p>
  </li>
  <li>
    <p><a href="https://pods.io/">Pods Framework</a> (<a href="https://fosstodon.org/@pods">@pods@fosstodon.org</a>)</p>

    <p>A content development framework for WordPress.</p>
  </li>
  <li>
    <p><a href="https://peppermintos.com/">PeppermintOS</a> (<a href="https://fosstodon.org/@peppermintos">@peppermintos@fosstodon.org</a>)</p>

    <p>A Linux operating system with low hardware resources.</p>
  </li>
  <li>
    <p><a href="https://qgis.org/">QGIS</a> (<a href="https://fosstodon.org/@qgis">@qgis@fosstodon.org</a>)</p>

    <p>A user-friendly geographic information system (GIS).</p>
  </li>
</ul>

<p>Image credits…</p>

<ul>
  <li><a href="https://pixabay.com/vectors/road-trip-couple-van-travel-4399206/">Van scene</a> by dapple-designers</li>
  <li><a href="https://www.fontsquirrel.com/fonts/fira-sans">Fira Sans</a> font by Mozilla</li>
  <li>Modified in <a href="https://inkscape.org/">Inkscape</a></li>
  <li>Modifications: Resize, crop, add text, add line</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="fediverse" /><summary type="html"><![CDATA[Discover the fediverse in the space of free open source software as you uncover these gems of curated accounts that embrace software freedom.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-october-2023.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/discover-the-fediverse-open-source-october-2023.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #8</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-8/" rel="alternate" type="text/html" title="Little Bits: Issue #8" /><published>2023-11-24T00:00:00-06:00</published><updated>2023-11-24T15:25:59-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-8</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-8/"><![CDATA[<p>Another month has past and here we are again with this mega load of little bits I’ve read. I still cannot get over the
fact of how much I’m consuming in only a month. Not sure if I should be taking this as it is or if I should be
reflecting on this fact that I need to reduce. Though when I sit to think about you the dear reader, I wonder if this is
even of any value to people and just makes you overwhelmed. Maybe I should change from monthly to weekly or even turn
this into a newsletter instead of blog posts. I’m not sure what to do, but in either case I guess I will eventually figure
this out. What are your thoughts?</p>

<h2 id="art">Art</h2>

<ul>
  <li><a href="https://www.hypertalking.com/2023/05/08/1-bit-pixel-art-of-hokusais-the-great-wave-off-kanagawa/">1-bit Hokusai’s “The Great Wave”</a> by James Weiner</li>
  <li><a href="https://www.gutenberg.org/ebooks/author/738">Bird and Flower Books</a> by Neltje Blanchan</li>
  <li><a href="https://graphicpolicy.com/2023/10/06/nycc-2023-sup-inc-launches-its-public-domain-sci-fi-universe-blitmap-with-every-comic-cover-being-a-variant/">NYCC 2023: Sup Inc launches its “public domain” sci-fi universe BLITMAP with every comic cover being a variant</a></li>
  <li><a href="https://www.inprnt.com/gallery/6vcr/traffic-light/">Traffic light</a> by 6VCR</li>
  <li><a href="https://www.inprnt.com/gallery/6vcr/05/">Train</a> by 6VCR</li>
</ul>

<h2 id="books--magazines">Books / Magazines</h2>

<ul>
  <li><a href="https://direct.mit.edu/books/oa-monograph/5589/Art-DIY-Electronics">Art + DIY Electronics</a> by Garnet Hertz</li>
  <li><a href="https://pragprog.com/titles/vbfoss/business-success-with-open-source/">Business Success with Open Source</a> by VM (Vicky) Brasseur</li>
  <li><a href="https://communicationpatternsbook.com/">Communication Patterns</a> (O’Reilly) by Jacqui Read</li>
  <li><a href="https://pragprog.com/titles/vbopens/forge-your-future-with-open-source/">Forge Your Future with Open Source</a> by VM (Vicky) Brasseur</li>
  <li>
    <p><a href="https://www.lightspeedmagazine.com/">Lightspeed Magazine</a></p>

    <p>A digital science fiction and fantasy magazine.</p>
  </li>
  <li><a href="https://nantucketebooks.com/ebooks/quarterup/quarterup_2023_q3/">Quarter Up! Volume II Fall 2023</a></li>
  <li><a href="https://magpi.raspberrypi.com/books/handbook-2024">The Official Raspberry Pi Handbook 2024</a></li>
  <li><a href="https://solar.lowtechmagazine.com/2023/08/thematic-books-series/">Thematic Book Series: How to Build a Low-tech Internet?</a> by Kris De Decker</li>
</ul>

<h2 id="blog">Blog</h2>

<ul>
  <li><a href="https://kevquirk.com/thing-is-the-worst-word-in-the-english-language">“Thing” Is the Worst Word in the English Language</a> by Kev Quirk</li>
  <li><a href="https://www.dwarmstrong.org/haw-34/">#34. My Desktop Astronomy OS: LMDE 6</a> by Daniel Wayne Armstrong</li>
  <li><a href="https://kevquirk.com/a-year-at-the-smallholding">A Year at the Smallholding</a> by Kev Quirk</li>
  <li><a href="https://kevquirk.com/absolutely-do-not-change-your-blogging-platform">Absolutely Do Not Change Your Blogging Platform</a> by Kev Quirk</li>
  <li><a href="https://joelchrono.xyz/blog/ama-responses-1">AMA Responses 1</a> by Joel</li>
  <li><a href="https://hjr265.me/blog/are-there-three-types-of-100daystooffload-challengers/">Are There Three Types of #100DaysToOffload Challengers?</a> by Mahmud Ridwan</li>
  <li><a href="https://benjaminhollon.com/musings/audio-postcard-the-msc/">audio postcard: the MSC</a> by Benjamin Hollon</li>
  <li><a href="https://kevquirk.com/blogging-for-the-hell-of-it">Blogging for the Hell of it</a> by Kev Quirk</li>
  <li><a href="https://kevquirk.com/blogs-gardens-and-thinking-aloud-in-public">Blogs, Gardens, and Thinking Aloud in Public</a> by Kev Quirk</li>
  <li><a href="https://creativegood.com/blog/23/25-years-of-newsletter.html">Celebrating 25 years of this newsletter – and an announcement</a> by Mark Hurst</li>
  <li><a href="https://barf.bt.ht/cleanup/">Cleaning Up barf’s Structure</a> by Bradley Taunt</li>
  <li><a href="https://baty.net/posts/2023/10/considering-only-shooting-film">Considering film (only)</a> by Jack Baty</li>
  <li><a href="https://claytonerrington.com/blog/creating-status-pages-on-the-fly">Creating Status Pages on the Fly</a> by Clayton Errington</li>
  <li><a href="https://garrit.xyz/posts/2023-10-10-did-you-try-turning-it-off">Did you try turning it off?</a> by Garrit Franke</li>
  <li><a href="https://garrit.xyz/posts/2023-10-09-field-notes-2">Field Notes #2</a> by Garrit Franke</li>
  <li><a href="https://claytonerrington.com/blog/file-encryption-with-gpg">File Encryption with GPG</a> by Clayton Errington</li>
  <li><a href="https://kevquirk.com/friends-from-blogging">Friends from Blogging</a> by Kev Quirk</li>
  <li><a href="https://kevquirk.com/having-a-microblog-on-a-traditional-blog">Having a Microblog on a Traditional Blog</a> by Kev Quirk</li>
  <li><a href="https://claytonerrington.com/blog/hosting-freshrss-on-fly-io">Hosting FreshRSS on Fly.io</a> by Clayton Errington</li>
  <li><a href="https://sheepdev.xyz/blog/how-i-organize-my-life/">How I Organize My Life</a> by Sheep</li>
  <li><a href="https://www.softwaremaxims.com/blog/not-a-supplier">I am not a supplier</a> by Thomas Depierre</li>
  <li><a href="https://cabel.com/2023/10/12/i-just-really-dont-like-automated-phone-systems/">I Just Really Don’t Like Automated Phone Systems</a> by Cabel Sasser</li>
  <li><a href="https://kevquirk.com/im-too-addicted-to-my-iphone">I’m Too Addicted to My iPhone</a> by Kev Quirk</li>
  <li><a href="https://baty.net/2023/images-in-hugo-rss-feeds/">Images in Hugo RSS feeds</a> by Jack Baty</li>
  <li><a href="https://taonaw.com/2023/10/17/important-factors-for.html">Important factors for journaling</a> by JTR</li>
  <li><a href="https://sheepdev.xyz/blog/its-been-a-long-time/">It’s Been A Long Time</a> by Sheep</li>
  <li><a href="https://joelchrono.xyz/blog/just-start-blogging/">Just start blogging</a> by Joel</li>
  <li><a href="https://www.kytta.dev/blog/language-on-mastodon/">Language on Mastodon</a> by Nikita</li>
  <li><a href="https://82mhz.net/posts/2023/10/living-in-the-technological-past/">Living in the (technological) past</a> by Andreas</li>
  <li><a href="https://joelchrono.xyz/blog/lossy-memory/">Lossy Memory</a> by Joel</li>
  <li><a href="https://hjr265.me/blog/mattermost-or-slack-message-on-ssh-login/">Mattermost (or Slack) Message on SSH Login</a> by Mahmud Ridwan</li>
  <li><a href="https://kevquirk.com/migrating-this-blog-to-kirby">Migrating This Blog to Kirby</a> by Kev Quirk</li>
  <li><a href="https://sheepdev.xyz/blog/music-platforms/">Music Platforms</a> by Sheep</li>
  <li><a href="https://orbitalmartian.codeberg.page/blog/posts/my-brain-is-a-messy-desk.html">My Brain Is A Messy Desk</a> by OrbitalMartian</li>
  <li><a href="https://kevquirk.com/my-first-wet-shave-in-15-years">My First Wet Shave in 15 Years</a> by Kev Quirk</li>
  <li><a href="https://claytonerrington.com/blog/my-linux-journey/">My Linux Journey</a> by Clayton Errington</li>
  <li><a href="https://baty.net/posts/2023/10/my-paper-journal-slash-scrapbook">My paper journal slash scrapbook</a> by Jack Baty</li>
  <li><a href="https://claytonerrington.com/blog/network-usage-since-last-boot">Network Usage Since Last Boot</a> by Clayton Errington</li>
  <li><a href="https://taonaw.com/2023/10/06/new-desktop-apps.html">New Desktop Apps I’m Enjoying Recently</a> by JTR</li>
  <li><a href="https://0xdstn.site/thoughts/nextcloud-music/">Nextcloud Music</a> by Dustin</li>
  <li><a href="https://joelchrono.xyz/blog/nintendo-switch">Nintendo Switch</a> by Joel</li>
  <li><a href="https://nathanupchurch.com/blog/offline/">Offline</a> by Nathan Upchurch</li>
  <li><a href="https://garrit.xyz/posts/2023-10-13-organizing-multiple-git-identities">Organizing multiple Git identities</a> by Garrit Franke</li>
  <li><a href="https://scottk.mba/personal-automations/">Personal Automations</a> bu Scott Knight</li>
  <li><a href="https://paste.sr.ht/~sircmpwn/d707b946bab8e05b23f4294633668b708b411ddd">Response to Kev’s “Use Plaintext Email”</a> by Drew DeVault</li>
  <li><a href="https://claytonerrington.com/blog/robots-and-ai">Robots and AI</a> by Clayton Errington</li>
  <li><a href="https://wandy.dev/posts/2023-09-21-scams-cults-and-kernels">Scams, cults, and kernels: A look back on waiting for the Librem 5</a> by Andy</li>
  <li><a href="https://artemis.sh/2023/10/12/scrollbars.html">Scrollbars are becoming a problem</a> by Artemis Everfree</li>
  <li><a href="https://joelchrono.xyz/blog/september-2023-summary/">September 2023 Summary</a> by Joel</li>
  <li><a href="https://lazybear.io/posts/september-2023/">September 2023</a> by Hyde</li>
  <li><a href="https://daverupert.com/2023/10/accessiblity-shamed/">So you’ve been publicly accessibility-shamed</a> by Dave Rupert</li>
  <li><a href="https://kevquirk.com/some-of-my-favourite-fonts">Some of My Favourite Fonts</a> by Kev Quirk</li>
  <li><a href="https://luroapp.com/posts/sources-of-truth/">Sources of Truth</a> by Dave Rupert</li>
  <li><a href="https://blog.ohheybrian.com/2023/10/staying-organized-as-a-teacher/">Staying Organized as a Teacher</a> by Brian Bennett</li>
  <li><a href="https://mcormond.blogspot.com/2023/10/canadiana.org.html">Still spinning? My time at Canadiana.org prior to the CRKN merger</a> by Russell McOrmond</li>
  <li><a href="https://joelchrono.xyz/blog/still-using-gboard">Still using Gboard</a> by Joel</li>
  <li><a href="https://werd.io/2023/subscribing-to-the-blogs-of-people-i-follow-on-mastodon">Subscribing to the blogs of people I follow on Mastodon</a> by Ben Werdmuller</li>
  <li><a href="https://www.brycewray.com/posts/2023/10/big-rebundle/">The big rebundle</a> by Bryce Wray</li>
  <li><a href="https://baty.net/posts/2023/10/the-kirby-experiment-so-far">The Kirby Experiment so far</a> by Jack Baty</li>
  <li><a href="https://garrit.xyz/posts/2023-10-01-the-mind-rope-experiment">The Mind Rope Experiment</a> by Garrit Franke</li>
  <li><a href="https://ctmiller.net/2023/10/25/the-old-man.html">The Old Man is Down The Road</a> by Chris Miller</li>
  <li><a href="https://moddedbear.com/the-pc-build/">The PC Build</a> by Jeremy</li>
  <li><a href="https://blog.ohheybrian.com/2023/10/the-phone-counter/">The Phone Counter</a> by Brian Bennett</li>
  <li><a href="https://joelchrono.xyz/blog/this-week-so-far">This week so far…</a> by Joel</li>
  <li><a href="https://joelchrono.xyz/blog/trying-to-organize-audiobooks/">Trying to organize audiobooks</a> by Joel</li>
  <li><a href="https://kevquirk.com/using-chatgpt-to-write-code">Using ChatGPT to Write Code</a> by Kev Quirk</li>
  <li><a href="https://82mhz.net/posts/2023/10/using-two-usb-sticks-as-a-raid-on-a-raspberry-pi/">Using two USB Sticks as a Raid on a Raspberry Pi</a> by Andreas</li>
  <li><a href="https://whiona.weblog.lol/2023/10/what-happened-to-blogging-for-the-hell-of-it">What happened to blogging for the hell of it?</a> by Whiona</li>
  <li><a href="https://sheepdev.xyz/blog/what-really-matters-in-life/">What really matters in life?</a> by Sheep</li>
  <li><a href="https://joelchrono.xyz/blog/word-filters/">Word filters are great</a> by Joel</li>
  <li><a href="https://sheepdev.xyz/blog/your-own-corner-of-the-internet/">Your Own Corner of the Internet</a> by Sheep</li>
</ul>

<h2 id="gaming">Gaming</h2>

<ul>
  <li>
    <p><a href="https://www.canucklegame.ca/">Canuckle</a></p>

    <p>A daily Canadian word game.</p>
  </li>
  <li><a href="https://paranoidcactus.itch.io/captain-neat-o-in-the-time-nexus">Captain Neat-O in the Time Nexus</a> by Paranoid Cactus</li>
  <li><a href="https://www.gameinformer.com/news/2023/10/09/cd-projekt-red-devs-form-union-following-layoffs">CD Projekt Red Devs Form Union Following Layoffs</a> by Wesley LeBlanc</li>
  <li><a href="https://ausretrogamer.com/jersey-jack-pinballs-elton-john-pinball-is-unleashed-at-pinball-expo-23/">Jersey Jack Pinball’s ELTON JOHN Pinball Is Unleashed at Pinball Expo ‘23</a></li>
  <li><a href="https://ldjam.com/events/ludum-dare/54/lab-job">Lab Job!</a> by Smitner</li>
  <li><a href="https://artemis.sh/2023/10/12/scrollbars.html">Scrollbars are becoming a problem</a> by Artemis Everfree</li>
  <li><a href="https://blog.jimmac.eu/2023/skulls/">Skull Buster</a> (<a href="https://github.com/jimmac/pico-shed/">source code</a>) by Jakub Steiner</li>
  <li><a href="https://blog.while-true-do.io/steam-deck-one-year-later/">Steam Deck - One year later</a> by Daniel Schier</li>
  <li><a href="https://eniko.itch.io/superbernieworld">Super Bernie World</a> by Eniko</li>
  <li><a href="https://liquidream.itch.io/undune2">UnDune II - The Demaking of a Dynasty</a> by Paul Nicholas</li>
  <li><a href="https://vivaldi.com/press/vivaldi-launches-its-new-arcade-game-vivaldia-2-on-steam/">Vivaldi launches its new arcade game - Vivaldia 2 - on Steam</a></li>
</ul>

<h2 id="design">Design</h2>

<ul>
  <li><a href="https://ubuntu.com/blog/into-the-labyrinth">Into the Labyrinth: Revealing the Mantic Minotaur</a> by Aaron Prisk</li>
  <li>
    <p><a href="https://oklch.com/">OKLCH</a></p>

    <p>Color picker and converter.</p>
  </li>
  <li><a href="https://blog.jimmac.eu/2023/colorful-hig/">Colorful HIG</a> by Jakub Steiner</li>
  <li><a href="https://yequari.com/blog/2023/10/no-more-88x31-buttons/">Why Are We Still Using 88x31 Buttons?</a> by yequari</li>
</ul>

<h2 id="hardware">Hardware</h2>

<ul>
  <li><a href="https://www.404media.co/diy-tinkerer-invents-tool-that-breaks-apples-macbook-repair-locks/">DIY Tinkerer Invents MacBook Tool That Breaks Apple’s Repair Locks</a> by Jason Koebler</li>
  <li><a href="https://github.com/malcolmosh/dispatchPi">dispatchPi</a> by Olivier Simard-Hanley</li>
  <li><a href="https://liberatedsystems.co.uk/">Liberated Embedded Systems</a></li>
  <li><a href="https://www.404media.co/vintage-mac-community-begs-belkin-for-new-supply-of-rare-dongle-as-resellers-charge-250/">Vintage Mac Community Begs Manufacturers for New Supply of Rare Dongle as Resellers Charge $250</a> by Jason Koebler</li>
</ul>

<h2 id="knowledge">Knowledge</h2>

<ul>
  <li><a href="https://github.com/nayafia/lemonade-stand">A handy guide to financial support for open source</a></li>
  <li>
    <p><a href="https://batteryuniversity.com/">Battery University</a></p>

    <p>A free educational website offering hands-on battery information. The tutorials evaluate the advantages and
  limitations of diverse battery chemistries, advise on best choices, and suggest ways to extend life.</p>
  </li>
  <li><a href="https://blog.while-true-do.io/go-getting-started/">Go - Getting Started</a> by Daniel Schier</li>
  <li><a href="https://deadlime.hu/en/2023/09/30/lost-in-the-network/">Lost in the network</a> by Nagy Krisztián</li>
  <li><a href="https://jwdallas.com/posts/namingcssvariables/">Naming Variables In CSS</a> by Jonathan Dallas</li>
  <li>
    <p><a href="https://www.nospec.com/">No!Spec</a></p>

    <p>Don’t underestimate your worth.</p>
  </li>
  <li><a href="https://dataswamp.org/~solene/2023-10-18-syncthing-discovery-server.html">Run your own Syncthing discovery server on OpenBSD</a> by Solène</li>
  <li><a href="https://garrit.xyz/posts/2023-11-01-tracking-sqlite-database-changes-in-git">Tracking SQLite Database Changes in Git</a> by Garrit Franke</li>
</ul>

<h2 id="misc">Misc</h2>

<ul>
  <li><a href="https://blog.archive.org/2023/10/02/academic-librarian-leans-on-internet-archive-for-access-and-analysis/">Academic Librarian Leans on Internet Archive for Access and Analysis</a> by Caralee Adams</li>
  <li><a href="https://certwatch.xmpp.net/">Check your XMPP server’s TLS setup</a></li>
  <li><a href="https://nrennie.rbind.io/blog/creating-typewriter-maps-r/">Creating typewriter-styled maps in {ggplot2}</a> by Nicola Rennie</li>
  <li><a href="https://lerner.co.il/2023/10/19/im-banned-for-life-from-advertising-on-meta-because-i-teach-python/">I’m banned for life from advertising on Meta. Because I teach Python.</a> by Reuven</li>
  <li><a href="https://axbom.com/hammer-ai/">If a hammer was like AI…</a> by Per Axbom</li>
  <li><a href="https://neal.fun/internet-artifacts/">Internet Artifacts</a></li>
  <li><a href="https://0xdstn.site/wiki/ipod/">iPod</a> by Dustin</li>
  <li><a href="">Jim Henson’s Labyrinth Pinball Teaser Trailer</a> (YouTube Video)</li>
  <li><a href="https://www.reddit.com/r/openbsd/comments/1710p9i/openbsd_wallpaper/">OpenBSD Wallpaper</a></li>
  <li><a href="https://www.youtube.com/watch?v=Ln4rsxWq3WM">Samsung disables customer phones remotely, holds data hostage until Mexican government stepped in</a> (YouTube Video) by Louis Rossmann</li>
  <li><a href="https://store.transmutable.com/l/msdfo">Smol Floppy Disk Organizer for Micro SD Cards</a> by Trevor Flowers</li>
  <li><a href="https://creativecommons.org/2023/10/26/sorry-this-video-does-not-exist/">Sorry: This video does not exist. CC’s Open VIdeo Blocked by Automatic Copyright Robots</a> by Catherine Stihler</li>
  <li><a href="https://www.thingiverse.com/thing:6259024">Stargate</a> by RevK</li>
  <li><a href="https://www.bbc.com/rd/blog/2023-07-mastodon-distributed-decentralised-fediverse-activitypub">The BBC on Mastodon: experimenting with distributed and decentralised social media</a> by Tristan Ferne</li>
  <li><a href="https://publicdomainreview.org/blog/2023/10/sources-and-rights-labelling-overhaul/">The Presentation of Sources and Rights Labelling Gets a Big Overhaul </a></li>
  <li><a href="https://thisweek.gnome.org/posts/2023/10/twig-116/">This Week in GNOME: #116 Fragmented Files</a></li>
  <li><a href="https://thisweek.gnome.org/posts/2023/10/twig-119/">This Week in GNOME: #119 Stylish Websites</a></li>
  <li><a href="https://selfh.st/newsletter/2023-10-06/">This Week in Self-Hosted 6 October 2023</a></li>
  <li><a href="https://www.youtube.com/watch?v=XYqkOxZMsfU">THUNDERBIRD: the SUCCESS STORY of LINUX!</a> (YouTube Video) by Nicco Loves Linux</li>
  <li><a href="https://psyche.co/ideas/to-improve-your-life-consider-changing-your-personality">To improve your life, consider changing your personality</a> by Christian Jarrett</li>
  <li><a href="https://ebpfdocumentary.com/">Unlocking The Kernel</a> (YouTube movie trailer)</li>
  <li><a href="https://www.youtube.com/watch?v=J4JmEFNFYqQ">Video Editing with Kdenlive — Creative Freedom Summit</a> (YouTube Video) by Seth Kenlon</li>
  <li><a href="https://octoprint.org/blog/2023/10/26/we-need-to-talk-about-funding/">We need to talk about funding - OctoPrint.org</a></li>
  <li><a href="https://psyche.co/ideas/what-can-we-learn-from-those-who-have-a-moral-change-of-heart">What can we learn from those who have a moral change of heart?</a> by Joshua May</li>
  <li><a href="https://psyche.co/ideas/whats-going-on-in-depression-to-make-negative-beliefs-so-sticky">What’s going on in depression to make negative beliefs so sticky?</a> by Tobias Kube</li>
  <li><a href="https://youtu.be/RQF82Kj-v0E">Who Is Killing Cinema? – A Murder Mystery</a> (YouTube Video) by Patrick (H) Willems</li>
</ul>

<h2 id="music">Music</h2>

<ul>
  <li><a href="https://haniarani.bandcamp.com/album/ghosts">Ghosts</a> by Hania Rani</li>
  <li><a href="https://jimmac.bandcamp.com/">Jimmac</a> by Jimmac</li>
  <li>
    <p><a href="https://radiolise.gitlab.io/">Radiolise</a></p>

    <p>A web app that lets you enjoy your favourite TV and radio stations.</p>
  </li>
  <li><a href="https://fingerspit.bandcamp.com/album/sunset-shift">Sunset Shift </a> by fingerspit</li>
</ul>

<h2 id="news">News</h2>

<ul>
  <li><a href="https://news.itsfoss.com/gnome-wayland-xorg/">Big News! GNOME to Drop X11 for a Wayland-only Future</a> by Sourav Rudra</li>
  <li><a href="https://laurenshof.online/bluesky-technical-roadmap/">Bluesky technical roadmap</a> by Laurens Hof</li>
  <li><a href="https://www.raspberrypi.com/news/bookworm-the-new-version-of-raspberry-pi-os/">Bookworm — the new version of Raspberry Pi OS</a> by Simon Long</li>
  <li><a href="https://www.ifixit.com/News/84491/california-right-to-repair-signed-into-law">California Right to Repair Signed into Law</a> by Elizabeth Chamberlain</li>
  <li><a href="https://blog.twitch.tv/en/2023/10/20/everything-we-announced-at-twitchcon-las-vegas/">Everything We Announced at TwitchCon Las Vegas</a></li>
  <li><a href="https://www.404media.co/inside-a-30-million-cash-for-bitcoin-laundering-ring-in-the-heart-of-new-york/">Inside a $30 Million Cash-for-Bitcoin Laundering Ring in the Heart of New York</a> by Joseph Cox</li>
  <li><a href="https://www.eff.org/deeplinks/2023/10/landmark-technologys-two-decade-patent-assault-e-commerce-finally-over">Is Landmark Technology’s Two-Decade Patent Assault On E-Commerce Finally Over?</a> by Joe Mullin</li>
  <li><a href="https://www.404media.co/mastodon-is-the-good-one/">Mastodon Is the Good One</a> by Jason Koebler</li>
  <li><a href="https://blog.openstreetmap.org/2023/10/25/microsoft-pledges-150k-to-support-openstreetmap/">Microsoft Pledges $150k to Support OpenStreetMap</a> by Courtney Williamson</li>
  <li><a href="https://news.itsfoss.com/red-hat-fiasco/">The Suicide Attempt by Red Hat [Opinion]</a></li>
</ul>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li>
    <p><a href="https://actualbudget.org/">Actual Budget</a></p>

    <p>A super fast and privacy-focused app for managing your finances.</p>

    <p>Language: TypeScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/antares-sql/antares">Antares</a></p>

    <p>A modern, fast and productivity driven SQL client with a focus in UX.</p>

    <p>Language: Vue, License: MIT</p>
  </li>
  <li>
    <p><a href="https://laaca.borec.cz/blocek/">Bloček</a></p>

    <p>A text editor for DOS with unicode support.</p>

    <p>Language: Pascal, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://censorship.no/">Ceno Browser</a></p>

    <p>Side-steps current Internet censorship methods using a peer-to-peer backbone to allow people to access and share web information.</p>

    <p>Language: Kotlin, License: MPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/schollz/croc">croc</a></p>

    <p>Easily and securely send files or directories from one computer to another.</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://gitlab.gnome.org/subpop/damask">Damask</a></p>

    <p>Automatically set wallpaper images by selecting images from a variety of sources, including local files and folders.</p>

    <p>Language: Vala, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/SuperIlu/DOjS">DOjS</a></p>

    <p>A MS-DOS Creative Coding IDE/platform based on JavaScript.</p>

    <p>Language: C, License: Multi</p>
  </li>
  <li>
    <p><a href="https://github.com/lawmurray/doxide">Doxide</a></p>

    <p>Modern documentation for modern C++.</p>

    <p>Language: C++, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://www.dslinux.org/">DSLinux</a></p>

    <p>A Linux operating system for the Nintendo DS and Nintendo DS Lite.</p>

    <p>License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/deep-entertainment/egoventure">EgoVenture</a></p>

    <p>First person point and click adventure framework for Godot.</p>

    <p>Language: GDScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://fab4m.org/">fab4m</a></p>

    <p>Take the hard parts out of form building!</p>

    <p>Language: TypeScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://filegator.io/">FileGator</a></p>

    <p>A powerful multi-user file manager, self-hosted web application.</p>

    <p>Language: PHP, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/bragefuglseth/fretboard">Fretboard</a></p>

    <p>Look up guitar chords.</p>

    <p>Language: Rust, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://getfrog.app/">Frog</a></p>

    <p>Quickly extract text from any source such as images, websites, video or a QR code.</p>

    <p>Language: Python, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/lowercasename/gathio">gathio</a></p>

    <p>Self-destructing, shareable, no-registration event pages with the ability to self host.</p>

    <p>Language: JavaScript, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://git.mcksp.com/gituwa/">gituwa</a></p>

    <p>Static git web frontend generator.</p>

    <p>Language: , License:</p>
  </li>
  <li>
    <p><a href="https://github.com/sillydan1/graphedit">Graphedit</a></p>

    <p>An application for visualizing, creating, editing and debugging graph-based syntaxes.</p>

    <p>Language: Java, License: MIT</p>
  </li>
  <li>
    <p><a href="https://www.hoptodesk.com/">HopToDesk</a></p>

    <p>A free remote desktop tool allowing users to share their screen and allow remote control access to their computers and devices.</p>

    <p>Language: Rust, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/pentacent/keila">Keila</a></p>

    <p>An Open Source alternative to newsletter tools like Mailchimp or Sendinblue.</p>

    <p>Language: Elixir, License: AGPL v3</p>
  </li>
  <li>
    <p><a href="https://github.com/librerandonaut/librerandonaut">LibreRandonaut</a></p>

    <p>An Android app to generate true random coordinates that allow users to explore their surroundings to perform the activity “randonauting”.</p>

    <p>Language: Java, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/paulirish/lite-youtube-embed">Lite YouTube Embed</a></p>

    <p>A faster YouTube embed.</p>

    <p>Language: JavaScript, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/localsend/localsend">Localsend</a></p>

    <p>A cross-platform alternative to AirDrop.</p>

    <p>Language: Dart, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/vinc/moros">MOROS</a></p>

    <p>Obscure Rust operating system.</p>

    <p>Language: Rust, License: MIT</p>
  </li>
  <li>
    <p><a href="https://missioncenter.io/">Mission Center</a></p>

    <p>Monitor your CPU, Memory, Disk, Network and GPU usage.</p>

    <p>Language: Rust, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/arianrhodsandlot/nostalgist">Nostalgist.js</a></p>

    <p>A library used for running emulators of retro consoles inside browsers.</p>

    <p>Language: TypeScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/dynobo/normcap">NormCap</a></p>

    <p>OCR powered screen-capture tool to capture information instead of images.</p>

    <p>Language: Python, License: GNU GPL</p>
  </li>
  <li>
    <p><a href="https://github.com/Theta-Limited/OpenAthenaAndroid">OpenAthena for Android</a></p>

    <p>Allows common drones to spot precise geodetic locations.</p>

    <p>Language: Java, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/zidoro/pomatez">Pomatez</a></p>

    <p>Stay Focused. Take a Break.</p>

    <p>Language: TypeScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/mapedorr/popochiu">Popochiu</a></p>

    <p>Godot plugin to make point n’ click games in a similar way to tools like Adventure Game Studio and Power Quest.</p>

    <p>Language: GDScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/SuffolkLITLab/rss_algo">RSS Algo</a></p>

    <p>A client-side open source algo-driven RSS reader.</p>

    <p>Language: JavaScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://www.stirlingtools.com/">Stirling-PDF</a></p>

    <p>Locally hosted web application that allows you to perform various operations on PDF files.</p>

    <p>Language: Java, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/adamghill/django-unicorn">Unicorn</a></p>

    <p>The magical reactive component framework for Django.</p>

    <p>Language: Python, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/flattool/warehouse">Warehouse</a></p>

    <p>A versatile toolbox for viewing flatpak info, managing user data, and batch managing installed flatpaks.</p>

    <p>Language: Python, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://git.sr.ht/~amolith/wyrd">wyrd</a></p>

    <p>Receive credentials from clients in a reasonably secure manner.</p>

    <p>Language: Go, License: Multi</p>
  </li>
</ul>

<h2 id="privacy">Privacy</h2>

<ul>
  <li><a href="https://www.eff.org/deeplinks/2023/10/how-goguardian-invades-student-privacy">How GoGuardian Invades Student Privacy</a> by Jason Kelley</li>
  <li><a href="https://www.eff.org/deeplinks/2023/10/victory-california-department-justice-declares-out-state-sharing-license-plate">VICTORY! California Department of Justice Declares Out-of-State Sharing of License Plate Data Unlawful</a> by Dave Maass &amp; Jennifer Pinsof</li>
</ul>

<h2 id="security">Security</h2>

<ul>
  <li><a href="https://marc.info/?l=oss-security&amp;m=169754375211439&amp;w=2">[oss-security] with firefox on X11, any page can pastejack you anytime</a> by turistu</li>
  <li><a href="https://www.helpnetsecurity.com/2023/10/18/cybersecurity-cheat-sheets/">10 essential cybersecurity cheat sheets available for free</a></li>
  <li><a href="https://www.theregister.com/2023/10/05/cisco_icritical_emergency/">Cisco warns of critical flaw in Emergency Responder code</a> by Thomas Claburn</li>
  <li>
    <p><a href="https://cvecrowd.com/">cvecrowd</a></p>

    <p>Lists of common vulnerabilities and exposures (CVE) that are currently being discussed on the Fediverse.</p>
  </li>
  <li><a href="https://therecord.media/curl-vulnerabilities-to-be-announced-open-source">Maintainers warn of vulnerability affecting foundational open-source tool</a> by Jonathan Greig</li>
  <li><a href="https://www.bleepingcomputer.com/news/security/new-wordpress-backdoor-creates-rogue-admin-to-hijack-websites/">New WordPress backdoor creates rogue admin to hijack websites</a> by Bill Toulas</li>
  <li><a href="https://www.lpi.org/blog/2023/09/20/will-the-european-union-erect-barriers-to-foss/">Will the European Union Erect Barriers to FOSS?</a> By Max Roveri</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Explore the mega load of little bits I've collected over the last month covering topics of gaming, open source, books, blogs, security and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts//little-bits-issue-8.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts//little-bits-issue-8.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Resolve Error libFLAC.so.8 No Such File or Directory</title><link href="https://www.adamsdesk.com/posts/libflac-no-such-file-directory/" rel="alternate" type="text/html" title="Resolve Error libFLAC.so.8 No Such File or Directory" /><published>2023-10-15T00:00:00-06:00</published><updated>2023-11-07T23:04:54-06:00</updated><id>https://www.adamsdesk.com/posts/libflac-no-such-file-directory</id><content type="html" xml:base="https://www.adamsdesk.com/posts/libflac-no-such-file-directory/"><![CDATA[<p>Our computer systems receive software updates using a package manager or software center (e.g. GNOME Software). Overtime
this can cause software to break especially for older applications or games that have not or do not receive updates.
This is even more likely when the app or game has been installed outside the main system of choice. However, this
doesn’t mean it’s not possible to resolve an issue such as a missing library file. In this example I tried to run the
game Jill of the Jungle The Complete Trilogy from GOG and realized that the game no longer would load. Join me on this
investigation into the disappearance of LibFLAC.so.8.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux</li>
  <li>DOSBox v0.74.3-2</li>
  <li>SDL_sound v1.0.3-11</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
</ul>

<h2 id="problem">Problem</h2>

<p>Starting a game as an example does not load and when running via the terminal it fails with the following error message.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>./GOG<span class="se">\ </span>Games/Jill<span class="se">\ </span>of<span class="se">\ </span>the<span class="se">\ </span>Jungle<span class="se">\ </span>The<span class="se">\ </span>Complete<span class="se">\ </span>Trilogy/start.sh
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">eGen/AArch64/fast-
Running Jill of the Jungle: The Complete Trilogy
Starting DOSBox
/home/adam/GOG Games/Jill of the Jungle The Complete Trilogy/dosbox/dosbox_x86_64: error while
loading shared libraries: libFLAC.so.8: cannot open shared object file: No such file or directory
Done.
</span></code></pre></div></div>

<h2 id="what-does-this-mean">What Does This Mean?</h2>

<p>The FLAC (free lossless audio codec) library is not found on the system. This library is used to decode and encode audio
files that utilizes FLAC.</p>

<p>In this context DOSBox requires SDL_sound which then requires FLAC.</p>

<h2 id="investigating-the-problem">Investigating the Problem</h2>

<p>First, make sure your system is update to date, and you have the latest version of DOSBox and SDL_sound installed.</p>

<p>Next is to confirm the system doesn’t have the missing system object file, “libFLAC.so.8”.
This is done by querying all the files provided by the “flac” package locally and remotely by searching for
“libFLAC.so.8”. As you can see the there are no results returned, which then confirms the “flac” package no longer
provides this system object file, “libflac.so.8”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pacman <span class="nt">-Ql</span> flac | <span class="nb">grep</span> <span class="nt">-i</span> libflac.so.8
</code></pre></div></div>

<p>Since the missing file is a system object that is built at installation time, it is unlikely that one would find this
file remotely. The example is here to make one aware of this being possible.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Fyx</span> libflac.so.8
</code></pre></div></div>

<p>We now have to extend the search for a package that can provide the file we need within the Arch User Repository. Though
before we do that we need to get the current “flac” package version.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Qi</span> flac | <span class="nb">grep</span> <span class="nt">-i</span> version
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Version         : 1.4.3-1
</span></code></pre></div></div>

<p>Now that we have the version number we can search for a package that is older by one minor version, such as 1.3. To do
the search I will be using an <a href="https://kb.adamsdesk.com/operating_system/arch_linux_install_aur_helper/">AUR Helper</a>,
Pikaur as an example. The search will look through the package name and description and then search the results returned
for a string starting with “aur”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ pikaur -Ss flac | grep -i ^aur
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">Searching... [#</span><span class="c">##]</span>
<span class="c">...
</span><span class="go">aur/flac1.3 1.3.4-1 (2, 0.00)
aur/lib32-flac1.3 1.3.4-1 (0, 0.00)
</span><span class="c">...
</span></code></pre></div></div>

<p>Within the results we can see a package called “flac1.3” and “lib32-flac1.3” which is the assumed version that we need.
The first one is for 64-bit and the second would be for 32-bit. In my particular case I will require the 64-bit library.
Let’s confirm the version number of the package “flac1.3”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Si</span> flac1.3 | <span class="nb">grep</span> <span class="nt">-i</span> version
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Version         : 1.3.4-1
</span></code></pre></div></div>

<p>Since the system object file “libFLAC.so.8” has not been built yet, we will have to install this package in order to
confirm it provides what we need.</p>

<h2 id="solution">Solution</h2>

<p>Depending on your use case one or both maybe required to install the package which will build the missing file,
libFLAC.so.8. It all depends on the program whether it requires 64-bit or 32-bit.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> flac1.3
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> lib32-flac1.3
</code></pre></div></div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="linux" /><category term="archlinux" /><summary type="html"><![CDATA[Join the adventure on this investigation into the disappearance of "libFLAC.so.8", no such file or directory and learn how the case was resolved.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/libflac-no-such-file-directory.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/libflac-no-such-file-directory.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #7</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-7/" rel="alternate" type="text/html" title="Little Bits: Issue #7" /><published>2023-09-30T00:00:00-06:00</published><updated>2023-09-30T08:28:39-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-7</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-7/"><![CDATA[<p>I’m not sure why, but this month seemed to really go bye much quicker then the rest of the year. Possibly one reason
could be due to the tremendous amount of reading I’ve done. This is quite apparent seeing all those little bits (links)
I’ve collection below. Tracking all the bits I come across in a month sure gives an insight into the amount one absorbs
overtime. I can’t imagine how much larger this could be if I added all the music, videos, podcasts, TV shows and movies.
I hope this issue provides a level of insight and value to you.</p>

<h2 id="art">Art</h2>

<ul>
  <li><a href="https://communityblog.fedoraproject.org/freetober-join-the-latest-art-challenge/">#freetober - Join the latest Art Challenge!</a> by Marie Nordin</li>
  <li><a href="https://inkscape.org/forums/competitions/">Inkscape Drawing Challenges, Contests, Competitions</a></li>
</ul>

<h2 id="books--magazines">Books / Magazines</h2>

<ul>
  <li>
    <p><a href="https://nantucketebooks.com/ebooks/doctorow/doctorow_ebooks/">Ebooks: Neither E, Nor Books</a> by Cory Doctorow</p>

    <p>Speech at O’Reilly Emerging Technology Conference, February 2004 (<a href="http://craphound.com/ebooksneitherenorbooks.txt">source</a>)</p>
  </li>
  <li><a href="https://hackspace.raspberrypi.com/issues/70">HackSpace magazine - Issue 70 for September 2023</a></li>
  <li><a href="https://nantucketebooks.com/ebooks/atgonzalez/kengraham_interview/">Interview With Ken Grahan</a> by AT Gonzalez</li>
  <li><a href="https://magpi.raspberrypi.com/issues/133">The MagPi - Issue 133 for September 2023</a></li>
  <li>
    <p><a href="https://www.midnightpals.com/">The Midnight Pals</a></p>

    <p>Famous horror authors, living and dead, gather around a campfire to tell their strange and scary stories.
  A social media based microfiction series created by horror author and double Hugo nominee Bitter Karella.</p>
  </li>
</ul>

<h2 id="blog">Blog</h2>

<ul>
  <li><a href="https://noisydeadlines.net/10-things-to-remember-every-day">10 Things to Remember Every Day</a> by Noisy Deadlines</li>
  <li><a href="https://www.knickish.com/palm/rust/2023/09/12/a-mastodon-client-for-palmos.html">A mastodon client for palmOS</a> by knickish</li>
  <li><a href="https://lazybear.io/posts/days-of-our-life/">Days of our life</a> by Hyde Stevenson</li>
  <li><a href="https://lazybear.io/posts/how-to-extract-notes-from-your-remarkable2/">How to extract notes from your Remarkable2</a> by Hyde</li>
  <li><a href="https://kevquirk.com/lets-be-accountable-together">Let’s Be Accountable Together</a> by Kev Quirk</li>
  <li><a href="https://the.webm.ink/lock-in-syndrome">Lock-In Syndrome</a> by Simon Phipps</li>
  <li><a href="https://claytonerrington.com/blog/manage-aws-instances">Manage AWS Instances</a> by Clayton Errington</li>
  <li><a href="https://werd.io/2023/removing-my-home-information-from-the-internet">Removing my home information from the internet</a> by Ben Werdmuller</li>
  <li><a href="https://claytonerrington.com/blog/scheduling-automatic-builds-with-static-site-generators/">Scheduling Automatic Builds with Static Site Generators</a> by Clayton Errington</li>
  <li><a href="https://heather-buchel.com/blog/2023/07/crowd-sourcing-accessibility/">Thoughts on crowdsourcing your accessibility feedback</a> by Heather Buchel</li>
  <li><a href="https://ctmiller.net/2023/09/19/time-for-a.html">Time for a New Phone</a> by Chris Miller</li>
  <li><a href="https://joelchrono12.xyz/blog/what-is-on-my-phone-fall-2023/">What’s on my Phone (Fall 2023)</a> By Joel</li>
</ul>

<h2 id="gaming">Gaming</h2>

<ul>
  <li>
    <p><a href="https://crawl.develz.org/">Dungeon Crawl Stone Soup</a></p>

    <p>A roguelike adventure through dungeons filled with dangerous monsters in a quest to find the mystifyingly fabulous Orb of Zot.</p>

    <p>Language: C++, License: Multi</p>
  </li>
  <li>
    <p><a href="https://github.com/ihhub/fheroes2">fheroes2</a></p>

    <p>A recreation of Heroes of Might and Magic II game engine.</p>

    <p>Language: C++, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/luxtorpeda-dev/luxtorpeda">Luxtorpeda</a></p>

    <p>Steam Play compatibility tool to run games using native Linux engines.</p>

    <p>Language: Rust, License: GNU GPL v2.0</p>
  </li>
  <li><a href="https://www.404media.co/meet-the-guy-preserving-the-new-history-of-pc-games-one-linux-port-at-a-time/">Meet the Guy Preserving the New History of PC Games, One Linux Port at a Time</a> by Emanuel Maiberg</li>
  <li>
    <p><a href="https://github.com/Anuken/Mindustry">Mindustry</a></p>

    <p>The automation tower defence RTS (real-time strategy).</p>

    <p>Language: Java, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://midzer.de/games">Midzer’s flicker box</a></p>

    <p>Web ports of video games using emscripts.</p>
  </li>
  <li>
    <p><a href="https://mindustrygame.github.io/">Mindustry</a></p>

    <p>The automation tower defence real time strategy (RTS).</p>

    <p>Language: Java, License: GNU GPL v3.0</p>
  </li>
  <li><a href="https://phoboslab.org/log/2023/08/rewriting-wipeout">Rewriting wipEout</a> by Dominic Szablewski</li>
</ul>

<h2 id="design">Design</h2>

<ul>
  <li>
    <p><a href="https://jdan.github.io/98.css/">98.css</a> by Jeremy</p>

    <p>A design system for building faithful recreations of old UIs.</p>

    <p>Language: CSS, License: MIT</p>
  </li>
  <li><a href="https://andy-bell.co.uk/a-more-modern-css-reset/">A (more) Modern CSS Reset</a> by Andy Bell</li>
  <li>
    <p><a href="https://b612-font.com/">B612 Font family</a></p>

    <p>An highly legible open source font family designed and tested to be used on aircraft cockpit screens.</p>

    <p>License: OFL v1.1</p>
  </li>
  <li>
    <p><a href="https://github.com/intel/intel-one-mono">Intel One Mono Typeface</a></p>

    <p>License: OFL v1.1</p>
  </li>
  <li>
    <p><a href="https://github.com/Pictogrammers/Memory">Memory Icons</a></p>

    <p>An icon set that contains 22x22 pixelated icons. Ideal for the Sharp Memory 2.7” display.</p>

    <p>Language: TypeScript, License: Apache 2.0 / MIT</p>
  </li>
  <li><a href="https://nantucketebooks.com/blog/2023/09/2023-09-27_working_with_svgs,_and_new_books.html">Working With SVGs, and New Books</a> by NJB</li>
</ul>

<h2 id="hardware">Hardware</h2>

<ul>
  <li><a href="https://9to5linux.com/tuxedo-announces-nano-pro-gen12-mini-linux-pc-powered-by-amd-ryzen-7000u">TUXEDO Announces Nano Pro Gen12 Mini Linux PC Powered by AMD Ryzen 7000U</a> by Marius Nestor</li>
  <li><a href="https://www.linux-magazine.com/Online/News/Star-Labs-Reveals-a-New-Surface-Like-Linux-Tablet">Star Labs Reveals a New Surface-Like Linux Tablet</a> by Jack Wallen</li>
  <li><a href="https://9to5linux.com/hp-linux-imaging-and-printing-drivers-now-support-fedora-38-and-ubuntu-23-04">HP Linux Imaging and Printing Drivers Now Support Fedora 38 and Ubuntu 23.04</a> by Marius Nestor</li>
  <li><a href="https://www.raspberrypi.com/news/introducing-raspberry-pi-5/">Introducing: Raspberry Pi 5!</a> by Eben Upton</li>
  <li><a href="https://www.raspberrypi.com/products/raspberry-pi-5/">Raspberry Pi 5 product page</a></li>
  <li><a href="https://9to5linux.com/qemu-8-1-released-with-new-pipewire-audio-backend-many-improvements">QEMU 8.1 Released with New PipeWire Audio Backend, Many Improvements</a> by Marius Nestor</li>
</ul>

<h2 id="knowledge">Knowledge</h2>

<ul>
  <li><a href="https://blog.while-true-do.io/ansible-notify-the-right-way/">Ansible - Notify the right way</a> by Daniel Schier</li>
  <li><a href="https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/">Block the Bots that Feed “AI” Models by Scraping Your Website</a> by Neil Clarke</li>
  <li><a href="https://media.libreplanet.org/u/libreplanet/m/workshop-video-editing-with-kdenlive/">Workshop: Video Editing with Kdenlive</a> by Seth Kenlon</li>
  <li><a href="https://hjr265.me/blog/hiding-files-in-zip-archives/">Hiding Files in ZIP Archives</a> by Mahmud Ridwan</li>
  <li><a href="https://www.davidrevoy.com/article989/how-to-customise-a-usb-numeric-keypad-under-gnulinux">How to customise a USB numeric keypad under GNU/Linux</a> by David Revoy</li>
  <li><a href="https://www.collabora.com/news-and-blog/news-and-events/introducing-nvk.html">Introducing NVK</a> by Faith Ekstrand</li>
  <li>
    <p><a href="https://un.curl.dev/">Uncurled</a> by Daniel Stenberg</p>

    <p>Everything I know and learned about running and maintaining Open Source projects for three decades.</p>
  </li>
  <li><a href="https://www.linuxfoundation.org/blog/understanding-the-cyber-resilience-act">Understanding the Cyber Resilience Act: What Everyone involved in Open Source Development Should Know</a> by Ashwin Ramaswami, Mirko Boehm</li>
  <li><a href="https://media.libreplanet.org/u/libreplanet/m/workshop-video-editing-with-kdenlive/">Workshop: Video Editing with Kdenlive</a> by Seth Kenlon</li>
</ul>

<h2 id="misc">Misc</h2>

<ul>
  <li><a href="https://www.theregister.com/2023/08/18/opinion_column/">A license to trust: Can you rely on ‘open source’ companies?</a> by Steven J. Vaughan-Nichols</li>
  <li><a href="https://www.sciencedirect.com/science/article/pii/S0305750X22002169">Capitalism and extreme poverty: A global analysis of real wages, human height, and mortality since the long 16th century</a> by Dylan Sullivan, Jason Hickel</li>
  <li><a href="https://media.defcon.org/DEF%20CON%2031/DEF%20CON%2031%20video%20and%20slides/DEF%20CON%2031%20-%20An%20Audacious%20Plan%20to%20Halt%20the%20Internet%27s%20Enshittification%20-%20Cory%20Doctorow.mp4">DEF CON 31 - An Audacious Plan to Halt the Internet’s Ensh*ttification</a> (<a href="https://youtu.be/rimtaSgGz_4">YouTube video</a>) by Cory Doctorow</li>
  <li>
    <p><a href="https://endoflife.date/">End-of-life Date</a></p>

    <p>End-of-life (EOL) dates and support lifecycles for various products.</p>
  </li>
  <li><a href="https://www.youtube.com/watch?v=hAtbFwzZp6Y">Everything Is Content Now</a> (YouTube video) by Patrick (H) Willems</li>
  <li><a href="https://www.theguardian.com/technology/2023/aug/31/fish-doorbells-historic-sandwiches-50-of-the-weirdest-most-wonderful-corners-of-the-web-picked-by-an-expert">Fish doorbells! Historic sandwiches! 50 of the weirdest, most wonderful corners of the web - picked by an expert</a> by Emma Beddington</li>
  <li><a href="https://psyche.co/guides/how-to-stop-people-pleasing-by-learning-to-say-no">How to say no</a> by Shayla Love</li>
  <li>
    <p><a href="https://youtu.be/ggx9ZssPHU8">Open Source Summit Europe 2023 - LinuxCon - Room 0B - Live from Bilbao, Spain</a> (YouTube video)</p>

    <p>First talk is Jonathan Corbet, and he initially talks about Linux kernel long term support (LTS).</p>
  </li>
  <li><a href="https://www.infoworld.com/article/3703768/the-open-source-licensing-war-is-over.html">The open source licensing war is over</a> by Matt Asay</li>
  <li><a href="https://psyche.co/ideas/slow-down-its-what-your-brain-has-been-begging-for">Slow down, it’s what your brain has been begging for</a> by Teodora Stoica</li>
  <li><a href="https://pointieststick.com/2023/09/17/so-lets-talk-about-this-wayland-thing/">So let’s talk about this Wayland thing</a> by Nate</li>
  <li><a href="https://conf.tube/w/d68VGvtAaYc1ptvdkuXwv8">Speaking Up For FOSS Now Everyone Uses It</a> (PeerTube video) by Simon Phipps at FOSS North</li>
  <li><a href="https://www.redhat.com/en/blog/ins-and-outs-innersource">The ins and outs of InnerSource</a> by Brian Proffitt</li>
  <li>
    <p><a href="https://tld-list.com/">TLD-List</a></p>

    <p>Compare prices of all top-level domains.</p>
  </li>
</ul>

<h2 id="music">Music</h2>

<ul>
  <li><a href="https://youtu.be/sqSA-SY5Hro">Rich Men North Of Richmond</a> (YouTube Video) by Oliver Anthony</li>
  <li><a href="https://www.songtradr.com/blog/posts/songtradr-bandcamp-acquisition">Songtradr acquires Bandcamp</a></li>
</ul>

<h2 id="news">News</h2>

<ul>
  <li><a href="https://www.nature.com/articles/d41586-023-02648-9">A DIY ‘bionic pancreas’ is changing diabetes care - what’s next?</a> by Liam Drew</li>
  <li><a href="https://www.ghacks.net/2023/08/23/firefox-users-may-import-chrome-extensions-now/">Firefox users may import Chrome extensions now</a> by Martin Brinkmann</li>
  <li><a href="https://www.fsf.org/news/forty-years-of-gnu-and-the-free-software-movement">Forty years of GNU and the free software movement</a></li>
  <li><a href="https://fossforce.com/2023/09/gnus-having-a-40th-birthday-party-and-youre-invited/">GNU’s Having a 40th Birthday Party and You’re Invited!</a> by Christine Hall</li>
  <li><a href="https://release.gnome.org/45/">Introducing GNOME 45, “Rīga”</a></li>
  <li><a href="https://www.theregister.com/2023/09/05/birmingham_city_council_oracle/">Largest local government body in Europe goes under amid Oracle disaster</a> by Lindsay Clark</li>
  <li><a href="https://fediversereport.com/last-week-in-fediverse-episode-35/">Last Week in Fediverse – episode 35</a> by Laurens Hof</li>
  <li><a href="https://investors.mariadb.com/news/news-details/2023/Announcement-Regarding-Possible-Offer/default.aspx">MariaDB Announcement Regarding Possible Offer</a></li>
  <li><a href="https://www.theguardian.com/world/2023/sep/13/levira-portugal-wine-flood-how-damage-litres-destilaria">Portuguese town flooded by river of ‘good quality’ red wine</a> by Helen Livingstone</li>
  <li><a href="https://techcrunch.com/2022/07/27/protestware-code-sabotage/">Protestware on the rise: Why developers are sabotaging their own code</a> by Ax Sharma</li>
  <li><a href="https://audio-video.gnu.org/video/gnu40/rms-gnu40.webm">Richard Stallman reveals he has cancer in the GNU 40 Hacker Meeting talk</a> (video)</li>
  <li><a href="https://fossforce.com/2023/09/slowroll-opensuses-new-take-on-the-rolling-release-model/">Slowroll: openSUSE’s New Take on the Rolling Release Model</a> by Christine Hall</li>
  <li><a href="https://arstechnica.com/information-technology/2023/09/insufficient-disk-space-caused-2-day-shutdown-of-toyotas-japanese-factories/">Toyota’s Japanese production was halted due to insufficient disk space</a> by Scharon Harding</li>
  <li><a href="https://www.theregister.com/2023/08/30/usenet_revival">USENET, the OG social network, rises again like a text-only phoenix</a> by Liam Proven</li>
  <li><a href="https://opensource.net/welcome-to-opensource-net/">Welcome to OpenSource.net!</a> by Stefano Maffulli</li>
</ul>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li>
    <p><a href="https://github.com/advplyr/audiobookshelf">Audiobookshelf</a></p>

    <p>Self-hosted audiobook and podcast server.</p>

    <p>Language: JavaScript, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/biznisbox/biznisbox">BiznisBox</a></p>

    <p>A web application for managing invoices, clients, and payments.</p>

    <p>Language: PHP, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/gen2brain/cbconvert">cbconvert</a></p>

    <p>A Comic Book converter.</p>

    <p>Language: Go, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/KRTirtho/flemozi">Flemozi</a></p>

    <p>Advanced emoji picker for Linux, Windows and macOS.</p>

    <p>Language: Dart, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/harness/gitness">Gitness</a></p>

    <p>A lightweight, superfast code hosting and continuous integration service.</p>

    <p>Language: Go, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/osteele/gojekyll">Gojekyll</a></p>

    <p>A fast Go implementation of the Jekyll blogging engine.</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/goreleaser/goreleaser">GoReleaser</a></p>

    <p>Deliver Go binaries as fast and easily as possible.</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/GraphiteEditor/Graphite">Graphite</a></p>

    <p>2D raster and vector editor that melds traditional layers &amp; tools with a modern node-based, fully non-destructive procedural workflow.</p>

    <p>Language: Rust. License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/davquar/halfdot">Halfdot</a></p>

    <p>Minimalistic Umami client for Android.</p>

    <p>Language: Dart, MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/headlamp-k8s/headlamp">Headlamp</a></p>

    <p>A Kubernetes web UI that is fully-featured, user-friendly and extensible.</p>

    <p>Language: TypeScript, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/sezanzeb/input-remapper">Input Remapper</a></p>

    <p>An easy-to-use tool to change the behaviour of your input devices.</p>

    <p>Language: Python, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/IrisShaders/Iris">Iris</a></p>

    <p>A work in progress modern shaders mod for Minecraft intended to be compatible with existing OptiFine shader packs.</p>

    <p>Language: Java, License: LGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/badlogic/ledit">ledit</a></p>

    <p>A read-only Reddit/YouTube/Hackernews/RSS client for people who don’t like bells and whistles.</p>

    <p>Language: TypeScript</p>
  </li>
  <li>
    <p><a href="https://github.com/krateng/maloja">Maloja</a></p>

    <p>Self-hosted music scrobble database to create personal listening statistics and charts.</p>

    <p>Language: Python, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/memoetapp/memoet">Memoet</a></p>

    <p>Self-hosted to play quizzes &amp; review flashcards to memorize everything using spaced repetition method.</p>

    <p>Language: Elixir, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/news-flash/news_flash_gtk">NewsFlash</a></p>

    <p>A program designed to complement an already existing web-based RSS reader account.</p>

    <p>Language: Rust, License: GNU GPL v3</p>
  </li>
  <li>
    <p><a href="https://git.sr.ht/~geb/numen">Numen</a></p>

    <p>Voice control for handsfree computing running locally.</p>

    <p>Language: Go, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/ocrmypdf/OCRmyPDF">OCRmyPDF</a></p>

    <p>Adds an OCR (optical character recognition) text layer to scanned PDF files, allowing them to be searched.</p>

    <p>Language: Python, License: MPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/imixs/open-bpmn">Open BPMN</a></p>

    <p>Modeler based on Eclipse Graphical Language Server Platform.</p>

    <p>Language: Java, License: EPL v2.0</p>
  </li>
  <li>
    <p><a href="https://git.sr.ht/~amolith/password-thing/">Password Thing</a></p>

    <p>Receive credentials from clients in a reasonably secure manner.</p>

    <p>Language: Go, License: Multiple</p>
  </li>
  <li>
    <p><a href="https://github.com/pods-framework/pods">Pods Framework</a></p>

    <p>A content development framework for WordPress.</p>

    <p>Language: PHP, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/containers/podman">Podman</a></p>

    <p>Manage containers, pods, and images from your local environment.</p>

    <p>Language: Go, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://users.notam02.no/~kjetism/radium/">Radium</a></p>

    <p>A next generation graphical music editor.</p>

    <p>Language: C++, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/geno7/Rarebit">Rarebit</a></p>

    <p>Webcomic template built in HTML and JavaScript.</p>

    <p>Language: HTML, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/Lodobo/rdict">rdict</a></p>

    <p>An offline CLI dictionary, using data from Wiktionary.</p>

    <p>Language: Rust, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/orhun/rustypaste">Rustypaste</a></p>

    <p>A minimal file upload/pastebin service.</p>

    <p>Language: Rust, License: MIT</p>
  </li>
  <li>
    <p><a href="https://www.scilab.org/">Scilab</a></p>

    <p>Numerical computation providing a powerful computing environment for engineering and scientific applications.</p>

    <p>Language: Scilab, License: GNU GPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/rafaelmardojai/share-preview">Share Preview</a></p>

    <p>Test social media cards locally.</p>

    <p>Language: Rust, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/sile-typesetter/sile">SILE</a></p>

    <p>Simon’s Improved Layout Engine (typesetting).</p>

    <p>Language: Lua, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/typst/typst">Typst</a></p>

    <p>A new markup-based typesetting system that is designed to be as powerful as LaTeX, but easier to learn.</p>

    <p>Language: Rust, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/dusnm/wifiqr">wifiqr</a></p>

    <p>A simple program to generate a QR code to connect to a WiFi network.</p>

    <p>Language: Go, License: GNU GPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/zulip/zulip">Zulip</a></p>

    <p>Team chat application designed to help people collaborate.</p>

    <p>Language: Python, License: Apache v2.0</p>
  </li>
</ul>

<h2 id="osint">OSINT</h2>

<ul>
  <li>
    <p><a href="https://atlasofsurveillance.org/">Atlas of Surveillance</a></p>

    <p>Documenting police tech in our communities with open source research (USA).</p>
  </li>
</ul>

<h2 id="privacy">Privacy</h2>

<ul>
  <li><a href="https://youtu.be/nQ9LR8homt4">ACTUALLY! Android is more private than the iPhone!</a> (YouTube video) by The Hated One</li>
  <li><a href="https://www.justsecurity.org/87615/changes-to-uk-surveillance-regime-may-violate-international-law/">Changes to UK Surveillance Regime May Violate International Law</a> by Ioannis Kouvakas</li>
  <li><a href="https://edri.org/our-work/global-civil-society-and-experts-statement-stop-facial-recognition-surveillance-now/">Global civil society and experts statement: Stop facial recognition surveillance now</a></li>
  <li><a href="https://foundation.mozilla.org/en/privacynotincluded/articles/its-official-cars-are-the-worst-product-category-we-have-ever-reviewed-for-privacy/">It’s Official: Cars Are the Worst Product Category We Have Ever Reviewed for Privacy</a> By Jen Caltrider, Misha Rykov and Zoë MacDonald</li>
  <li><a href="https://www.theverge.com/2023/9/19/23880919/uk-passes-massive-online-safety-bill">The UK passes massive online safety bill</a> by Emma Roth</li>
  <li><a href="https://www.computerworld.com/article/3705992/uk-rolls-back-controversial-encryption-rules-of-online-safety-bill.html">UK rolls back controversial encryption rules of Online Safety Bill</a> by Charlotte Trueman</li>
</ul>

<h2 id="security">Security</h2>

<ul>
  <li><a href="https://www.fosslife.org/cisa-lays-out-roadmap-open-source-software-security">CISA Lays Out a Roadmap for Open Source Software Security</a></li>
  <li><a href="https://www.zerodayinitiative.com/advisories/ZDI-23-1469/">Exim AUTH Out-Of-Bounds Write Remote Code Execution Vulnerability</a></li>
  <li><a href="https://securelist.com/backdoored-free-download-manager-linux-malware/110465/">Free Download Manager backdoored - A possible supply chain attack on Linux machines</a> by Georgy Kucherin, Leonid Bezvershenko</li>
  <li><a href="https://www.helpnetsecurity.com/2023/09/27/cve-2023-5129/">Google “confirms” that exploited Chrome zero-day is actually in libwebp (CVE-2023-5129)</a></li>
  <li><a href="https://www.bleepingcomputer.com/news/security/mozilla-patches-firefox-thunderbird-against-zero-day-exploited-in-attacks/">Mozilla patches Firefox, Thunderbird against zero-day exploited in attacks</a> by Sergiu Gatlan</li>
  <li><a href="https://www.vuxml.org/freebsd/b5508c08-547a-11ee-85eb-84a93843eb75.html">Roundcube – XSS vulnerability</a></li>
  <li><a href="https://blog.zulip.com/2023/09/16/zulip-server-7-4-security-release/">Zulip Server 7.4 security release</a> by Tim Abbott</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[See the tremendous amount of little bits I've collected over the last month covering topics of gaming, open source, OSINT, privacy, security and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-7.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-7.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Switch Between Multiple Versions of Java</title><link href="https://www.adamsdesk.com/posts/switch-java-multiple-versions/" rel="alternate" type="text/html" title="How to Switch Between Multiple Versions of Java" /><published>2023-09-29T00:00:00-06:00</published><updated>2023-10-03T15:17:34-06:00</updated><id>https://www.adamsdesk.com/posts/switch-java-multiple-versions</id><content type="html" xml:base="https://www.adamsdesk.com/posts/switch-java-multiple-versions/"><![CDATA[<p>Running multiple versions of Java on an operating system may not always be necessary for everyone, but some may need to
run older applications or want to test an application against numerous versions for compatibility. No matter the reason
this is made possible by setting the default Java environment to use. Setting which Java version to use is accomplished
differently depending on which operating system is being used. Before we jump into the command-line to switch or set
the desired Java environment I will provide what the differences are between the JDK and JRE.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux</li>
  <li>Debian 11, 12</li>
  <li>Fedora 38</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
</ul>

<h2 id="what-is-jdk">What is JDK?</h2>

<p>A distribution used for software development and creation of Java applications and is referred as the Java Development
Kit (JDK) that includes the Java Runtime Environment (JRE). There are two primary implementations of the JDK, Oracle
JDK and OpenJDK. Oracle JDK is commercially licensed with multiple editions and OpenJDK is the Java Standard Edition
(Java SE) with a free open source license.</p>

<h2 id="what-is-jre">What is JRE?</h2>

<p>A software package that Java programs require in order to successfully run and is referred to as the Java Runtime
Environment (JRE). This package does not include the development tools.</p>

<h2 id="how-to-switchset-default-java-environment">How to Switch/Set Default Java Environment</h2>

<h3 id="arch-linux">Arch Linux</h3>

<p>Get the list of installed Java environments.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>archlinux-java status
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Available Java environments:
  java-11-openjdk
  java-17-openjdk
  java-21-openjdk
  java-8-openjdk
</span></code></pre></div></div>

<p>Set a default Java environment.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>archlinux-java <span class="nb">set </span>java-21-openjdk
</code></pre></div></div>

<p>Verify Java environment has been set.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>java <span class="nt">-version</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">openjdk version "21" 2023-09-19
OpenJDK Runtime Environment (build 21+35)
OpenJDK 64-Bit Server VM (build 21+35, mixed mode, sharing)
</span></code></pre></div></div>

<h3 id="debian--ubuntu">Debian / Ubuntu</h3>

<p>Get the list of installed Java environments and set the default Java environment.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>update-alternatives <span class="nt">--config</span> java
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">There are 2 choices from the alternative java (providing /usr/bin/java).

  Selection     Path                                        Priority    Status
------------------------------------------------------------
* 0             /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      auto mode
  1             /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1111      manual mode
  2             /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      manual mode

</span><span class="gp">Press &lt;enter&gt;</span><span class="w"> </span>to keep teh current choice[<span class="k">*</span><span class="o">]</span>, or <span class="nb">type </span>selection number:
</code></pre></div></div>

<p>Verify Java environment has been set.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>java <span class="nt">-version</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment (build 17.0.7+7-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 17.0.7+7-post-Debian-1deb11u1, mixed mode, sharing)
</span></code></pre></div></div>

<h3 id="fedora-rhel-and-variant-basesystem">Fedora, RHEL and Variant Basesystem</h3>

<p>Get the list of installed Java environments and set the default Java environment.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>alternatives <span class="nt">--config</span> java
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------------------
*+ 1             java-17-openjdk.x86_64 (/usr/lib/jvm/java-17-openjdk-17.0.6.0.10-1.fc38.x86_64/bin/java)
   2             java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.fc38.x86_64/bin/java)

Enter to keep the current selection[+], or type selection number:
</span></code></pre></div></div>

<p>Verify Java environment has been set.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>java <span class="nt">-version</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment (Red_Hat-17.0.6.0.10-1.fc38) (build 17.0.6+10)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.6.0.10-1.fc38) (build 17.0.6+10, mixed mode, sharing)
</span></code></pre></div></div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Follow these easy steps for various operating systems on how to set the default Java environment to use when multiple Java versions are installed.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/switch-java-multiple-versions.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/switch-java-multiple-versions.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The GNU Project Celebrates 40 Years!</title><link href="https://www.adamsdesk.com/posts/gnu-project-celebrates-40-years/" rel="alternate" type="text/html" title="The GNU Project Celebrates 40 Years!" /><published>2023-09-27T14:36:00-06:00</published><updated>2023-10-03T15:21:21-06:00</updated><id>https://www.adamsdesk.com/posts/gnu-project-celebrates-40-years</id><content type="html" xml:base="https://www.adamsdesk.com/posts/gnu-project-celebrates-40-years/"><![CDATA[<p>On this very day Richard Stallman announced the GNU Project in 1983 on Tuesday, September 27. This great project
established a strong foundation to collaboratively produce free software to support four freedom rights to, copy,
distribute, study and modify software. Since then many have followed this ideal to produce software collaboratively by
using an open source software license.</p>

<h2 id="what-is-the-gnu-project">What is the GNU Project?</h2>

<p>A free software and mass collaboration project to provide users freedom and control over their computing devices. This
is achieved by developing and publishing software that gives every user the rights to freely copy, distribute, study
and modify. This freedom of rights are granted by the use of the software GNU General Public License.</p>

<h2 id="what-is-gnu">What is GNU?</h2>

<p>GNU is an operating system that was created with GNU packages release by the GNU Project. GNU is a recursive acronym
standing for “GNU’s not Unix”. This comes from basing the design on Unix, a propriety operating system.</p>

<p>Commonly though many operating system distributions refer to it as Linux even though Linux is the name of the kernel.
So really the operating system should be called GNU/Linux.</p>

<h2 id="celebrations">Celebrations</h2>

<p>There are a few events occurring in celebration. Do consider joining in the festivities.</p>

<ul>
  <li><a href="https://www.gnu.org/gnu40/">40th GNU Anniversary Hacker Meeting</a></li>
  <li><a href="https://www.fsf.org/events/gnu40">GNU40 - Celebration in the US</a></li>
</ul>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>It’s unbelievable that 40 years has passed by already and truly amazing what GNU Project has been able to accomplish.
It feels like it wasn’t that long ago. When I think back over the years I’ve used a lot of GNU’s not Unix software and
wouldn’t have been able to accomplish what I have personally and professionally done without it.</p>

<p>I wish all the best to the GNU Project and all those involved. May the next 40 years be productive and impactful. Never
stop promoting and pursuing to protect our software freedoms.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[In celebration of 40 years of the GNU Project, I provide a post describing what the GNU project is, what is GNU, list events, and my final thoughts.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/gnu-project-celebrates-40-years.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/gnu-project-celebrates-40-years.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What’s New for GNOME 45</title><link href="https://www.adamsdesk.com/posts/whats-new-gnome-45/" rel="alternate" type="text/html" title="What’s New for GNOME 45" /><published>2023-09-27T00:00:00-06:00</published><updated>2023-09-27T08:38:01-06:00</updated><id>https://www.adamsdesk.com/posts/whats-new-gnome-45</id><content type="html" xml:base="https://www.adamsdesk.com/posts/whats-new-gnome-45/"><![CDATA[<p>On September 20, 2023 the GNOME project released the latest version 45 code name “Rīga”. This release is said to be
focused on providing a better daily interaction experience with overall enhanced performance and efficiency. I’ve been
using the GNOME desktop environment since version 1.0 all the way up to version 44.5. Things have changed a lot since
version 1.0 though GNOME v2.0 was more of what got me hooked on using it. Instead of me only reporting what has been
released in this new version I thought I would actually test things out using GNOME OS Nightly as much as I can since
most Linux distributions haven’t received the update yet. With all this said, let’s get on with it and find out what’s
new.</p>

<h2 id="what-is-gnome-os-nightly">What is GNOME OS Nightly?</h2>

<p>A working system to help facilitate the development of GNOME for debugging and testing the design and features. It is
intended to be used in a virtual machine (GNOME Boxes) or on bare metal hardware. Do keep mind that it is not a
complete system nor GNOME’s own platform or general purpose operating system. It can be unstable and unreliable since
it contains pre-released software.</p>

<h2 id="whats-new-for-gnome-45">What’s New for GNOME 45</h2>

<ol>
  <li>
    <p>Workspace Indicator</p>

    <p>Right away I noticed the top left corner of the Top Bar no longer has the static label of “Activities”. Instead, it
 has an elegant workspace indicator that changes based on which workspace is active. The large rounded rectangle
 indicates the active workspace and the individual dots indicate the additional workspaces that are available. When
 the indicator is clicked it brings up the activities overview screen.</p>

    <p>As a result of this change, the app menu that use to be under activities has been removed.</p>

    <p><img src="/assets/img/posts/gnome-45-workspace-indicator-top-bar.webp" alt="Screenshot illustrating the new workspace indicator in the Top Bar for GNOME version 45." width="500" height="39" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>Fast Search</p>

    <p>The search performance has been improved for the following applications, Software, Characters, Clocks, Files and
 Calculator. I did a few test searches using Software and Files applications and I would have to say the improvements
 are quite noticeable providing a snappy search result. Hopefully this is the case on a system that has loads of
 files.</p>
  </li>
  <li>
    <p>Camera Usage Indicator</p>

    <p>When the camera is in use a new indicator icon shaped like an old school camera one would hold appears in the towards
 the top right of the Top Bar. The icon is highlighted in orange to match similar privacy indicators when in use such
 as the microphone, screen sharing, etc. This is a nice addition for privacy reasons. I tested it out using the Camera
 (Snapshot) application, and it all worked quite well. Apparently the usage is only visible for apps using the latest
 camera technologies such as <a href="https://pipewire.org/">PipeWire</a>.</p>

    <p><img src="/assets/img/posts/gnome-45-camera-indicator-top-bar.webp" alt="Screenshot illustrating the new camera indicator in the Top Bar status area for GNOME version 45." width="170" height="39" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>New Core Applications</p>

    <p>Snapshot a camera application gives easy access to capture still photographs or record videos. Stills are captured
 in JPEG and video to WEBM file format. Preferences include the ability to toggle on/off shutter sound and
 composition guidelines. The interface provides an optional countdown in seconds (none, 3, 5, 10), a gallery preview,
 capture/record button and a mode toggle for picture or recording.</p>

    <p>Loupe an image viewer application works with touchscreen displays and multitouch trackpads with common gesture
 support. The app bar consists four actions, copy to clipboard, move to trash, image properties, and main menu.
 At the bottom icons appear only when mouse or touch is in use with, previous image, next image, zoom out, zoom in,
 and toggle fullscreen. The main menu has features for open with, printing, rotate image, set background.</p>

    <p>Both applications seem quite modern and responsive. Though I do wish for an option in the image viewer to always
 display the image properties as of right now you have to toggle it back on when opening the app again.</p>
  </li>
  <li>
    <p>Keyboard Backlight Control</p>

    <p>The new quick menu setting provides the ability to toggle on or off the backlight as well a slider to adjust the
 brightness. In my test I was not able to locate this in my testing using a Logitech K800 Wireless Slim, so I guess
 my keyboard is not supported.</p>
  </li>
  <li>
    <p>Hardware Video Playback</p>

    <p>The playing of videos will now use hardware resources when possible for a faster and less power experience.</p>
  </li>
  <li>
    <p>Quick Settings Keyboard Shortcut</p>

    <p>A new keyboard shortcut <kbd>Super</kbd> + <kbd>S</kbd> will open and close the quick settings menu.</p>

    <p><img src="/assets/img/posts/gnome-45-quick-settings-menu.webp" alt="Screenshot of the quick settings menu using Super + S keyboard shortcut for GNOME version 45." width="500" height="346" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>Settings Application</p>

    <p>Date and Time display format in the Top Bar can now be configured without using the GNOME Tweaks app.</p>

    <p><img src="/assets/img/posts/gnome-45-settings-date-time.webp" alt="Screenshot of the Settings for Clock &amp; Calendar in top bar for GNOME 45." width="614" height="300" loading="lazy" class="img-fluid" /></p>

    <p>Users no longer has the ability to view Account Activity. This seems rather odd to see this go.
 Apps and Privacy no longer uses the sidebar for subpages. The subpage is built-in to the main viewing area.
 About now has a more compact layout yet adding more information. System Details bring up a dialog called System
 Details for hardware and software information with added feature of copying details to the clipboard.</p>
  </li>
  <li>
    <p>Light System Style</p>

    <p>A new option to give the system a light interface style instead of the default dark.</p>

    <p>I see the new option, however this confuses me as of GNOME 44.5, and I’m pretty sure before that I’ve been able to
use the default style which is white. Maybe this is an Arch Linux alteration? I even see this within the
“Settings” &gt; “Appearance”. Looking into this further using <code class="language-plaintext highlighter-rouge">gsettings</code> from the command line that a valid value of
“default”, “prefer-dark”, “prefer-light” is already possible. So I’m not sure exactly what this means.</p>
  </li>
  <li>
    <p>Better Pointer</p>

    <p>GNOME’s pointers or cursors has a new look as well as a smoother pointer movement when the system is busy.</p>
  </li>
  <li>
    <p>New Style Apps</p>

    <p>New interface components have been added to many core GNOME applications allowing for better window sizes and device
form factors. The adaptive sidebars change width of the window and layout automatically within the app. The header
bar also has a new look with a subtle shadow for separation between the header and content below. These improvements
are visible in the following applications, Console, Text Editor, Calendar, Characters, Clocks, Contacts, Disk Usage
Analyzer, Files, Fonts, Tour and Web.</p>
  </li>
  <li>
    <p>KVM Support for Wayland</p>

    <p>Software called Input Leap implements keyboard-video-mouse (KVM) to control multiple computers using a single
keyboard and mouse without the use of hardware. This ability has been added for Wayland sessions.</p>
  </li>
  <li>
    <p>Files Improvements</p>

    <p>Faster search results with claims of being able to search millions of files with results returned in milliseconds.
A more useful and predictable order of search results as well as new buttons to allow expanding the scope of
search. Though I have no had millions of files to test this on, I indeed notice quite an improvement and I do think
having the ability to expand the search scope is great bonus.</p>

    <p>Other enhancements include a new “Visible columns…” menu within “View Options” has been added for theme
consistency, more consistent date and time formats in the list view, indicator for starred files in list view, and
faster thumbnail generation.</p>

    <p>I’ve done some testing with Files and I do have to say it is noticeably faster for search results and for thumbnail
generation. The rest is just bonuses to me.</p>

    <p><img src="/assets/img/posts/gnome-45-files-visible-columns.webp" alt="Screenshot of GNOME Files with Visible Columns dialog new layout for GNOME 45." width="300" height="400" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>Enhanced Applications</p>

    <p>Core applications of GNOME have received a number of new features and improvements.</p>

    <ul>
      <li><strong>Software:</strong>
        <ul>
          <li>App data can now be optionally removed when uninstalling a Flatpak</li>
          <li>The user interface adjusts automatically when there are little apps available</li>
          <li>When detecting a gaming being played downloading and installing updates is paused</li>
        </ul>
      </li>
      <li><strong>Calendar:</strong>
        <ul>
          <li>Month view can be scrolled through a week at time instead of flipping from month to month</li>
          <li>Keyboard shortcuts added for synchronizing calendars (<kbd>F5</kbd>), opening the calendars’ menu (<kbd>F8</kbd>),
and managing calendars (<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>M</kbd>)</li>
          <li>Search results returns events from a wider range of dates</li>
          <li>Performance improvements</li>
        </ul>
      </li>
      <li><strong>Maps:</strong>
        <ul>
          <li>A button has been added that indicates direction and allows orientating the map to north</li>
          <li>Explore nearby points of interest from the search popover</li>
          <li>Zoom buttons are now overlaid over the map instead of in the header bar</li>
        </ul>
      </li>
      <li><strong>Connections:</strong>
        <ul>
          <li>Allows for copying text, images and files to and from remote computers using the RDP protocol
-<strong>Console:</strong></li>
          <li>Settings for a custom font</li>
          <li>Setting to disable terminal bell sound and visual effects</li>
        </ul>
      </li>
      <li><strong>Calculator:</strong>
        <ul>
          <li>Convert more currencies with Taiwanese Dollar, Ukrainian Hryvnia, Nigerian Naira, and Jamaican Dollar</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    <p>New Circle Applications</p>

    <p>Six new applications have been added.</p>

    <ul>
      <li><a href="https://apps.gnome.org/Telegraph/">Telegraph</a>, Morse code translator</li>
      <li><a href="https://apps.gnome.org/Cartridges/">Cartridges</a>, Game launcher (supports Steam, Lutris, Heroic, and more)</li>
      <li><a href="https://apps.gnome.org/EarTag/">Ear Tag</a>, Audio file tag editor</li>
      <li><a href="https://apps.gnome.org/PdfMetadataEditor/">Paper Clip</a>, PDF metadata editor</li>
      <li><a href="https://apps.gnome.org/ForgeSparks/">Forge Sparks</a>, Notifier app for GitHub, Gitea, and Forgejo</li>
      <li><a href="https://apps.gnome.org/Impression/">Impression</a>, Writes disk images to removable drives</li>
    </ul>
  </li>
</ol>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>Well this has been quite the process going through each item, but was cool to be able to try things out using GNOME OS
Nightly. It is just a matter of time I hope that soon we will no longer need to have GNOME Tweaks. Overall the GNOME 45
release has positive changes and I believe the GNOME team deserves a job well done. Make a point to reach out with a
thank you to the developers and other volunteers that made this all possible.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="gnome" /><summary type="html"><![CDATA[Read all about each significant changes and additions to GNOME version 45, the free and open source Linux desktop environment.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/whats-new-gnome-45.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/whats-new-gnome-45.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What is the Social Media Platform Bluesky?</title><link href="https://www.adamsdesk.com/posts/what-is-bluesky-social/" rel="alternate" type="text/html" title="What is the Social Media Platform Bluesky?" /><published>2023-09-26T00:00:00-06:00</published><updated>2023-09-26T11:41:15-06:00</updated><id>https://www.adamsdesk.com/posts/what-is-bluesky-social</id><content type="html" xml:base="https://www.adamsdesk.com/posts/what-is-bluesky-social/"><![CDATA[<p>With the foundation falling apart from underneath of X (formerly known as Twitter), many people are seeking alternatives
for their online social activities. One contender that is fairly new to the market is Bluesky Social, a spin-off project
originating at Twitter. Let us dive in as we discover this new service to answer some questions people are
asking, what is Bluesky, who owns it, how can I join and more.</p>

<h2 id="what-is-bluesky">What is Bluesky?</h2>

<p>A decentralized American social media platform focused on microblogging utilizing the open source Authenticated Transfer
(AT) protocol.</p>

<h2 id="bluesky-brief-company-history">Bluesky Brief Company History</h2>

<p>The initiative was announced by Twitter’s then CEO Jack Dorsey on Twitter in 2019 to develop an open protocol for
decentralized social media. Bluesky was formally incorporated in late 2021 as an independent public benefit limited
liability company (LLC) with Jay Graber as the CEO. The service agreement between Twitter and Bluesky was severed in
late 2022. In July 2023 seed funding raised $8 million and then Bluesky changed from public benefit limited liability
company to public benefit C Corp.</p>

<h2 id="what-is-the-goal-of-bluesky">What is the Goal of Bluesky?</h2>

<p>To build a protocol for public conversation similar to email, blogs, phone numbers that will create an open system to
give the power back to its users instead companies being in control.</p>

<h2 id="who-owns-bluesky">Who Owns Bluesky?</h2>

<p>According to the Bluesky’s frequently asked questions (FAQ), the Bluesky company is a Public Benefit Corporation
which is owned by Jay Graber and the Bluesky team. I’ve not been able to determine exactly what the Bluesky team means.
Though the FAQ states that Jack Dorsey and Jeremie Miller serve on the board, along with Jay.</p>

<h2 id="what-is-the-at-protocol">What is the AT protocol?</h2>

<p>An open source protocol (Authenticated Transfer protocol) for public conversation and framework that allows one to build
social applications with the ability to see how it works, and what is being developed. With this foundation it will
create a standard format for user identity, follows, and data for social apps. This provides the ability of a federated
network with account portability. So if a user wants to move to another application or service that can do so freely
without loosing follows, followers, posts, etc.</p>

<h2 id="how-do-i-access-bluesky-social">How Do I Access Bluesky Social?</h2>

<p>Bluesky operates its own official network called Bluesky Social, a centralized service running on proprietary software
for its servers. The AT protocol and client apps has been released under the open source license MIT. Bluesky Social
can be accessed via the web client at <a href="https://bsky.app/">bsky.app</a> or mobile client apps for
<a href="https://apps.apple.com/us/app/bluesky-social/id6444370199">iOS</a> and
<a href="https://play.google.com/store/apps/details?id=xyz.blueskyweb.app">Android</a>.</p>

<p>Here are few third-party clients…</p>

<ul>
  <li><a href="https://graysky.app/">Graysky</a> (web, open source)</li>
  <li><a href="https://kite.black/">Kite</a> (web)</li>
  <li><a href="https://klearsky.pages.dev/">Klearsky</a> (web)</li>
  <li><a href="https://skyline.gay/">Skyline</a> (web, open source)</li>
  <li><a href="https://github.com/rmcan/swiftsky">swiftsky</a> (macOS, open source)</li>
</ul>

<h2 id="how-do-i-join-bluesky-social">How do I join Bluesky Social?</h2>

<p>Presently Bluesky Social is not accepting new accounts. However, there are a couple of options.</p>

<ol>
  <li>
    <p>Sign up for the waitlist at <a href="https://bsky.app/">bsky.app</a>.</p>

    <p>Click on “Create a new account” &gt; “Next” &gt; “Join the waitlist”.</p>
  </li>
  <li>
    <p>Obtain a free invite code from a user of Bluesky.</p>
  </li>
</ol>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I’ve not used Bluesky Social enough yet, so another post will be coming about my experience. I’m still uncertain how
this is all going to unfold. Though as of September 12, 2023 Bluesky has reported reaching 1 million users. There are
many features I feel that are missing. I have a lot to catch up and understand how it all works. Most of my hesitations
is really from the fact of I don’t feel this is going to be truly free, and that it feels like a conflict of interest.
How does a company create an open social media network when the ultimate goal is to make profit, even though they say
otherwise. Time I guess will show us all what becomes of Bluesky Social.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Explore a new social network Bluesky by finding out what it is all about, where it came from, who owns it, how to join and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/what-is-bluesky-social.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/what-is-bluesky-social.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What’s New in Mastodon version 4.2</title><link href="https://www.adamsdesk.com/posts/whats-new-mastodon-version-4.2/" rel="alternate" type="text/html" title="What’s New in Mastodon version 4.2" /><published>2023-09-21T00:00:00-06:00</published><updated>2023-09-21T20:03:13-06:00</updated><id>https://www.adamsdesk.com/posts/whats-new-mastodon-version-4.2</id><content type="html" xml:base="https://www.adamsdesk.com/posts/whats-new-mastodon-version-4.2/"><![CDATA[<p>On September 21, 2023 Mastodon version 4.2.0 has been released to the public with new and exciting changes for the
fediverse citizens to use for their social microblogging needs. To better understand what has all changed I have
taken the time to arrange the list of changes as best I could into two groups, end users and administrators of
what I deemed significant. With each item listed I’ve provided a description and the odd comments. Let’s take a
look at what all the fuss is about.</p>

<h3 id="whats-new-for-end-users">What’s New for End Users</h3>

<ul>
  <li>
    <p>Full-text search</p>

    <p>A rework of search options (operators), new Privacy and reach setting “Include public posts in search results” and
  results are ordered chronologically.</p>

    <p>Search operators: <code class="language-plaintext highlighter-rouge">from:me</code>, <code class="language-plaintext highlighter-rouge">before:2022-11-01</code>, <code class="language-plaintext highlighter-rouge">after:2022-11-01</code>, <code class="language-plaintext highlighter-rouge">during:2022-11-01</code>, <code class="language-plaintext highlighter-rouge">language:fr</code>,
  <code class="language-plaintext highlighter-rouge">has:poll</code>, or <code class="language-plaintext highlighter-rouge">in:library</code></p>
  </li>
  <li>
    <p>Privacy and Reach</p>

    <p>Privacy and reach settings are reorganized into one location under “Edit profile” &gt; “Privacy and reach tab”.
  Under the search section a new option is available “Include public posts in search results”. This allows search
  results on Mastodon to show your public posts. Do keep in mind, those that interact with your posts may be able to
  search them regardless of this setting.</p>
  </li>
  <li>
    <p>Display of out-of-band hashtags in the web interface</p>

    <p>To be honest, I’m at a loss as to what exactly has changed. I thought the hashtags were to be rendered into pills,
  however I don’t see this. Though what is an out-of-band hashtag in the first place? Is it the truncation of the
  hashtags where the first 3 displayed and the rest truncated?</p>
  </li>
  <li>
    <p>Role Badges</p>

    <p>Profiles can now have role badges such as Automated (bot), Owner, etc.</p>
  </li>
  <li>
    <p>Report User by choosing domains</p>

    <p>A user now has the ability to choose which domains will receive the abuse report user. This allows a choice to not
  forward to a known malicious instance or an instance that does not violate policies.</p>
  </li>
  <li>
    <p>Lists, Hide these posts from home</p>

    <p>A new option is available on each list “Hide these posts from home”. The feature gives the ability to choose if you
  want the accounts associated to a list to be hidden in your home feed and rather be visible only within the list
  itself.</p>
  </li>
  <li>
    <p>Import Lists</p>

    <p>Support has been added to allow for importing lists and can be access under “Edit profile” &gt; “Import and export” &gt;
  “Import”. This supplements with the ability to export lists.</p>
  </li>
  <li>
    <p>Post Threads</p>

    <p>Vertical lines have been added to clearly indicate a post’s conversion thread.</p>
  </li>
  <li>
    <p>New Users</p>

    <p>When signing up for a new account, a user will be presented with step-by-step instructions to assist in creating and
  setting up a new profile.</p>
  </li>
  <li>
    <p>Explore News with Published Date and Author</p>

    <p>News posts founder under “Explore” &gt; “News” now shows the author and published date when possible.</p>
  </li>
  <li>
    <p>Open New Post</p>

    <p>After publishing a post you now have the option to click on “Open” within the toast notification.</p>
  </li>
  <li>
    <p>Poll Results</p>

    <p>See current poll results without having to vote. This is nice, though I do feel results shouldn’t be visible until
  poll has ended as this can sway how people vote. Maybe I’m taking polls too seriously (smile).</p>
  </li>
  <li>
    <p>Home Feed Too Slow</p>

    <p>When the home feed is too slow a dismissible notice appears with two buttons “See what’s trending” and
  “Find people to follow”. This only occurs when one is true…</p>

    <ul>
      <li>Fewer than 7 different accounts</li>
      <li>Average gap between posts is more than 20 minutes</li>
      <li>The most recent post is more than an hour ago</li>
    </ul>
  </li>
  <li>
    <p>Time zone preference</p>

    <p>The time zone can now be set under “Edit profile” &gt; “Preferences” &gt; “Time zone”. This is an optional setting used
  for how dates and times are displayed within email messages.</p>
  </li>
  <li>
    <p>Alt Text Badge</p>

    <p>Media with an alternative text will now be indicated with a badged displayed at the bottom left.</p>
  </li>
  <li>
    <p>Logged-Out Experience</p>

    <p>A new interactive flow has been implemented to handle scenarios when doing actions that require to be logged in. You
  now be prompted to enter your instance domain that will allow one to login or continue a current session to complete
  the action. Optional you can create account at this stage too.</p>
  </li>
  <li>
    <p>Profile Posts</p>

    <p>The behaviour has changed as follows.</p>

    <ul>
      <li>Posts tab shows all the users posts and boosts</li>
      <li>Posts and replies tab only shows users posts and replies</li>
    </ul>
  </li>
  <li>
    <p>Link Previews Redesign</p>

    <p>The link card preview has been given a fresh new look. To me this feels bigger and not as clean.</p>
  </li>
  <li>
    <p>Direct Messages Name Change</p>

    <p>Direct Messages is now called “Private mentions”.</p>
  </li>
  <li>
    <p>Local and Federated Feed</p>

    <p>The local and federated feeds have been moved under “Live feeds” and have also received a name change.</p>

    <ul>
      <li>Local feed is now called “This server”</li>
      <li>Fderated feed is now called “Other servers” (excludes This server) or “All” (includes This servera and
federated).</li>
    </ul>
  </li>
  <li>
    <p>Edit profile</p>

    <p>Rework the profile section using a tabbed design and then rename “Profile” to “Public profile”, “Avatar” to
  “Profile picture”, “Profile metadata” to “Extra fields”.</p>
  </li>
  <li>
    <p>Bot Name Change</p>

    <p>The “bot” label is now referred to as “Automated” for less negative connotation.</p>
  </li>
  <li>
    <p>Explore For you</p>

    <p>Under “Explore”, “For you” has be renamed to “People.</p>
  </li>
</ul>

<h2 id="whats-new-for-administrators">What’s New for Administrators</h2>

<ul>
  <li>
    <p>Notification of new Mastodon version for administrators</p>

    <p>By default, every 30 minutes a query to “https://api.joinmastodon.org/update-check” will be sent in the background
  checking if a new version is available. Options are available to change the URL or disable this feature entirely.</p>
  </li>
  <li>
    <p>hCaptcha</p>

    <p>An optional feature to require new users to solve a CAPTCHA for confirmation of their account.</p>
  </li>
  <li>
    <p>Hashtag Moderation</p>

    <p>Within “Trending hashtags” you are now able to click to view hashtag timelines which eliminates the need to manually
  copy/paste.</p>
  </li>
  <li>
    <p>Manage Tags with Admin API</p>

    <p>Adds an API endpoint to return paginated list of all tags, single tag or update a single tag.</p>
  </li>
  <li>
    <p>Trend Management</p>

    <p>This extends the admin/trends API for managing trends using REST API.</p>
  </li>
</ul>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I’ve yet to have a full experience of all the changes, though I do feel I’ve definitely appreciated a few of them thus
far. I like the potential power of search and the layout redesign of “Edit profile” settings especially for “Privacy and
reach”. Overtime I believe I will also enjoy seeing posts exclusively within a list to help filter what I exactly want to
see. The new “Live posts” layout, seems practical. For backup purpose it is nice to see the ability to import lists since
we can export them. At this stage I feel overall these are all good changes, but who knows I may change my opinion once
I’ve used theme all more. What are your thoughts?</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Discover what is new and exciting in the latest software release of the microblogging social network Mastodon version 4.2.0.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/whats-new-mastodon-v4.2.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/whats-new-mastodon-v4.2.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Fix Undefined nav_item in Material for MkDocs</title><link href="https://www.adamsdesk.com/posts/material-mkdocs-fix-undefined-nav-item/" rel="alternate" type="text/html" title="How to Fix Undefined nav_item in Material for MkDocs" /><published>2023-09-20T00:00:00-06:00</published><updated>2023-09-20T15:36:25-06:00</updated><id>https://www.adamsdesk.com/posts/material-mkdocs-fix-undefined-nav-item</id><content type="html" xml:base="https://www.adamsdesk.com/posts/material-mkdocs-fix-undefined-nav-item/"><![CDATA[<p>Just a couple of days ago I updated my Arch Linux system and everything went well as usual. Though I
discovered while trying to get a few more updates out that I’m no longer able to build or run locally <a href="https://kb.adamsdesk.com/">Adamsdesk
Knowledge Base</a> website due to an error message with Material MkDocs. As it turns out during
the system update a new version of Material for MkDocs was installed, version 9.1.21 to 9.3.1. As well, I customized
Material for MkDocs to extend the theme, so this could be the cause. Let’s break down this exception error and find the
solution.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Arch Linux</li>
  <li>Fish v3.6.1</li>
  <li>GNU Bash v5.1.16</li>
  <li>MkDocs Material v9.3.1</li>
  <li>MkDocs v1.5.2</li>
  <li>Python v3.11.5</li>
</ul>

<h2 id="problem">Problem</h2>

<p>When running <code class="language-plaintext highlighter-rouge">mkdocs serve</code> or <code class="language-plaintext highlighter-rouge">mkdocs build</code> commands the following error message is returned.</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        All development files are stored at "/home/adam/dev/kb/" and therefore all other references outside this path are third party source files.
    </p>
</div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">
Traceback (most recent call last):
</span><span class="gp">  File "/usr/bin/mkdocs", line 8, in &lt;module&gt;</span><span class="w">
</span><span class="go">    sys.exit(cli())
             ^^^^^
  File "/usr/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mkdocs/__main__.py", line 270, in serve_command
    serve.serve(**kwargs)
  File "/usr/lib/python3.11/site-packages/mkdocs/commands/serve.py", line 86, in serve
    builder(config)
  File "/usr/lib/python3.11/site-packages/mkdocs/commands/serve.py", line 67, in builder
    build(config, live_server=None if is_clean else server, dirty=is_dirty)
  File "/usr/lib/python3.11/site-packages/mkdocs/commands/build.py", line 340, in build
    _build_theme_template(template, env, files, config, nav)
  File "/usr/lib/python3.11/site-packages/mkdocs/commands/build.py", line 110, in _build_theme_template
    output = _build_template(template_name, template, files, config, nav)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mkdocs/commands/build.py", line 89, in _build_template
    output = template.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jinja2/environment.py", line 1301, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.11/site-packages/jinja2/environment.py", line 936, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "/usr/lib/python3.11/site-packages/material/404.html", line 4, in top-level template code
    {% extends "main.html" %}
  File "/home/adam/dev/kb/overrides/main.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/usr/lib/python3.11/site-packages/material/base.html", line 143, in top-level template code
    {% block header %}
^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/material/base.html", line 144, in block 'header'
    {% include "partials/header.html" %}
^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/material/partials/header.html", line 60, in top-level template code
    {% include "partials/tabs.html" %}
^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/material/partials/tabs.html", line 4, in top-level template code
    {% import "partials/tabs-item.html" as item with context %}
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jinja2/environment.py", line 1405, in make_module
    return TemplateModule(self, ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jinja2/environment.py", line 1535, in __init__
</span><span class="gp">    body_stream = list(template.root_render_func(context))  #</span><span class="w"> </span><span class="nb">type</span>: ignore
<span class="go">                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/adam/dev/kb/overrides/partials/tabs-item.html", line 32, in top-level template code
    {% if nav_item.children %}
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jinja2/environment.py", line 485, in getattr
    return getattr(obj, attribute)
           ^^^^^^^^^^^^^^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'nav_item' is undefined

</span></code></pre></div></div>

<h2 id="solution">Solution</h2>

<p>If we look closely at the traceback we can see the “nav_item” variable is undefined within the file
“/home/adam/dev/kb/overrides/partials/tabs-item.html” just before it encounters the exception error. Due to the fact
that I didn’t make any changes to this file or any other base files other than creating new articles I deduced that it
has to be that Material for MkDocs code has changed. To prove this I removed the partial file “tabs-item.html” and ran
<code class="language-plaintext highlighter-rouge">mkdocs serve</code> again. Sure enough the exception error disappeared.</p>

<p>To resolve the error I simply fetched the latest
<a href="https://github.com/squidfunk/mkdocs-material/blob/master/src/partials/tabs-item.html">tabs-item.html</a> file and then
applied my alterations.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="webdev" /><summary type="html"><![CDATA[Learn how to fix MkDocs not able to serve or build a website after receiving the exception error of "jinja2.exceptions.UndefinedError: 'nav_item' is undefined".]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/material-mkdocs-fix-undefined-nav-item.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/material-mkdocs-fix-undefined-nav-item.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #6</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-6/" rel="alternate" type="text/html" title="Little Bits: Issue #6" /><published>2023-09-15T00:00:00-06:00</published><updated>2023-09-15T17:34:56-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-6</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-6/"><![CDATA[<p>Well it looks like the time has passed by again on me, no one’s fault but my own. I’ve had a lot of activity since my
last post, so this will be a large one. So let’s correct this by catching up on what interesting and wonderful
discoveries I’ve found on the Internet in the past month. Enjoy.</p>

<h2 id="art">Art</h2>

<ul>
  <li>
    <p><a href="https://inkblot.art/">InkBlot</a></p>

    <p>A community by artists for artists that is similar to DeviantArt.</p>
  </li>
</ul>

<h2 id="books">Books</h2>

<ul>
  <li>
    <p><a href="https://www.asimovs.com/">Asimov’s Science Fiction</a></p>

    <p>A magazine that covers the best at science fiction stories since 1977. Each issue is available in print and digitally via third party platforms.</p>
  </li>
  <li>
    <p><a href="https://archive.org/details/manuals">The Manual Library</a></p>

    <p>The Internet Archive Manual Library is a collection of manuals, instructions, walkthroughs and data sheets for a massive spectrum of items.</p>
  </li>
  <li>
    <p><a href="https://masha.co.za/">Masha du Toit</a> (<a href="https://mefi.social/@Zumbador">Mastodon</a>)</p>

    <p>Science Fiction and Contemporary Fantasy set in alternate world South Africa.</p>
  </li>
  <li><a href="https://archive.org/details/mit_press_open_access">MIT Press: Open Access Materials</a> via Internet Archive</li>
  <li><a href="https://nantucketebooks.com/ebooks/pd/timemachine/">The Time Machine by H.G. Wells - Nantucket E-books</a></li>
  <li>
    <p><a href="https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/ebook/why-we-love-freedos-29/why-we-love-freedos-29.pdf">Why We Love FreeDOS</a> by various contributors</p>

    <p>A collection of essays and contributions about how people started working on and using FreeDOS, and why we love
  FreeDOS.</p>
  </li>
</ul>

<h2 id="comics">Comics</h2>

<ul>
  <li><a href="https://globalcomix.com/news/details/410/most-popular-of-2022-slice-of-life">Most Popular of 2022: Slice of Life</a></li>
</ul>

<h2 id="gaming">Gaming</h2>

<ul>
  <li>
    <p><a href="https://www.outofprintarchive.com/">Out of Print Archive</a></p>

    <p>Classic video game magazines.</p>
  </li>
  <li>
    <p><a href="https://nantucketebooks.com/ebooks/quarterup/quarterup_2023_q2/">QUARTER UP! Vol. II, Summer 2023</a></p>

    <p>A free online newsletter about pinball and retro arcade gaming.</p>
  </li>
</ul>

<h2 id="design">Design</h2>

<ul>
  <li>
    <p><a href="https://beehive.gay/blobbee">Blobbee</a></p>

    <p>Blobbee is an emoji pack based on Neofox by Volpeon.</p>

    <p>License: CC BY-NC-SA 4.0</p>
  </li>
  <li>
    <p><a href="https://www.freefaces.gallery/">Free Faces</a></p>

    <p>Collection of typefaces that are available under a variety of free licenses.</p>
  </li>
  <li>
    <p><a href="https://github.com/Solidifyconceptdevelopment/Repair-symbol">Repair Symbol</a></p>

    <p>An open source repair symbol, inspired by the recycle symbol.</p>

    <p>License: CC-BY 4.0</p>
  </li>
  <li>
    <p><a href="https://missing.style/">Missing.css</a></p>

    <p>The classless-ish CSS library you’ve been missing.</p>

    <p>Language: CSS, License: BSD 2-Clause</p>
  </li>
</ul>

<h2 id="hardware">Hardware</h2>

<ul>
  <li>
    <p><a href="https://play.date/">Playdate</a></p>

    <p>A tiny handheld game system with a bunch of brand-new games.</p>
  </li>
</ul>

<h2 id="knowledge">Knowledge</h2>

<ul>
  <li><a href="https://timheuer.com/blog/resx-editor-for-visual-studio-code/">Creating a VS Code Editor Extension</a> by Tim Heuer</li>
  <li>
    <p><a href="https://cpu.land/">CPU Land</a> by Lexi Mattick &amp; Hack Club</p>

    <p>Learn how multiprocessing works, what system calls really are, how computers manage memory with hardware interrupts, and how Linux loads executables.</p>
  </li>
  <li><a href="https://alexplescan.com/posts/2023/07/08/easy-svg-sparklines/">Easy SVG sparklines</a> by Alex Plescan</li>
  <li><a href="https://inkscape.org/forums/competitions/inkscape-challenge-1-august-2023-31-august-2023/">Inkscape Challenge | 1 August 2023 - 31 August 2023</a></li>
  <li><a href="https://arxiv.org/pdf/2307.03172.pdf">Lost in the Middle: How Language Models Use Long Contexts</a></li>
  <li><a href="https://store.theleap.co/theleap/course/mini-course-building-your-email-list">Mini Course Building Your Email List</a> by Millie Adrian</li>
</ul>

<h2 id="misc">Misc</h2>

<ul>
  <li><a href="https://www.scientificamerican.com/article/we-need-to-focus-on-ais-real-harms-not-imaginary-existential-risks/">AI Causes Real Harm. Let’s Focus on That over the End-of-Humanity Hype</a> by Emily M. Bender, Alex Hanna</li>
  <li><a href="https://github.com/BuddiesOfBudgie/budgie-backgrounds/releases/tag/v2.0">Budgie Backgrounds v2.0 released</a></li>
  <li><a href="https://media.defcon.org/DEF%20CON%2031/">DEF CON 31 Media Files</a></li>
  <li><a href="https://werd.io/2023/my-first-thoughts-about-threads">First thoughts about threads</a> by Ben Werdmuller</li>
  <li><a href="https://computer.rip/2023-07-29-Free-Public-WiFi.html">Free Public WiFi</a> by j. b. Crawford</li>
  <li><a href="https://ploum.net/2023-06-23-how-to-kill-decentralised-networks.html">How to Kill a Decentralized Network (such as the Fediverse)</a> by Ploum</li>
  <li><a href="https://hackaday.com/2023/08/04/if-the-shoe-doesnt-fit-print-it/">If The Shoe Doesn’t Fit, Print It!</a> by Al Williams</li>
  <li><a href="https://overturemaps.org/overture-maps-foundation-releases-first-world-wide-open-map-dataset/">Overture Maps Foundation Releases Its First World-Wide Open Map Dataset</a></li>
  <li><a href="https://www.peppercarrot.com/extras/html/2023_peertube-generator/">Peertube Advatar Generator</a> by David Revoy</li>
  <li><a href="https://www.unixsheikh.com/articles/the-delusions-of-debian.html">The delusions of Debian</a></li>
  <li><a href="https://www.youtube.com/watch?v=l-8qqkCbo3U">Samsung is a GARBAGE company!</a> (<a href="https://piped.projectsegfau.lt/watch?v=l-8qqkCbo3U">Piped</a>) by Louis Rossmann</li>
</ul>

<h2 id="music">Music</h2>

<ul>
  <li>
    <p><a href="https://www.radio-browser.info/">RadioBrowser</a></p>

    <p>A community driven effort with the aim of collecting as many internet radio and TV stations as possible.</p>
  </li>
</ul>

<h2 id="news">News</h2>

<ul>
  <li><a href="https://arstechnica.com/gadgets/2023/07/fairphone-is-coming-to-america/">Fairphone 4—the repairable, sustainable smartphone—is coming to the US</a> by Ron Amadeo</li>
  <li><a href="https://www.bleepingcomputer.com/news/security/major-us-energy-org-targeted-in-qr-code-phishing-attack/">Major U.S. energy org targeted in QR code phishing attack</a> by Bill Toulas</li>
  <li><a href="https://www.theverge.com/2023/6/24/23771064/european-union-battery-regulation-ecodesign-user-replacable-batteries">Making sense of the EU’s fight for user-replaceable smartphone batteries</a> by Jon Porter</li>
  <li><a href="https://www.infosecurity-magazine.com/news/study-reveals-forged-certificate/">New Study Reveals Forged Certificate Attack Risks</a> by Alessandro Mascellino</li>
  <li><a href="https://www.theverge.com/2023/7/6/23786474/reddit-nsfw-moderator-protest-final-warning">Reddit demands moderators remove NSFW labels, or else - The Verge</a> by Jay Peters</li>
  <li><a href="https://hackaday.com/2023/06/30/rocky-strikes-back-at-red-hat/">Rocky Strikes Back At Red Hat</a> by Jenny List</li>
</ul>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li>
    <p><a href="https://github.com/hackerb9/lsix">lsix</a></p>

    <p>List images by thumbnails in terminal using sixel graphics.</p>

    <p>Language: Shell, GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/muesli/duf">duf</a></p>

    <p>Disk usage/free space utility alternative to df.</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/jvns/dig-pretty">Dig Pretty</a></p>

    <p>Make dig’s output prettier.</p>

    <p>Language: Python, License: MIT</p>
  </li>
  <li>
    <p><a href="https://readup.org/">Readup</a></p>

    <p>A free and open source reading platform without the algorithms via a web browser, or on the go with an iPhone and iPad.</p>

    <p>License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://www.ivarch.com/programs/pv.shtml">pv</a></p>

    <p>Pipe Viewer (pv) is a terminal-based tool for monitoring the progress of data through a pipeline.</p>

    <p>Language: C, License: Artistic v2.0</p>
  </li>
  <li>
    <p><a href="https://ruffle.rs/">Ruffle</a></p>

    <p>A Flash Player emulator available for both the desktop and the web using WebAssembly.</p>

    <p>Language: Rust, License: Apache v2.0 or MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/lirantal/dockly">Dockly</a></p>

    <p>Immersive terminal interface for managing docker containers and services.</p>

    <p>Language: JavaScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://crawlee.dev/">Crawlee</a></p>

    <p>A web scraping and browser automation library.</p>

    <p>Language: TypeScript, License: Apache v2.0</p>
  </li>
  <li>
    <p><a href="https://www.wellobserve.com/index.php?post=20221222155743">Our Paint</a></p>

    <p>A featureless but programmable painting program.</p>

    <p>Language: C, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://mailinabox.email/">Mail-in-a-Box</a></p>

    <p>Take back control of your email with this easy-to-deploy mail server in a box without having to be a technology expert to set it up.</p>
  </li>
  <li>
    <p><a href="https://switching.software/">switching.software</a></p>

    <p>A directory of ethical, easy-to-use and privacy-conscious alternatives to well-known software.</p>
  </li>
  <li>
    <p><a href="https://github.com/sampotts/plyr">Plyr</a></p>

    <p>A simple HTML5, YouTube and Vimeo player.</p>

    <p>Language: JavaScript, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/iman-salmani/iplan">iPlan</a></p>

    <p>Your plan for improving personal life and workflow.</p>

    <p>Language: Rust, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/ohwgiles/laminar">Laminar CI</a></p>

    <p>Fast and lightweight Continuous Integration.</p>

    <p>Language: C++, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/misskey-dev/misskey">Misskey</a></p>

    <p>An interplanetary microblogging platform.</p>

    <p>Language: TypeScript, License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://akkoma.dev/FoundKeyGang/FoundKey">FoundKey</a></p>

    <p>FoundKey is a free and open source microblogging server compatible with ActivityPub.</p>

    <p>Language: TypeScript, License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/nosarthur/gita">Gita</a></p>

    <p>Manage many git repositories with sanity.</p>

    <p>Language: Python, License: MIT</p>
  </li>
  <li>
    <p><a href="https://codeberg.org/silverpill/mitra">Mitra</a></p>

    <p>A Federated microblogging self-hosted, lightweight platform built on ActivityPub protocol.</p>

    <p>Language: Rust, License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/w84death/smolOS">SmolOS</a></p>

    <p>A lightweight operating system for microcontrollers with a POSIX-like environment.</p>

    <p>Language: MicroPython, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/segin/readexe">readexe</a></p>

    <p>A command-line tool for inspecting various Microsoft PC EXE formats.</p>

    <p>Language: C</p>
  </li>
  <li>
    <p><a href="https://github.com/roc-streaming/roc-toolkit">Roc Toolkit</a></p>

    <p>Real-time audio streaming over the network.</p>

    <p>Language: C++, License: MPL v2.0</p>
  </li>
  <li>
    <p><a href="https://github.com/curl/trurl">trurl</a></p>

    <p>Command line tool for URL parsing and manipulation.</p>

    <p>Language: C</p>
  </li>
  <li>
    <p><a href="https://veilid.com/">Veilid</a></p>

    <p>An open-source, peer-to-peer, mobile first, networked application framework.</p>
  </li>
  <li>
    <p><a href="https://github.com/weebney/webcamize">webcamize</a></p>

    <p>Use any camera as a webcam—DSLR, mirrorless, camcorder, point-and-shoot, and even some smartphones/tablets.</p>

    <p>Language: Shell, License: BSD 2-Clause</p>
  </li>
</ul>

<h2 id="osint">OSINT</h2>

<ul>
  <li>
    <p><a href="https://github.com/m8sec/CrossLinked">CrossLinked</a></p>

    <p>LinkedIn enumeration tool to extract valid employee names from an organization through search engine scraping.</p>

    <p>Language: Python, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/Te-k/harpoon">Harpoon</a></p>

    <p>Command line tool for open source and threat intelligence.</p>

    <p>Language: Python, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/bellingcat/octosuite">octosuite</a></p>

    <p>A framework for gathering open-source intelligence on GitHub users, repositories and organizations.</p>

    <p>Language: Python, License: GNU GPLv3</p>
  </li>
</ul>

<h2 id="privacy">Privacy</h2>

<ul>
  <li>
    <p><a href="https://gofoss.net/">gofoss.net</a></p>

    <p>A guide on how to start protecting your online privacy with free and open source software.</p>
  </li>
  <li><a href="https://discussion.fedoraproject.org/t/f40-change-request-privacy-preserving-telemetry-for-fedora-workstation-system-wide/85320/291?page=6">F40 Change Request: Privacy-preserving Telemetry for Fedora Workstation (System-Wide) - Fedora Discussion</a></li>
  <li><a href="https://www.theodi.org/project/privacy-enhancing-technologies-pets/">What are Privacy Enhancing Technologies (PETs) and why are they important?</a></li>
  <li><a href="https://foundation.mozilla.org/en/blog/slack-microsoft-teams-privacy/">Slack Vs Microsoft Teams — Which Is Better For Your Privacy?</a> by Xavier Harding</li>
</ul>

<h2 id="security">Security</h2>

<ul>
  <li><a href="https://fy.blackhats.net.au/blog/2023-02-02-how-hype-will-turn-your-security-key-into-junk/">How Hype Will Turn Your Security Key Into Junk</a> by William Brown</li>
  <li><a href="https://jfloren.net/b/2023/7/7/0">ProtonMail Rewrites Your Emails</a> by John Floren</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Inspect the wonderful and interesting discoveries I've made last month covering topics of gaming, open source, OSINT, privacy, security and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-6.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-6.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Surprising Birthday Celebration Leads To an Upgrade</title><link href="https://www.adamsdesk.com/posts/surpising-birthday-celebration-upgrade/" rel="alternate" type="text/html" title="Surprising Birthday Celebration Leads To an Upgrade" /><published>2023-09-14T00:00:00-06:00</published><updated>2023-09-14T20:18:32-06:00</updated><id>https://www.adamsdesk.com/posts/surpising-birthday-celebration-upgrade</id><content type="html" xml:base="https://www.adamsdesk.com/posts/surpising-birthday-celebration-upgrade/"><![CDATA[<p>This year I was expecting a quiet August birthday celebration at home with my son coming over to watch a movie. I decided
to take things ease and play my favourite video game. Though this all seemed like a well laid plan, others and fate had a
completely different ideas.</p>

<h2 id="pre-celebration-woes">Pre-Celebration Woes</h2>

<p>During the afternoon I decided to play <a href="https://en.wikipedia.org/wiki/Cities%3A_Skylines">Cities: Skylines</a>. It has been
almost a year I think since I last played. Unfortunately quite a few things are broken due to updates. This shouldn’t be
shocking considering I play with quite a few mods to make the experience more enjoyable. However, I didn’t really want to
fight with getting the game working, I just wanted to play. Times like this I miss the old games when updates were slow
and for the most part just worked. In either case, I didn’t end up getting to play. I need to go back and finish figuring
out which mod is causing the game to crash.</p>

<h2 id="celebration">Celebration</h2>

<p>As I understood from a previous conversation my son was to come over around 19:00 (7 p.m.) and we would watch the movie
<a href="https://www.themoviedb.org/movie/414906-the-batman">The Batman (2022)</a>. So I carried on my day as usual and made up meal
for my supper. So around 19:30 (7:30 p.m.) my son and his partner arrived with a couple frozen pizzas. Not even a few
minutes pass before we could fully talk when a group of family members (my mom, brothers and sister-in-law) walk in with
pizzas and a cake. This through me completely off as I didn’t expect this at all. You see my mother was supposed to be on
vacation and said she wouldn’t be around. The unfortunate part in all this was I didn’t know about having a meal in the
celebration. However, I ate a small meal and I couldn’t pass up eating a few slices (smile). We all visited as we ate, and
we ended up not watching the movie.</p>

<h2 id="unexpected-gifts">Unexpected Gifts</h2>

<p>If the celebration itself wasn’t enough of a surprise, the gifts I received were much more of a shock. I honestly couldn’t
find the right words to say. Even now thinking about this, I still don’t know what to say other than “this is crazy” and
“thank you so much”.</p>

<p>I started off by opening a small present from my bother and sister-in-law. It wasn’t really sure what it was other than
possibly a tabletop game. Indeed, it was a table-top game I’ve been wanting for years to try out called,
<a href="https://boardgamegeek.com/boardgame/2593/pass-pigs">Pass The Pigs</a>. I look forward to playing this.</p>

<p>Next my son handed me an unwrapped box of a Logitech keyboard and mouse combo. The unusual box and weight felt like there
was nothing inside, which just added to the puzzled look I must have had on my face. I proceeded to open the box up and
found three pieces of paper inside. Each sheet of paper had one photo printed on them of an
<a href="https://kb.adamsdesk.com/hardware/amd-ryzen-7-5700x/">AMD Ryzen 7 5700X Desktop Processor</a>,
<a href="https://kb.adamsdesk.com/hardware/asus-rog-strix-b550-f-gaming-wifi-ii/">ASUS ROG Strix B550-F Gaming WiFi II Motherboard</a>,
and <a href="https://www.corsair.com/ca/en/p/memory/cmk32gx4m2d3600c18/vengeancea-lpx-32gb-2-x-16gb-ddr4-dram-3600mhz-c18-memory-kit-black-cmk32gx4m2d3600c18">Corsair Vengeance LPX 32 GB of DDR4 RAM</a>. This puzzled me more, because I
thought there is no way he bought me all this to upgrade my current computer system. I found out that the photos were done
because the order was late arriving. My son did say that he wanted to get something that would help me achieve my new job
as a tech blogger and YouTube creator. This was and is just insane to me, but I am very grateful.</p>

<p>At this stage I figured this would be the end of being blown away by crazy gifts, but I was wrong. My other Brother says
his gift has not arrived and proceeds to tell me that he purchased me a <a href="https://www.samsung.com/ca/memory-storage/nvme-ssd/990-pro-1tb-nvme-pcie-gen-4-mz-v9p1t0b-am/">Samsung 990 PRO PCIe 4.0 NVMe M.2 1 TB SSD</a>. Again,
I was at a loss for words.</p>

<p>On top of all these thoughtful gifts I received two gifts prior to and after the celebration. First was a
<a href="https://ca.tilley.com/products/ltm5-airflo-hat">Tilley LTM5 Airflow Hat (khaki/olive)</a> from my Mother. I’m was quite
surprised as I’ve wanted one of these for a while now. Then the second was a card game
<a href="https://boardgamegeek.com/boardgame/7803/ono-99">ONO 99</a> given to me from my Aunt which I was not expecting. Since the
card game is similar to Uno, I look forward trying it out.</p>

<h2 id="finale">Finale</h2>

<p>A far amount of time has passed since this celebration and I still cannot believe the endless blessings I’ve received this
year. It all seems to me as unimaginable. Every wonderful gift will be put to good use, especially the computer hardware
as my current system is more than 8 years old now. This is the old hardware I was using.</p>

<ul>
  <li><a href="https://kb.adamsdesk.com/hardware/asus-a88x-pro/">ASUS A88X Pro Motherboard</a></li>
  <li><a href="https://kb.adamsdesk.com/hardware/amd-a10-7850k/">AMD A10-7850K Desktop Processor</a></li>
  <li>CORSAIR Vengeance Pro 16 GB (2 x 8 GB) 240-Pin SDRAM DDR3 1866Mhz Desktop Memory</li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Follow along on this surprising change of events of a quiet evening at home to a small celebration and shocking gifts that leads to an upgrade.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/surprising-gifts.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/surprising-gifts.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">It’s Overdue, Time To Say Goodbye to Twitter!</title><link href="https://www.adamsdesk.com/posts/goodbye-twitter/" rel="alternate" type="text/html" title="It’s Overdue, Time To Say Goodbye to Twitter!" /><published>2023-09-12T00:00:00-06:00</published><updated>2023-09-12T19:54:57-06:00</updated><id>https://www.adamsdesk.com/posts/goodbye-twitter</id><content type="html" xml:base="https://www.adamsdesk.com/posts/goodbye-twitter/"><![CDATA[<p>My use of Twitter (X) has really dropped off over the years since I first created my account on April 2009. Though I admit
for a bit I was using it to help spread awareness of my work on Adamsdesk. I no longer enjoy my time with the service
and I do not agree with the policy changes I now must abide to. It’s overdue, but it is finally time to say goodbye to
Twitter.</p>

<h2 id="my-usage-of-social-media">My Usage of Social Media</h2>

<p>How I use social media in my perspective is not the general norm. I’ve always been against sharing specific details of
my life or of others online far before social media became mainstream. I value respect and privacy of others including my
own. Furthermore, I’ve always used social media as a means to share as well as explore my joy of technology and hobbies by
helping others in the context of creating a positive brand or image of myself, yet keeping true to who I am. It is without
a doubt a balancing act of where to draw the line, though having this perspective helps to keep me mostly on track and to
avoid making those posts that does not have value for someone else let alone myself.</p>

<h2 id="waiting-it-out">Waiting It Out</h2>

<p>Several years ago prior to Elon Musk’s ownership of Twitter, I wanted to delete my account, but decided that I will keep
the Twitter account for now and wait it out. My reasoning was at the time, Twitter is better than Facebook, Instagram, etc.
and I will need Twitter in order to reach people for the betterment of my business, Adamsdesk. Now, I no longer
agree with this reasoning.</p>

<h2 id="reasons-to-leave">Reasons to Leave</h2>

<p>Twitter uses an algorithm to display content within your feed, instead of allowing the user to have full control. To me
this gives the potential to manipulate what I can and cannot see as well as influencing a dopamine response. As a result
this is creating unhealthy behaviour and displaying posts I never agreed to follow. Saying this though on a positive note
Twitter has finally open sourced <a href="https://github.com/twitter/the-algorithm">the algorithm</a>. I believe the only way one can
gain control over your feed to a certain extent is by using lists, however I’m not certain if this is still true. In the
end this just creates an unenjoyable experience.</p>

<p>As the years have gone by with changes of policies, API (application programming interface), behaviour and new ownership
(Elon Musk) of Twitter seems to foster toxicity instead of a healthy respectful engagement. I will not deny, no matter the
social media used there will always be some level of toxic behaviour, but things just seem to be out of hand, and no
longer care to be a part of the circus.</p>

<p>Recently I’ve realized one profound question that I may have gained from my experiences of using not just Twitter, but
many other social media services in a personal and professional context that I believe we should all be asking ourselves.
Why have we allowed our social life to be owned and controlled by companies? No company will ever have your best interests
at heart. To me this is a conflict of interest. You are not a human being, but rather a product that can be used as they
see fit for profit. This doesn’t settle well for me and quite frankly no one should be in my opinion.</p>

<p>In the past there wasn’t much of alternatives other than the main stream social media. However, today this is no longer
the case. With the <a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a> growing by leaps and bonds, there is a community
out there for just about anyone that is easy to use and become a part of.</p>

<p>Overall I simply feel that my values do not align with Twitter. I want to have a system, admins and moderators that foster
a healthy engagement and community that respects privacy, security, freedom and operates in transparency. I’m not looking
for perfection, but a good genuine experience without the algorithms, and a system that doesn’t make me into a product.</p>

<h2 id="considerations-before-leaving">Considerations Before Leaving</h2>

<p>Before taking the action of deleting your Twitter account there are a few things that should be taken into consideration.</p>

<ol>
  <li>
    <p>Backup your data.</p>

    <p>A backup cannot be done during the deactivation period or after the account has been permanently deleted. Therefore,
 make sure to download an archive of your data. The requested archive can take up to 24 hours before receiving it.</p>

    <p>Browse to “More” &gt; “Settings and Support” &gt; “Settings and Privacy” &gt; “Your Account” &gt; “Download an archive of your
 data” to begin.</p>
  </li>
  <li>
    <p>Deleting an account is not immediate.</p>

    <p>The process of deleting a Twitter account is done by deactivating it. Once deactivated this process takes 30 days
 before the account is permanently deleted. However, if the account is accessed with-in the 30-day deactivation
 period, and you have confirmed to reactivate the account it is then considered reactivated and therefore would
 require to start the process all over again.</p>
  </li>
  <li>
    <p>Your username is fair game.</p>

    <p>Once an account has completed the 30-day deactivation period, the username associated to the Twitter account is free
 for anyone to use.</p>
  </li>
  <li>
    <p>Public personas, brand or image can be affected.</p>

    <p>Deleting a Twitter account is not always simple for everyone. If you have an account that has a substantial following
 as a persona, brand or image one must think about the potential impact for impersonation if the account is deleted. In
 cases like this, it may be best to hold onto the account, but keep in mind an account can possibly be deleted due to
 inactivity.</p>
  </li>
</ol>

<h2 id="conclusion">Conclusion</h2>

<p>In the end of it all what Twitter has to offer is not a desirable experience I care to partake in and therefore have
decided to delete my account. You can see how little I used Twitter with my current stats.</p>

<ul>
  <li>139 Following</li>
  <li>84 Followers</li>
  <li>12 lists</li>
  <li>2896 posts</li>
</ul>

<p>Unfortunately Twitter doesn’t offer an easy way to delete your data before leaving. I tried to find an open source
solution, but was not able to do so. I decided to use the free <a href="https://redact.dev/">Redact</a> application for Linux
(AppImage) to delete my data beforehand. I realize this doesn’t guarantee that my data is indeed deleted, but at least I
tried to do the best I can.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Gain insight into my thoughts on social media usage, reasons to leave Twitter and what to consider before leaving Twitter.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/goodbye-twitter.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/goodbye-twitter.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Top Recommended Settings for Roundcube Webmail</title><link href="https://www.adamsdesk.com/posts/roundcube-webmail-recommened-settings/" rel="alternate" type="text/html" title="Top Recommended Settings for Roundcube Webmail" /><published>2023-07-14T00:00:00-06:00</published><updated>2023-07-14T14:30:26-06:00</updated><id>https://www.adamsdesk.com/posts/roundcube-webmail-recommened-settings</id><content type="html" xml:base="https://www.adamsdesk.com/posts/roundcube-webmail-recommened-settings/"><![CDATA[<p>Quite often we forget to go through the settings of web applications especially when it comes to email. By reviewing the
settings this helps improve your experience, communication, privacy, security and understanding of the application.
Here are a few areas of settings that I recommended changing at the bare minimum when using the free and open source
software Roundcube Webmail suite.</p>

<h2 id="environment">Environment</h2>

<p>Instructions tested with the following.</p>

<ul>
  <li>Roundcube Webmail v1.4.13</li>
</ul>

<h2 id="change-password">Change Password</h2>

<p>When an email address is set up by someone else other than yourself or the account has been compromised the password
should be changed to keep it secure and under your control for accountability.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Password”.</li>
  <li>Enter the desired password under “New Password” and then again in “Confirm New Password”.</li>
  <li>Click the “Save” button.</li>
</ol>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Never share the password with anyone under any
circumstances. This includes system administrators, tech support, boss, etc.
    </p>
</div>

<h2 id="set-your-identity">Set Your Identity</h2>

<p>To clearly communicate to the recipient of your email messages it is best to set the display name, organization name
(if applicable) and signature that will be used each time a message is sent. All these settings helps the recipient
be able to clearly identify who a message is from.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Identities”.</li>
  <li>Select desired identity.</li>
  <li>Under “Settings” set the “Display Name” by entering your name.</li>
  <li>Under “Settings” set the “Organization” by entering the name of organization the email address is associated to (optional).</li>
  <li>Under “Signature” enter the desired text.</li>
  <li>Click the “Save” button.</li>
</ol>

<h2 id="read-messages-in-plaintext">Read Messages in Plaintext</h2>

<p>To protect one’s privacy, security and freedom of control turn off displaying email messages in HyperText Markup
Language (HTML) by default. This will force all emails to be displayed by default in plaintext. Each email message will
now have an extra button to toggle on displaying the message using HTML if necessary. This is the safest route to go in
protecting yourself online from tracking or malicious messages.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Preferences” &gt; “Displaying Messages”.</li>
  <li>Toggle off “Display HTML”.</li>
  <li>Click the “Save” button.</li>
</ol>

<h2 id="email-maintenance">Email Maintenance</h2>

<p>To keep your email clean and optimized for the best experience I always recommend emptying the trash and compacting
on logout.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Preferences” &gt; “Server Settings”.</li>
  <li>Toggle on “Clear Trash on logout”.</li>
  <li>Toggle on “Compact Inbox on logout”.</li>
  <li>Click the “Save” button.</li>
</ol>

<h2 id="spellcheck">Spellcheck</h2>

<p>It is often forgotten to do spellcheck on an email message, so to help combat this follow these steps.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Preferences” &gt; “Composing Messages”.</li>
  <li>Toggle on “Check spelling before sending a message” under “Spellcheck Options”.</li>
  <li>Click the “Save” button.</li>
</ol>

<h2 id="change-theme">Change Theme</h2>

<p>For the best experience using an application is having an interface that is enjoyable to interact with. There are three
themes to choose from. However, “Elastic” theme is best for the most modern experience.</p>

<ol>
  <li>Open Roundcube email client.</li>
  <li>Browse to “Settings” &gt; “Preferences” &gt; “User Interface”.</li>
  <li>Select interface skin to “Elastic”.</li>
  <li>Click the “Save” button.</li>
</ol>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="privacy" /><category term="security" /><summary type="html"><![CDATA[Improve your Roundcube Webmail email client experience by following these step-by-step top recommend settings all users should consider doing.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/roundcube-webmail-recommended-settings.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/roundcube-webmail-recommended-settings.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Check If Wayland or Xorg Is Being Used</title><link href="https://www.adamsdesk.com/posts/find-display-server-wayland-xorg/" rel="alternate" type="text/html" title="How to Check If Wayland or Xorg Is Being Used" /><published>2023-07-13T00:00:00-06:00</published><updated>2023-07-13T20:39:09-06:00</updated><id>https://www.adamsdesk.com/posts/find-display-server-wayland-xorg</id><content type="html" xml:base="https://www.adamsdesk.com/posts/find-display-server-wayland-xorg/"><![CDATA[<p>For some time now the Linux display server has been going through a transition for the graphical environment.
The well established X Window System (a.k.a. X, X11 or X.Org) has been the default, but slowly the mainstream Linux
desktop distributions have changed the default to Wayland. Unfortunately not all legacy components or applications are
compatible even with the use of the compatibility layer of XWayland. As a result it can be beneficial to know for
certain which display manager is being used in order to debug issues. I will show how this can be accomplished using a
variety of methods that will work in most circumstances.</p>

<h2 id="what-is-a-display-server">What is a Display Server?</h2>

<p>A program that is responsible for handling the coordination of input and output of the hardware, the operating system
and as well as each other. All the coordination is sent using a communication protocol, such as
<a href="https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)">Wayland</a> or
<a href="https://en.wikipedia.org/wiki/X_Window_System_core_protocol">X11</a>. Without a display server a computer could not be
used graphically.</p>

<h2 id="environment">Environment</h2>

<p>Instructions were tested using the following.</p>

<ul>
  <li>Arch Linux</li>
  <li>Fish v3.6.1</li>
  <li>GNU Bash v5.1.16</li>
  <li>GNOME v44.3</li>
  <li>KDE Plasma v5.27.4</li>
</ul>

<h2 id="gnome-settings">GNOME Settings</h2>

<ol>
  <li>Open GNOME Settings.</li>
  <li>Click on “About” on the left-hand side.</li>
  <li>
    <p>On the right-hand side look for the value under “Windowing System”.</p>

    <p><img src="/assets/img/posts/gnome-settings-windowing-system.webp" alt="Screenshot of the about section within GNOME Settings that illustrates the location of Windowing System type just below GNOME version." width="720" height="431" class="img-fluid rounded" /></p>
  </li>
</ol>

<h2 id="kde-plasma">KDE Plasma</h2>

<ol>
  <li>Open System Settings.</li>
  <li>Click on “About” on the left-hand side.</li>
  <li>
    <p>On the right-hand side look for the value under “Graphics Platform”.</p>

    <p><img src="/assets/img/posts/kde-plasma-system-settings-graphics-platform.webp" alt="Screenshot of the about this system within System Settings that illutrates the location of the Graphics Platform type below kernel version." width="720" height="515" class="img-fluid rounded" /></p>
  </li>
</ol>

<h2 id="environment-variable">Environment Variable</h2>

<p>During the loading process environment variables are set and as a result we can confirm which display server is being
used by getting the value of the variable using a terminal. For best results look at using “XDG_SESSION_TYPE” or “env”
examples.</p>

<ul>
  <li>
    <p>Display the value of the variable “XDG_SESSION_TYPE”.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span><span class="nb">echo</span> <span class="nv">$XDG_SESSION_TYPE</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">  x11
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Display the value of the variable “WAYLAND_DISPLAY”.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span><span class="nb">echo</span> <span class="nv">$WAYLAND_DISPLAY</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">  wayland-0
</span></code></pre></div>    </div>
    <p>If no value is returned then X11 is being used.</p>
  </li>
  <li>
    <p>Use the “env” and grep commands to search all environment variables for X11 or Wayland.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span><span class="nb">env</span> | <span class="nb">grep</span> <span class="nt">-i</span> <span class="nt">-e</span> x11 <span class="nt">-e</span> wayland
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">  XDG_SESSION_TYPE=x11
</span></code></pre></div>    </div>
  </li>
</ul>

<h2 id="systemd-login-manager">Systemd Login Manager</h2>

<p>For the Linux operating systems configured with Systemd the login manager can be accessed using the command “loginctl”
in the terminal to confirm which display server is in use.</p>

<ol>
  <li>
    <p>Get the session ID.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>loginctl list-sessions
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> SESSION  UID USER SEAT  TTY
     3 1000 adam seat0 tty2

 1 sessions listed.
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Display session type to confirm display server being used.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>loginctl show-session 3 <span class="nt">-p</span> Type
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Type=x11
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="system-processes">System Processes</h2>

<p>The example below list all the system processes and then searches through all the results to only display process with
the name of “tty” using a terminal. Visually look through the returned results for X11 (Xorg) or Wayland.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>ps <span class="nt">-e</span> | <span class="nb">grep tty</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">20162 tty2     00:00:00 gdm-x-session
20167 tty2     00:00:16 Xorg
20200 tty2     00:00:00 gnome-session-b
23334 ?        00:00:00 kitty
</span></code></pre></div></div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[Find out if Wayland or Xorg is being used as the Linux display server using a graphical interface or terminal.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/linux-find-display-server.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/linux-find-display-server.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #5</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-5/" rel="alternate" type="text/html" title="Little Bits: Issue #5" /><published>2023-07-06T00:00:00-06:00</published><updated>2023-07-06T14:26:57-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-5</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-5/"><![CDATA[<p>Well here we are again, more than two months has passed by without another issue of Little Bits and this is not
acceptable for me. I need to start getting more organized by using a content schedule and improve how I produce a new
issue. All these thoughts just recently clicked into place when I was reading Joel’s post entitled,
<a href="https://joelchrono12.xyz/blog/what-interested-me-today/">What interested me today (#1?)</a>. You see, when I sit down to
produce another issue of Little Bits, I go to my bookmarks found in my personal knowledge management system (PKMS) and
start grabbing links that I wish to share. This method is not ideal and doesn’t feel natural to me, plus it’s
time-consuming. From now on I will share what I am discovering online organized by topics since the last issue. This
allows for me to create a new issue as I go instead of piecing it all together in one sitting. This should provide a
more natural experience and also will mean some issues will be bigger or smaller depending on how much I’ve discovered.
As well, I feel having topic headings would be beneficial for not just myself, but for the reader and search engine
discovery. My workflow maybe changing, but Little Bits should now continue with more frequency, having more value and
still remain short and sweet. Enjoy!</p>

<h2 id="books">Books</h2>

<ul>
  <li>
    <p><a href="https://www.chuq.me/ebooks">Books by Chuq Von Rospach</a></p>

    <p>Free e-books on birds and wildlife.</p>
  </li>
  <li>
    <p><a href="https://mwl.io/fiction/freebies">Book Freebies by Michael W Lucas</a></p>

    <p>Free fictional stories and novels.</p>
  </li>
</ul>

<h2 id="gaming">Gaming</h2>

<ul>
  <li>
    <p><a href="https://www.moddb.com/mods/half-life-mmod">Half-Life: MMod</a></p>

    <p>A free, fan made modification for Half-Life aiming to refine player’s arsenal and further expand player’s combat
  options. Featuring AI tweaks, VFX and SFX overhaul in spirit of original, additional weapon functionality and bug
  fixes, while keeping most changes optional.</p>
  </li>
</ul>

<h2 id="hardware">Hardware</h2>

<ul>
  <li>
    <p><a href="https://www.codeof.me/pikku-raspberry-pi-pico-powered-macropad/">Pikku</a></p>

    <p>A do-it-yourself (DIY) customizable six key macropad powered by Raspberry Pi Pico microcontroller.</p>
  </li>
  <li>
    <p><a href="https://www.davidrevoy.com/article842/review-xp-pen-artist-24-pro-on-linux">Review: XP-Pen Artist 24 Pro on Linux </a> by David Revoy</p>
  </li>
</ul>

<h2 id="knowledge">Knowledge</h2>

<ul>
  <li>
    <p><a href="https://github.com/dair-ai/Prompt-Engineering-Guide">Prompt Engineering Guide</a></p>

    <p>Guides, papers, lecture, notebooks and resources for <a href="https://en.wikipedia.org/wiki/Prompt_engineering">prompt engineering</a>.</p>

    <p>Language: MDX, License: MIT</p>
  </li>
  <li><a href="https://www.33southtextworks.com/demystifying-the-apostrophe/">Demystifying the Apostrophe - how and when to use an apostrophe</a></li>
  <li><a href="https://www.linux-magazine.com/Online/Features/Designer-Pages">Page styles in LibreOffice Writer</a></li>
  <li>
    <p><a href="https://blindsvg.com/">Blind SVG Study Guide</a></p>

    <p>Built to help teach blind and low-vision folks how to code their own graphics with SVG.</p>
  </li>
  <li>
    <p><a href="https://nantucketebooks.com/shantydocs">Learn Shanty</a></p>

    <p>A markup language for writing e-books.</p>

    <p>License: GNU Free Documentation</p>
  </li>
  <li><a href="https://theevilskeleton.gitlab.io/2023/03/24/how-to-propose-features-to-gnome.html">How to Propose Features to GNOME</a></li>
</ul>

<h2 id="music">Music</h2>

<ul>
  <li>
    <p><a href="https://codeberg.org/jasonnab/AwesomeListOfMusicRetailers">Awesome List of Music Retailers</a></p>

    <p>List of online stores offering music in high quality, accessible, and permanently ownable formats. Each provider
  must have the option of lossless audio file format, ability to download media to your system locally without DRM
  and no special tools required and not require a subscription to purchase media.</p>
  </li>
  <li>
    <p><a href="https://www.discogs.com/">Discogs</a></p>

    <p>A user-generated music database and marketplace that is open source and crowdsourced.</p>
  </li>
  <li>
    <p><a href="https://radiofreefedi.net/">Radio Free Fedi</a></p>

    <p>24/7 music and sounds from the fediverse.</p>
  </li>
</ul>

<h2 id="news">News</h2>

<ul>
  <li><a href="https://www.fsf.org/blogs/community/googles-decision-to-deprecate-jpeg-xl-emphasizes-the-need-for-browser-choice-and-free-formats">Google’s decision to deprecate JPEG-XL emphasizes the need for browser choice and free formats</a></li>
  <li><a href="https://www.malwarebytes.com/blog/news/2023/06/edge-browser-feature-sends-images-you-view-back-to-microsoft">Edge browser feature sends images you view back to Microsoft</a></li>
  <li><a href="https://huggingface.co/blog/falcon">The Falcon has landed in the Hugging Face ecosystem</a></li>
  <li><a href="https://keepassxc.org/blog/2023-04-15-audit-report/">KeePassXC Audit Report</a></li>
  <li><a href="https://blog.joinmastodon.org/2023/07/what-to-know-about-threads/">What to know about Threads</a> by Eugen Rochko (CEO/Founder of Mastodon)</li>
</ul>

<h2 id="open-source-software">Open Source Software</h2>

<ul>
  <li>
    <p><a href="https://beyondgrep.com/">ack</a></p>

    <p>Grep-like source code search tool.</p>

    <p>Language: Perl, License: Artistic v2.0</p>
  </li>
  <li>
    <p><a href="https://framagit.org/Ezwen/bandcamp-collection-downloader">Bandcamp collection downloader</a></p>

    <p>A command-line tool to automatically download all releases purchased with a Bandcamp account.</p>

    <p>Language: Kotlin, License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://github.com/nidud/doszip">Doszip</a></p>

    <p>The Doszip Commander is an LFN (long file name) aware text user interface (TUI) file manager (Norton Commander
  clone) with built-in Zip and Unzip for DOS and Windows.</p>

    <p>Language: Assembly, License: GNU GPLv2</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/adhami3310/Impression">Impression</a></p>

    <p>A straight-forward and modern application to create bootable drives. Available officially via a flatpak.</p>

    <p>Language: Rust, License: CC BY-SA 3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/tomnomnom/gron">gron</a></p>

    <p>Make JSON greppable (searchable)!</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://github.com/PaulJuliusMartinez/jless">jless</a></p>

    <p>jless is a command-line JSON viewer designed for reading, exploring, and searching through JSON data. Available on
  FreeBSD, Linux, macOS and NetBSD.</p>

    <p>Language: Go, License: MIT</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/brutaldon/brutaldon">Brutaldon</a></p>

    <p>A web client for <a href="https://joinmastodon.org/">Mastodon</a> and <a href="https://pleroma.social/">Pleroma</a>. There are two key
  benefit of this software, one having the option to host it yourself or use the hosted instance at
  <a href="https://brutaldon.org/">brutaldon.org</a> and two having the ability to work without JavaScript. This makes it possible
  to use text based browsers such as <a href="https://lynx.browser.org/">Lynx</a>, <a href="https://w3m.sourceforge.net/">w3m</a>, or
  <a href="http://elinks.or.cz/">elinks</a>.</p>

    <p>Language: Python, License: GNU AGPLv3</p>
  </li>
  <li>
    <p><a href="https://pawamoy.github.io/mkdocs-manpage/">MkDocs Manpage</a></p>

    <p>Generate a manpage using the source of a documentation site using MkDocs.</p>

    <p>Language: Python, License: ISC</p>
  </li>
  <li>
    <p><a href="https://www.lunarvim.org/">LunarVim</a></p>

    <p>An integrated development environment (IDE) layer for Neovim with sane defaults. Completely free and community driven.</p>

    <p>Language: Lua, License: GNU GPLv3</p>
  </li>
  <li>
    <p><a href="https://web-grease.netlify.app/">Grease</a></p>

    <p>A website starter that makes building performant, accessible, aesthetic websites fast and frictionless.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Join me in this issue of Little Bits sharing my online discoveries covering topics of books, gaming, hardware, knowledge, music, news and open source.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-5.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-5.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Count JSON Array Elements with JQ</title><link href="https://www.adamsdesk.com/posts/count-json-array-elements-jq/" rel="alternate" type="text/html" title="How To Count JSON Array Elements with JQ" /><published>2023-06-26T00:00:00-06:00</published><updated>2023-06-26T16:11:58-06:00</updated><id>https://www.adamsdesk.com/posts/count-json-array-elements-jq</id><content type="html" xml:base="https://www.adamsdesk.com/posts/count-json-array-elements-jq/"><![CDATA[<p>Using JSON as a data source can be quite powerful, but what can take it to the next level is using a program that can
process the JSON data to manipulate it or to simply verify how many array elements exist. This is all possible and more
with the use of an open source lightweight command-line program called <a href="https://jqlang.github.io/jq/">jq</a>. The jq
application is quite accessible being available on a variety of operating systems, FreeBSD, Linux, macOS, Solaris and
Windows. Let’s begin the journey of exploring how to count JSON array elements.</p>

<h2 id="what-is-jq">What is jq?</h2>

<p>A JavaScript Object Notation (JSON) command-line processor that provides the ability to slice, filter, map and
manipulate the data structure with simplicity.</p>

<h2 id="json-string-count-array-elements">JSON String: Count Array Elements</h2>

<p>Using the built-in length function of jq we can count the array elements found in a simple JSON string that contains a
list of website addresses.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">echo</span> <span class="s1">'[{"Adamsdesk": "https://www.adamsdesk.com/"},{"Adamsdesk KB": "https://kb.adamsdesk.com/"}]'</span> | jq <span class="s1">'. | length'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">2
</span></code></pre></div></div>

<h2 id="a-file-count-array-elements">A File: Count Array Elements</h2>

<p>Here are the contents of the file “example.json” that contains a list of countries and cities. Let’s count the root
array elements.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"countries"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Canada"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"ISO-3166-1-alpha-2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"CA"</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"United States of America"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"ISO-3166-1-alpha-2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"US"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"cities"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Los Angeles"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"countries_id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Vancouver"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"countries_id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Toronto"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"countries_id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>jq <span class="s1">'. | length'</span> example.json
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">2
</span></code></pre></div></div>

<h2 id="nested-array-count-array-elements">Nested Array: Count Array Elements</h2>

<p>The nested array has a list of various city names, let’s count how many array elements are associated to cities.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">echo '{"cities":[{"name":"Los Angeles"},{"name":"Vancouver"},{"name":"Toronto"}]}' | jq '.cities | length'
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">3
</span></code></pre></div></div>

<h2 id="remote-json-data-count-array-elements">Remote JSON Data: Count Array Elements</h2>

<p>This example queries the Mastodon account Adamsdesk profile metadata on Fosstodon using the Mastodon API and then will
count the total array elements found under the “emojis” key.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl <span class="s2">"https://fosstodon.org/api/v1/accounts/lookup?acct=adamsdesk"</span> | jq <span class="s1">'.emojis | length'</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>21
</code></pre></div></div>

<p>For illustration purposes here are the contents of the query data with the beginning and end truncated so that only the
“emojis” data is shown.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"emojis"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"arch"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/090/050/original/ae5ab97b259fe17d.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/090/050/static/ae5ab97b259fe17d.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"alpine"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/218/777/original/82d920d583221b7e.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/218/777/static/82d920d583221b7e.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"linux"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/115/original/077a5cfa08a16bcb.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/115/static/077a5cfa08a16bcb.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"openbsd"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/059/615/original/db208ca8502874ee.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/059/615/static/db208ca8502874ee.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"android"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/102/original/64ec1c48b5f213fe.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/102/static/64ec1c48b5f213fe.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"terminal"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/127/original/398662c04f1d032f.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/127/static/398662c04f1d032f.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"AntennaPod"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/720/381/original/9346145bb110c8e3.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/720/381/static/9346145bb110c8e3.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"firefox"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/378/original/6710d28f8a2cdc05.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/378/static/6710d28f8a2cdc05.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gimp"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/111/original/592f1bf79e1af1d3.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/025/111/static/592f1bf79e1af1d3.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gitea"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/702/389/original/650b0e605850f306.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/702/389/static/650b0e605850f306.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gnomewhite"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/367/original/gnomewhite.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/367/static/gnomewhite.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"inkscape"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/083/940/original/2225d4cb86fd6e88.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/083/940/static/2225d4cb86fd6e88.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"thunderbird"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/377/original/4bc6f0caa347f85a.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/377/static/4bc6f0caa347f85a.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ublockorigin"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/716/461/original/9fe02b7d9ec3397c.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/716/461/static/9fe02b7d9ec3397c.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"duckduckgo"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/368/original/duckduckgo.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/010/368/static/duckduckgo.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"fsf"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/084/358/original/d1411f3764516b0f.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/084/358/static/d1411f3764516b0f.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"fedi"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/691/240/original/fce8be1e4468ce58.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/691/240/static/fce8be1e4468ce58.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"osm"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/177/141/original/0ccb7bb1bc8563de.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/177/141/static/0ccb7bb1bc8563de.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tetris"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/100/768/original/5148c03e43140252.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/100/768/static/5148c03e43140252.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"raspberrypi"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/015/409/original/raspberry-pi.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/015/409/static/raspberry-pi.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"shortcode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"startrek"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/129/517/original/26b6b8b0066163ac.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"static_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://cdn.fosstodon.org/custom_emojis/images/000/129/517/static/26b6b8b0066163ac.png"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"visible_in_picker"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span></code></pre></div></div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="commandline" /><summary type="html"><![CDATA[Learn by example on how to count JSON array elements with the use of the powerful open source lightweight command-line program, jq.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/count-json-array-elements-jq.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/count-json-array-elements-jq.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Red Hat Enterprise Linux Goes Closed Source?</title><link href="https://www.adamsdesk.com/posts/redhat-enterprise-linux-closed-source/" rel="alternate" type="text/html" title="Red Hat Enterprise Linux Goes Closed Source?" /><published>2023-06-24T00:00:00-06:00</published><updated>2023-06-24T22:18:05-06:00</updated><id>https://www.adamsdesk.com/posts/redhat-enterprise-linux-closed-source</id><content type="html" xml:base="https://www.adamsdesk.com/posts/redhat-enterprise-linux-closed-source/"><![CDATA[<p>On Wednesday, June 21, 2023, Red Hat announced with a post on their blog entitled
“<a href="https://www.redhat.com/en/blog/furthering-evolution-centos-stream">Furthering the evolution of CentOS Stream </a>”.
In the industry this post was quite shocking news to read, though to me this is not surprising. Red Hat has
come a long way proving that open source can generate revenue and undeniably has boosted various open source projects
along the way. Unfortunately the trajectory of Red Hat is no longer on a clear path of supporting free open source
software since IBM acquired the business in 2019. The future may be uncertain to some, but there is still many
possibilities ahead.</p>

<h2 id="whats-changed">What’s Changed?</h2>

<p>The development of Red Hat Enterprise Linux (RHEL) works with Fedora at the top of the stream, in the middle is CentOS
Stream and then RHEL. Fedora provides innovation and testing with CentOS Stream as the continuously delivered Linux
distribution that is now the sole repository for public RHEL source code. RHEL source code will no longer be publically
accessible. To be clear CentOS Stream and RHEL is entirely under the control by Red Hat. Fedora Linux however is
independent of Red Hat and is developed under the Fedora Project.</p>

<p>This does still provide opportunities for those interested in participating and collaborating in the RHEL ecosystem,
however without having the full benefits of RHEL direct source code.</p>

<h2 id="is-it-closed-source">Is It Closed Source?</h2>

<p>With these changes of how to access the source code this means that the RHEL source code is no longer publically
accessible. The only way to gain access to the source code is by being a paying Red Hat customer or partner via the Red
Hat Customer Portal. In the past one could have almost one to one enterprise Linux without using RHEL directly.</p>

<h2 id="is-this-even-legal">Is This Even Legal?</h2>

<p>There is many view points on this subject and in all honestly it is beyond my understanding. Though generally speaking I
don’t see why a group cannot stop development and then continue on with a new license. However, since I’m not a lawyer I
will leave this up to the well versed Software Freedom Conservancy article,
<a href="https://sfconservancy.org/blog/2023/jun/23/rhel-gpl-analysis/">A Comprehensive Analysis of the GPL Issues With the Red Hat Enterprise Linux (RHEL) Business Model</a>.</p>

<h2 id="how-does-this-affect-you">How Does This Affect You?</h2>

<p>For the majority of Linux users you will not be affected since most use desktop Linux or a non-enterprise server
operating system.</p>

<p>However, those people working in the business industry that uses RHEL or variant (e.g. AlmaLinux, Rocky Linux) will be
affected. Changes will need to be done most likely within a year to either migrate to RHEL or move to new Linux server
distribution.</p>

<p>There is already movement in the community by AlmaLinux and Rocky Linux.</p>

<ul>
  <li><a href="https://almalinux.org/blog/impact-of-rhel-changes/">Impact of RHEL changes to AlmaLinux</a></li>
  <li><a href="https://rockylinux.org/news/2023-06-22-press-release/">Rocky Linux Expresses Confidence Despite Red Hat’s Announcement</a></li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>No doubt this is disappointing news from Red Hat, but it is not shocking. IBM has never had a history of caring much
for free open source software and as such does not align with the values open source advocates abide by. However, I see
this as an opportunity for the community as a whole to create a new fork of enterprise Linux solutions that will truly
be free from corporate interests.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="linux" /><summary type="html"><![CDATA[Get the answers to what has happened to Red Hat Enterprise Linux (RHEL) soure code, is this even legal, how does this affect you and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/red-hat-enterprise-linux-closed-source.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/red-hat-enterprise-linux-closed-source.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Resolve Pip Error Externally Managed Environment</title><link href="https://www.adamsdesk.com/posts/resolve-pip-externally-managed-environment/" rel="alternate" type="text/html" title="Resolve Pip Error Externally Managed Environment" /><published>2023-06-23T00:00:00-06:00</published><updated>2023-06-23T21:16:36-06:00</updated><id>https://www.adamsdesk.com/posts/resolve-pip-externally-managed-environment</id><content type="html" xml:base="https://www.adamsdesk.com/posts/resolve-pip-externally-managed-environment/"><![CDATA[<p>It is inevitable that as a computer user will experience error messages that does not entirely make sense. In
particular when working with Python packages one may come across the message “error: externally-managed-environment”.
What does this mean? What options does one have to resolve this problem? Let’s break this down and provide possible
solutions to this issue, so you can continue on your merry way.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux</li>
  <li>Fish v3.6.1</li>
  <li>GNU Bash v5.1.16</li>
  <li>Python v3.11.3</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>A directory path that includes a “~” (tilde) expands automatically to the current user home directory (.e.g. /home/adamsdesk)</li>
</ul>

<h2 id="problem">Problem</h2>

<p>Each time a Python package is installed or uninstalled using pip the action is stopped with the following error message as illustrated below.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pip uninstall mkdocs
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">error: externally-managed-environment

× This environment is externally managed
</span><span class="gp">╰─&gt;</span><span class="w"> </span>To <span class="nb">install </span>Python packages system-wide, try <span class="s1">'pacman -S
</span><span class="go">    python-xyz', where xyz is the package you are trying to
    install.

    If you wish to install a non-Arch-packaged Python package,
    create a virtual environment using 'python -m venv path/to/venv'.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip.

    If you wish to install a non-Arch packaged Python application,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. Make sure you have python-pipx
    installed via pacman.

note: If you believe this is a mistake, please contact your Python
installation or OS distribution provider. You can override this, at
the risk of breaking your Python installation or OS, by passing
--break-system-packages.
hint: See PEP 668 for the detailed specification.
</span></code></pre></div></div>

<h2 id="what-does-this-mean">What Does This Mean?</h2>

<p>The operating system configuration is protecting the user against having system provided packages (e.g. pacman, apt,
dnf, etc.) and pip provided packages. Mixing the two different package managers is a bad idea and usually ends with
having multitude of issues that no one desires.</p>

<h2 id="solution---override">Solution - Override</h2>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        This method is not advisable, as this will most likely break system packages.
    </p>
</div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pip <span class="nb">install </span>package-name <span class="nt">--break-system-packages</span><span class="nb">.</span>
</code></pre></div></div>

<p>Another option to not have to add a command-line parameter would be to add the following to the user’s pip configuration
file.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.config/pip/pip.conf:
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">[global]
break-system-packages = true
</span></code></pre></div></div>

<h2 id="solution---virtual-environment">Solution - Virtual Environment</h2>

<p>The following example will create the Python virtual environment, and then it will be activated.</p>

<p>For further explanation on creating virtual environments and how they work read the Python documentation on
<a href="https://docs.python.org/3/library/venv.html">venv - Creation of virtual environments</a>.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>python <span class="nt">-m</span> venv .venv
<span class="gp">#</span><span class="w"> </span><span class="nb">source</span> .venv/bin/activate
</code></pre></div></div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        To manage and use virtual environments easier try using <a href="https://github.com/pypa/pipx">pipx</a> (e.g. package name python-pipx, pipx).
    </p>
</div>

<h2 id="solution---package-manager">Solution - Package Manager</h2>

<p>Each system uses a different package manager, so exact steps will vary. Search for the desired package and then install
the desired package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pacman <span class="nt">-Ss</span> keyword
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Sy</span> package-name
</code></pre></div></div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        On an Arch Linux system an <a href="https://kb.adamsdesk.com/operating_system/arch_linux_install_aur_helper/">AUR Helper</a> may be helpful in finding and installing the desired package.
    </p>
</div>]]></content><author><name>Adam Douglas</name></author><category term="programming" /><category term="development" /><summary type="html"><![CDATA[Discover solutions to resolve the issue of installing or uninstalling a Python package when recieving the message, error externally-managed-environment.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/python-error-externally-manged-environment.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/python-error-externally-manged-environment.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Find The Windows Install Date</title><link href="https://www.adamsdesk.com/posts/windows-install-date/" rel="alternate" type="text/html" title="How To Find The Windows Install Date" /><published>2023-06-08T00:00:00-06:00</published><updated>2023-06-26T11:28:50-06:00</updated><id>https://www.adamsdesk.com/posts/windows-install-date</id><content type="html" xml:base="https://www.adamsdesk.com/posts/windows-install-date/"><![CDATA[<p>Curiosity always seems to get the better of me of wanting to achieve a better understanding of a particular subject or
in this case learning how to get the installation date of Microsoft Windows. I figured this out on
<a href="/posts/linux-install-date/">Linux</a>, so why not continue this on with another operating system. There
are of course many was to go about getting the installation or creation date and time of a Windows system. As mentioned
in my previous post, which method you choose is up to you and remember depending on the solution you may get misleading
data.</p>

<p>I played around with several solutions I found online using Windows 10 22H2. While doing my testing I discovered my
installation will be 3 years old in August 2023. Shocking considering most of us know that Windows requires a fresh
install just to keep it happy :-).</p>

<h2 id="windows-settings">Windows Settings</h2>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Click on “Settings” &gt; “System” &gt; “About”.</li>
  <li>
    <p>In the “Settings” window under “Windows specifications”, look for the “Installed on” value.</p>

    <p><img src="/assets/img/posts/windows-10-settings-install-date.webp" alt="Windows 10 Settings dialog with install date highlighted." class="img-fluid" width="827" height="540" loading="lazy" /></p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Edition         Windows 10 Pro
 Version         22H2
 Installed on    8/13/2020
 OS build        19045.2965
 Experience      Windows Feature Experience Pack 1000.19041.1000.0
</code></pre></div>    </div>

    <p>For clarity the date is formatted as month, day, year.</p>
  </li>
</ol>

<h2 id="windows-folder">Windows Folder</h2>

<p>This solution is not always ideal due to the fact that a folder or directory date can be changed overtime.</p>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Browse to “Windows System”.</li>
  <li>Click on “File Explorer”.</li>
  <li>Within the left-hand panel click on the “Local Disk (C:)”.</li>
  <li>
    <p>Right mouse click on the “Windows” folder and click on “Properties”.</p>

    <p>Look for the “created” value within the folder properties dialog.</p>

    <p><img src="/assets/img/posts/windows-folder-properties-install-date.webp" alt="Windows 10 File Explorer with the Windows folder properties dialog open, highlighting the created date." class="img-fluid" width="747" height="540" loading="lazy" /></p>
  </li>
</ol>

<h2 id="file-system">File System</h2>

<p>As far as I know there is no built-in way to access the creation date of the file system or partition. However, the
approximate date can be obtained by looking at the creation date of “System Volume Information” found on the C drive.</p>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Browse to “Windows System”.</li>
  <li>Click on “File Explorer”.</li>
  <li>On the left-hand side click on “Local Disk (C:)”.</li>
  <li>Click on the “View” menu then “Options”.</li>
  <li>
    <p>Uncheck “Hide protected operating system files (Recommended)”.</p>

    <p>This step is required in order to see the “System Volume Information” folder. It is advised to enable this feature
 again once the task has been completed.</p>

    <p><img src="/assets/img/posts/windows-folder-options-hide-protected-files.webp" alt="Windows 10 File Explorer C folder options dialog, highlighting hide protected operating system files (Recommended) being unchecked." class="img-fluid" width="427" height="540" loading="lazy" /></p>
  </li>
  <li>Click on the “OK” button.</li>
  <li>
    <p>Right mouse click on the “System Volume Information” folder and click on “Properties”.</p>

    <p>Look for the “created” value within the folder properties dialog.</p>

    <p><img src="/assets/img/posts/sys-vol-info-folder-properties-install-date.webp" alt="Windows 10 File Explorer with the System Volume Information folder properties dialog open, highlighting the created date." class="img-fluid" width="812" height="540" loading="lazy" /></p>
  </li>
</ol>

<h2 id="windows-powershell">Windows PowerShell</h2>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Browse to “Windows PowerShell”.</li>
  <li>Click on “Windows PowerShell”.</li>
  <li>
    <p>Use one of the following command examples.</p>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="p">([</span><span class="n">WMI</span><span class="p">]</span><span class="s1">''</span><span class="p">)</span><span class="o">.</span><span class="nf">ConvertToDateTime</span><span class="p">((</span><span class="n">Get-WmiObject</span><span class="w"> </span><span class="nx">Win32_OperatingSystem</span><span class="p">)</span><span class="o">.</span><span class="nf">InstallDate</span><span class="p">)</span><span class="w">
</span></code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Thursday, August 13, 2020 9:31:58 PM
</span></code></pre></div>    </div>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="nv">$date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Get-ItemProperty</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="s1">'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select</span><span class="w"> </span><span class="nt">-ExpandProperty</span><span class="w"> </span><span class="nx">InstallDate</span><span class="w">
 </span><span class="p">(</span><span class="n">Get-Date</span><span class="w"> </span><span class="s2">"1970-01-01 00:00:00.000Z"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">([</span><span class="n">TimeSpan</span><span class="p">]::</span><span class="n">FromSeconds</span><span class="p">(</span><span class="nv">$date</span><span class="p">))</span><span class="w">
</span></code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Thursday, August 13, 2020 9:31:58 PM
</span></code></pre></div>    </div>

    <p>As I understand it there is supposed to be multiple registry entries of “Source OS (Updated on xxxxxx)” per update.
 However, as you can see I only have one entry even though I have all the recommended updates installed to date.</p>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="nv">$AllBuilds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">$</span><span class="p">(</span><span class="n">gci</span><span class="w"> </span><span class="s2">"HKLM:\System\Setup"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nf">?</span><span class="w"> </span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">Name</span><span class="w"> </span><span class="o">-match</span><span class="w"> </span><span class="s2">"\\Source\s"</span><span class="p">})</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="bp">$_</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Select</span><span class="w"> </span><span class="p">@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"UpdateTime"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{</span><span class="kr">if</span><span class="w"> </span><span class="p">(</span><span class="bp">$_</span><span class="o">.</span><span class="nf">Name</span><span class="w"> </span><span class="o">-match</span><span class="w"> </span><span class="s2">"Updated\son\s(\d{1,2}\/\d{1,2}\/\d{4}\s\d{2}:\d{2}:\d{2})\)$"</span><span class="p">)</span><span class="w"> </span><span class="p">{[</span><span class="n">dateTime</span><span class="p">]::</span><span class="n">Parse</span><span class="p">(</span><span class="bp">$Matches</span><span class="p">[</span><span class="mi">1</span><span class="p">],([</span><span class="n">Globalization.CultureInfo</span><span class="p">]::</span><span class="n">CreateSpecificCulture</span><span class="p">(</span><span class="s1">'en-US'</span><span class="p">)))}}},</span><span class="w"> </span><span class="p">@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"ReleaseID"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="s2">"ReleaseID"</span><span class="p">)}},@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"Branch"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="s2">"BuildBranch"</span><span class="p">)}},@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"Build"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="s2">"CurrentBuild"</span><span class="p">)}},@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"ProductName"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="s2">"ProductName"</span><span class="p">)}},@{</span><span class="nx">n</span><span class="o">=</span><span class="s2">"InstallTime"</span><span class="p">;</span><span class="nx">e</span><span class="o">=</span><span class="p">{[</span><span class="n">datetime</span><span class="p">]::</span><span class="n">FromFileTime</span><span class="p">(</span><span class="bp">$_</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="s2">"InstallTime"</span><span class="p">))}}</span><span class="w"> </span><span class="p">};</span><span class="w">
 </span><span class="nv">$AllBuilds</span><span class="w"> </span><span class="err">|</span><span class="w"> </span><span class="nx">Sort</span><span class="w"> </span><span class="nx">UpdateTime</span><span class="w"> </span><span class="err">|</span><span class="w"> </span><span class="nx">ft</span><span class="w"> </span><span class="nx">UpdateTime</span><span class="p">,</span><span class="w"> </span><span class="nx">ReleaseID</span><span class="p">,</span><span class="w"> </span><span class="nx">Branch</span><span class="p">,</span><span class="w"> </span><span class="nx">Build</span><span class="p">,</span><span class="w"> </span><span class="nx">ProductName</span><span class="w">
</span></code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> UpdateTime           ReleaseID Branch       Build ProductName
 ----------           --------- ------       ----- -----------
 8/13/2020 7:54:54 PM 1909      19h1_release 18363 Windows 10 Pro
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="windows-registry-editor">Windows Registry Editor</h2>

<ol>
  <li>Open the “Run” dialog by pressing the keys, <kbd>Windows</kbd>+<kbd>R</kbd>.</li>
  <li>Type in the input field without double quotes “regedit” and press <kbd>Enter</kbd>.</li>
  <li>
    <p>Browse to the following location.</p>

    <p>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion</p>
  </li>
  <li>On the right-hand side double click on “InstallDate”.</li>
  <li>Within “Edit DWORD” dialog click on “Decimal” under “Base”.</li>
  <li>
    <p>The “Value data” field value is the installation date.</p>

    <p><img src="/assets/img/posts/windows-registry-editor-install-date.webp" alt="Windows 10 Registry Editor with the edit dialog open on InstallDate property." class="img-fluid" width="1080" height="568" loading="lazy" /></p>

    <p>The “Value data” field value is formatted in seconds since January 1st, 1970, better know as Unix time.</p>
  </li>
</ol>

<p>The seconds can be easily converted using Windows PowerShell.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">Get-Date</span><span class="w"> </span><span class="nt">-Date</span><span class="w"> </span><span class="s2">"1970-01-01 00:00:00Z"</span><span class="p">)</span><span class="o">.</span><span class="nf">addSeconds</span><span class="p">(</span><span class="nx">1597375918</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Thursday, August 13, 2020 9:31:58 PM
</span></code></pre></div></div>

<h2 id="windows-systeminfo">Windows Systeminfo</h2>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Browse to “Windows System”.</li>
  <li>Click on “Command Prompt”.</li>
  <li>
    <p>Input the following command after the prompt and press <kbd>Enter</kbd>.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> C:\Users\Adam&gt;</span>systeminfo | find /i <span class="s2">"install date"</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Original Install Date:     8/13/2020, 9:31:58 PM
</span></code></pre></div>    </div>

    <p>For clarity the date is formatted as month, day, year.</p>
  </li>
</ol>

<h2 id="windows-management-infrastructure-command-line">Windows Management Infrastructure Command-line</h2>

<ol>
  <li>Click on the Windows “Start” button.</li>
  <li>Browse to “Windows System”.</li>
  <li>Click on the “Command Prompt”.</li>
  <li>
    <p>Input the following command after the prompt and press <kbd>Enter</kbd>.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> C:\Users\Adam&gt;</span>wmic os get installdate
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> InstallDate
 20200813213158.000000-360
</span></code></pre></div>    </div>
  </li>
</ol>

<p>The output timestamp is formatted as “yyyyMMddHHmmss” and is described as shown below. The value after the period
represents the number of milliseconds.</p>

<ul>
  <li>yyyy = Numeric representation of a year, 4 digits</li>
  <li>MM = Numeric representation of a month, 2 digits with leading zero</li>
  <li>dd = Day of the month, 2 digits with leading zero</li>
  <li>HH = 24-hour format of an hour, 2 digits with leading zero</li>
  <li>mm = Minutes, 2 digits with leading zero</li>
  <li>ss = Seconds, 2 digits with leading zero</li>
</ul>

<div class="admonition info rounded">
    <p class="admonition-title">Info</p>
    <p>
        WMIC utility is deprecated as of Windows 10 and Windows Server version 21H1. This utility is superseded by Windows PowerShell for WMI.
    </p>
</div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="windows" /><category term="commandline" /><summary type="html"><![CDATA[How to locate the initial Windows operating system installation or creation date and time for those wishing to appease ones curiosity.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/windows-install-date.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/windows-install-date.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Slice of Life Wallpaper: Part Five</title><link href="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-five/" rel="alternate" type="text/html" title="Slice of Life Wallpaper: Part Five" /><published>2023-06-07T00:00:00-06:00</published><updated>2023-06-07T11:58:25-06:00</updated><id>https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-five</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-five/"><![CDATA[<p>Life is always evolving in each of us in different directions. Some of it is dependent upon our own choices based
upon our perspectives and experiences. What seems to me as common amongst us all is the core attributes we each seek,
love, acceptance, companionship, and happiness to name a few. I wish for you dear reader to achieve these attributes and
remember to not take life too seriously and enjoy the simple moments of life in this dose of slice of life wallpapers.</p>

<h2 id="wallpapers">Wallpapers</h2>

<p class="mb-4">Please remember to respect the artists of each one of these art wallpapers and consider giving thanks to at least one
of the artists.</p>

<figure class="text-center">
    <a href="https://www.pixiv.net/en/artworks/95454322">
        <img src="/assets/img/posts/wallpaper-coffee-addict-someone-else-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Stacks of used coffee cups surround a woman sitting at the table in a restaurant." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.pixiv.net/en/artworks/95454322" title="View source">
            The Coffee Addict by Someone Else (2000 x 1400 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znp0c9/blind_girls_peaceful_day_at_the_park_art_by/">
        <img src="/assets/img/posts/wallpaper-peaceful-day-park-popopoka-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A little girl sitting at a bench in a park reading braille with a small dog close by." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znp0c9/blind_girls_peaceful_day_at_the_park_art_by/" title="View source">
            Blind Girl's peaceful day at the park by popopoka (4096 x 2654 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://twitter.com/popopoka_/status/1591869574601142272">
        <img src="/assets/img/posts/wallpaper-we-live-in-a-society-popopoka-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Parallel shot down the side of bus, in one window is an angry person." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://twitter.com/popopoka_/status/1591869574601142272" title="View source">
            We Live in a Society by popopoka (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znx74z/vending_machine_by_%E3%81%95%E3%81%91%E3%83%8F%E3%83%A9%E3%82%B9/">
        <img src="/assets/img/posts/wallpaper-vending-machine-hunwaritoast-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A woman standing in the rain at night next to vending machines with garbage on the ground and an open umbrella." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znx74z/vending_machine_by_%E3%81%95%E3%81%91%E3%83%8F%E3%83%A9%E3%82%B9/" title="View source">
            Vending Machine by さけハラス (2118 x 3000 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znmz0a/the_start_of_winter_oc/">
        <img src="/assets/img/posts/wallpaper-start-of-winter-djbmo-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Snow falling down from a cloudy sky with a person standing in the distance on top of a hill." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/znmz0a/the_start_of_winter_oc/" title="View source">
            The Start of Winter by djbmo (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.zerochan.net/3561464">
        <img src="/assets/img/posts/wallpaper-abandoned-bus-imoniii-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Bus art studio filled with decor and a woman sitting on a chair thinking." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.zerochan.net/3561464" title="View source">
            Abandoned bus in the grass is a studio by imoniii (2234 x 2382  px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zn2xpk/camping_trip_by_advarcher/">
        <img src="/assets/img/posts/wallpaper-camping-trip-advarcher-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A couple of people sitting next to a camper. One person having a hot drink and the other is playing a game." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zn2xpk/camping_trip_by_advarcher/" title="View source">
            Camping Trip by advarcher (6247 x 2970 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/L2ObdK">
        <img src="/assets/img/posts/wallpaper-garage-faiz-azhar-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Three people looking at a car in a garage." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/L2ObdK" title="View source">
            Garage by Faiz Azhar (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/8dzKQ">
        <img src="/assets/img/posts/wallpaper-riva-idm-faiz-azhar-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Woman standing leaning against a cupboard waiting for the noodles to finish cooking." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/8dzKQ" title="View source">
            RIVA-IDM by Faiz Azhar (1920 x 2716 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zklgjt/untitled_by_alariko_alariko/">
        <img src="/assets/img/posts/wallpaper-untitled-alariko-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A perspective view down the street of a down town are with busy people coming and go." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zklgjt/untitled_by_alariko_alariko/" title="View source">
            Untitled by Alariko (2048 x 1854 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.tumblr.com/pixelmima/701716747573657600/encounter-ko-fi-print">
        <img src="/assets/img/posts/wallpaper-encounter-pixelmima-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A little girl walking in the snow that encounters upon a cat next to a vending machine." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.tumblr.com/pixelmima/701716747573657600/encounter-ko-fi-print" title="View source">
            Encounter by PixelMima (2048 x 1365 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/q9E4Ky">
        <img src="/assets/img/posts/wallpaper-checking-in-daniel-ang-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A man having a quite moment sitting in a cozy coffee shop writing while having a drink." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/q9E4Ky" title="View source">
            Checking In by Daniel Ang (1920 x 1363 px)
        </a>
    </figcaption>
</figure>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="artwork" /><summary type="html"><![CDATA[Seek and enjoy the simplest moments of life with a dose of these curated high resolution 2K/4K slice of life wallpapers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-five.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-five.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Is It Time To Say Goodbye To Reddit?</title><link href="https://www.adamsdesk.com/posts/say-goodbye-to-reddit/" rel="alternate" type="text/html" title="Is It Time To Say Goodbye To Reddit?" /><published>2023-06-06T00:00:00-06:00</published><updated>2023-07-07T00:53:13-06:00</updated><id>https://www.adamsdesk.com/posts/say-goodbye-to-reddit</id><content type="html" xml:base="https://www.adamsdesk.com/posts/say-goodbye-to-reddit/"><![CDATA[<p>Reddit is a place of community for niche interests of pretty much any subject imaginable and has long ago become
ingrained into one’s life as the go-to source for many topics of interest. However, in the last ten years there has
been a divide between Reddit the company and Reddit’s community of users that doesn’t appear to be in alignment
anymore. Is it time to say goodbye?</p>

<h2 id="culture">Culture</h2>

<p>The users of Reddit, to me have different characteristics than similar social online services. On top of that we have
to remember the age of Reddit as it was established on June 23, 2005. Times were different then, and as a result this
has allowed the communities or subreddits to mature over the years. Reddit is known as place that is open nature, and
diverse users that tend to be more privacy-conscious that do not like feeling manipulated by Reddit itself or brands.
Users often wish to engage with intelligent viewers and participants looking for advice, answers, and social
discussions. The culture and the community have allowed for fostering many great things as a result such as, image
sharing, image host Imgur and RedditGfits.</p>

<h2 id="privacy">Privacy</h2>

<p>Change has been occurring with Reddit on how advertising is being done that tracks the user, which is defiantly not
desired by the user base. Yes, it has unfortunately become a norm amongst many online services, which is a problem in
itself. This has been shown as the user base has worked hard on creating Reddit front ends or entirely new software in
order to venture out on their own Reddit like service to take back control over privacy.</p>

<h2 id="third-party">Third Party</h2>

<p>There is endless third party Reddit front end interfaces, and applications that can be used to access Reddit’s service.
This has all been made possible of course by the wonderful user base that develop the software, but would not be
possible without having access to Reddit’s API (application programming interface). The unfortunate part is it is now
all in question if these third party applications can even survive due to the cost Reddit has put on using the API.
Unfortunately I’ve not been able to confirm pricing as I couldn’t find an official source. I’m going by the
<a href="https://www.reddit.com/r/apolloapp/comments/13ws4w3/had_a_call_with_reddit_to_discuss_pricing_bad/">out cry</a>
and subreddits protesting. On the surface, this seems like excessive pricing that in the end would just hurt the open
nature and diverse community Reddit has become.</p>

<h2 id="redditgifts">RedditGifts</h2>

<p>The service was created by a Reddit user Dan McComas, and was a user-to-user gift exchange service for Reddit users.
Later RedditGifts was acquired by Reddit in August 2011. The wonderful and largest gift exchange that I know of and
even participated in multiple times sadly was shutdown on January 2022.</p>

<p>This to me was a huge sign of Reddit not understanding its user base. As far as I understand there was a strong user
base of the gift exchange. It can be understandable why Reddit itself may no longer want to own and operate
RedditGifts, but why not figure out a way to hand it back over to the community in which it came from? Thankfully gift
exchanges have returned due to the user base creating it once again.</p>

<h2 id="community">Community</h2>

<p>It appears to me that it is no longer about community with healthy engagement by providing what the users are asking
for, but rather all about the dollar. I feel that Reddit the company are not treating the community and the volunteers
as valued and respected customers that they are.</p>

<p>Find out for yourself by reading the responses from Reddit in the news.</p>

<ul>
  <li><a href="https://www.reddit.com/r/reddit/comments/145bram/addressing_the_community_about_changes_to_our_api/">Addressing the community about changes to our API - r/reddit</a></li>
  <li><a href="https://www.washingtonpost.com/technology/2023/06/16/reddit-ceo-blackout-moderators-steve-huffman/">Reddit CEO compares moderators to aristocracy as blackout stretches on - The Verge</a></li>
  <li><a href="https://www.theverge.com/2023/6/15/23762868/reddit-ceo-steve-huffman-interview">Reddit CEO Steve Huffman isn’t backing down: our full interview - The Verge</a></li>
  <li><a href="https://www.theverge.com/2023/7/6/23786474/reddit-nsfw-moderator-protest-final-warning">Reddit demands moderators remove NSFW labels, or else - The Verge</a></li>
  <li><a href="https://www.theverge.com/2023/6/15/23762103/reddit-protest-api-changes-indefinite">Thousands of Reddit communities remain dark as protest continues - The Verge</a></li>
</ul>

<p>Here are open letters from subreddits and beyond.</p>

<ul>
  <li><a href="https://www.reddit.com/r/aww/comments/14joxtg/an_open_letter_to_reddit_forging_a_return_to/">r/aww</a></li>
  <li><a href="https://www.reddit.com/r/BuyItForLife/comments/14dnxaf/post_blackout_reddit_and_the_future_of/">r/ButItForLife</a></li>
  <li><a href="https://www.reddit.com/r/DigitalPainting/comments/14ll70b/open_letter_to_reddit_with_community_vote/">r/DigitalPainting</a></li>
  <li><a href="https://www.reddit.com/r/funny/comments/14jmh7e/forging_a_return_to_productive_conversation_an/">r/funny</a></li>
  <li><a href="https://www.reddit.com/r/ModCoord/comments/13xh1e7/an_open_letter_on_the_state_of_affairs_regarding/">r/ModCoord</a></li>
  <li><a href="https://independenttechresearch.org/reddit-data-access-letter/">Restricting Reddit Data Access Threatens Online Safety &amp; Public-Interest Research</a></li>
</ul>

<h2 id="alternative">Alternative</h2>

<p>Thanks to the open source movement and the wonderful dedicated developers out there, we all have an alternative if one
so chooses to move away from Reddit. Here are a few that to me are quite promising.</p>

<ul>
  <li>
    <p><a href="https://getaether.net/">Aether</a></p>

    <p>Aether is a distributed peer-to-peer network using the stateless Aether protocol. Self-hosting is an option with it
  based on Go. To learn more read these two pages,
  <a href="https://getaether.net/docs/how_is_it_different_from/">How is it different from…</a> and
  <a href="https://getaether.net/docs/developers/">Aether protocol</a>.</p>
  </li>
  <li>
    <p><a href="https://join-lemmy.org/">Lemmy</a></p>

    <p>The decentralized social link aggregation and discussion platform is connected to the
  Fediverse network (ActivityPub). Can be self-hosted and is based upon Rust and TypeScript. Refer to
  <a href="https://join-lemmy.org/docs/en/index.html">Lemmy</a> documentation to learn more.</p>

    <p>Discover communities using <a href="https://lemmyverse.net/communities">Lemmy Explorer</a>.</p>
  </li>
  <li>
    <p><a href="https://kbin.pub/">Kbin</a></p>

    <p>Decentralized content aggregator and microblogging platform running on the Fediverse network (ActivityPub). Can be
  self-hosted and is based on PHP. Refer to <a href="https://kbin.pub/en/docs">Kbin documentation</a> to learn more.</p>

    <p>Mobile application coming soon.</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/postmill/Postmill/">Postmill</a></p>

    <p>A self-hosted PHP based social link aggregator with voting and discussion platform. Postmill doesn’t appear
  decentralized by being connected to the Fediverse network or peer-to-peer distributed. Therefore, this seems to be
  a centralized service.</p>
  </li>
  <li>
    <p><a href="https://github.com/mariusor/go-littr">Littr</a> (<a href="https://brutalinks.tech/">brutalinks.tech</a>)</p>

    <p>Go based link aggregator using the Fediverse network and has the option to self-host.</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/tildes/tildes">Tildes</a> (<a href="https://tildes.net/">Tildes.net</a>)</p>

    <p>A non-profit community site that written in Python has no advertising, open source and minimal user-tracking. Learn
  more by reading the <a href="https://docs.tildes.net/">docs</a> or the
  <a href="https://blog.tildes.net/announcing-tildes">announcement blog post</a>.</p>
  </li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>We are in times now that I question if Reddit is really viable and desired anymore to be run by a business that doesn’t
seem to understand its own user base. A lot of what is even done by the users on Reddit is accomplished by using third
party software because there is no good solution available otherwise. That in itself seems off for Reddit to not see
this.</p>

<p>I’m sure most of us would agree that we can all understand as a company like Reddit, they need to find a way to
generate revenue in order to pay the bills and to make some profit. However, let’s do this without having to sell out
your own users and break the entire system that makes it all possible. It is the connection of people and openness that
makes places like Reddit thrive. I only see this becoming more broken as time goes by and creating a division between
people instead of fostering the growth of connections to people.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Has Reddit finally gone too far? First it was privacy, advertisements, and now third party apps. Is it time to say goodbye to Reddit?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/say-goodbye-to-reddit.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/say-goodbye-to-reddit.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Enable Natural Mouse or Touchpad Scroll</title><link href="https://www.adamsdesk.com/posts/enable-natural-mouse-touchpad-scroll/" rel="alternate" type="text/html" title="How To Enable Natural Mouse or Touchpad Scroll" /><published>2023-05-25T00:00:00-06:00</published><updated>2023-05-25T22:07:28-06:00</updated><id>https://www.adamsdesk.com/posts/enable-natural-mouse-touchpad-scroll</id><content type="html" xml:base="https://www.adamsdesk.com/posts/enable-natural-mouse-touchpad-scroll/"><![CDATA[<p>For some the direction one scrolls using a mouse, touchpad (trackpad), or trackball may feel it goes in the wrong
direction and just feels odd. Thankfully the scroll direction can be changed even though some operating systems
do not provide a convenient setting to quickly make the switch from traditional to natural (reverse).</p>

<h2 id="what-is-natural-scroll">What Is Natural Scroll?</h2>

<p>Within a graphical user interface a natural scroll is an upward motion on a mouse scroll wheel, touchpad or trackball
that causes the content of the window to move down and a downward motion to move up.</p>

<p>To better understand this let’s take a look at the animated illustrations of traditional vs. natural scroll
directions by Allan Day and Jakub Steiner (GNU General Public License v2.0).</p>

<div class="d-md-flex flex-row flex-wrap align-content-center">
    <div class="card m-2" style="width: 18rem; box-shadow: none; border:none;">
        <video controls="" width="455" preload="none" poster="/assets/img/posts/scroll-traditional-d-poster.webp" class="card-img-top ratio ratio-16x9">
            <source src="/assets/video/posts/scroll-traditional-d.webm" type="video/webm" />
        </video>
        <div class="card-body">
            <p class="card-text">Traditional mouse scroll</p>
        </div>
    </div>
    <div class="card m-2" style="width: 18rem; box-shadow: none; border:none;">
        <video controls="" width="455" preload="none" poster="/assets/img/posts/touch-scroll-traditional-d-poster.webp" class="card-img-top ratio ratio-16x9">
            <source src="/assets/video/posts/touch-scroll-traditional-d.webm" type="video/webm" />
        </video>
        <div class="card-body">
            <p class="card-text">Traditional touch scroll</p>
        </div>
    </div>
    <div class="card m-2" style="width: 18rem; box-shadow: none; border:none;">
        <video controls="" width="455" preload="none" poster="/assets/img/posts/scroll-natural-d-poster.webp" class="card-img-top ratio ratio-16x9">
            <source src="/assets/video/posts/scroll-natural-d.webm" type="video/webm" />
        </video>
        <div class="card-body">
            <p class="card-text">Natural mouse scroll</p>
        </div>
    </div>
    <div class="card m-2" style="width: 18rem; box-shadow: none; border:none;">
        <video controls="" width="455" preload="none" poster="/assets/img/posts/touch-scroll-natural-d-poster.webp" class="card-img-top ratio ratio-16x9">
            <source src="/assets/video/posts/touch-scroll-natural-d.webm" type="video/webm" />
        </video>
        <div class="card-body">
            <p class="card-text">Natural touch scroll</p>
        </div>
    </div>
</div>

<p>For those wishing to dive deeper into the history of natural scrolling, take a look at the article by Tedium entitled,
<a href="https://tedium.co/2021/12/29/natural-scrolling-history/">Why Does “Natural Scrolling” Exist, Anyway?</a></p>

<h2 id="enable-natural-scroll-with-gnome">Enable Natural Scroll with GNOME</h2>

<ol>
  <li>Open “Settings”.</li>
  <li>Click on “Mouse &amp; Touchpad” located on the left-hand side.</li>
  <li>Under “Scroll Direction” click “Natural”.</li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Tested using GNOME v44.1.
    </p>
</div>

<h2 id="enable-natural-scroll-with-kde-plasma">Enable Natural Scroll with KDE Plasma</h2>

<ol>
  <li>Open “System Settings”.</li>
  <li>Browse to “Hardware” &gt; “Input Devices” &gt; “Mouse”</li>
  <li>Under “Scrolling” click to “Invert scroll direction” (checkmark).</li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Tested using KDE Plasma v5.27.4
    </p>
</div>

<h2 id="enable-natural-scroll-with-windows-powershell">Enable Natural Scroll with Windows PowerShell</h2>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Before proceeding please make a system backup. Editing the Windows registry can be damaging to operating system if not done correctly.
    </p>
</div>

<ol>
  <li>Open the “Start Menu” by clicking on it.</li>
  <li>Begin typing without double quotes “powershell” then click on “Run as Administrator”.</li>
  <li>
    <p>Copy and paste the following code into the command line of Windows PowerShell.</p>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Get-ItemProperty</span><span class="w"> </span><span class="nx">HKLM:\SYSTEM\CurrentControlSet\Enum\HID\</span><span class="o">*</span><span class="nx">\</span><span class="o">*</span><span class="nx">\Device</span><span class="se">` </span><span class="nx">Parameters</span><span class="w"> </span><span class="nx">FlipFlopWheel</span><span class="w"> </span><span class="nt">-EA</span><span class="w"> </span><span class="nx">0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ForEach-Object</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Set-ItemProperty</span><span class="w"> </span><span class="bp">$_</span><span class="o">.</span><span class="nf">PSPath</span><span class="w"> </span><span class="nx">FlipFlopWheel</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></code></pre></div>    </div>

    <p>To change back to traditional scroll set the “FlipFlopWheel” value from “1” to “0” without double quotes located
towards the end of the code.</p>
  </li>
  <li>
    <p>Verify registry changes.</p>

    <p>Copy and paste the following code into the command line of Windows PowerShell. Verify the FlipFlopWheel value is set
 to “1” for natural scroll or “0” for traditional scroll.</p>
    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="n">Get-ItemProperty</span><span class="w"> </span><span class="nx">HKLM:\SYSTEM\CurrentControlSet\Enum\HID\</span><span class="o">*</span><span class="nx">\</span><span class="o">*</span><span class="nx">\Device</span><span class="se">` </span><span class="nx">Parameters</span><span class="w"> </span><span class="nx">FlipFlopWheel</span><span class="w"> </span><span class="nt">-EA</span><span class="w"> </span><span class="nx">0</span><span class="w">
</span></code></pre></div>    </div>
    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="n">FlipFlopWheel</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">1</span><span class="w">
 </span><span class="n">PSPath</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\VID_046D</span><span class="o">&amp;</span><span class="nx">PID_C52B</span><span class="o">&amp;</span><span class="nx">MI_01</span><span class="o">&amp;</span><span class="nx">Col01\7</span><span class="o">&amp;</span><span class="nx">683dbcf</span><span class="o">&amp;</span><span class="nx">0</span><span class="o">&amp;</span><span class="nx">0000\Device</span><span class="w"> </span><span class="nx">Parameters</span><span class="w">
 </span><span class="n">PSParentPath</span><span class="w">  </span><span class="p">:</span><span class="w"> </span><span class="nx">Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\VID_046D</span><span class="o">&amp;</span><span class="nx">PID_C52B</span><span class="o">&amp;</span><span class="nx">MI_01</span><span class="o">&amp;</span><span class="nx">Col01\7</span><span class="o">&amp;</span><span class="nx">683dbcf</span><span class="o">&amp;</span><span class="nx">0</span><span class="o">&amp;</span><span class="nx">0000</span><span class="w">
 </span><span class="n">PSChildName</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">Device</span><span class="w"> </span><span class="nx">Parameters</span><span class="w">
 </span><span class="n">PSDrive</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="nx">HKLM</span><span class="w">
 </span><span class="n">PSProvider</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">Microsoft.PowerShell.Core\Registry</span><span class="w">

 </span><span class="o">...</span><span class="w">
</span></code></pre></div>    </div>
  </li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Tested using Windows 10 v22H2.
    </p>
</div>

<h2 id="enable-natural-scroll-with-windows-registry-editor">Enable Natural Scroll with Windows Registry Editor</h2>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Before proceeding please make a system backup. Editing the Windows registry can be damaging to operating system if not done correctly.
    </p>
</div>

<p>Doing this process manually first requires knowing the device identifier (ID). Once the device ID is found then the
applicable registry entry can be changed to reverse or enable the natural scroll feature.</p>

<h3 id="find-device-id">Find Device ID</h3>

<ol>
  <li>Open the “Start Menu” by clicking on it.</li>
  <li>Begin typing without double quotes “device manager”.</li>
  <li>Click on “Device Manager”.</li>
  <li>Expand “Mice and other pointing devices”.</li>
  <li>Right mouse click on the desired mouse device and left mouse click on “Properties”.</li>
  <li>Left mouse click on the “Details” tab.</li>
  <li>Under the “Property” menu list select “Device instance path” option.</li>
  <li>Make note of the VID value for the mouse (e.g. VID_046D&amp;PID_C52B&amp;MI_01&amp;COL01).</li>
  <li>Click on the “OK” button.</li>
  <li>Close the “Device Manager” window by clicking on the “X” at the top right.</li>
</ol>

<h3 id="set-natural-scroll">Set Natural Scroll</h3>

<ol>
  <li>Press the <kbr>Windows key</kbr> + <kbr>R</kbr> to open the “Run” command dialog.</li>
  <li>Type “regedit” without double quotes and then click the “OK” button.</li>
  <li>Click the “Yes” button to continue, when the “User Access Control” dialog appears with “Do you want to allow this app to make changes to your device?”</li>
  <li>
    <p>Within “Registry Editor” browse to the following path.</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID
</code></pre></div>    </div>
  </li>
  <li>Expand the key folder that matches the VID of your mouse that was noted previously (e.g. VID_046D&amp;PID_C52B&amp;MI_01&amp;COL01).</li>
  <li>Expand the available key.</li>
  <li>Left mouse click on “Device Parameters”.</li>
  <li>Double left mouse click on the “FlipFlopWheel” DWORD to edit the value.</li>
  <li>
    <p>Set the “Value data” from “0” to “1” without double quotes.</p>

    <p>To change back to traditional scroll set the value from “1” to “0” without double quotes.</p>
  </li>
  <li>Click on the “OK” button.</li>
  <li>Close the “Registry Editor” window by clicking on the “X” at the top right.</li>
  <li>Restart the computer.</li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Tested using Windows 10 v22H2.
    </p>
</div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="linux" /><category term="windows" /><summary type="html"><![CDATA[Step by step instructions of how to reverse or flip the mouse or touchpad scroll direction on Linux and Microsoft Windows 10/11 to a natural scroll.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/natural-traditional-scroll-direction.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/natural-traditional-scroll-direction.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Is Telly Truly a Free 4K Dual-Screen TV?</title><link href="https://www.adamsdesk.com/posts/telly-free-tv/" rel="alternate" type="text/html" title="Is Telly Truly a Free 4K Dual-Screen TV?" /><published>2023-05-17T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/telly-free-tv</id><content type="html" xml:base="https://www.adamsdesk.com/posts/telly-free-tv/"><![CDATA[<p>It seems everywhere one goes online from news to podcasts people are talking about the newly announced free
ad-supported television by Telly. Most of what I found in the news and on Telly’s website appears to be nothing more
than marketing and fails to provide what should matter to a consumer, product specifications and what one is giving up
to use something that is for free.</p>

<h2 id="the-free-tv">The Free TV</h2>

<p>The new television is being marketed as free product which is ad-supported with dual-screens. The primary display
is a 55” at 4K HDR and the 9” secondary display or smart screen is used to display advertisements, news, weather,
stocks, sport scores, widgets, and more. A sound bar is found between the two displays. The system is equipped with
a microphone and camera to used with video calling (powered by Zoom) and voice assistant. Additionally, the TV will
come with an Android TV USB dongle in order to use streaming services.</p>

<p><img src="/assets/img/posts/telly-free-tv-1280x720.webp" alt="A free Telly TV hanging from the wall just above a cabinet that displays one screen a sunset with elephants and on the other, weather, sport scores, stocks and an advertisement." class="img-fluid mx-auto d-block" loading="lazy" /></p>

<p>The company behind the free TV Telly Corp. has recently announced and opened a reservation system for the first
500,000 free units that will begin shipping to consumers in summer of 2023. At this time the offer is only applicable to
citizens of the United States.</p>

<h2 id="tv-specifications">TV Specifications</h2>

<p>Unfortunately the entire television specifications have not all been official released to date, therefore what I’ve collected
is what I could find reading various websites. The operating system TellyOS apparently is a fork of Google Android TV, though
I’ve not been able to confirm this.</p>

<table class="table table-striped table-hover mb-4">
  <tbody>
    <tr>
      <td>Primary Display Size</td>
      <td>55” (139.7 cm)</td>
    </tr>
    <tr>
      <td>Secondary Display Size</td>
      <td>9” (22.86 cm)</td>
    </tr>
    <tr>
      <td>Primary Display Resolution</td>
      <td>4K HDR</td>
    </tr>
    <tr>
      <td>Secondary Display Resolution</td>
      <td>Unknown</td>
    </tr>
    <tr>
      <td>Operating System</td>
      <td>TellyOS</td>
    </tr>
    <tr>
      <td>Audio</td>
      <td>5-driver sound bar, integrates both displays</td>
    </tr>
    <tr>
      <td>HDMI Ports</td>
      <td>3</td>
    </tr>
    <tr>
      <td>USB Ports</td>
      <td>2</td>
    </tr>
    <tr>
      <td>Composite Ports</td>
      <td>Unknown</td>
    </tr>
    <tr>
      <td>Component Ports</td>
      <td>Unknown</td>
    </tr>
    <tr>
      <td>Coaxial Ports</td>
      <td>Unknown</td>
    </tr>
    <tr>
      <td>Tuner</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Microphone</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Camera</td>
      <td>Yes (privacy shutter included)</td>
    </tr>
    <tr>
      <td>Streaming Support</td>
      <td>Yes (Android TV USB dongle)</td>
    </tr>
    <tr>
      <td>Cable/Satellite Support</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Additional Features</td>
      <td>video calling, game room (40+ video games, single and multiplayer support), music, voice assistant, fitness (free advanced motion-tracking fitness programs)</td>
    </tr>
  </tbody>
</table>

<h2 id="concerns">Concerns</h2>

<p>We should all remember that, nothing comes for free. There is a cost to everything we do and use. The so-called “free”
television, actually comes at a serious cost to the consumer. In simple terms the TV is an appliance, but in this case
the appliance turns the viewer into a product with the use of your own data along with a billboard advertising whatever
it deems necessary. The revenue Telly makes is from your own data and advertisements. The only compensation is the TV
itself which is nothing compared to value of your own data and advertisements. This new appliance has taken things to a
whole new level of invading your privacy and security within your own home. Telly and any associated third party
companies will now be able to collect your data such as, the audio and video content you watch, the channels you view,
duration of viewing session, voice pattern, physical movements, queries, settings, preferences, applications, purchases,
the buttons clicked, cultural and social identifiers, and the physical presence of people using the TV. All this that
may not even be anonymized or de-identified.</p>

<p>If you choose to protect your own network such as using an advertisement blocker or disconnect Internet to the TV or opt
out of sharing your data you will be in violation of the terms of service. As a result the service will be terminated
and must return the free TV or be charged for it.</p>

<h2 id="conclusion">Conclusion</h2>

<p>It is nice to see how Telly appears to be up front instead of hiding what they are doing. However, this doesn’t make it
right. The marketing seems to focus the reader on the fact of “free” and what is generally offers. Doesn’t go into
specifics or even provide full detailed specifications. Almost like it’s trying to divert you away from the truth.
This is just another appliance like product and service that violates our own freedoms. At least with streaming services,
other smart TVs, cell phones, etc. I have a choice how I use it to some extent without being penalized for it. This all
seems insane to me, especially considering how a decent TV doesn’t even cost a consumer that much. It just feels like
this product will take advantage of those less fortunate or less informed. Heck we don’t even know the entire scope of
harm this could bring for the benefit of a company. Ultimately we as consumers should have the say and control over what
we own and consume. This free TV is not “free”, so just say “NO”.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Discover the new free 4K dual-screen television coming to the market summer 2023 and what it actually costs you as a consumer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/telly-free-tv.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/telly-free-tv.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #4</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-4/" rel="alternate" type="text/html" title="Little Bits: Issue #4" /><published>2023-04-18T00:00:00-06:00</published><updated>2023-04-18T14:26:07-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-4</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-4/"><![CDATA[<p>Life seems to fly by when one doesn’t notice especially when there is so many goodies to be discovered online. Let’s
take this time to relax and enjoy these bits for our entertainment covering topics in graphic design, OpenAI,
software programming, computing history, blogging and web development.</p>

<h2 id="bits">Bits</h2>

<ul>
  <li>
    <p><a href="https://hyperpix.net/text-effects/game/free-minecraft-text-effect/">Minecraft Text Effect</a></p>

    <p>Follow this <a href="https://www.youtube.com/watch?v=ATv3r_bVLZE">tutorial</a> (video) to create the perfect Minecraft text effect
  using <a href="https://www.dafont.com/minercraftory.font">Minercraftory</a> or
  <a href="https://www.dafont.com/8-bit-arcade.font">8-bit Arcade</a> fonts. Free for personal or commercial use.</p>
  </li>
  <li>
    <p><a href="https://github.com/openai/whisper">OpenAI Whisper</a></p>

    <p>An open source general-purpose speech recognition tool that can aid in generating a transcript of an audio file.</p>
  </li>
  <li>
    <p><a href="https://codeberg.org/DansLeRuSH/no-icon">No-icon</a> by Franck Albaret</p>

    <p>Icons for Android, Tux, Forgejo, OpenDesktop and Solus.</p>
  </li>
  <li>
    <p><a href="https://build-your-own.org/blog/20230127_byor/">The “Build Your Own Redis” Book is Completed</a> by James Smith</p>

    <p>Take on the challenge of building your own Redis by coding from scratch using C/C++.</p>
  </li>
  <li>
    <p><a href="https://lunduke.substack.com/p/wendin-dos-the-forgotten-multi-tasking">Wendin-DOS : The forgotten multi-tasking, multi-user DOS clone from the 1980s</a> by Bryan Lunduke</p>

    <p>Many are well aware of the existence of MS-DOS, but what about Wendin-DOS? A forgotten operating system that Bryan
  brings back to life covering an in depth history and the capabilities it offers.</p>
  </li>
  <li>
    <p><a href="https://www.rspack.dev/">Rspack</a></p>

    <p>An open source Rust-based JavaScript bundler that enables fast and efficient web development.</p>
  </li>
  <li>
    <p><a href="https://www.kickstarter.com/projects/mwichary/shift-happens">Shift Happens: A book about keyboards</a></p>

    <p>Pre-order your copy of the history of keyboards, covering early typewriters to modern day mechanical. The book is
  broken up into two volumes.</p>
  </li>
  <li>
    <p><a href="https://bringback.blog/">Bring Back Blogging</a></p>

    <p>Looking to discover new blogs to read? Take a look at this curated directory of bloggers.</p>
  </li>
  <li>
    <p><a href="https://github.com/meyskens/mastodon-for-workgroups">Mastodon 3.11 for Workgroups</a></p>

    <p>A Windows 9x Mastodon client built in Visual Basic 6 using an open source license.</p>
  </li>
  <li>
    <p><a href="https://www.youtube.com/watch?v=4Q7FTjhvZ7Y">Project Code Rush - The Beginnings of Netscape / Mozilla Documentary</a> (video) published Aug 12, 2013</p>

    <blockquote>
      <p>“Code Rush is a documentary following the lives of a group of Netscape engineers in Silicon Valley. It covers Netscape’s last year as an independent company, from their announcement of the Mozilla open source project until their acquisition by AOL. It particularly focuses on the last minute rush to make the Mozilla source code ready for release by the deadline of March 31 1998, and the impact on the engineers’ lives and families as they attempt to save the company from ruin.”</p>
    </blockquote>
  </li>
  <li>
    <p><a href="https://www.youtube.com/watch?v=UTWK_bIJf1U">Creating an Operating System for the NES</a> (video)</p>

    <p>An operating system called <a href="https://notin.tokyo/nesos/">NESOS</a> for the Nintendo Entertainment System or Family Computer Systems.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Grab yourself a drink, relax and enjoy as I uncover fresh Little Bits in issue number four covering topics on blogging, OpenAI, programming, and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-4.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-4.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fix Element Desktop Error Connection reset by peer</title><link href="https://www.adamsdesk.com/posts/element-desktop-error-connection-reset-by-peer/" rel="alternate" type="text/html" title="Fix Element Desktop Error Connection reset by peer" /><published>2023-04-12T00:00:00-06:00</published><updated>2023-04-12T17:18:36-06:00</updated><id>https://www.adamsdesk.com/posts/element-desktop-error-connection-reset-by-peer</id><content type="html" xml:base="https://www.adamsdesk.com/posts/element-desktop-error-connection-reset-by-peer/"><![CDATA[<p>Last week I ran system updates for Arch Linux as I normally do. Everything seemed okay, until I ran Element desktop
(Matrix client). Each time I would run Element, it would crash shortly after. Further investigation was required to
figure out what was going on. In the end I discovered this problem has been an ongoing since Sep 19, 2022, which is
not ideal. Let’s take at what I’ve found to work around this bug until it has been resolved.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Electron v22.3.3 (<a href="https://archlinux.org/packages/community/x86_64/electron/">Community/electron</a>)</li>
  <li>Element v1.11.26 (<a href="https://archlinux.org/packages/community/x86_64/element-desktop/">Community/element-desktop</a>)</li>
  <li>Olm v3.2.12</li>
</ul>

<h2 id="problem">Problem</h2>

<p>The application crashes shortly after being started.</p>

<p>I was not able to find anything when launching Element from the command line or launching with “–enable-logging”
argument. However, I did end up receiving an error message when monitoring with <code class="language-plaintext highlighter-rouge">journalctl</code>.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>journalctl <span class="nt">-f</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Apr 12 15:22:07 adamsdesk kernel: traps: ThreadPoolForeg[57565] trap int3 ip:5648e7635924 sp:7f3964c36050 error:0 in electron[5648e400e000+7267000]
Apr 12 15:22:07 adamsdesk systemd[1]: Started Process Core Dump (PID 57667/UID 0).
Apr 12 15:22:09 adamsdesk systemd-coredump[57668]: [🡕] Process 57467 (electron) of user 1000 dumped core.

                                                   Stack trace of thread 57565:
</span><span class="gp">                                                   #</span>0  0x00005648e7635924 n/a <span class="o">(</span>electron + 0x5286924<span class="o">)</span>
<span class="gp">                                                   #</span>1  0x00005648e423202b n/a <span class="o">(</span>electron + 0x1e8302b<span class="o">)</span>
<span class="gp">                                                   #</span>2  0x00005648e7544565 n/a <span class="o">(</span>electron + 0x5195565<span class="o">)</span>
<span class="gp">                                                   #</span>3  0x00007f39c74e1782 closedir <span class="o">(</span>libc.so.6 + 0xcd782<span class="o">)</span>
<span class="gp">                                                   #</span>4  0x00005648e752883c n/a <span class="o">(</span>electron + 0x517983c<span class="o">)</span>
<span class="go">
.......... (truncated dump)

                                                   Stack trace of thread 57563:
</span><span class="gp">                                                   #</span>0  0x00007f39c7496766 n/a <span class="o">(</span>libc.so.6 + 0x82766<span class="o">)</span>
<span class="gp">                                                   #</span>1  0x00007f39c7499294 pthread_cond_timedwait <span class="o">(</span>libc.so.6 + 0x85294<span class="o">)</span>
<span class="gp">                                                   #</span>2  0x00005648e7534d2b n/a <span class="o">(</span>electron + 0x5185d2b<span class="o">)</span>
<span class="gp">                                                   #</span>3  0x00005648e75357b4 n/a <span class="o">(</span>electron + 0x51867b4<span class="o">)</span>
<span class="gp">                                                   #</span>4  0x00005648e750d448 n/a <span class="o">(</span>electron + 0x515e448<span class="o">)</span>
<span class="gp">                                                   #</span>5  0x00005648e750e08c n/a <span class="o">(</span>electron + 0x515f08c<span class="o">)</span>
<span class="gp">                                                   #</span>6  0x00005648e750dc7a n/a <span class="o">(</span>electron + 0x515ec7a<span class="o">)</span>
<span class="gp">                                                   #</span>7  0x00005648e750db12 n/a <span class="o">(</span>electron + 0x515eb12<span class="o">)</span>
<span class="gp">                                                   #</span>8  0x00005648e753898e n/a <span class="o">(</span>electron + 0x518998e<span class="o">)</span>
<span class="gp">                                                   #</span>9  0x00007f39c7499bb5 n/a <span class="o">(</span>libc.so.6 + 0x85bb5<span class="o">)</span>
<span class="gp">                                                   #</span>10 0x00007f39c751bd90 n/a <span class="o">(</span>libc.so.6 + 0x107d90<span class="o">)</span>
<span class="go">                                                   ELF object binary architecture: AMD x86-64
Apr 12 15:22:10 adamsdesk systemd[1]: systemd-coredump@1-57667-0.service: Deactivated successfully.
Apr 12 15:22:10 adamsdesk systemd[1]: systemd-coredump@1-57667-0.service: Consumed 2.095s CPU time.
Apr 12 15:22:10 adamsdesk io.element.Element.desktop[57532]: [57532:0412/152210.055595:ERROR:broker_posix.cc(40)] Recvmsg error: Connection reset by peer (104)
</span></code></pre></div></div>

<h2 id="solution---workaround">Solution - Workaround</h2>

<p>Thanks to a posted <a href="https://github.com/vector-im/element-web/issues/23311">project issue</a> I learned of a workaround by
disabling the feature “Message Search” which securely cache encrypted messages locally for them to appear in search
results. Here are the steps I took.</p>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Disabling this feature will result in being unable to search encrypted messages when using this application.
    </p>
</div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        These steps must be done quickly before the application crashes.
    </p>
</div>

<ol>
  <li>Open Element Desktop application.</li>
  <li>Go to “Profile picture” &gt; “All settings” &gt; “Security and Privacy”</li>
  <li>Under “Message Search” click on the “Manage” button.</li>
  <li>Click on the “Disable” button.</li>
  <li>Confirm by clicking on the “Disable” button again.</li>
</ol>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="archlinux" /><category term="linux" /><summary type="html"><![CDATA[Investigating and applying a workaround for a bug where Element desktop crashes shortly after being launched with, Recvmsg error: Connection reset by peer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/element-error-connection-reset-by-peer.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/element-error-connection-reset-by-peer.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Count The Number of Characters per Filename</title><link href="https://www.adamsdesk.com/posts/count-characters-per-filename/" rel="alternate" type="text/html" title="Count The Number of Characters per Filename" /><published>2023-03-28T00:00:00-06:00</published><updated>2023-03-28T13:49:23-06:00</updated><id>https://www.adamsdesk.com/posts/count-characters-per-filename</id><content type="html" xml:base="https://www.adamsdesk.com/posts/count-characters-per-filename/"><![CDATA[<p>There can be many reasons as to why one would want to know the length of a filename or multiple files within a
directory. In my case I had no direct need other than my curiosity getting the better of me and wanting to know how I
could accomplish this using the command line. Just thinking about this task brings to mind many possible solutions, so
if you notice a possible issue or have another way to accomplish the task please feel free to provide some feedback. Now
allow me to clarify what I mean by the length of a filename, as it can get confusing. I’m referring to the total amount
of characters used for the filename including the filename extension. So for example a filename of “my-filename.txt”
would have 15 total characters (length). In my use case I’m not including the full path for the filename length.</p>

<p>There is a lot to unpack here, especially for those dear readers that are not familiar with shell scripting. Do not
allow this to stop you from playing around with this. I will do my best to illustrate what each solution does by showing
the command example followed by the command output.</p>

<h2 id="environment">Environment</h2>

<p>Applicable commands were tested using the following.</p>

<ul>
  <li>Bash v5.1.16</li>
  <li>BusyBox v1.35.0</li>
  <li>PowerShell v7.3.3</li>
</ul>

<h2 id="command-examples">Command Examples</h2>

<p>The examples are sorted below by shell with a few variations. All examples achieve the following.</p>

<ul>
  <li>Iterate through each file found</li>
  <li>Counts each character used in the filename</li>
  <li>Outputs the results with the filename then filename length (total characters)</li>
</ul>

<p>For the purpose of testing and output examples, the current directory has a group of files and is illustrated below
containing 5 regular files and one subdirectory. The subdirectory contains one regular file.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">├── a-deep-dive-into-the-wayland-protocol-for-linux.md
├── hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md
├── inodes-and-the-linux-filesystem.md
├── test/
│  └── hello-world.md
├── this is-a test.txt
└── xorg-x11-wayland-linux-display-servers-and-protocols-explained.md
</span></code></pre></div></div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        In some example commands, a star or period is used which each represent as a special character.
The star in "for file in *" represents all files within the current directory.
The period in "find ." represents the current directory.
    </p>
</div>

<h2 id="bashbusybox">Bash/BusyBox</h2>

<p>Look at all file types within the current directory and then use
<a href="http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion">parameter expansion</a> to count each
character (<code class="language-plaintext highlighter-rouge">${#file}</code>).</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="k">for </span>file <span class="k">in</span> <span class="k">*</span><span class="p">;</span> <span class="k">do </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2"> </span><span class="k">${#</span><span class="nv">file</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">a-deep-dive-into-the-wayland-protocol-for-linux.md 50
hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md 63
inodes-and-the-linux-filesystem.md 34
test 4
this is-a text.txt 18
xorg-x11-wayland-linux-display-servers-and-protocols-explained.md 65
</span></code></pre></div></div>

<p>Look at all file types within the current directory and then use <a href="https://man.archlinux.org/man/wc.1">wc</a>
command to count each character.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="k">for </span>file <span class="k">in</span> <span class="k">*</span><span class="p">;</span> <span class="k">do </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2"> </span><span class="si">$(</span><span class="nb">echo</span> <span class="nt">-n</span> <span class="nv">$file</span> | <span class="nb">wc</span> <span class="nt">-m</span><span class="si">)</span><span class="s2">"</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">a-deep-dive-into-the-wayland-protocol-for-linux.md 50
hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md 63
inodes-and-the-linux-filesystem.md 34
test 4
this is-a text.txt 18
xorg-x11-wayland-linux-display-servers-and-protocols-explained.md 65
</span></code></pre></div></div>

<p>Look at all regular files (no directories, symbolic links, etc.) using the
<a href="https://man.archlinux.org/man/core/findutils/find.1">find</a> command recursively through the current directory with a max
depth (<code class="language-plaintext highlighter-rouge">-maxdepth</code>) of 1. Count each filename character without directory path using
<a href="http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion">parameter expansion</a> (<code class="language-plaintext highlighter-rouge">${#f}</code>).</p>

<p>While this solution may seem more complex, it is still quite simple and offers more flexible with options to change the
depth of recursion (how many subdirectories to go into), filter by file type (<code class="language-plaintext highlighter-rouge">-type</code>), and ensures only the filename is
counted for characters. All being displayed in a beautiful table with title headings making it clear what each value
represents.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>find <span class="nb">.</span> <span class="nt">-maxdepth</span> 1 <span class="nt">-type</span> f <span class="nt">-print0</span> | <span class="k">while </span><span class="nv">IFS</span><span class="o">=</span> <span class="nb">read</span> <span class="nt">-d</span> <span class="s1">''</span> file<span class="p">;</span> <span class="k">do </span><span class="nv">f</span><span class="o">=</span><span class="si">$(</span><span class="nb">basename</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2">"</span><span class="si">)</span><span class="p">;</span> <span class="nb">printf</span> <span class="s2">"%s: %s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2">"</span> <span class="s2">"</span><span class="k">${#</span><span class="nv">f</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">done</span> | column <span class="nt">-s</span> : <span class="nt">-t</span> <span class="nt">-N</span> Filename,Length
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Filename                                                             Length
./hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md     63
./test/hello-world.md                                                 14
./inodes-and-the-linux-filesystem.md                                  34
./this is-a text.txt                                                  18
./a-deep-dive-into-the-wayland-protocol-for-linux.md                  50
./xorg-x11-wayland-linux-display-servers-and-protocols-explained.md   65
</span></code></pre></div></div>

<h2 id="fish">Fish</h2>

<p>Look at all file types within the current directory and then use the
<a href="https://fishshell.com/docs/current/cmds/string.html#length-subcommand">string length</a> command to count each character.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="k">for </span>file <span class="k">in</span> <span class="k">*</span><span class="p">;</span> <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2"> </span><span class="si">$(</span>string length <span class="nv">$file</span><span class="si">)</span><span class="s2">"</span><span class="p">;</span> end
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">a-deep-dive-into-the-wayland-protocol-for-linux.md 50
hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md 63
inodes-and-the-linux-filesystem.md 34
test 4
this is-a text.txt 18
xorg-x11-wayland-linux-display-servers-and-protocols-explained.md 65
</span></code></pre></div></div>

<p>Look at all file types within the current directory and then use <a href="https://man.archlinux.org/man/wc.1">wc</a>
command to count each character.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="k">for </span>file <span class="k">in</span> <span class="k">*</span><span class="p">;</span> <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2"> </span><span class="si">$(</span><span class="nb">echo</span> <span class="nt">-n</span> <span class="nv">$file</span> | <span class="nb">wc</span> <span class="nt">-m</span><span class="si">)</span><span class="s2">"</span><span class="p">;</span> end
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">a-deep-dive-into-the-wayland-protocol-for-linux.md 50
hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md 63
inodes-and-the-linux-filesystem.md 34
test 4
this is-a text.txt 18
xorg-x11-wayland-linux-display-servers-and-protocols-explained.md 65
</span></code></pre></div></div>

<p>Look at all regular files (no directories, symbolic links, etc.) using the
<a href="https://man.archlinux.org/man/core/findutils/find.1">find</a> command recursively through the current directory with a max
depth (<code class="language-plaintext highlighter-rouge">-maxdepth</code>) of 1. Count each filename character without directory path using
<a href="https://fishshell.com/docs/current/cmds/string.html#length-subcommand">string length</a> command.</p>

<p>While this solution may seem more complex, it is still quite simple and offers more flexible with options to change the
depth of recursion (how many subdirectories to go into), filter by file type (<code class="language-plaintext highlighter-rouge">-type</code>), and ensures only the filename is
counted for characters. All being displayed in a beautiful table with title headings making it clear what each value
represents.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="k">for </span>file <span class="k">in</span> <span class="si">$(</span>find <span class="nb">.</span> <span class="nt">-maxdepth</span> 1 <span class="nt">-type</span> f<span class="si">)</span><span class="p">;</span> <span class="nb">set basename</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">basename</span> <span class="nv">$file</span><span class="si">)</span><span class="s2">"</span><span class="p">;</span> <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2"> </span><span class="si">$(</span>string length <span class="nv">$basename</span><span class="si">)</span><span class="s2">"</span><span class="p">;</span> end | column <span class="nt">-t</span> <span class="nt">-N</span> Filename,Length
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Filename                                                             Length
./hard-links-and-soft-links-in-linux-explained-enable-sysadmin.md    63
./inodes-and-the-linux-filesystem.md                                 34
./this is-a text.txt                                                 18
./a-deep-dive-into-the-wayland-protocol-for-linux.md                 50
./xorg-x11-wayland-linux-display-servers-and-protocols-explained.md  65
</span></code></pre></div></div>

<h2 id="powershell">PowerShell</h2>

<p>Look at all files types within the current directory and then use object length (<code class="language-plaintext highlighter-rouge">$_.Name.Length</code>) to count each character.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">get-childitem</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nx">Name</span><span class="p">,</span><span class="w"> </span><span class="p">@{</span><span class="nx">N</span><span class="o">=</span><span class="s2">"Length"</span><span class="p">;</span><span class="nx">E</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">Name</span><span class="o">.</span><span class="nf">Length</span><span class="p">}}</span><span class="w">
</span></code></pre></div></div>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Name</span><span class="w">                                                              </span><span class="nx">Length</span><span class="w">
</span><span class="o">----</span><span class="w">                                                              </span><span class="o">------</span><span class="w">
</span><span class="n">test</span><span class="w">                                                                   </span><span class="nx">4</span><span class="w">
</span><span class="n">a-deep-dive-into-the-wayland-protocol-for-linux.md</span><span class="w">                    </span><span class="nx">50</span><span class="w">
</span><span class="n">hard-links-and-soft-links-in-linux-explained.md</span><span class="w">                       </span><span class="nx">47</span><span class="w">
</span><span class="n">inodes-and-the-linux-filesystem.md</span><span class="w">                                    </span><span class="nx">34</span><span class="w">
</span><span class="n">this</span><span class="w"> </span><span class="nx">is-a</span><span class="w"> </span><span class="nx">text.txt</span><span class="w">                                                    </span><span class="nx">18</span><span class="w">
</span><span class="n">xorg-x11-wayland-linux-display-servers-and-protocols-explained.md</span><span class="w">     </span><span class="nx">65</span><span class="w">
</span></code></pre></div></div>

<p>Look at files (not directories) recursively within the current directory and then use object length (<code class="language-plaintext highlighter-rouge">$_.Name.Length</code>)
to count each character.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">get-childitem</span><span class="w"> </span><span class="nt">-File</span><span class="w"> </span><span class="nt">-Recurse</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nx">Name</span><span class="p">,</span><span class="w"> </span><span class="p">@{</span><span class="nx">N</span><span class="o">=</span><span class="s2">"Length"</span><span class="p">;</span><span class="nx">E</span><span class="o">=</span><span class="p">{</span><span class="bp">$_</span><span class="o">.</span><span class="nf">Name</span><span class="o">.</span><span class="nf">Length</span><span class="p">}}</span><span class="w">
</span></code></pre></div></div>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Name</span><span class="w">                                                              </span><span class="nx">Length</span><span class="w">
</span><span class="o">----</span><span class="w">                                                              </span><span class="o">------</span><span class="w">
</span><span class="n">a-deep-dive-into-the-wayland-protocol-for-linux.md</span><span class="w">                    </span><span class="nx">50</span><span class="w">
</span><span class="n">hard-links-and-soft-links-in-linux-explained.md</span><span class="w">                       </span><span class="nx">47</span><span class="w">
</span><span class="n">inodes-and-the-linux-filesystem.md</span><span class="w">                                    </span><span class="nx">34</span><span class="w">
</span><span class="n">this</span><span class="w"> </span><span class="nx">is-a</span><span class="w"> </span><span class="nx">text.txt</span><span class="w">                                                    </span><span class="nx">18</span><span class="w">
</span><span class="n">xorg-x11-wayland-linux-display-servers-and-protocols-explained.md</span><span class="w">     </span><span class="nx">65</span><span class="w">
</span><span class="n">hello-world.md</span><span class="w">                                                        </span><span class="nx">14</span><span class="w">
</span></code></pre></div></div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        To work outside the current directory add the parameter "-Path" and then the desired directory path to "get-childitem" (e.g. "get-childitem -File -Recurse -Path C:\dir\example").
    </p>
</div>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="commandline" /><summary type="html"><![CDATA[Find each filename's total length of characters within a directory in the terminal using Bash, BusyBox, Fish or PowerShell with these one line commands.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/filename-character-length.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/filename-character-length.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #3</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-3/" rel="alternate" type="text/html" title="Little Bits: Issue #3" /><published>2023-03-03T00:00:00-06:00</published><updated>2023-03-03T18:21:02-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-3</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-3/"><![CDATA[<p>Welcome back folks, I have a jam packed issue this time covering a lot of topics from applications, gaming, hardware
and more. I’m sure these bits will keep you busy discovering the hidden gems throughout the Internet, enjoy!</p>

<h2 id="bits">Bits</h2>

<ul>
  <li>
    <p><a href="https://www.7xwords.com/">7x7 puzzles</a> by malaika &amp; friends</p>

    <p>A lot of crossword puzzles to pass the time by challenging your mind.</p>
  </li>
  <li>
    <p><a href="https://web.law.duke.edu/cspd/publicdomainday/2023/">January 1, 2023 is Public Domain Day: Works from 1927 are open to all!</a></p>

    <p>Jennifer Jenkins a Director of Duke’s Center for the Study of the Public Domain talks about and lists material that
  enters the public domain from 1927.</p>
  </li>
  <li>
    <p><a href="http://pxtoem.com/">PXtoEM.com</a></p>

    <p>Brian Cray makes converting px to em quick and easy with this online tool.</p>
  </li>
  <li>
    <p><a href="https://ploopy.co/">Ploppy</a></p>

    <p>A company that produces 100% open source products from computer mice to headphones. Not just the hardware is open
  source, but also the design files, documentation, and software utilizing the licenses of
  <a href="https://www.gnu.org/licenses/gpl-3.0.txt">GPLv3</a>, <a href="https://ohwr.org/cern_ohl_s_v2.txt">CERN-OHL-v2-S</a>, and
  <a href="https://www.gnu.org/licenses/fdl-1.3.txt">GFDLv1.3</a>.</p>
  </li>
  <li>
    <p><a href="https://podcastindex.org/">Podcast Index</a></p>

    <p>Helping to preserve, protect and extend the open, independent podcasting ecosystem. Use the search engine to find
  podcasts of interest, list podcast apps, and use the API to create new applications without the heavy lifting of
  indexing, aggregation and data management.</p>
  </li>
  <li>
    <p><a href="https://interviews.school/">Interviews.school</a></p>

    <p>Help prepare for software engineering interviews.</p>
  </li>
  <li>
    <p><a href="https://www.xbrowsersync.org/">xBrowserSync</a></p>

    <p>A secure, annoymous, and free open source browser syncing tool.</p>
  </li>
  <li>
    <p><a href="https://github.com/anchore/grype">grype</a></p>

    <p>A vulnerability scanner for container images and filesystems.</p>
  </li>
  <li>
    <p><a href="https://punkx.org/unix-pipe-game/">The UNIX Pipe Card Game</a></p>

    <p>A card game for teaching how to combine Unix commands through pipes.</p>
  </li>
  <li>
    <p><a href="https://vintageapple.org/">Vintage Apple</a></p>

    <p>Vintage Apple books, magazines, manuals and more.</p>
  </li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><summary type="html"><![CDATA[Get your fresh Little Bits in issue number three covering topics on applications, gaming, history, hardware, software development and web design.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-3.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-3.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Improve Your Development Productivity with Snippets</title><link href="https://www.adamsdesk.com/posts/vscodium-snippets/" rel="alternate" type="text/html" title="Improve Your Development Productivity with Snippets" /><published>2023-03-02T00:00:00-06:00</published><updated>2023-03-02T20:47:35-06:00</updated><id>https://www.adamsdesk.com/posts/vscodium-snippets</id><content type="html" xml:base="https://www.adamsdesk.com/posts/vscodium-snippets/"><![CDATA[<p>I’ve found that over the years of writing code or just entering notes down that we often produce text that can be
partially reproduced. Often I would create reference files for code snippets or formatted text that I could go and grab
to reuse when needed. I’m sure most of us would agree that this is not effective and accessible as having access to the
snippets right within the editor. When using <a href="https://vscodium.com/">VSCodium</a> a free open source software fork of
<a href="https://code.visualstudio.com/">VSCode</a>, there is a built-in system that can help manage snippets and take them to a
whole new level with tabstops, placeholders, choices (value picker), and variables. Join me in exploring this wonderful
feature.</p>

<h2 id="what-are-snippets">What are Snippets?</h2>

<p>Re-usable text pattern or source code that aids in avoiding repetitive typing and recreating the text that has already
been done in the past. Typically, snippets are used in programming or specifically formatted text.</p>

<p>There are two types of code snippets, built-in and user-defined. Built-in snippets are provided by the editor itself
or from installing extensions. The user-defined snippets are created by you the user. All snippets are written in JSON
(JavaScript Object Notation) and have support for C-style comments. Such use cases can be Jekyll code blocks, loops,
or <a href="/posts/admonitions-jekyll/">Jekyll admonitions</a>.</p>

<h2 id="snippet-properties">Snippet Properties</h2>

<p>Each code snippet is defined with the following properties.</p>

<dl>
  <dt>name (required)</dt>
  <dd>Snippet name that is displayed at the time of code completion if no description is defined.</dd>
  <dt>scope (optional)</dt>
  <dd>Defines the context in which the code snippet is available by using one or more <a href="https://kb.adamsdesk.com/development/vscodium-snippets/#language-identifiers">language identifiers</a>. This helps code completion list only relevant suggestions. If scope property is omitted, then the snippet will be available in all languages.</dd>
  <dt>prefix (required)</dt>
  <dd>One or more trigger words that will cause the snippet to be listed as an option at the time of code completion.</dd>
  <dt>body (required)</dt>
  <dd>One or more lines of content that will be added to the desired location from which it was called. Newlines, tabs, etc. will be formatted based upon the context in which the snippet is inserted.</dd>
  <dt>description (optional)</dt>
  <dd>A descriptive text of the code snippet that will be displayed at the time of code completion.</dd>
  <dt>isFileTemplate (optional)</dt>
  <dd>To control whether the code snippet can be used to populate or replace a file’s contents when running “Snippets: Populate File from Snippet” via the Command Palette for a new or existing file. The property has a value of either true or false.</dd>
</dl>

<h2 id="using-snippets">Using Snippets</h2>

<p>Accessing the list of user-defined, and built-in snippets can be done using one of the below methods.</p>

<dl>
  <dt>Code Completion (IntelliSense)</dt>
  <dd>Type the snippet keyword (prefix) followed by pressing, <kbd>CTRL</kbd>+<kbd>Spacebar</kbd> and then select a snippet by pressing <kbd>enter</kbd>.</dd>
  <dt>Command Palette</dt>
  <dd>Use command “Snippets: Insert Snippet” or “Snippets: Populate File from Snippet” by pressing <kbd>CTRL</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and then select a snippet by pressing <kbd>enter</kbd>.</dd>
  <dt>Tab Completion</dt>
  <dd>This method is supported, but must be enabled within the settings (<kbd>CTRL</kbd>+<kbd>,</kbd>) under User &gt; Text Editors (<code class="language-plaintext highlighter-rouge">"editor.tabCompletion": "on"</code>). Then simply type the snippet keyword (prefix), and press the <kbd>tab</kbd> key and then select a snippet by pressing <kbd>enter</kbd>.</dd>
</dl>

<h2 id="creating-snippets">Creating Snippets</h2>

<p>Use the following steps to create either a language, project or global scope snippet.</p>

<ol>
  <li>Open the Command Palette, press <kbd>CTRL</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>.</li>
  <li>Run the command “Snippets: Configure User Snippets”.</li>
  <li>Selected the desired option under “New Snippets”.
    <ul>
      <li>Options displayed as a language will only be applied to a specific language</li>
      <li>Options displayed as “New Snippets file for” will only be applied to a specific project</li>
      <li>Options displayed as “New Global Snippets file” will be applied to all languages</li>
    </ul>
  </li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Snippets are stored with the file extension of "json" or "code-snippets" (global/projects).
    </p>
</div>

<h2 id="editing-snippets">Editing Snippets</h2>

<ol>
  <li>Open the Command Palette, press <kbd>CTRL</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>.</li>
  <li>Run the command “Snippets: Configure User Snippets”.</li>
  <li>Selected the desired snippet to modify.</li>
</ol>

<h2 id="removing-snippets">Removing Snippets</h2>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        This process is permanent and cannot be undone.
    </p>
</div>

<ol>
  <li>Open the Explorer Workspace (<kbd>CTRL</kbd>+<kbd>Shift</kbd>+<kbd>E</kbd>).</li>
  <li>Browse and select the desired code snippet by left mouse clicking on the file.</li>
  <li>Press the <kbd>del</kbd> key or right mouse click on the file and left click on “Delete”.</li>
</ol>

<p>Deleting a snippet can be done manually by browsing to one of the following applicable directories using a file manager
or terminal to remove the desired file.</p>

<ul>
  <li>/home/{username-here}/.config/VSCodium/User/snippets</li>
  <li>.vscode (located within each project folder)</li>
  <li>C:\Users\{username-here}\AppData\Roaming\VSCodium\User\snippets</li>
</ul>

<h2 id="example-snippets">Example Snippets</h2>

<p>This example illustrations language specific snippets for YAML (yaml.json). Multiple snippets are stored together.
The first snippet is a changelog that is stored within the Jekyll front matter for a post. This snippet is triggered by
the keyword (prefix) “adlog” (Adamsdesk post changelog). The second example is another Jekyll front matter for a
wallpaper post that is triggered by <code class="language-plaintext highlighter-rouge">adwal</code> (Adamsdesk wallpaper item).</p>

<p>The variable <code class="language-plaintext highlighter-rouge">$CURRENT_YEAR</code> will be replaced with the current four digit year, <code class="language-plaintext highlighter-rouge">$CURRENT_MONTH</code> two-digit month and
<code class="language-plaintext highlighter-rouge">$CURRENT_DATE</code> two digit day of the month. The numbered variables control the order of cursor placement after being
inserted. Enter the desired value at each cursor positing and jump to the next position by pressing the <kbd>tab</kbd>
key. The last cursor position is defined by the variable <code class="language-plaintext highlighter-rouge">$0</code>. The <code class="language-plaintext highlighter-rouge">\t</code> represents a tab character.</p>

<figure class="highlight"><code class="language-json" data-lang="json"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre><span class="err">//This</span><span class="w"> </span><span class="err">is</span><span class="w"> </span><span class="err">comment</span><span class="w"> </span><span class="err">for</span><span class="w"> </span><span class="err">the</span><span class="w"> </span><span class="err">snippets</span><span class="w"> </span><span class="err">stored</span><span class="w"> </span><span class="err">in</span><span class="w"> </span><span class="err">the</span><span class="w"> </span><span class="err">yaml.json</span><span class="w"> </span><span class="err">file.</span><span class="w">
</span><span class="p">{</span><span class="w">
    </span><span class="nl">"Adamsdesk Changelog"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"adlog"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"changelog:"</span><span class="p">,</span><span class="w">
                </span><span class="s2">"</span><span class="se">\t</span><span class="s2">-   date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE"</span><span class="p">,</span><span class="w">
                    </span><span class="s2">"</span><span class="se">\t\t</span><span class="s2">log:"</span><span class="p">,</span><span class="w">
                        </span><span class="s2">"</span><span class="se">\t\t\t</span><span class="s2">- $0"</span><span class="w">
        </span><span class="p">],</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Adamsdesk YAML frontmatter changelog."</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"Adamsdesk Wallpaper Item"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"adwal"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
            </span><span class="s2">"</span><span class="se">\t</span><span class="s2">-   caption: $1"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"</span><span class="se">\t\t</span><span class="s2">link: $2"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"</span><span class="se">\t\t</span><span class="s2">source: $3"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"</span><span class="se">\t\t</span><span class="s2">image: $4"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"</span><span class="se">\t\t</span><span class="s2">alt: $5"</span><span class="p">,</span><span class="w">
            </span><span class="s2">"$0"</span><span class="w">
        </span><span class="p">],</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Adamsdesk YAML wallpapers array item."</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">}</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="dive-deeper">Dive Deeper</h2>

<p>For further details on snippet scope, special constructs, remove built-in snippets from IntelliSense, and more refer to
the <a href="https://kb.adamsdesk.com/development/vscodium-snippets/">knowledge base article</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="programming" /><category term="development" /><summary type="html"><![CDATA[Learn how to improve your development productivity with code snippets using the source-code editor VSCodium or VSCode.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/vscodium-snippets.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/vscodium-snippets.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Twitter Drops Text Message Two-Factor Authentication</title><link href="https://www.adamsdesk.com/posts/twitter-text-message-two-factor-authentication/" rel="alternate" type="text/html" title="Twitter Drops Text Message Two-Factor Authentication" /><published>2023-02-22T00:00:00-06:00</published><updated>2023-06-16T00:04:02-06:00</updated><id>https://www.adamsdesk.com/posts/twitter-text-message-two-factor-authentication</id><content type="html" xml:base="https://www.adamsdesk.com/posts/twitter-text-message-two-factor-authentication/"><![CDATA[<p>On Wednesday, February 15, 2023 Twitter announced in a <a href="https://blog.twitter.com/en_us/topics/product/2023/an-update-on-two-factor-authentication-using-sms-on-twitter">blog post</a> that two-factor authentication using text message (SMS,
Short Message/Messaging Service) will no longer be free. This may come as a shock to some and as well create further
confusion as what one can do other than paying for Twitter Blue. The unfortunate part in this news announcement is how
Twitter has chosen to handle it. In some cases Twitter gives the impression that paying is the only option when this
is not the case. Let us first break down the confusion and then look at what options a Twitter user may have.</p>

<h2 id="what-is-two-factor-authentication">What is Two-Factor Authentication?</h2>

<p>Multi-factor authentication (MFA) or also known as two-factor authentication (2FA) is a security method used to log in
to a website or application that requires two or more distinct forms of identification in order to gain access. The
first-factor would be the password, and commonly the second would be a text message (SMS) with a code sent to a mobile
phone, authenticator app, biometrics (fingerprint, face, or retina), etc.</p>

<p>We can break this down simply as…</p>

<ul>
  <li>Something you know (your password)</li>
  <li>Something you have (text message with code)</li>
  <li>Something you are (fingerprint, face, retina)</li>
</ul>

<h2 id="why-charge-for-a-security-feature">Why Charge for a Security Feature?</h2>

<p>As far as I’m aware at the time of writing this post Twitter as not publicly stated their reasoning entirely. The
blog post announcement does state indirectly that 2FA via text message is being abused by bad actors. So this does
seem to imply that ultimately text message two-factor authentication will eventually be removed for the sack of
security. However, we can make further deductions as to why Twitter would even consider this.</p>

<ul>
  <li>To discourage use</li>
  <li>To reduce operating costs, sending text message (SMS) is expensive for a business</li>
  <li>To gain revenue, even if temporary</li>
  <li>To eventually drop text message support completely</li>
  <li>To improve security, text message is not a secure method for two-factor authentication</li>
</ul>

<h2 id="when-will-free-text-message-2fa-end">When Will Free Text Message 2FA End?</h2>

<p>The blog announcement states that after March 20, 2023 non-Twitter Blue subscribers will no longer have access to text
messages for two-factor authentication. So to be safe I would make sure to turn off text message 2FA before March 19,
2023.</p>

<h2 id="what-do-i-do-after-the-deadline">What Do I Do After the Deadline?</h2>

<p>Those accounts left with text messages 2FA enabled will have it disabled according to the blog announcement. What
is not clear is, will the accounts with text message 2FA indeed still have access or not. Some users have been shown
messages on Twitter that states “To avoid loosing access to Twitter, remove text message two-factor authentication by
March 19, 2023”.</p>

<h2 id="what-are-my-options">What Are My Options?</h2>

<p>Twitter offers other methods of two-factor authentication using an authenticator app or security key for free under an
accounts Settings &gt; Security and account access &gt; Two-factor authentication. I’m not certain, but it may be possible to
not even enable two-factor authentication. However, I strongly advise against this as it is not a matter of if an
account will be breached, but more of matter of when without having 2FA enabled.</p>

<p>So my advice would be to disable text message 2FA, and enable either the 2FA using authentication app or security key
methods provided by Twitter for free.</p>

<h2 id="conclusion">Conclusion</h2>

<p>I personally may not agree with how Twitter is handling the transition of removing text message 2FA, however I do
believe in the end this is better for everyone from a security point of view. Sending a security code using a text
message is simply dangerous and honestly should have never been done in the first place. For those using Twitter take
this opportunity to learn more about two-factor authentication, password managers and/or an authenticator app, and
security keys.</p>

<p>In the end I recommend enabling two-factor authentication using an authenticator app or security key. For those looking
for solutions of a free open source authenticator/password manager app or security key, here are some recommendations.
Please remember to safe your backup codes in case the 2FA cannot be used.</p>

<h3 id="authenticatorpassword-manager-apps">Authenticator/Password Manager apps</h3>

<ul>
  <li><a href="https://getaegis.app/">Aegis Authenticator</a> (Android)</li>
  <li><a href="https://authpass.app/">AuthPass</a> (Android, iOS, macOS, Windows)</li>
  <li><a href="https://bitwarden.com/open-source/">Bitwarden</a> (Android, iOS, Linux, macOS, Windows)</li>
  <li><a href="https://buttercup.pw/">Buttercup</a> (Android, iOS, Linux, macOS, Windows)</li>
  <li><a href="https://www.keepassdx.com/">KeePassDX</a> (Android)</li>
  <li><a href="https://keepassxc.org/">KeePassXC</a> (Linux, macOS, Windows)</li>
</ul>

<h3 id="security-keys">Security Keys</h3>

<ul>
  <li><a href="https://www.nitrokey.com/">NitroKey</a></li>
  <li><a href="https://onlykey.io/">OnlyKey</a></li>
  <li><a href="https://solokeys.com/">Solokeys</a></li>
  <li><a href="https://www.yubico.com/">YubiKey</a></li>
</ul>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="security" /><summary type="html"><![CDATA[Get the latest news and understanding about Twitter dropping free support for text message two-factor authentication.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/twitter-text-message-2fa.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/twitter-text-message-2fa.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Resolve RealSimGear Linux Driver Fails To Compile</title><link href="https://www.adamsdesk.com/posts/realsimgear-g1000-suite-linux-driver-install/" rel="alternate" type="text/html" title="Resolve RealSimGear Linux Driver Fails To Compile" /><published>2023-01-30T00:00:00-06:00</published><updated>2023-11-28T00:02:10-06:00</updated><id>https://www.adamsdesk.com/posts/realsimgear-g1000-suite-linux-driver-install</id><content type="html" xml:base="https://www.adamsdesk.com/posts/realsimgear-g1000-suite-linux-driver-install/"><![CDATA[<p>I was doing a routine Arch Linux system update for a client on a flight simulator system I set up quite some time ago
using X-Plane. The system updates all went well as expected until I attempted to recompile the RealSimGear CH34x Linux
driver. Unfortunately it failed to compile, and I was left with the thought, “how am I going to fix this?”.</p>

<figure class="text-center">
    <img src="/assets/img/posts/flight-simulator-full-setup.webp" width="720" height="630" class="figure-img img-fluid rounded" alt="A fully setup flight simulator with yoke, rudder pedals, metal dashboard, RealSimGear G1000 Suite PFD/MFD/GMA, throttle quadrant and 49-inch curved gaming monitor." loading="lazy" />
    <figcaption class="figure-caption">
        Full Setup of The Flight Simulator with X-Plane Running On Linux
    </figcaption>
</figure>

<h2 id="the-problem">The Problem</h2>

<p>The driver I am using for the hardware RealSimGear G1000 Suite PFD/MFD/GMA is supplied by RealSimGear
RSG_CH34x_Linux_Driver.tar.gz v1.3. Each time the kernel is updated the driver needs to be recompiled. I tried to compile
the driver, but received the following output.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>make
<span class="go">make -C /lib/modules/5.15.86-1-lts/build  M=/home/flightsim/Downloads/RSG_CH34x_Linux_Driver
make[1]: Entering directory '/usr/lib/modules/5.15.86-1-lts/build'
  CC [M]  /home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.o
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c: In function ‘ch34x_close’:
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:642:28: warning: unused variable ‘wait’ [-Wunused-variable]
</span><span class="gp">  642 |         wait_queue_entry_t wait;</span><span class="w">
</span><span class="go">      |                            ^~~~
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:641:14: warning: unused variable ‘timeout’ [-Wunused-variable]
</span><span class="gp">  641 |         long timeout;</span><span class="w">
</span><span class="go">      |              ^~~~~~~
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:640:13: warning: unused variable ‘bps’ [-Wunused-variable]
</span><span class="gp">  640 |         int bps;</span><span class="w">
</span><span class="go">      |             ^~~
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c: At top level:
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:1348:27: error: initialization of ‘unsigned int (*)(struct tty_struct *)’ from incompatible pointer type ‘int (*)(struct tty_struct *)’ [-Werror=incompatible-pointer-types]
 1348 |         .write_room     = ch34x_write_room,
      |                           ^~~~~~~~~~~~~~~~
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:1348:27: note: (near initialization for ‘ch34x_device.write_room’)
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:1349:28: error: initialization of ‘unsigned int (*)(struct tty_struct *)’ from incompatible pointer type ‘int (*)(struct tty_struct *)’ [-Werror=incompatible-pointer-types]
 1349 |         .chars_in_buffer = ch34x_chars_in_buffer,
      |                            ^~~~~~~~~~~~~~~~~~~~~
/home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.c:1349:28: note: (near initialization for ‘ch34x_device.chars_in_buffer’)
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:289: /home/flightsim/Downloads/RSG_CH34x_Linux_Driver/ch34x.o] Error 1
make[1]: *** [Makefile:1902: /home/flightsim/Downloads/RSG_CH34x_Linux_Driver] Error 2
make[1]: Leaving directory '/usr/lib/modules/5.15.86-1-lts/build'
make: *** [Makefile:7: default] Error 2
</span></code></pre></div></div>

<p>I’ve never written a driver before and nothing really stood out for me from the error messages that I could easily
repair myself. I was at a cross road, and I wasn’t sure what direction to go.</p>

<h2 id="contact-support">Contact Support</h2>

<p>At the time the client tried to reach RealSimGear tech support by phone, but unfortunately they were not available and
was directed to send an email message instead. A message was left by the client to have tech support call him back.
Later that day I decided to send an email into tech support myself since I was the one having to do that work and had
the technical know how.</p>

<p>I received an email reply shortly, and I was told that RealSimGear has dropped support for Linux some time ago due to
lack of Linux users. This was a response I was not expecting. There was no notice of this change and the hardware was
intentionally purchased due to it supporting Linux. The hardware was purchased less than 2 years ago, this doesn’t even
seam like a reasonable support period. This isn’t hardware that is just a few hundred dollars. We are talking over
$2,000 USD at the time of purchase. I was frustrated due to this response, but figured what can I do, but try and talk
more. After some email messages exchanging back and forth I was happy to receive some direction on how to get the
hardware driver working again using the native Linux kernel Arduino driver and a Bash script their developer provided
me.</p>

<h2 id="solution">Solution</h2>

<p>The instructions given by the developer was good, just not exactly clear for my exact use case since I was using Arch
Linux and I wouldn’t imagine the developer was using that operating system. It took quite some time of trying different
direction and installing a bunch of packages until I finally had a perspective that I should have taken from the start.
You see there are a bunch of drivers that the Linux kernel supports, but not all of them are loaded by default. I found
out that the driver I required was on the system already I just had to install it. Thanks to the priceless Arch Wiki
article <a href="https://wiki.archlinux.org/title/Kernel_module">Kernel module</a> and
<a href="https://wiki.archlinux.org/title/Arduino">Arduino</a> I was able to take what I found, plus the script RealSimGear
developer provided to register the USB device IDs and was able to make it all work again. It is very exciting to solve
a problem and see things working again while learning more about Linux.</p>

<p>I wrote an entire article on how to make this all work over on my Knowledge Base called
<a href="https://kb.adamsdesk.com/hardware/realsimgear-g1000-gma-mfd-pfd-install/">RealSimGear G1000 Suite Linux Install</a> for
those that are interested.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Though the solution sounds exciting I still concerned about it all. In the short term I am concerned that the X-Plane
RealSimGear plugin will no longer work. As I understand it the plugin is what communicates from the driver to within
X-Plane, so it understands what action to do. Basically a translator of sorts. I’m grateful for RealSimGear developer
that provided the script, without that I doubt I would have fixed it. As for now the hardware is working with X-Plane
11 and the client is happy.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><summary type="html"><![CDATA[A simple routine Linux system update goes bad, but then ends up finding a solution with help from RealSimGear tech support.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/realsimgear-g1000-pfd-mfd-gma-linux.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/realsimgear-g1000-pfd-mfd-gma-linux.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ivory for Mastodon Review</title><link href="https://www.adamsdesk.com/posts/review-ivory-mastodon/" rel="alternate" type="text/html" title="Ivory for Mastodon Review" /><published>2023-01-26T00:00:00-06:00</published><updated>2023-07-14T19:05:37-06:00</updated><id>https://www.adamsdesk.com/posts/review-ivory-mastodon</id><content type="html" xml:base="https://www.adamsdesk.com/posts/review-ivory-mastodon/"><![CDATA[<p>The unfortunate news came that <a href="https://tapbots.com/tweetbot/">Tweetbot</a> would be forced to cease development and
support due to Twitter’s recent changes to suspend access to third party clients. This may be sad news to a lot of
people, however with the over 10 years of hard work this knowledge and experience can be used for future development.
I never used Tweetbot before, but I definately read a lot about the app throughout the years. So with this sad news
comes some exciting news from Tapbots, the developer team behind Tweetbot to create a new social media client called
Ivory for Mastodon. Early access to the new iOS app for iPhone and iPad is now available, and I thought I would check
out what all the toots are all about.</p>

<h2 id="environment">Environment</h2>

<p>Testing was done using the following…</p>

<ul>
  <li>iPad Pro 10.5”</li>
  <li>iOS v16.3</li>
  <li>Ivory v1.4.1</li>
</ul>

<h2 id="initial-setup">Initial Setup</h2>

<p>I installed the application using the App Store by searching for “ivory for mastodon”. Upon initial load of the
application I was presented with a lovely elephant that appears to be the mascot of the software. Next I entered my
instance server name, “fosstodon.org”. Afterwards I had to authorize access to my Mastodon account. All this went pretty
smoothly. Now I was presented with the option to demo the app or purchase a subscription. Apparently I will not be
charged a fee if I choose to cancel the subscription within 7 days. This part, I’m not a fan of. I should be able to
test out the application using most of the base features so that I can make a decision without making a commitment.
I realize this seems to be the norm nowadays especially on an Apple device, but I’m strongly against this approach to
get money from people. Anyway, I moved on by choosing to go with “I Just Want to Demo”.</p>

<p><img src="/assets/img/posts/ivory-app-screenshot-1.webp" alt="Screenshot of Ivory initial setup/welcome screen." class="img-fluid mx-auto d-block" loading="lazy" /></p>

<p>Unfortunately at this point I experienced an iCloud Sync Issue. I found the issue online on the
<a href="https://tapbots.com/support/ivory/general/icloud">Ivory support page</a>. Turns out iCloud Drive is required along with
app permission for iCloud access. I have no interest in using iCloud, so this is why I have it disabled. I would really
like to know what exactly the app is using iCloud for as I’ve not been able to find any explanation. As far as I can
tell, the app doesn’t have to have access to iCloud in order to function properly.</p>

<h2 id="using-ivory">Using Ivory</h2>

<p>At the initial look and feel the Mastodon client is quite smooth and elegant to use. Everything that I need is available to
me quickly and easily using the vertical bar with icons. On the home view one can choose to select Home, Local,
Federated, or a predefined user list. The top right has a split view icon that adds having mentions listed as you browse.
Go down the vertical navigation, you have mentions, profile, notifications, search, favorites, bookmarks, lists, filters,
and statistics.</p>

<p><img src="/assets/img/posts/ivory-app-screenshot-2.webp" alt="Screenshot of Ivory viewing a Mastodon post." class="img-fluid mx-auto d-block" loading="lazy" /></p>

<p>One of the coolest features I’ve found is the statistics. Though it is not a necessary feature it is a cool to see your
overall activity, favorites, boots, replies, mentions, posts, and follows all in a nice looking graph. As far I can tell
these stats are for the recent week. May be over time this will grow to show more, at this stage I’m not sure.</p>

<h2 id="customizing">Customizing</h2>

<p>There doesn’t seem to be much left out that I can think of that cannot be changed under the settings. Everything from
having multiple accounts to changing the display, behaviour, notifications, sounds, browser, and app icon is available.
I like the fact that one has the choice to change the default built-in web browser to the user’s desired web browser of
choice. Interesting to see so many options on changing the app icon with even a Tweetbot rest-in-peace icon for some
nostalgia.</p>

<h2 id="missing-features">Missing Features</h2>

<p>A few things I noticed that doesn’t seem to be supported yet.</p>

<ul>
  <li>Profile doesn’t render emojis</li>
  <li>Profile doesn’t have a media tab</li>
</ul>

<h2 id="privacy">Privacy</h2>

<p>One of the reasons why I wanted to check out this app was due to how wonderful the developers seem to respect a user’s
privacy. It has been taken serious enough that the App Store reports that the developer does not collect any data from
this app along with the <a href="https://tapbots.net/ivory/privacy/">website</a> explaining this further. It all seems fair and
reasonable. I praise the Tapbots for doing this and wish more would come on board.</p>

<h2 id="license">License</h2>

<p>For me this is the disappointing part. I’m a strong advocate of software being developed using free open source
licenses, and now seeing this how beautiful everything else has been done it saddens me that a close source license has
been chosen. As a user I have no way to verify or have the community verify exact what is going on in the background.
Providing transparency is key as far as I’m concerned and in return having an open source license allows for the
community to grow and learn if one chooses to do so.</p>

<p>Saying all this though I do respect the developers choice, and wish them all the best in this adventure.</p>

<h2 id="conclusion">Conclusion</h2>

<p>It is unfortunate that I was not able to dive deeper into the review due to being stuck in demo mode. It frustrates that
this was the approach the developers took or maybe strongly encouraged due Apple forcing this decision. Overall the
application looks and feels great with an intuitive interface. The polished feel definitely shows that a lot of
thought and effort has gone into the development of this application.</p>

<p>Ultimately for me the there are two reasons as to why I would not choose to use this application. First is the payment
options available, lock a customer in using a subscription of monthly or yearly bases. Which really means I have to pay
for it indefinitely to use it. Though the subscription cost is quite reasonable, but not for endless years. Give the
freedom of choice with the option of having one time payment even if that means for a certain period of time. The second
issue is not being developed using an open source license with the source code available.</p>

<p>Either way it is good to see another Mastodon client available, and I’m sure it will be a good choice for those that
choose it. Give it a try and see what you think.</p>]]></content><author><name>Adam Douglas</name></author><category term="review" /><category term="mastodon" /><summary type="html"><![CDATA[Review of the Ivory Mastodon client by Tapbots for iOS (iPhone/iPad) from the makers of the now defunct Tweetbot app.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/ivory-app-icon.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/ivory-app-icon.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The End of Round 2 of 100 Days To Offload Challenge</title><link href="https://www.adamsdesk.com/posts/end-round-2-100-days-to-offload/" rel="alternate" type="text/html" title="The End of Round 2 of 100 Days To Offload Challenge" /><published>2023-01-25T21:44:00-06:00</published><updated>2023-01-26T22:12:38-06:00</updated><id>https://www.adamsdesk.com/posts/end-round-2-100-days-to-offload</id><content type="html" xml:base="https://www.adamsdesk.com/posts/end-round-2-100-days-to-offload/"><![CDATA[<p>I started round two of 100 Days To Offload challenge on January 14, 2022 and was determined to complete the challenge of
writing 100 blog posts on my website during a year period. However, good intention don’t always end as we may hope for.</p>

<h2 id="reflection">Reflection</h2>

<p>I’ve learned a lot through this challenge of issues, one of which is vital is tracking ones progress in order to
complete a goal. Second I need to start organizing my life better, so I have the time to do the things that matter
most to me. As well, I need to use the tools that help manage tasks and blog post ideas in order to complete them.
Third, I really need to start to open up more and allow myself to have short posts. None of them have to be perfect. I’m
not entirely sure how I will accomplish the third one as of writing this post.</p>

<p>I created a simple script that I talked about in <a href="/posts/tracking-100-days-to-offload/">Tracking 100 Days To Offload</a>
that keeps track of my goal for the challenge. As well as use a proper tag line at the bottom of each post to show
my participation and post count out of 100.</p>

<p>To help with task management I will be using <a href="https://taskwarrior.org/">Taskwarrior</a> and
<a href="https://timewarrior.net/">Timewarrior</a>. They are simple yet powerful tools that I’ve found so far priceless in getting
things on track.</p>

<h2 id="challenge-results">Challenge Results</h2>

<p>Round two ended on January 14, 2023, and unfortunately I did not successfully complete the challenge. I posted a total
of 86 posts within a year period. The majority of my posts where done when I was determined to finish this challenge
successfully on November 29, 2022 by posting a total of 44 posts within 44 days. This means that I was able to post more
within 44 days then I did the entire rest of the year. To me this shows that I’m more than capable of completing this
challenge.</p>

<p>Here is a list of all the posts I’ve written during the challenge, January 14, 2022 to January 14, 2023.</p>

<ul>
  <li><a href="/posts/create-social-media-buttons/">How to Create Social Media Share Buttons with Privacy</a></li>
  <li><a href="/posts/experimenting-jekyll-comments/">Experimenting with Jekyll Blog Comments</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-four/">Slice of Life Wallpaper: Part Four</a></li>
  <li><a href="/posts/change-default-linux-file-manager/">How to Change the Default Linux File Manager</a></li>
  <li><a href="/posts/manage-adlist-pi-hole-command-line/">How to Manage Pi-hole Adlists from The Command Line</a></li>
  <li><a href="/posts/get-public-ip-address-identme/">Get Your Public IP Address with Ident.me</a></li>
  <li><a href="/posts/user-domain-mastodon-discoverability/">Use Your Own Domain for Mastodon Discoverability</a></li>
  <li><a href="/posts/duckduckgo-bangs/">Improve Your DuckDuckGo Search Experience with Bangs</a></li>
  <li><a href="/posts/2022-fitness-review/">2022 Fitness Year End Review</a></li>
  <li><a href="/posts/clean-tags-categories-two/">Cleaning Up Post Tags and Categories: Part Two</a></li>
  <li><a href="/posts/rustdesk-not-connecting/">Resolve RustDesk Not Generating an ID or Making a Connection</a></li>
  <li><a href="/posts/duckduckgo-commandline/">How To Use DuckDuckGo From the Command Line</a></li>
  <li><a href="/posts/pacman-reverse-package-dependencies/">List Packages That Depend On Another Package with Pacman</a></li>
  <li><a href="/posts/little-bits-issue-2/">Little Bits: Issue #2</a></li>
  <li><a href="/posts/add-kramdown-attributes/">Add kramdown Attributes with Jekyll or Bridgetown</a></li>
  <li><a href="/posts/happy-new-year-2023/">Happy New Year 2023</a></li>
  <li><a href="/posts/essential-desktop-linux-applications/">Must Have Essential Applications For Desktop Linux</a></li>
  <li><a href="/posts/experimenting-jekyll-relatable-posts/">Experimenting with Jekyll Relatable Posts</a></li>
  <li><a href="/posts/list-mastodon-resources/">List of Helpful Mastodon Resources</a></li>
  <li><a href="/posts/joy-of-gaming/">The Joy of Gaming</a></li>
  <li><a href="/posts/slow-down/">Taking Time To Slow Down</a></li>
  <li><a href="/posts/seasonal-stress/">‘Tis The Season For Stress and Anxiety?</a></li>
  <li><a href="/posts/merry-christmas-2022/">Merry Christmas from Adamsdesk</a></li>
  <li><a href="/posts/automatic-copyright-year/">Add Copyright Year Automatically to any Website</a></li>
  <li><a href="/posts/little-bits-issue-1/">Little Bits: Issue #1</a></li>
  <li><a href="/posts/linux-markdown-viewers/">Markdown Viewers for the Linux Command Line</a></li>
  <li><a href="/posts/quality-products/">Are Quality Products a Thing of the Past?</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-three/">Slice of Life Wallpaper: Part Three</a></li>
  <li><a href="/posts/clean-tags-categories/">Cleaning Up Blog Tags and Categories</a></li>
  <li><a href="/posts/a-cyberspace-inquisition-6/">A Cyberspace Inquisition #6: The End</a></li>
  <li><a href="/posts/fork-gitea-to-forgejo/">Codeberg Forks Gitea to Forgejo</a></li>
  <li><a href="/posts/pulsar-project-text-editor/">Pulsar Project: A New Text Editor</a></li>
  <li><a href="/posts/mastodon-link-verification-gitea/">Add Mastodon Link Verification for Gitea</a></li>
  <li><a href="/posts/building-point-of-sale-system/">Building a Point of Sale System</a></li>
  <li><a href="/posts/inkscape-crop-image/">5 Easy Steps To Crop An Image in Inkscape</a></li>
  <li><a href="/posts/sudo-echo-permission-denied/">Why Does Sudo Echo Fail with Permission Denied?</a></li>
  <li><a href="/posts/tracking-100-days-to-offload/">Tracking 100 Days To Offload</a></li>
  <li><a href="/posts/linux-install-date/">How To Find The Linux Install Date</a></li>
  <li><a href="/posts/find-most-used-terminal-commands/">Find Your Most Frequently Used Terminal Commands</a></li>
  <li><a href="/posts/bash-countdown-christmas/">A Bash Countdown To Christmas</a></li>
  <li><a href="/posts/add-disk-drive-linux/">How to Add New Disk Drive to a Linux System</a></li>
  <li><a href="/posts/composer-php-platform/">Restrict PHP Version for Composer Packages</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-two/">Slice of Life Wallpaper: Part Two</a></li>
  <li><a href="/posts/space-cadet-pinball/">Space Cadet Pinball</a></li>
  <li><a href="/posts/send-email-symfony-mailer/">Send Email Messages Using Symfony Mailer</a></li>
  <li><a href="/posts/pair-device-logitech-unifying-receiver/">Pairing to a Logitech Unifying Receiver</a></li>
  <li><a href="/posts/confusing-mastodon-features/">Confusion In The Land of Mastodon Features</a></li>
  <li><a href="/posts/pikaur-type-error/">Pikaur System Update Returns TypeError</a></li>
  <li><a href="/posts/schedule-meetings/">Challenges of Scheduling Meetings</a></li>
  <li><a href="/posts/setting-up-mastodon-profile/">Setting Up a Mastodon Profile</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-one/">Slice of Life Wallpaper: Part One</a></li>
  <li><a href="/posts/geany-background-color-schemes/">Change Background Color In Geany</a></li>
  <li><a href="/posts/mkdocs-add-metadata/">Add Custom Metadata to MkDocs</a></li>
  <li><a href="/posts/remove-tracking-parameters/">Automatically Remove Tracking Parameters</a></li>
  <li><a href="/posts/admonitions-jekyll/">Adding Admonitions to Jekyll</a></li>
  <li><a href="/posts/tech-podcasts/">Tech Podcasts Recommendations</a></li>
  <li><a href="/posts/pi-hole-set-upstream-dns-servers/">Configure Pi-hole Upstream DNS Servers</a></li>
  <li><a href="/posts/inspiration-for-mental-health/">Inspiration for Mental Health</a></li>
  <li><a href="/posts/convert-address-book-contacts/">Converting Address Book Contacts from vCard</a></li>
  <li><a href="/posts/share-website-qrcode/">Share a Website Address Using a QR Code</a></li>
  <li><a href="/posts/gimp-batch-mode/">GIMP Image Processing Using Batch Mode</a></li>
  <li><a href="/posts/replacing-pen-ink-cartrdiges/">Replacing Pen Ink Cartridges</a></li>
  <li><a href="/posts/recover-prevent-depression/">How to Recover and Prevent Depression</a></li>
  <li><a href="/posts/thrifting-benefits/">The Benefits of Thrifting</a></li>
  <li><a href="/posts/print-raspberry-pi-paper-case/">Printable Paper Based Raspberry Pi Cases</a></li>
  <li><a href="/posts/keyboard-shortcuts-explained/">What are Keyboard Shortcuts?</a></li>
  <li><a href="/posts/atom-text-editor-project-ends/">Atom Text Editor Project Ends</a></li>
  <li><a href="/posts/export-youtube-subscriptions/">Rants of Exporting YouTube Subscriptions</a></li>
  <li><a href="/posts/building-the-mastodon-mascott/">Building The Mastodon Mascot</a></li>
  <li><a href="/posts/breathing-life-back-into-an-old-laptop/">Breathing Life Back Into An Old Laptop with Manjaro</a></li>
  <li><a href="/posts/canon-update-firmware-t7i/">Update Firmware On Canon EOS Rebel T7i DSLR</a></li>
  <li><a href="/posts/what-is-firmware-and-why-should-firmware-be-updated/">What is Firmware and Why Should Firmware Be Updated?</a></li>
  <li><a href="/posts/cancer-experience/">My Experience With Cancer</a></li>
  <li><a href="/posts/canadian-income-tax-software/">Canadian Income Tax Software</a></li>
  <li><a href="/posts/quick-reference-commands/">Quick Reference Commands</a></li>
  <li><a href="/posts/postman-open-source-alternatives/">Postman API Client Open Source Alternatives</a></li>
  <li><a href="/posts/view-webp-images/">How To View WebP Images</a></li>
  <li><a href="/posts/element-desktop-error-cannot-find-module/">Element Desktop Error: Cannot Find Module en-us.json</a></li>
  <li><a href="/posts/calibre-dark-theme/">How To Enable Dark Mode In Calibre</a></li>
  <li><a href="/posts/mozilla-working-with-facebook/">Mozilla Is Working With Facebook?</a></li>
  <li><a href="/posts/share-wifi-using-a-qr-code/">Share Wi-Fi Using A QR Code</a></li>
  <li><a href="/posts/how-to-upgrade-storage-capacity-on-a-raspberry-pi/">How To Upgrade Storage Capacity On A Raspberry Pi</a></li>
  <li><a href="/posts/one-step-closer-to-content-creation/">One Step Closer To Content Creation</a></li>
  <li><a href="/posts/movie-review-the-one-i-love/">Movie Review: The One I Love</a></li>
  <li><a href="/posts/inspiration-from-an-elder/">Inspiration from an Elder</a></li>
  <li><a href="/posts/100daystooffload-challenge/">What I’ve Learned from #100DaysToOffload Challenge</a></li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>I’ve continued to learn more about my self as a result of this challenge and that I am grateful for. I will continue to
push myself on improving and writing more. Ultimately if I keep focused on my goals with intention and use the necessary
tools to help manage it all I will succeed as I’ve shown myself in the post streak I had.</p>

<p>My life is quite busy and unfortunately that is not going to change for a while as I’ve made commitments that I need to
complete and then move on. With all this said, I will not be joining in the 100 Days to Offload challenge for round
three at this time. Once I have more free time available I will then. This will be a busy year, but I will succeed.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><summary type="html"><![CDATA[Uncover my thoughts of participating in 100 Days To Offload challenge by Kev Quirk and the results I had for round two.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/stained-glass-spiral.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/stained-glass-spiral.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Create Social Media Share Buttons with Privacy</title><link href="https://www.adamsdesk.com/posts/create-social-media-buttons/" rel="alternate" type="text/html" title="How to Create Social Media Share Buttons with Privacy" /><published>2023-01-11T11:59:00-06:00</published><updated>2023-01-25T19:54:50-06:00</updated><id>https://www.adamsdesk.com/posts/create-social-media-buttons</id><content type="html" xml:base="https://www.adamsdesk.com/posts/create-social-media-buttons/"><![CDATA[<p>We all love to share the things we enjoy, and it just makes it that much easier to do when a website provides convenient
social media share buttons. The unfortunate part for far too many years, these buttons have turned into something that
far more than just sharing. Once implemented into a website they start to track you even without the use of the buttons.
The level of tracking really depends on circumstance, and how the social media buttons were implemented. Instead of
getting into the nasty details lets just focus on how can we take as much control back, but still have the capability
of allowing someone to share a website link from your own website to various social media platforms.</p>

<h2 id="social-media-buttons">Social Media Buttons</h2>

<p>We cannot stop tracking entirely, but we can try to help protect your website visitors by following some key rules when
it comes to integrating social media buttons into your own website.</p>

<ul>
  <li>Do not use plugins</li>
  <li>Do not use add-ons</li>
  <li>Do not use social media button generators</li>
  <li>Do not use remote icons/images</li>
  <li>Do not use remote JavaScript</li>
  <li>Do not use themes with social media buttons built in</li>
  <li>Use only HTML and CSS</li>
  <li>Use local social media icons/images</li>
  <li>Use JavaScript only for copy to clipboard</li>
</ul>

<p>Of course there are exceptions to what I’ve listed above. Some plugins, add-ons, etc. may be genuine, and purely do what
they are intended to do and nothing more. All I’m trying to say is keeping things simple is key by not over complicating
the feature. I would go farther and say to use only pure/vanilla JavaScript, meaning without libraries or frameworks.</p>

<h2 id="how-do-the-share-buttons-work">How Do The Share Buttons Work?</h2>

<p>What I’m doing to add this feature to my own website is nothing groundbreaking. It just uses the links each social
media platform provides in order to share content. Each link will be crafted to contain the following information, though
keep in mind the tags are not always possible.</p>

<ul>
  <li>Website link</li>
  <li>Website link title</li>
  <li>Website link tags</li>
</ul>

<h2 id="how-to-create-share-buttons">How to Create Share Buttons</h2>

<p>This feature can be added to any website as long as the logic and information is provided to build the links as shown. An
example of this could be converting the Liquid template language code to PHP. The key is to at least use the HTML code
provided below when building your own social media share buttons. Let’s get started.</p>

<p>The following code is a Jekyll include file called “share.html”. The first line loads another include file called
“tags_to_csv.html”. See just below the first code block for further explanation. Add a include to load the
“share.html” file to where ever you wish for the share buttons to appear.</p>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code"><pre>{% include tags_to_csv.html %}

<span class="nt">&lt;div&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"fw-bold mb-2"</span><span class="nt">&gt;</span>Share<span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">"nav social-list social-list-hover nav-pills"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://www.facebook.com/sharer/sharer.php?u={{site.url}}{{page.url}}&amp;t={{page.title | url_encode}}"</span> <span class="na">title=</span><span class="s">"Share on Facebook"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Facebook"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-facebook"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://twitter.com/intent/tweet?text={{page.title | url_encode}}&amp;url={{site.url}}{{page.url}}&amp;hashtags={{tagscsv}}"</span> <span class="na">title=</span><span class="s">"Share on Twitter"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Twitter"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-twitter"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://www.reddit.com/submit?title={{page.title | url_encode}}&amp;url={{site.url}}{{page.url}}"</span> <span class="na">title=</span><span class="s">"Share on Reddit"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Reddit"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-reddit"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://pinterest.com/pin/create/button/?url={{site.url}}{{page.url}}&amp;description={{page.title | url_encode}}&amp;media={{site.url}}/img/posts/{{page.img}}"</span> <span class="na">title=</span><span class="s">"Share on Pinterest"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Pinterest"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-pinterest"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://www.tumblr.com/share/link?url={{site.url}}{{page.url}}&amp;name={{page.title | url_encode}}&amp;description={{page.excerpt | strip_html | url_encode}}"</span> <span class="na">title=</span><span class="s">"Share on Tumblr"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Tumblr"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-tumblr"</span><span class="nt">&gt;&lt;/span&gt;</span>
        	<span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://www.linkedin.com/shareArticle?mini=true&amp;url={{site.url}}{{page.url}}"</span> <span class="na">title=</span><span class="s">"Share on LinkedIn"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on LinkedIn"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-linkedin"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://api.whatsapp.com/send?text={{page.title | url_encode}}&amp;nbsp;{{site.url}}{{page.url}}"</span> <span class="na">title=</span><span class="s">"Share on WhatsApp"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on WhatsApp"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-whatsapp"</span><span class="nt">&gt;&lt;/span&gt;</span>
        	<span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://telegram.me/share/url?url={{site.url}}{{page.url}}&amp;text={{page.title | url_encode}}"</span> <span class="na">title=</span><span class="s">"Share on Telegram"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share on Telegram"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-telegram"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"mailto:?subject={{page.title}}&amp;body={{site.url}}{{page.url}}"</span> <span class="na">title=</span><span class="s">"Share via email "</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Share via email"</span> <span class="na">class=</span><span class="s">"nav-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-email"</span><span class="nt">&gt;&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
        <span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"nav-item"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"{{site.url}}{{page.url}}"</span> <span class="na">title=</span><span class="s">"Copy link"</span> <span class="na">rel=</span><span class="s">"external noreferrer noopener"</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">aria-label=</span><span class="s">"Copy share link"</span> <span class="na">class=</span><span class="s">"nav-link"</span> <span class="na">data-clipboard-text=</span><span class="s">"{{site.url}}{{page.url}}"</span> <span class="na">id=</span><span class="s">"copy-site-link"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">aria-hidden=</span><span class="s">"true"</span> <span class="na">class=</span><span class="s">"icon icon-link"</span><span class="nt">&gt;&lt;/span&gt;</span>
        	<span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/li&gt;</span>
    <span class="nt">&lt;/ul&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<p>This is the “tags_to_csv.html”, it’s entire job is to convert a post’s hashtags to a comma delimited string (e.g.
100DaysToOffload,webdev,privacy).</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">tags</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span><span class="nv">tag</span><span class="w"> </span><span class="nt">in</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">tags</span><span class="w"> </span><span class="cp">%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nb">forloop.first</span><span class="w"> </span><span class="cp">%}</span>
            <span class="cp">{%</span><span class="w"> </span><span class="nt">capture</span><span class="w"> </span><span class="nv">tagscsv</span><span class="w"> </span><span class="cp">%}{{</span><span class="w"> </span><span class="nv">tagscsv</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nv">tag</span><span class="w"> </span><span class="cp">}}{%</span><span class="w"> </span><span class="nt">endcapture</span><span class="w"> </span><span class="cp">%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">else</span><span class="w"> </span><span class="cp">%}</span>
            <span class="cp">{%</span><span class="w"> </span><span class="nt">capture</span><span class="w"> </span><span class="nv">tagscsv</span><span class="w"> </span><span class="cp">%}{{</span><span class="w"> </span><span class="nv">tagscsv</span><span class="w"> </span><span class="cp">}}</span>,<span class="cp">{{</span><span class="w"> </span><span class="nv">tag</span><span class="w"> </span><span class="cp">}}{%</span><span class="w"> </span><span class="nt">endcapture</span><span class="w"> </span><span class="cp">%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

<p>To style and apply the icons I used Syntactically Awesome Style sheets (SASS), to help reduce the amount of Cascading
Style Sheets (CSS) lines that I had to write.</p>

<figure class="highlight"><code class="language-sass" data-lang="sass"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code"><pre><span class="nv">$icons</span><span class="p">:</span>
    <span class="c1">//name, filename, width (rem), height (rem), background color (hover)</span>
    <span class="o">(</span><span class="s1">'email'</span><span class="o">,</span> <span class="s1">'envelope-solid.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'facebook'</span><span class="o">,</span> <span class="s1">'facebook-f-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'link'</span><span class="o">,</span> <span class="s1">'link-solid.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'linkedin'</span><span class="o">,</span> <span class="s1">'linkedin-in-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#1d9bf0'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'pinterest'</span><span class="o">,</span> <span class="s1">'pinterest-p-brands.svg'</span><span class="o">,</span> <span class="nt">1</span><span class="nc">.4</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'reddit'</span><span class="o">,</span> <span class="s1">'reddit-alien-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ff4500'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'telegram'</span><span class="o">,</span> <span class="s1">'telegram-plane-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'tumblr'</span><span class="o">,</span> <span class="s1">'tumblr-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#ddd'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'twitter'</span><span class="o">,</span> <span class="s1">'twitter-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#1d9bf0'</span><span class="o">)</span>
    <span class="o">(</span><span class="s1">'whatsapp'</span><span class="o">,</span> <span class="s1">'whatsapp-brands.svg'</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="nt">2</span><span class="o">,</span> <span class="s1">'#00e676'</span><span class="o">)</span>
<span class="o">;</span>

<span class="nc">.icon</span> <span class="err">{</span>
    <span class="nl">width</span><span class="p">:</span> <span class="mi">.875rem</span><span class="err">;</span>
    <span class="nl">height</span><span class="p">:</span> <span class="m">1rem</span><span class="err">;</span>
    <span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="err">;</span>
    <span class="nl">content</span><span class="p">:</span> <span class="s1">''</span><span class="err">;</span>
    <span class="na">-webkit-mask-size</span><span class="p">:</span> <span class="n">cover</span><span class="err">;</span>
    <span class="na">mask-size</span><span class="p">:</span> <span class="n">cover</span><span class="err">;</span>
    <span class="nl">background-color</span><span class="p">:</span> <span class="mh">#808080</span><span class="err">;</span>
    <span class="nl">vertical-align</span><span class="p">:</span> <span class="nb">text-bottom</span><span class="err">;</span>
<span class="err">}</span>
<span class="k">@each</span> <span class="nv">$name</span><span class="o">,</span> <span class="nv">$filename</span><span class="o">,</span> <span class="nv">$width</span><span class="o">,</span> <span class="nv">$height</span><span class="o">,</span> <span class="nv">$color</span> <span class="n">in</span> <span class="nv">$icons</span> <span class="err">{</span>
    <span class="nc">.icon-</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="err">{</span>
        <span class="na">-webkit-mask</span><span class="p">:</span> <span class="sx">url("/assets/img/icons/</span><span class="si">#{</span><span class="nv">$filename</span><span class="si">}</span><span class="sx">")</span> <span class="nb">no-repeat</span> <span class="m">50%</span> <span class="m">50%</span><span class="err">;</span>
        <span class="nl">mask</span><span class="p">:</span> <span class="sx">url("/assets/img/icons/</span><span class="si">#{</span><span class="nv">$filename</span><span class="si">}</span><span class="sx">")</span> <span class="nb">no-repeat</span> <span class="m">50%</span> <span class="m">50%</span><span class="err">;</span>
        <span class="k">@if</span> <span class="nv">$width</span> <span class="err">{</span>
            <span class="nl">width</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$width</span><span class="si">}</span><span class="n">rem</span><span class="err">;</span>
        <span class="err">}</span>
        <span class="k">@if</span> <span class="nv">$height</span> <span class="err">{</span>
            <span class="nl">height</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$height</span><span class="si">}</span><span class="n">rem</span><span class="err">;</span>
        <span class="err">}</span>
    <span class="err">}</span>
    <span class="k">@if</span> <span class="nv">$color</span> <span class="err">{</span>
        <span class="nc">.social-list</span> <span class="nt">a</span><span class="nd">:active</span> <span class="nc">.icon-</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span><span class="o">,</span>
        <span class="nc">.social-list</span> <span class="nt">a</span><span class="nd">:focus</span> <span class="nc">.icon-</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span><span class="o">,</span>
        <span class="nc">.social-list</span> <span class="nt">a</span><span class="nd">:hover</span> <span class="nc">.icon-</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="err">{</span>
            <span class="nl">background-color</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$color</span><span class="si">}</span><span class="err">;</span>
        <span class="err">}</span>
    <span class="err">}</span>
<span class="err">}</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="copy-to-clipboard">Copy to Clipboard</h2>

<p>I’ve opted to also add copy to clipboard in my share buttons. This may not be for everyone, though you would be
surprised how many are not even aware how to do this. Either way for those that are interested I chose to use a local
copy of <a href="https://clipboardjs.com/">clipboard.js</a>, a long with some initialization code below.</p>

<p>The JavaScript code creates an event to listen for a click that has an element with an attribute ID of “copy-site-link”.
When the link is copied successfully a tool tip will appear with a message of “Copied link”, and then disappear.
Otherwise, an error message of “Failed to copy link” will appear as the tool tip.</p>

<figure class="highlight"><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre><span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">DOMContentLoaded</span><span class="dl">'</span><span class="p">,</span> <span class="nf">function </span><span class="p">()</span> <span class="p">{</span>
    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="nf">function </span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nf">matches</span><span class="p">(</span><span class="dl">"</span><span class="s2">[id$='copy-site-link']</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
            <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>
            <span class="kd">var</span> <span class="nx">clipboard</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ClipboardJS</span><span class="p">(</span><span class="dl">'</span><span class="s1">#copy-site-link</span><span class="dl">'</span><span class="p">);</span>
            <span class="nx">clipboard</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">success</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">let</span> <span class="nx">trigger_click</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">trigger</span><span class="p">;</span>
                <span class="nx">trigger_click</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Copied link</span><span class="dl">'</span><span class="p">);</span>
                <span class="kd">let</span> <span class="nx">tooltip</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">bootstrap</span><span class="p">.</span><span class="nc">Tooltip</span><span class="p">(</span><span class="nx">trigger_click</span><span class="p">,</span> <span class="p">{</span> <span class="na">trigger</span><span class="p">:</span> <span class="dl">'</span><span class="s1">manual</span><span class="dl">'</span> <span class="p">});</span>
                <span class="nx">tooltip</span><span class="p">.</span><span class="nf">show</span><span class="p">();</span>
                <span class="nf">hideTooltip</span><span class="p">(</span><span class="nx">tooltip</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
                <span class="nx">trigger_click</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Copy link</span><span class="dl">'</span><span class="p">);</span>
            <span class="p">});</span>
            <span class="nx">clipboard</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">'</span><span class="s1">error</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">let</span> <span class="nx">trigger_click</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">trigger</span><span class="p">;</span>
                <span class="nx">trigger_click</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Failed to copy link</span><span class="dl">'</span><span class="p">);</span>
                <span class="kd">let</span> <span class="nx">tooltip</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">bootstrap</span><span class="p">.</span><span class="nc">Tooltip</span><span class="p">(</span><span class="nx">trigger_click</span><span class="p">,</span> <span class="p">{</span> <span class="na">trigger</span><span class="p">:</span> <span class="dl">'</span><span class="s1">manual</span><span class="dl">'</span> <span class="p">});</span>
                <span class="nx">tooltip</span><span class="p">.</span><span class="nf">show</span><span class="p">();</span>
                <span class="nf">hideTooltip</span><span class="p">(</span><span class="nx">tooltip</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
                <span class="nx">trigger_click</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Copy link</span><span class="dl">'</span><span class="p">);</span>
            <span class="p">});</span>
        <span class="p">}</span>
    <span class="p">});</span>
<span class="p">});</span>

<span class="kd">function</span> <span class="nf">hideTooltip</span><span class="p">(</span><span class="nx">element</span><span class="p">,</span> <span class="nx">delay</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
        <span class="nx">element</span><span class="p">.</span><span class="nf">hide</span><span class="p">();</span>
    <span class="p">},</span> <span class="nx">delay</span><span class="p">);</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></figure>

<p>Now to load the JavaScript code, add the following in the exact order as shown to you the desired layout page.</p>

<figure class="highlight"><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
</pre></td><td class="code"><pre><span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="dl">"</span><span class="s2">/assets/js/clipboard.min.js</span><span class="dl">"</span><span class="o">&gt;&lt;</span><span class="sr">/script</span><span class="err">&gt;
</span><span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="dl">"</span><span class="s2">/assets/js/clipboard-init.js</span><span class="dl">"</span><span class="o">&gt;&lt;</span><span class="sr">/script&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="where-do-i-get-icons">Where Do I Get Icons?</h2>

<p>I would recommend using <a href="https://www.svgrepo.com/">SVG Repo</a>, or <a href="https://fontawesome.com/icons">Font Awesome Free</a>.</p>

<p>This is post 86 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="webdev" /><category term="privacy" /><summary type="html"><![CDATA[Learn to create your own share buttons for social media, email, and more using HTML, CSS, and a little JavaScript for a website with privacy in mind.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/website-share-buttons.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/website-share-buttons.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Slice of Life Wallpaper: Part Four</title><link href="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-four/" rel="alternate" type="text/html" title="Slice of Life Wallpaper: Part Four" /><published>2023-01-10T19:05:00-06:00</published><updated>2023-01-11T00:03:17-06:00</updated><id>https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-four</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-four/"><![CDATA[<p>Having wallpaper that embodies positive energy can feel as if that energy pours out and in to you. Some have viewed the
energy as the artwork speaking to you. One piece that stands out to me by Rachel Bradley entitled “Like No One’s
Watching”. The woman is just going about her household chores cleaning and then just starts singing with passion along
to the song she is listening too. It’s the spontaneous and happy energy that I like. Hopefully a few that I’ve selected this
round will speak to you and spark positivity or inspiration in your life.</p>

<h2 id="wallpapers">Wallpapers</h2>

<p class="mb-4">Please remember to respect the artists of each one of these art wallpapers and consider giving thanks to at least one
of the artists.</p>

<figure class="text-center">
    <a href="https://www.reddit.com/r/unixporn/comments/yejmzq/qtile_gruvbox_victoria_3/">
        <img src="/assets/img/posts/wallpaper-victoria-3-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A girl sitting at a desk writing by a window with a cat sitting on the window sill. Victoria illustration." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/unixporn/comments/yejmzq/qtile_gruvbox_victoria_3/" title="View source">
            Victoria 3 (7680 x 4320 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/681lYw">
        <img src="/assets/img/posts/wallpaper-like-no-ones-watching-rachel-bradley-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Bedroom scene with light seeping through the blinds as a woman sings into a spray bottle with passion." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/681lYw" title="View source">
            Like No One's Watching by Rachel Bradley (2000 x 3000 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/v2lDw6">
        <img src="/assets/img/posts/wallpaper-slice-of-life-husef-artigas-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Two boys sleeping in a boat floating on clear blue water. The water has a tree casting a shadow with a sea lion come up to the surface." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/v2lDw6" title="View source">
            Slice of Life by Husef Artigas (1920 x 1280 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/L35DqA">
        <img src="/assets/img/posts/wallpaper-park-josie-king-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="On looking into park with the sunlight come through the tall tress that is casting shadows on to the ground." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/L35DqA" title="View source">
            Park (environment studies #1) by Josie King (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/lxqw5a">
        <img src="/assets/img/posts/wallpaper-tea-break-josie-king-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A parked train with a man off to the side sitting on an electrical box surrounded by trees, grass and flowers as he drinks his tea." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/lxqw5a" title="View source">
            Tea Break By Josie King (1917 x 1029)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/9qqOR">
        <img src="/assets/img/posts/wallpaper-pottery-shop-justin-conway-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Large merchant shop with various pottery on display. Woman stands of to the side while the potter stands with arms crossed looking down at broken pot." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/9qqOR" title="View source">
            The Pottery Shop by Justin Conway (3840 x 2161 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/rQ1wm">
        <img src="/assets/img/posts/wallpaper-walk-your-lizards-justin-conway-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A person out walking her lizard down the sidewalk beside a large concrete building with tress and plants framing the scene." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/rQ1wm" title="View source">
            Walk Your Lizards by Justin Conway (3840 x 2325 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/8o7ov2">
        <img src="/assets/img/posts/wallpaper-lofi-girl-juan-pablo-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A girl sitting at a desk wearing headphones painting by a window with cat sitting on the window sill." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/8o7ov2" title="View source">
            Lofi Girl by Juan Pablo Machado (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/d85zGX">
        <img src="/assets/img/posts/wallpaper-birdbath-claire-lin-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="One bird sits on the edge of a basin of water while the other bird vigorously baths." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/d85zGX" title="View source">
            Birdbath by Claire Lin (1920 x 1920 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.deviantart.com/shilin/art/Start-With-Love-840203794">
        <img src="/assets/img/posts/wallpaper-start-with-love-shilin-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Woman in a kitchen with food laid out to eat, tablet is set up as if a person is sitting at the table with her." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.deviantart.com/shilin/art/Start-With-Love-840203794" title="View source">
            Start With Love by Shilin (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.deviantart.com/cowltori/art/Slice-of-Life-810123254">
        <img src="/assets/img/posts/wallpaper-slice-of-life-cowltori-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Two people sitting on a bench talking in the park surrounded by grenery." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.deviantart.com/cowltori/art/Slice-of-Life-810123254" title="View source">
            Slice of Life by cowltori (2560 x 1440 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zoj98p/napping_by_%E3%81%A4%E3%81%98%E3%81%93_tsujin_bohboh/">
        <img src="/assets/img/posts/wallpaper-napping-tsujin-bohboh-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Asian home with warm sunlight coming from the kitchen into another room were a woman sleeps on the floor next to manga books and a Nintendo DS." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/zoj98p/napping_by_%E3%81%A4%E3%81%98%E3%81%93_tsujin_bohboh/" title="View source">
            Napping by つじこ (2893 x 4100  px)
        </a>
    </figcaption>
</figure>

<p>This is post 84 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="100DaysToOffload" /><category term="artwork" /><summary type="html"><![CDATA[Find the energy of inspiration, positivity or relaxation in this round of curated high resolution wallpapers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-four.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-four.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Experimenting with Jekyll Blog Comments</title><link href="https://www.adamsdesk.com/posts/experimenting-jekyll-comments/" rel="alternate" type="text/html" title="Experimenting with Jekyll Blog Comments" /><published>2023-01-10T00:00:00-06:00</published><updated>2023-07-30T12:09:40-06:00</updated><id>https://www.adamsdesk.com/posts/experimenting-jekyll-comments</id><content type="html" xml:base="https://www.adamsdesk.com/posts/experimenting-jekyll-comments/"><![CDATA[<p>The whole point of the content I post is to show a community how wonderful technology is, and how open source is the
future as it embodies community. I want to encourage engagement, as we all learn and discover new things in the wonderful
world of tech. One such way to create engagement is to allow for comments on the posts I make. Though based on the
current times, and my experience long ago dealing with having a comment system I dread to ever have it again. It usually
becomes a task that consumes far too much time as you battle against spam, inappropriate comments, and comments that have
nothing to do with the post itself. Another solution is using a general contact form, though this is not always an ideal
solution. So I took the web, and read a few posts to help finally make my decision at least for now.</p>

<h2 id="discovery">Discovery</h2>

<p>I’ve spent some time reading Kev Quirk’s and Joel’s posts on the subject of comments just to try and make myself more
informed of the current times. Sounds to me things are still not great in this area. For those that are interested here
are the articles that I read.</p>

<ul>
  <li><a href="https://www.joelchrono12.xyz/blog/how-to-add-mastodon-comments-to-jekyll-blog/">How to add comments to Jekyll blog (2022)</a> by Joel</li>
  <li><a href="https://www.joelchrono12.xyz/blog/sharing-my-blogs-to-the-fediverse-automatically/">Sharing my blogs to the Fediverse automatically</a> by Joel</li>
  <li><a href="https://kevquirk.com/ban-the-spam/">Ban the Spam!</a> by Kev Quirk</li>
  <li><a href="https://kevquirk.com/commento-the-privacy-respecting-commenting-system/">Commento – The Privacy Respecting Commenting System</a> by Kev Quirk</li>
</ul>

<h2 id="contact-form">Contact Form</h2>

<p>Previously I was pretty much decided on only using a contact page with a form that sends the message via email to me.
However, some folks on Mastodon has pointed out that this is not always ideal due to it takes away freedom of choice,
and how can one trust a form due to so much widespread abuse. All valid points.</p>

<p>I have decided to keep the contact form. However, I will eventually add an email address, so the form can be avoided if
desired along with my GPG public key, so one has the choice of secure communication. I’ve already added social media
links for another means of communication.</p>

<h2 id="comments">Comments</h2>

<p>I strongly feel it is still best to not have a comment system as I don’t want more work, nor do I want to have to add
more code to my website then necessary. Furthermore, I’ve chosen long ago to keep JavaScript to a minimum. Keeping
things simple always seems to be the best policy. No one wants to view and use a website that is slow, and bloated with
nonsense.</p>

<p>I like the idea of having a reply via email, and a view Mastodon comments buttons on each post. This provides a
convenient way to contact me, and right at the spot where someone would be thinking about sending a comment. I will
have to experiment with this idea, and see how my results go.</p>

<h2 id="implementing-comments">Implementing Comments</h2>

<p>I added a new Jekyll config (_config.yml) value called <code class="language-plaintext highlighter-rouge">comments_email</code>, that will store the comments email address. The
email address I’m using is just an alias. This allows for me to delete the address at any time I want, and quickly change
to another address. I thought this was a smart idea that Kev came up with, and honestly I’ve been doing this for email
addresses I give out to the public to avoid hassle down the line for many years now.</p>

<p>Each post will now have a new front matter property called <code class="language-plaintext highlighter-rouge">comments_id</code> which was a great idea by Joel. Once I have
the post online I will make post on Mastodon, and take the copy the link to get the identifier. Do a quick post update
with the ID, and should be good to go. I will definitely have to look at a later time about automating this task to
avoid mistakes, and make the process more convenient.</p>

<p>Here is an example of the code I wrote in my post layouts file that creates the comment buttons.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"card-footer"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"fw-bold mb-2"</span><span class="nt">&gt;</span>Comments<span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"ms-3"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">"btn btn-primary-light fw-bold"</span> <span class="na">href=</span><span class="s">"mailto:{{ site.comments_email }}?subject=Re: {{ page.title }}"</span> <span class="na">role=</span><span class="s">"button"</span><span class="nt">&gt;</span>Reply via email<span class="nt">&lt;/a&gt;</span>
    {% if page.comments_id %}
        <span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">"btn btn-primary-light"</span> <span class="na">href=</span><span class="s">"https://{{ site.mastodon.instance }}/@{{ site.mastodon.username }}/{{ page.comments_id }}"</span> <span class="na">role=</span><span class="s">"button"</span><span class="nt">&gt;</span>View Mastodon comments<span class="nt">&lt;/a&gt;</span>
    {% endif %}
    <span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</code></pre></div></div>

<h2 id="conclusion">Conclusion</h2>

<p>I honestly do not know how this will all go, and I guess time will tell if this works well or not. If by chance it
doesn’t I will have to revisit this, though as of right now I have no idea what I would do differently. Thanks to Kev
Qurik, and Joel for their insightful posts.</p>

<p>This is post 85 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="jekyll" /><summary type="html"><![CDATA[Come with me on a journey of discovery and inquisition on finding a solution of how to add comments to blog posts when using Jekyll.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/stack-of-letters.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/stack-of-letters.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Change the Default Linux File Manager</title><link href="https://www.adamsdesk.com/posts/change-default-linux-file-manager/" rel="alternate" type="text/html" title="How to Change the Default Linux File Manager" /><published>2023-01-09T00:00:00-06:00</published><updated>2023-08-04T13:15:44-06:00</updated><id>https://www.adamsdesk.com/posts/change-default-linux-file-manager</id><content type="html" xml:base="https://www.adamsdesk.com/posts/change-default-linux-file-manager/"><![CDATA[<p>It is a given that not all Linux users want to use the same file manager, and wish to change the default file manager.
Other users however may be content with their file manager, but are experiencing the issue of directories are not
opening in the desired file manager. In either case, these situations can be easily remedied. First let’s begin
explaining a few things, before we change the default manager.</p>

<h2 id="file-association">File Association</h2>

<p>An application is associated to files or content by using what is called MIME type or also known as a media type. When
an application is installed MIME types are set automatically, and updated when a software update is applied. Think of it
like map that gives the system directions on what program opens a particular file. In the case of file manager the
MIME type is called “inode/directory”. Any application set as default that is associated to this MIME type, and will be
opened as the file manager even if the application itself is not actually a file manager. Such applications that are
known to be set as the file manager can be <a href="https://audacious-media-player.org/">Audacious</a>,
<a href="https://github.com/VSCodium/vscodium">VSCodium</a>, <a href="https://sw.kovidgoyal.net/kitty/">Kitty</a>, etc.</p>

<h2 id="what-is-a-desktop-entry-file">What is a Desktop Entry File?</h2>

<p>A way to integrate an application into menus of a Linux desktop environment that follow the standard XDG Desktop Menu
specification. Think of these files like a shortcut providing all the information needed to work seamlessly.</p>

<h2 id="find-the-default-file-manager">Find The Default File Manager</h2>

<p>To determine the default file manager run the following command.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>xdg-mime query default inode/directory
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">codium.desktop
</span></code></pre></div></div>

<h2 id="change-the-default-file-manager">Change The Default File Manager</h2>

<p>In order to change the default manager you have to know what the desktop entry file name is called. Desktop entry files
are typically stored at a couple location on a Linux system, “~/.local/share/applications/” for user-specific
applications, and “/usr/share/applications/” or “/usr/local/share/applications/” for applications installed system-wide.
Try locating the application name by browsing each of those directories listed or searching by using the <code class="language-plaintext highlighter-rouge">find</code> command.</p>

<p>Here is an example of a search for GNOME Files (nautilus) within the directory “/usr/share/applications/”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>find /usr/share/applications/ <span class="nt">-iname</span> <span class="s2">"*nautilus*"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">/usr/share/applications/nautilus-autorun-software.desktop
/usr/share/applications/org.gnome.Nautilus.desktop
</span></code></pre></div></div>

<p>The below command example will set GNOME Files (nautilus) as the default file manager.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>xdg-mime default org.gnome.Nautilus.desktop inode/directory
</code></pre></div></div>

<p>To verify if the change worked, you can run the following command.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>xdg-mime query default inode/directory
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">org.gnome.Nautilus.desktop
</span></code></pre></div></div>

<h2 id="more-examples">More Examples</h2>

<p>Here are some more examples of other file managers, and how to change them to be the default.</p>

<ul>
  <li>
    <p>Dolphin</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default org.kde.dolphin.desktop inode/directory
</code></pre></div>    </div>
  </li>
  <li>
    <p>Double Commander</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default doublecmd.desktop inode/directory
</code></pre></div>    </div>
  </li>
  <li>
    <p>Gnome Commander</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default org.gnome.gnome-commander.desktop inode/directory
</code></pre></div>    </div>
  </li>
  <li>
    <p>Krusader</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default org.kde.krusader.desktop inode/directory
</code></pre></div>    </div>
  </li>
  <li>
    <p>nnn</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default nnn.desktop inode/directory
</code></pre></div>    </div>
  </li>
  <li>
    <p>Thunar</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>xdg-mime default thunar.desktop inode/directory
</code></pre></div>    </div>
  </li>
</ul>

<p>This is post 83 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="commandline" /><summary type="html"><![CDATA[A detailed guide on how to change which application is used as the Linux desktop default file manager for directories or folders.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/file-archives.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/file-archives.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Manage Pi-hole Adlists from The Command Line</title><link href="https://www.adamsdesk.com/posts/manage-adlist-pi-hole-command-line/" rel="alternate" type="text/html" title="How to Manage Pi-hole Adlists from The Command Line" /><published>2023-01-08T18:06:00-06:00</published><updated>2023-01-23T17:36:41-06:00</updated><id>https://www.adamsdesk.com/posts/manage-adlist-pi-hole-command-line</id><content type="html" xml:base="https://www.adamsdesk.com/posts/manage-adlist-pi-hole-command-line/"><![CDATA[<p>Ever since I started using <a href="https://pi-hole.net/">Pi Hole</a> I’ve found it quite frustrating that I’m not able to add,
remove or modify the adlist from the command line. It doesn’t make sense to me considering I can do everything else I’ve
ever need to do entirely from the command line. I have a pretty good idea how I could achieve this, I just haven’t tried
to test it out until now.</p>

<h2 id="pi-holes-database">Pi-hole’s Database</h2>

<p>Adding, removing, and modifying the adlist records are done using Structured Query Language (SQL) against Pi-hole’s
SQLite database. In order to add an adlist we have to connect to Pi-hole’s SQLite database, so you must
know where the database is stored on the file system. In my particular case Pi-hole has been installed, and configured
following the knowledge base article
<a href="https://kb.adamsdesk.com/operating_system/arch_linux_arm_install_rpi_pi_hole/">Arch Linux ARM Install Pi-Hole On A Raspberry Pi</a>,
and therefore the database is located on the system at “/etc/pihole/gravity.db”.</p>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        The instructions outlined below are done at your own risk. Damage to the Pi-hole database may occur if not done correctly.
    </p>
</div>

<h2 id="add-an-adlist">Add an Adlist</h2>

<p>The command examples below will add an adlist by inserting a new record into the database, and then applying the changes.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>sqlite3 /etc/pihole/gravity.db <span class="s2">"INSERT INTO adlist (address, enabled, comment) VALUES ('https://www.example.com/hosts/lists/hosts.txt', 1, 'Example Block List');"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pihole <span class="nt">-g</span>
</code></pre></div></div>

<h2 id="modify-an-adlist">Modify an Adlist</h2>

<p>First we have to query for the adlist record “id” (12) that we want to change, run an update statement, and then apply the changes.
In the example shown below, the adlist record will be disabled.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>sqlite3 /etc/pihole/gravity.db <span class="s2">"SELECT id, address, comment FROM adlist"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">...
</span><span class="go">12|https://www.example.com/hosts/lists/hosts.txt|Example Block List
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>sqlite3 /etc/pihole/gravity.db <span class="s2">"UPDATE adlist SET enabled=0 WHERE id=12"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pihole <span class="nt">-g</span>
</code></pre></div></div>

<h2 id="remove-an-adlist">Remove An Adlist</h2>

<p>To delete an adlist record we must get the adlist record “id” (12), then delete the record, and apply the changes.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>sqlite3 /etc/pihole/gravity.db <span class="s2">"SELECT id, address, comment FROM adlist"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">...
</span><span class="go">12|https://www.example.com/hosts/lists/hosts.txt|Example Block List
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>sqlite3 /etc/pihole/gravity.db <span class="s2">"DELETE from adlist WHERE id=12"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pihole <span class="nt">-g</span>
</code></pre></div></div>

<p>This is post 82 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="pihole" /><category term="commandline" /><summary type="html"><![CDATA[Learn to manage the Pi-hole's adlists from the command line using SQL to add, modify, and delete SQLite database records.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pi-hole-manage-adlist-command-line.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pi-hole-manage-adlist-command-line.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Get Your Public IP Address with Ident.me</title><link href="https://www.adamsdesk.com/posts/get-public-ip-address-identme/" rel="alternate" type="text/html" title="Get Your Public IP Address with Ident.me" /><published>2023-01-07T00:00:00-06:00</published><updated>2023-07-29T16:09:18-06:00</updated><id>https://www.adamsdesk.com/posts/get-public-ip-address-identme</id><content type="html" xml:base="https://www.adamsdesk.com/posts/get-public-ip-address-identme/"><![CDATA[<p>More often than not I find having to get my public Internet protocol address, and I’m pretty sure I’m not the only one.
There are all kinds of services offering ways to show you your own public IP address. What most do not realize is that
the majority of such websites, make it more complicated than it needs, over load the web page with advertisements, and
distractions. Why not use something that is open source, simple to the point, and works in just about any application
of use required?</p>

<p>The service I’m suggesting is called Ident.me, and provides the service to fetch a public IP address for free by
<a href="https://github.com/sponsors/pcarrier">donations</a>. Requesting for a public IP address can be achieved using the
following protocols, HTTP(S), DNS, SSH, telnet(s), and STUN. The IP address is sent in plain text format or in json
format.</p>

<h2 id="get-public-ip-via-a-web-browser">Get Public IP via a Web Browser</h2>

<p>Using a web browser just simply visit one of the following web addresses. There’s nothing more to.</p>

<ul>
  <li><a href="https://ident.me/">ident.me</a></li>
  <li><a href="https://tnedi.me/">tnedi.me</a> (mirror site).</li>
</ul>

<p>If you want to get more specific you can request to get the public IP address in different formats, and even with
geolocation data.</p>

<ul>
  <li><a href="https://4.ident.me/">4.ident.me</a> (plain text IPv4 only)</li>
  <li><a href="https://6.ident.me/">6.ident.me/</a> (plain text IPv6 only)</li>
  <li><a href="https://ident.me/json">ident.me/</a> (JSON with geolocation information)</li>
</ul>

<h2 id="get-public-ip-via-command-line">Get Public IP via Command Line</h2>

<p>Here are simple one line command examples to request for your public IP address.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl https://ident.me/
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>dig +short @ident.me
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nc ident.me 23
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>openssl s_client <span class="nt">-quiet</span> <span class="nt">-connect</span> ident.me:992
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>wget <span class="nt">-qO-</span> https://ident.me/
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-q      Quite mode, turn off output
-O-     Display results to standard output
</span></code></pre></div></div>

<p>Make the JSON (JavaScript Object Notation) output format easier to read by using the <a href="https://stedolan.github.io/jq/">jq</a> command.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl https://ident.me/json | jq
</code></pre></div></div>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"ip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"10.10.0.1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"aso"</span><span class="p">:</span><span class="w"> </span><span class="s2">"MY-ISP"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"asn"</span><span class="p">:</span><span class="w"> </span><span class="s2">"27299"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"continent"</span><span class="p">:</span><span class="w"> </span><span class="s2">"NA"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"cc"</span><span class="p">:</span><span class="w"> </span><span class="s2">"CA"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"country"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Canada"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"city"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Example"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"postal"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
  </span><span class="nl">"latitude"</span><span class="p">:</span><span class="w"> </span><span class="s2">"45.4"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"longitude"</span><span class="p">:</span><span class="w"> </span><span class="s2">"-75.666667"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"tz"</span><span class="p">:</span><span class="w"> </span><span class="s2">"America/Example"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="get-public-ip-via-bash-script">Get Public IP via Bash Script</h2>

<p>The Bash script example below will attempt to fetch the public IP address using dig, curl, or wget.</p>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre><span class="c">#!/usr/bin/env bash</span>
<span class="nv">ip_host</span><span class="o">=</span><span class="s2">"ident.me"</span>
<span class="nb">timeout</span><span class="o">=</span>2

getPublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[</span> <span class="nt">-x</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">command</span> <span class="nt">-v</span> dig<span class="si">)</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">public_ip</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span>dig +timeout<span class="o">=</span><span class="nv">$timeout</span> +tries<span class="o">=</span>1 +short @<span class="nv">$ip_host</span><span class="si">)</span><span class="s2">"</span>
    <span class="k">elif</span> <span class="o">[</span> <span class="nt">-x</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">command</span> <span class="nt">-v</span> curl<span class="si">)</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">public_ip</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span>curl <span class="nt">-sL</span> <span class="nt">--max-time</span> <span class="nv">$timeout</span> <span class="nt">-w</span> <span class="s1">'\n'</span> https://<span class="nv">$ip_host</span><span class="si">)</span><span class="s2">"</span>
    <span class="k">elif</span> <span class="o">[</span> <span class="nt">-x</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">command</span> <span class="nt">-v</span> wget<span class="si">)</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">public_ip</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span>wget <span class="nt">-T</span> <span class="nv">$timeout</span> <span class="nt">-qO-</span> https://<span class="nv">$ip_host</span><span class="si">)</span><span class="s2">"</span>
    <span class="k">fi</span>
<span class="o">}</span>
run<span class="o">()</span> <span class="o">{</span>
    getPublicIP
    showPublicIP
<span class="o">}</span>
showPublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[</span> <span class="nt">-z</span> <span class="nv">$public_ip</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span><span class="nb">printf</span> <span class="s2">"%s"</span> <span class="s2">"dig, curl, and wget commands were not found. Unable to get public IP address."</span>
    <span class="k">else
        </span><span class="nb">printf</span> <span class="s2">"Public IP is %s"</span> <span class="s2">"</span><span class="nv">$public_ip</span><span class="s2">"</span>
    <span class="k">fi</span>
<span class="o">}</span>

run
</pre></td></tr></tbody></table></code></figure>

<p>This is post 81 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="BASH" /><category term="commandline" /><summary type="html"><![CDATA[Explore the potential of getting your public IP address using a service that is simple, fast, reliable, and without advertisements, and distractions.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/internet-public-ip.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/internet-public-ip.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Use Your Own Domain for Mastodon Discoverability</title><link href="https://www.adamsdesk.com/posts/user-domain-mastodon-discoverability/" rel="alternate" type="text/html" title="Use Your Own Domain for Mastodon Discoverability" /><published>2023-01-06T23:53:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/user-domain-mastodon-discoverability</id><content type="html" xml:base="https://www.adamsdesk.com/posts/user-domain-mastodon-discoverability/"><![CDATA[<p>I read Joel’s post on <a href="https://www.joelchrono12.xyz/blog/using-my-own-domain-for-mastodon-without-hosting-a-server-(kinda)/">Using my own domain for Mastodon without hosting a server (kinda)</a>, and thought I would do this myself.</p>

<p>The idea is that anyone would be able to look me up on Mastodon using my own domain. So someone could look up
@adam@adamsdesk.com, and it would show my actually Mastodon account.</p>

<h2 id="what-is-webfinger">What is WebFinger?</h2>

<p>A way to associate information to an email address, or other online service.</p>

<p>Using WebFiger allows for the discovery of information about a people or other entities on the Internet over hypertext
transfer protocol (HTTP).</p>

<h2 id="what-are-the-benefits">What are the Benefits?</h2>

<p>There is not a lot of benefits, but this is all I could come up with after talking about it on
<a href="https://fosstodon.org/@joel/109559951580325890">Mastodon</a>.</p>

<ul>
  <li>Discoverability</li>
  <li>Always redirects to your active Mastodon profile</li>
  <li>Validates your domain for your Mastodon profile</li>
</ul>

<h2 id="edit-jekyll-config">Edit Jekyll Config</h2>

<p>Add the following to your Jekyll configuration file (_config.yml) so that these values can be referenced to build the
webfinger file later. This will allow for ease of changes in the future without touching any code.</p>

<p>There is a <a href="https://github.com/philnash/jekyll-mastodon_webfinger">Jekyll plugin</a> that could be used, but I prefer
not to use plugins when it is simple to do yourself.</p>

<figure class="highlight"><code class="language-yaml" data-lang="yaml"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="code"><pre><span class="na">mastodon</span><span class="pi">:</span>
    <span class="na">instance</span><span class="pi">:</span> <span class="s">fosstodon.org</span>
    <span class="na">username</span><span class="pi">:</span> <span class="s">adamsdesk</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="create-webfinger-file">Create WebFinger File</h2>

<p>Create a file called “webfinger” in the root of your website that will have the following contents. When the website
builds Jekyll will parse the Liquid template language code, and create a file at the root of the website
“.well-known/webfinger”.</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre>---
layout: none
permalink: .well-known/webfinger
---
{
    "subject":"acct:<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">username</span><span class="cp">}}</span>@<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>",
    "aliases":
    [
        "https://<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>/@<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">username</span><span class="w"> </span><span class="cp">}}</span>",
        "https://<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>/users/<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">username</span><span class="w"> </span><span class="cp">}}</span>"
    ],
    "links":
    [
        {
            "rel":"http://webfinger.net/rel/profile-page",
            "type":"text/html",
            "href":"https://<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>/@<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">username</span><span class="w"> </span><span class="cp">}}</span>"
        },
        {
            "rel":"self",
            "type":"application/activity+json",
            "href":"https://<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>/users/<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">username</span><span class="w"> </span><span class="cp">}}</span>"
        },
        {
            "rel":"http://ostatus.org/schema/1.0/subscribe",
            "template":"https://<span class="cp">{{</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">mastodon</span><span class="p">.</span><span class="nv">instance</span><span class="w"> </span><span class="cp">}}</span>/authorize_interaction?uri={uri}"
        }
    ]
}
</pre></td></tr></tbody></table></code></figure>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        By default Jekyll will ignore hidden files/directories (e.g. .well-known). So if you chose to not use the permalink as shown above, make sure to add the <a href="https://jekyllrb.com/docs/configuration/options/">include option</a> into your Jekyll config so that ".well-known" will be included in the website build.
    </p>
</div>

<p>This is post 80 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="webdev" /><category term="jekyll" /><summary type="html"><![CDATA[Using the power of WebFinger on your own domain to make your Mastodon profile discoverable, and to verify association.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/webfinger-for-mastodon.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/webfinger-for-mastodon.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Improve Your DuckDuckGo Search Experience with Bangs</title><link href="https://www.adamsdesk.com/posts/duckduckgo-bangs/" rel="alternate" type="text/html" title="Improve Your DuckDuckGo Search Experience with Bangs" /><published>2023-01-06T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/duckduckgo-bangs</id><content type="html" xml:base="https://www.adamsdesk.com/posts/duckduckgo-bangs/"><![CDATA[<p>I’m always trying to find new ways to help get my tasks done in a more efficient yet effective manner. One area that
definitely can be improved upon is how we all search online. There are so many places to go, it is at times difficult
to recall each website, or even find the website amongst our bookmarks. A tool that I find extremely helpful is using
DuckDuckGo !Bangs. A great solution to do searches with ease.</p>

<h2 id="what-are-duckduckgo-bangs">What are DuckDuckGo Bangs?</h2>

<p>A shortcut command (bang) to perform a search directly on another search engine or service. This allows for a central
point to conduct all search queries from instead of having to go to each website or service separately.</p>

<p>Bang is a slang word for exclamation point or mark (!). However, in this particular context a Bang represents not just
the exclamation point or mark, but also includes the shortcut command (e.g. !tmdb).</p>

<h2 id="how-to-use-duckduckgo-bangs">How to Use DuckDuckGo Bangs</h2>

<p>Using Bangs requires one to type the search keyword followed by the bang (exclamation point/mark), and then the
shortcut command. Pressing enter afterwards will perform the search. Here is an example of searching for the keywords
“space team” followed by an exclamation mark, and the shortcut (gr) to GoodReads.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">space team !gr
</span></code></pre></div></div>

<p>If DuckDuckGo region setting is adjusted to a specific country in the settings menu, !bangs will automatically direct
to that region, if available. So if one does a Bang of <code class="language-plaintext highlighter-rouge">linux !w</code>, you will be sent to wikipedia.de.</p>

<h2 id="where-do-i-find-duckduckgo-bangs">Where Do I Find DuckDuckGo Bangs?</h2>

<p>Search for available Bangs by simply using the Bang <code class="language-plaintext highlighter-rouge">books !bangs</code> or by going directly to
<a href="https://duckduckgo.com/bangs">DuckDuckGo !Bangs</a> web page.</p>

<p>Personally I experiment by testing out what I think a Bang could be. Quite often I find it quickly, and I discover
Bangs that are not listed as far as I can find.</p>

<h2 id="how-to-addedit-a-bang">How to Add/Edit a Bang</h2>

<p>New or updating existing Bangs can be submitted by going to the <a href="https://duckduckgo.com/newbang">DuckDuckGo New !Bang</a>
web page, and filling out the required form fields.</p>

<h2 id="suggested-bangs">Suggested Bangs</h2>

<p>Here are a list of Bangs that I use frequently, that may be of help to get you started or discover a Bang you didn’t
think to use.</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Service</th>
      <th>Bang</th>
      <th>Query Example</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aliexpress</td>
      <td>!ali</td>
      <td>gadgets !ali</td>
    </tr>
    <tr>
      <td>Alpine Linux Wiki</td>
      <td>!alw</td>
      <td>uefi !alw</td>
    </tr>
    <tr>
      <td>Alpine Packages</td>
      <td>!alpine</td>
      <td>podman !alpine</td>
    </tr>
    <tr>
      <td>Amazon Canada</td>
      <td>!ca</td>
      <td>dell poweredge !ca</td>
    </tr>
    <tr>
      <td>Amazon USA</td>
      <td>!a</td>
      <td>dell poweredge !a</td>
    </tr>
    <tr>
      <td>ArchLinux Arm Packages</td>
      <td>!alarmpkg</td>
      <td>tcpdump !alarmpkg</td>
    </tr>
    <tr>
      <td>ArchLinux AUR</td>
      <td>!aur</td>
      <td>pikaur !aur</td>
    </tr>
    <tr>
      <td>ArchLinux Manual Pages</td>
      <td>!archman</td>
      <td>date !archman</td>
    </tr>
    <tr>
      <td>ArchLinux Packages</td>
      <td>!alp</td>
      <td>tcpdump !alp</td>
    </tr>
    <tr>
      <td>ArchWiki</td>
      <td>!aw</td>
      <td>networking !aw</td>
    </tr>
    <tr>
      <td>Dict.org</td>
      <td>!dict</td>
      <td>linux !dict</td>
    </tr>
    <tr>
      <td>eBay Canada</td>
      <td>!ebc</td>
      <td>gadgets !ebc</td>
    </tr>
    <tr>
      <td>eBay USA</td>
      <td>!e</td>
      <td>gadgets !e</td>
    </tr>
    <tr>
      <td>GoodReads</td>
      <td>!gr</td>
      <td>space team !gr</td>
    </tr>
    <tr>
      <td>Internet Pinball Database</td>
      <td>!ipdb</td>
      <td>batman 66 !ipdb</td>
    </tr>
    <tr>
      <td>Kijiji</td>
      <td>!kijiji</td>
      <td>switch game !kijiji</td>
    </tr>
    <tr>
      <td>Manpage.me</td>
      <td>!man</td>
      <td>wc !man</td>
    </tr>
    <tr>
      <td>Metacritic</td>
      <td>!mc</td>
      <td>streets of rage !mc</td>
    </tr>
    <tr>
      <td>Mozilla Developer Network</td>
      <td>!mdn !mdnjs !mdncss</td>
      <td>video !mdn</td>
    </tr>
    <tr>
      <td>Open Media Database</td>
      <td>!omdb</td>
      <td>star trek !omdb</td>
    </tr>
    <tr>
      <td>OpenStreetMap</td>
      <td>!osm</td>
      <td>example !osm</td>
    </tr>
    <tr>
      <td>Pixabay</td>
      <td>!px</td>
      <td>binary !px</td>
    </tr>
    <tr>
      <td>Qwant</td>
      <td>!qw</td>
      <td>adamsdesk !qw</td>
    </tr>
    <tr>
      <td>Qwant Maps</td>
      <td>!qmaps</td>
      <td>Canada !qmaps</td>
    </tr>
    <tr>
      <td>Reddit</td>
      <td>!r</td>
      <td>slice of life !r</td>
    </tr>
    <tr>
      <td>Rotten Tomato</td>
      <td>!rt</td>
      <td>monty python holly grail !rt</td>
    </tr>
    <tr>
      <td>Startpage</td>
      <td>!s</td>
      <td>adamsdesk !s</td>
    </tr>
    <tr>
      <td>SVGRepo</td>
      <td>!svgrepo</td>
      <td>fitness  !svgrepo</td>
    </tr>
    <tr>
      <td>The Movie DB</td>
      <td>!tmdb</td>
      <td>my neighbor totoro !tmdb</td>
    </tr>
    <tr>
      <td>The TVDB</td>
      <td>!tvdb</td>
      <td>kotaro lives alone !tvdb</td>
    </tr>
    <tr>
      <td>Wikimedia Commons</td>
      <td>!wmc</td>
      <td>linux terminal !wmc</td>
    </tr>
    <tr>
      <td>Wikipedia</td>
      <td>!w</td>
      <td>archlinux !w</td>
    </tr>
    <tr>
      <td>Wikiquote</td>
      <td>!wq</td>
      <td>change !wq</td>
    </tr>
    <tr>
      <td>Wikitionary</td>
      <td>!wt</td>
      <td>coder !wt</td>
    </tr>
    <tr>
      <td>Wordnik</td>
      <td>!word</td>
      <td>hacker !word</td>
    </tr>
  </tbody>
</table>

<p>This is post 79 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Learn the power of searching on DuckDuckGo by using !Bangs. Begin by uncovering what is a DuckDuckGo Bang, and how to use them.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/duckduckgo-bangs.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/duckduckgo-bangs.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2022 Fitness Year End Review</title><link href="https://www.adamsdesk.com/posts/2022-fitness-review/" rel="alternate" type="text/html" title="2022 Fitness Year End Review" /><published>2023-01-05T22:08:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/2022-fitness-review</id><content type="html" xml:base="https://www.adamsdesk.com/posts/2022-fitness-review/"><![CDATA[<p>I’ve thought reflecting on the past year would be healthy thing to do, though in the process of trying to write about
2022, I began to realize that I don’t really know what all to talk about. Looking at what I track, it is all mostly
related to media that I’ve consumed. To better myself I should be doing this to help prepare myself for the new year.
Does anyone have any suggestions to give me some direction? Even if it’s someone else’s post, that could be still
helpful. Either way, I decided to change this post slightly, and focus on a brief review of my 2022 fitness journey.</p>

<h2 id="gym-activity">Gym Activity</h2>

<p>I’m not happy about the lack of gym sessions I’ve done. In all honestly though this is not entirely my fault as I no
longer have the means to get to the gym on a consistent basis that I’m in control of. So I can only go when the
opportunity allows for it. My original goal was to go 5 times at week, though I would be happy with 3 to 4 starting
up again as one needs to ease into it. Longer term I want to go every day of the week. I enjoy the gym, and I quite
miss it. Even went as far as having a few trainers. I was making good progress a few years ago in reaching my
ultimate goal of building strength, muscle mass, and agility.</p>

<p>Upon this review I realized that I need to do further tracking as just having how many sessions really doesn’t allow
for finding areas of improvement. There is no interest for me to have how much weight I’ve lost, or how my body
measurements have changed. I’m not overweight, I’m more underweight, and require gaining muscle mass. Hopefully I
can make 2023 a better year in this area, and physically feel better for it.</p>

<p>The lack of statistics (due to me) below were tracked using FitNotes v1.23.1
(<a href="https://play.google.com/store/apps/details?id=com.github.jamesgay.fitnotes">Google Play</a>,
<a href="https://apkpure.com/fitnotes-gym-workout-log/com.github.jamesgay.fitnotes">Apk Pure</a>) for Android.</p>

<ul>
  <li>Total recorded session 11</li>
</ul>

<h2 id="cycling-activity">Cycling Activity</h2>

<p>Cycling is an area I very much enjoy, and can’t wait to get back to doing it again in 2023 once the weather permits it.
My over all sessions are okay in my mind, but in all honesty I’m not happy with my results. My goal was to be at minimum
2,000 km (1242.74 miles), but wanted to achieve 3,000 km (1864.11 miles). Physically I am more than capable of achieving
these goals. In 2020, I achieved 2,078 km (1291.21 miles) in 75 sessions. The main challenge is my mental state. To
improve I will set up an affirmation picture frames that will use to remind myself each day that I enjoy cycling, and I
want to do it because I enjoy it. Of course the affirmation picture frames will be for life, not just cycling. Wait,
does anything else exist outside of cycling? Oh yes technology, can’t leave that out (smile).</p>

<p>The statistics below were tracked using OpenTracks v4.1.2
(<a href="https://f-droid.org/packages/de.dennisguse.opentracks">F-Droid</a> |
<a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play</a> |
<a href="https://github.com/OpenTracksApp/OpenTracks">Source</a>) for Android.</p>

<ul>
  <li>Total recorded sessions 56</li>
  <li>Total distance 1499.21 km (931.56 miles)</li>
  <li>Total time moving 80 hours 7 minutes and 39 seconds</li>
  <li>Longest distance 36.63 km in 2 hours 3 minutes and 11 seconds</li>
  <li>Average distance 27.25 km (16.93 miles)</li>
</ul>

<h2 id="walking">Walking</h2>

<p>This area I’m very pleased with, if I compare myself to previous years I have blowing my records out of the water. Once
I realize how I could easily walk 10 km (6.21 miles) or more that mental barrier of thinking you can’t go that far just
falls apart. This year, I had 4 sessions that came close or broke the 10 km (6.21 miles). The area I need to improve
upon for 2023 is to just have more sessions of walking. Mentally again I feel we get ourselves to accustomed to how we
physically should feel. You could call it our new norm. When in reality we can do so much more even on those days we
convince ourselves that it’s too cold out, or I don’t want to deal with it. There was not a time when I went for a walk
that I didn’t feel better afterwards. Though cycling does help in this area as well, it is not quite the same. I find
walking more intentional, slows you down, makes you pay attention to what is around you, and allows for you to be more
at one with nature. The major challenge is to try to find a balance of walking, and cycling. If I had the choice I
would always cycle (smile).</p>

<p>The statistics below were tracked using OpenTracks v4.1.2
(<a href="https://f-droid.org/packages/de.dennisguse.opentracks">F-Droid</a> |
<a href="https://play.google.com/store/apps/details?id=de.dennisguse.opentracks.playstore">Google Play</a> |
<a href="https://github.com/OpenTracksApp/OpenTracks">Source</a>) for Android.</p>

<ul>
  <li>Total recorded sessions 25</li>
  <li>Total distance 6466 km (4017.79)</li>
  <li>Total time moving 21 hours 40 minutes and 4 seconds</li>
  <li>Longest distance 12.08 km (7.51 miles) in 2 hours 40 minutes and 24 seconds</li>
  <li>Average distance 4.57 km (2.84 miles)</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Ultimately I need to put measures in place to keep me on track, so I am able to reach my goals. The challenges I faced
in 2022 are still present today, with mental health issues, and financial issues that are mostly weighing me down. If
I’m being truly honest, I’m improving mentally, but it’s the lack income that really gets me worked up to the point
I’m concerned about the future. Saying all this though, I’m optimistic that I will in the end overcome these issues
and have great achievements to talk about for 2023.</p>

<p>This is post 78 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="fitness" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Reviewing, and reflecting upon my fitness activity achievements for 2022 in the areas of cycling, walking, and gym exercises.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/2022-fitness-review.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/2022-fitness-review.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cleaning Up Post Tags and Categories: Part Two</title><link href="https://www.adamsdesk.com/posts/clean-tags-categories-two/" rel="alternate" type="text/html" title="Cleaning Up Post Tags and Categories: Part Two" /><published>2023-01-05T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/clean-tags-categories-two</id><content type="html" xml:base="https://www.adamsdesk.com/posts/clean-tags-categories-two/"><![CDATA[<p>Well I’m at it again doing some clean up of the posts topics (categories), and tags. I spent some more time thinking
about what I wanted, and I felt there was a little more room for some further cleaning. Before I got started I decided
to review <a href="https://kevquirk.com/">Kev Quirk’s</a>, and <a href="https://joelchrono12.xyz/">Joel’s</a> websites to gain some insight on
how they organized content. Here is what I ended up doing in a little more detail than before.</p>

<h2 id="cleaning">Cleaning</h2>

<p>I created a checklist for what I wanted to do for the topics, and tags as shown below. All these changes were done to
all published posts as well as drafts. Shockingly I have 51 drafts as of this post.</p>

<p>Each topic would be moved or changed to another topic.</p>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />app to technology</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />hacking to technology</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />art to hobby</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />craft to hobby</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />website to web</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />cyberspace to LittleBits</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />household to hobby</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />hardware to technology</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Unboxing to review</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />1 post to review</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />2 posts with app to adamsdesk</li>
</ul>

<p>There wasn’t much for tags this time around.</p>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />bash to BASH</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Remove ventoy</li>
</ul>

<p>I began using <code class="language-plaintext highlighter-rouge">grep</code>, <code class="language-plaintext highlighter-rouge">wc</code>, and <code class="language-plaintext highlighter-rouge">sed</code> to help speed the process along. Combining <code class="language-plaintext highlighter-rouge">grep</code> along with <code class="language-plaintext highlighter-rouge">wc</code> helped get a
total count of posts that would be modified, so I could confirm later that <code class="language-plaintext highlighter-rouge">sed</code> modified the same total of posts. Using
<code class="language-plaintext highlighter-rouge">git diff</code> I reviewed the changes as I went along to ensure I wasn’t making any mistakes.</p>

<p>Here is an example of how I used <code class="language-plaintext highlighter-rouge">grep</code>, <code class="language-plaintext highlighter-rouge">wc</code>, and <code class="language-plaintext highlighter-rouge">sed</code> for the topic “app”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>grep -r "^category: app\$" _posts/ | wc -l
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">39
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">'s/category: app/category: technology/g'</span> _posts/<span class="k">*</span>.md
</code></pre></div></div>

<p>This is how I dealt with actually removing the entire tag, and line for “ventoy”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">grep</span> <span class="nt">-r</span> <span class="s2">"^    </span><span class="se">\-</span><span class="s2"> ventoy</span><span class="se">\$</span><span class="s2">"</span> _posts/
<span class="go">_posts/2021-02-09-ventoy-the-ultimate-multi-boot-manager.md
_posts/2021-02-14-how-to-create-a-multiboot-usb-with-ventoy-using-linux.md
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sed</span> <span class="nt">-i</span> <span class="s1">'/^    - ventoy$/d'</span> _posts/<span class="k">*</span>.md
</code></pre></div></div>

<p>The only downside to all this was I had to change each post’s front matter for date modified, and change log manually.
Unfortunately at the time of doing this I couldn’t see how I could automate those tasks since it wasn’t a simple
removal or search, and replace. Some may think, and honestly I have too, why bother with the changelog? The main reason
why I continue to do it is for accountability and history of changes of a post.</p>

<h2 id="stats">Stats</h2>

<p>Here are the end results of a couple of hours of work. Not as a dramatic difference this time, but I feel better for
doing it.</p>

<table class="table-striped table-hover w-100 mb-4">
  <tbody>
    <tr>
      <td>Item Name</td>
      <td>Before</td>
      <td>After</td>
      <td>Removed</td>
    </tr>
    <tr>
      <td>Paginated pages</td>
      <td>51</td>
      <td>44</td>
      <td>7</td>
    </tr>
    <tr>
      <td>Topics (categories)</td>
      <td>16</td>
      <td>11</td>
      <td>5</td>
    </tr>
    <tr>
      <td>Tags</td>
      <td>29</td>
      <td>28</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

<p>This is post 77 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="jekyll" /><summary type="html"><![CDATA[Website cleanup continues of topics (categories), and tags with detailed explanation on how I tried to automate the clean-up process.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/broom-clean-tags-categories-2.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/broom-clean-tags-categories-2.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Resolve RustDesk With No ID or Network Connection</title><link href="https://www.adamsdesk.com/posts/rustdesk-not-connecting/" rel="alternate" type="text/html" title="Resolve RustDesk With No ID or Network Connection" /><published>2023-01-04T00:00:00-06:00</published><updated>2023-07-29T17:06:19-06:00</updated><id>https://www.adamsdesk.com/posts/rustdesk-not-connecting</id><content type="html" xml:base="https://www.adamsdesk.com/posts/rustdesk-not-connecting/"><![CDATA[<p>There seems to be quite a few of people experiencing issues trying to use RustDesk. The two common problems are either
having the ID never generating or never connecting to the RustDesk network’s free relay server. In my experience of
using the free open source software, I’ve not had these problems until today. I was determined to figure this all out.</p>

<h2 id="investigation">Investigation</h2>

<p>I began searching online for a solution, but unfortunately I kept coming up empty. The results kept coming back with
either similar problems, but not entirely related, or finding people talking about the issue, but with no solution. My
intuition kept coming to me over, and over with the thought that it has to be a simple network problem. I ignored this
thought, because I kept telling myself I have no evidence of proof. So I decided to monitor the TCP traffic with
<code class="language-plaintext highlighter-rouge">tcpdump</code>, and I noticed a pattern. Every time I had RustDesk running it would repeatedly try to connect to three
domain names, “rs-sg.rustdesk.com”, “rs-cn.rustdesk.com”, and “rs-us.rustdesk.com”. For further proof I wanted to know
what were all the default relay servers being used, so I searched through the RustDesk source code. Shortly after I was
able to confirm that one of the three servers I already found are indeed used to establish a relay connection. With this
new-found evidence made me think back to my intuition that the host names were not being resolved so a connection could
be established to the free relay servers. Right after discovery this I quickly tried to resolve each domain name manually
with the command <code class="language-plaintext highlighter-rouge">dig</code>. The results confirmed my intuition, each domain name was not resolving to an IP address, and
therefore explains why I’m having problems.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Arch Linux</li>
  <li>GNOME v43.2</li>
  <li>RustDesk v1.1.9</li>
</ul>

<h2 id="problem">Problem</h2>

<p>Under ID a message of “Generating … “ is displayed, and never ends up generating an ID. Towards the bottom of the
application window a message is displayed “Connecting to the RustDesk network…”, but never establishes a connection.
One or both of these issues can occur at the same time resulting in being unable to connect to a system.</p>

<figure class="figure">
    <img src="/assets/img/posts/rustdesk-screenshot-not-connecting.webp" width="640" height="507" alt="Screenshot of RustDesk application illustrating the connection error message." class="figure-img img-fluid rounded" />
    <figcaption class="figure-caption">RustDesk screenshot illustrating a connection issue</figcaption>
</figure>

<h2 id="solution">Solution</h2>

<p>To resolve the network connection issue, I simply changed the DNS servers being used. Once this was done, I was able to
use the software as expected.</p>

<p>How to change your DNS servers depends on your system, and network configuration. Though this is usually done by
changing the DNS server addresses on a gateway router, or locally on the system itself (e.g. /etc/resolv.conf,
/etc/systemd/network/20-wired.network, etc.).</p>

<p>This is post 76 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><summary type="html"><![CDATA[Follow my thought process of how I resolved RustDesk not being able to generate an ID or make a connection to the free relay server.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/rustdesk-not-connecting.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/rustdesk-not-connecting.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Use DuckDuckGo From the Command Line</title><link href="https://www.adamsdesk.com/posts/duckduckgo-commandline/" rel="alternate" type="text/html" title="How To Use DuckDuckGo From the Command Line" /><published>2023-01-03T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/duckduckgo-commandline</id><content type="html" xml:base="https://www.adamsdesk.com/posts/duckduckgo-commandline/"><![CDATA[<p>I’ve used DuckDuckGo so many times throughout the day that I can’t even recall how many times I’ve searched for
something. What I do know is that I always have to use a graphical interface to conduct my searches, even though I’m in
the command line majority of the time. The dream of using DuckDuckGo in the command line is a reality thanks to an
application called “ddgr”, a simple, clean, and ease to use text interface.</p>

<h2 id="install">Install</h2>

<p><code class="language-plaintext highlighter-rouge">ddgr</code> can be installed in the majority of operating systems. Here are a few examples on how to achieve that.</p>

<h3 id="arch-linux">Arch Linux</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> ddgr
</code></pre></div></div>

<h3 id="debian">Debian</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>apt <span class="nb">install </span>ddgr
</code></pre></div></div>

<h3 id="fedora">Fedora</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>dnf <span class="nb">install </span>ddgr
</code></pre></div></div>

<h3 id="homebrew">Homebrew</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>brew <span class="nb">install </span>ddgr
</code></pre></div></div>

<h3 id="snap">Snap</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>snap <span class="nb">install </span>ddgr
</code></pre></div></div>

<h2 id="usage">Usage</h2>

<p>The basics of using ddgr is just simply running the command followed by a keyword. The default behavior will return a
list of 10 results per page, and a command prompt waiting for your instructions.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>ddgr adamsdesk
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">1.  Home - Adamsdesk [www.adamsdesk.com]
    A hub for technology users to navigate the misleading, outdated, and
    inaccurate product information online for what is honest, clear, and
    up-to-date.

2.  Adamsdesk KB [kb.adamsdesk.com]
    Home. Welcome to Adamsdesk Knowledge Base. Recent Activity.
</span><span class="gp">    2022-12-12 Arch Linux AUR Helper Add new article;</span><span class="w">
</span><span class="gp">    2022-12-12 Arch Linux Pacman Fix for accuracy and clarity;</span><span class="w">
</span><span class="gp">    2022-12-05 Arch Linux Install AUR Helper Add Paru AUR Helper;</span><span class="w">
</span><span class="gp">    2022-12-02 Logitech K400r Add new article;</span><span class="w">
</span><span class="gp">    2022-12-02 Pi-hole Quick Reference Commands Add missing command example;</span><span class="w">
</span><span class="go">    2022-11-29 Framadate Install Guide Add new ...

3.  About - Adamsdesk KB [kb.adamsdesk.com]
    Topics covered on Adamsdesk Knowledgebase is to be on all areas of life that
    are not necessarily related to computing. How It Works Adamsdesk
    Knowledgebase is primarily maintained by Adam Douglas. As this knowledge
    resource grows it may open up to the public for others to contribute. How
    You Can Help

... (intentionally trucated)

ddgr (? for help)
</span></code></pre></div></div>

<p>Here is a quick overview of the application commands.</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Task</th>
      <th>Command Example</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Copy link</td>
      <td>c 1</td>
      <td>Copy link to clipboard by index number.</td>
    </tr>
    <tr>
      <td>Help</td>
      <td>?</td>
      <td>Show help.</td>
    </tr>
    <tr>
      <td>Open link</td>
      <td>index 1</td>
      <td>Open result corresponding to index number in a web browser.</td>
    </tr>
    <tr>
      <td>Open link</td>
      <td>o 1 3 5</td>
      <td>Open multiple space-separated result indices in a web browser.</td>
    </tr>
    <tr>
      <td>Open link</td>
      <td>O 1 3 5</td>
      <td>Same as “o”, but will use a graphical user interface (GUI) web browser instead.</td>
    </tr>
    <tr>
      <td>Page first</td>
      <td>f</td>
      <td>Go to the first page of results.</td>
    </tr>
    <tr>
      <td>Page next</td>
      <td>n</td>
      <td>Fetch the next page of results.</td>
    </tr>
    <tr>
      <td>Page previous</td>
      <td>p</td>
      <td>Fetch previous page of results.</td>
    </tr>
    <tr>
      <td>Quit</td>
      <td>CTRL-D</td>
      <td>Exit ddgr.</td>
    </tr>
    <tr>
      <td>Quit</td>
      <td>ENTER ENTER</td>
      <td>Press the enter key twice to exit ddgr.</td>
    </tr>
    <tr>
      <td>Quit</td>
      <td>q</td>
      <td>Exit ddgr.</td>
    </tr>
    <tr>
      <td>Search</td>
      <td>adamsdesk.com</td>
      <td>New search for “adamsdesk.com”.</td>
    </tr>
    <tr>
      <td>Search</td>
      <td>d adamsdesk.com</td>
      <td>New search for “adamsdesk.com”.</td>
    </tr>
    <tr>
      <td>Show full link</td>
      <td>x</td>
      <td>Toggle displaying full links, or domain name only.</td>
    </tr>
  </tbody>
</table>

<h2 id="integrate-with-text-browsers">Integrate with Text Browsers</h2>

<p><code class="language-plaintext highlighter-rouge">ddgr</code> works with several text-based browsers, such as <a href="https://en.wikipedia.org/wiki/ELinks">elinks</a>,
<a href="https://en.wikipedia.org/wiki/Links_(web_browser)">links</a>, <a href="https://en.wikipedia.org/wiki/Lynx_(web_browser)">lynx</a> or
<a href="https://en.wikipedia.org/wiki/W3m">w3m</a>. For the text-browser
integration to work the environment variable <code class="language-plaintext highlighter-rouge">BROWSER</code> must be set. This can be done manually as shown below.</p>

<h3 id="bash">Bash</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">export </span><span class="nv">BROWSER</span><span class="o">=</span>w3m
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nv">BROWSER</span><span class="o">=</span>w3m ddgr adadamsdesk
</code></pre></div></div>

<h3 id="fish">Fish</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">set</span> <span class="nt">-g</span> <span class="nt">-x</span> BROWSER w3m
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nv">BROWSER</span><span class="o">=</span>w3m ddgr adadamsdesk
</code></pre></div></div>

<p>A permanent solution would be to add the environment variable to your shell configuration file (e.g. ~/.bashrc,
~/.config/fish/config.fish).</p>

<h3 id="bash-1">Bash</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.bashrc
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">export BROWSER="w3m"
</span></code></pre></div></div>

<h3 id="fish-1">Fish</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.bashrc
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">set -g -x BROWSER w3m
</span></code></pre></div></div>

<h2 id="colors">Colors</h2>

<p>The configuration of colors can be altered from the default of “oCdgxy” using an environment variable <code class="language-plaintext highlighter-rouge">DDGR_COLORS</code> or a
command line parameter. Each character of the total six characters represents a specific element, and are listed in
order as follows.</p>

<ul>
  <li>indices</li>
  <li>titles</li>
  <li>URLs (links)</li>
  <li>metadata/publishing info</li>
  <li>abstracts</li>
  <li>prompts</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">ddgr</code> offers the following colors/styles:</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Letter</th>
      <th>Color/Style</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>a</td>
      <td>black</td>
    </tr>
    <tr>
      <td>b</td>
      <td>red</td>
    </tr>
    <tr>
      <td>c</td>
      <td>green</td>
    </tr>
    <tr>
      <td>d</td>
      <td>yellow</td>
    </tr>
    <tr>
      <td>e</td>
      <td>blue</td>
    </tr>
    <tr>
      <td>f</td>
      <td>magenta</td>
    </tr>
    <tr>
      <td>g</td>
      <td>cyan</td>
    </tr>
    <tr>
      <td>h</td>
      <td>white</td>
    </tr>
    <tr>
      <td>i</td>
      <td>bright black</td>
    </tr>
    <tr>
      <td>j</td>
      <td>bright red</td>
    </tr>
    <tr>
      <td>k</td>
      <td>bright green</td>
    </tr>
    <tr>
      <td>l</td>
      <td>bright yellow</td>
    </tr>
    <tr>
      <td>m</td>
      <td>bright blue</td>
    </tr>
    <tr>
      <td>n</td>
      <td>bright magenta</td>
    </tr>
    <tr>
      <td>o</td>
      <td>bright cyan</td>
    </tr>
    <tr>
      <td>p</td>
      <td>bright white</td>
    </tr>
    <tr>
      <td>A-H</td>
      <td>bold version of the lowercase-letter color</td>
    </tr>
    <tr>
      <td>I-P</td>
      <td>bold version of the lowercase-letter bright color</td>
    </tr>
    <tr>
      <td>x</td>
      <td>normal</td>
    </tr>
    <tr>
      <td>X</td>
      <td>bold</td>
    </tr>
    <tr>
      <td>y</td>
      <td>reverse video</td>
    </tr>
    <tr>
      <td>Y</td>
      <td>bold reverse video</td>
    </tr>
  </tbody>
</table>

<h2 id="command-examples">Command Examples</h2>

<ul>
  <li>
    <p>Basic Search</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr adamsdesk
</code></pre></div>    </div>
  </li>
  <li>
    <p>Search with Bangs</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="o">!</span>w ansi escape code
</code></pre></div>    </div>

    <p>Escape the character “!” (exclamation mark) to work within Bash.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="se">\!</span>w ansi escape code
</code></pre></div>    </div>
  </li>
  <li>
    <p>Feeling Lucky</p>

    <p>Open the first result found in a web browser with no prompt.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-j</span> ansi escape code
</code></pre></div>    </div>
  </li>
  <li>
    <p>Specific Website</p>

    <p>Show only results from a specific website only.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-w</span> adamsdesk.com commandline
</code></pre></div>    </div>
  </li>
  <li>
    <p>Specific File Type</p>

    <p>Show results containing a specific file type.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr linux filetype:pdf
</code></pre></div>    </div>
  </li>
  <li>
    <p>Convert mass ddgr -n 1 –np 4 kg to lbs</p>

    <p>Convert kilograms to pounds without a prompt, and returning the first result only.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-n</span> 1 <span class="nt">--np</span> 4 kg to lbs
</code></pre></div>    </div>
  </li>
  <li>
    <p>Disable Safe Search –unsafe</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">--unsafe</span> adamsdesk.com
</code></pre></div>    </div>
  </li>
  <li>
    <p>Display Full Links</p>

    <p>Show the entire link instead of just the domain name.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-x</span> adamsdesk
</code></pre></div>    </div>
  </li>
  <li>
    <p>Get current public IP address without prompt -n 1 –np ip</p>

    <p>Display your public IP address without a prompt, and returning the first result only.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-n</span> 1 <span class="nt">--np</span> ip
</code></pre></div>    </div>
  </li>
  <li>
    <p>Search by Region -r en-ca</p>

    <p>Return results by region, see <a href="https://help.duckduckgo.com/settings/params/">DuckDuckGo params</a> help page for more
  details.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-r</span> en-ca adamsdesk.com
</code></pre></div>    </div>
  </li>
  <li>
    <p>Quoted Text</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr it<span class="se">\'</span>s a <span class="se">\"</span>beautiful world<span class="se">\"</span> <span class="k">in </span>spring
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="s2">"it's a "</span>beautiful world<span class="s2">" in spring"</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Limit Results Per Page</p>

    <p>Display 15 results per page.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">  $</span><span class="w"> </span>ddgr <span class="nt">-n</span> 15 adamsdesk.com
</code></pre></div>    </div>
  </li>
</ul>

<p>This is post 75 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="commandline" /><summary type="html"><![CDATA[Gain insight into using DuckDuckGo from the command line from installation, configuration, browser integration, and search usage examples.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/duckduckgo-commandline.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/duckduckgo-commandline.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #2</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-2/" rel="alternate" type="text/html" title="Little Bits: Issue #2" /><published>2023-01-02T15:33:00-06:00</published><updated>2023-01-11T21:25:58-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-2</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-2/"><![CDATA[<p>Time sure seems to fly by as it has already been almost 2 weeks since the last edition of Little Bits. I hope everyone
has had wonderful safe celebrations, and a happy new year. Let’s break in the new year with some new bits (links) to
fill your curiosity.</p>

<h2 id="bits">Bits</h2>

<ul>
  <li>
    <p><a href="https://theprintshop.club/">The Print Shop Club</a></p>

    <p>A website to give tribute to the software “The Print Shop” by Broderbund. Visitors can experience the fun of creating
  posters or greeting cards by playing with the software for the Apple II computer right from within a web browser.
  Documents printed from the software will be outputted to a PDF, and automatically downloaded to your device.</p>
  </li>
  <li>
    <p><a href="https://noclip.website/">noclip</a> by Jasper</p>

    <p>Browse the digital museum of animated video game levels by flying around within each level to discover the unknown.</p>
  </li>
  <li>
    <p><a href="https://www.reddit.com/r/NintendoSwitchBoxArt/comments/8e73bv/nintendo_switch_cover_template_psd_file/">Nintendo Switch Cover Template</a> by Hopper</p>

    <p>Take your creative skills to the next level by making custom Nintendo Switch covers using this wonderful template in PSD file format.</p>
  </li>
  <li>
    <p><a href="https://github.com/jrnxf/thokr">thokr</a></p>

    <p>Improve your typing skills with this command-line text-based user interface (TUI) application with visualized
  results and historical logging.</p>
  </li>
  <li>
    <p><a href="https://github.com/Lxtharia/minegrub-theme">minegrub-theme</a></p>

    <p>For those that never seem to get enough of Minecraft, why not change the Grub boot menu to a theme in the style of
  Minecraft?</p>
  </li>
  <li>
    <p><a href="https://github.com/jbensmann/mouseless">mouseless</a></p>

    <p>Take control of your mouse using this software and a keyboard.</p>
  </li>
  <li>
    <p><a href="https://wtfutil.com/">WTF</a></p>

    <p>An informational dashboard for the terminal to monitor systems, services, and much more.</p>
  </li>
  <li>
    <p><a href="https://archive.org/details/ultimate-doom-wads">Doom Engine Games WADs Selection</a></p>

    <p>A curated list of WADS for several Doom engine games, including, Doom (Ultimate, II, and Final),
  Heretic, Hexen, and Chex Quest.</p>
  </li>
  <li>
    <p><a href="https://pepperraccoon.com/">Pepper Raccoon</a></p>

    <p>Discover this dark indie visual artist, and illustrator from Wellington, New Zealand. Purchase some art of your own
  or hire for services.</p>
  </li>
  <li>
    <p><a href="https://aaronson.org/crosswords/">Aaronson.org Crosswords</a> by Adam Aaronson</p>

    <p>Solve from 42 crossword puzzles, and growing right within a web browser. For those wanting to go old school using
  paper, and a pencil, Aaronson has you covered. Each puzzle can be printed along with the solutions.</p>
  </li>
</ul>

<p>Do you have a bit you would like to share or just wanting to continue the conversation? Please consider <a href="/contact/">contacting me</a>.</p>

<p>This is post 73 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Break in the new year with a bang browsing these fresh new shiny bits (links) that should easily feed the void of curiosity.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-2.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-2.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">List Packages That Depend On Another Package with Pacman</title><link href="https://www.adamsdesk.com/posts/pacman-reverse-package-dependencies/" rel="alternate" type="text/html" title="List Packages That Depend On Another Package with Pacman" /><published>2023-01-02T00:00:00-06:00</published><updated>2023-07-29T16:17:14-06:00</updated><id>https://www.adamsdesk.com/posts/pacman-reverse-package-dependencies</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pacman-reverse-package-dependencies/"><![CDATA[<p>Maintaining a clean Linux system is always a challenge, but it is doable. One such task that I honestly do not enjoy
doing is removing packages that are no longer required, or wanted without breaking another package. The issue with
this task is that it requires running multiple commands in order to determine if a given package can be removed safely.
I’ve found the solution I’ve been using works quite well with my workflow, and I hope it may be of help for you as well.</p>

<h2 id="crafting-an-alias">Crafting an Alias</h2>

<p>The solution I’ve found is by creating an alias command that will allow to filtering packages, and then see a preview of
dependant packages of a specific package. The alias command requires the use of either GNU Bash or fish on an Arch Linux
based system as it uses <code class="language-plaintext highlighter-rouge">pacman</code>, and <code class="language-plaintext highlighter-rouge">pactree</code> to fetch the necessary information. The results are displayed using
<code class="language-plaintext highlighter-rouge">fzf</code>.</p>

<p>The package required for <code class="language-plaintext highlighter-rouge">pactree</code> is <a href="https://archlinux.org/packages/extra/x86_64/pacman-contrib/">pacman-contrib</a>
, and <a href="https://archlinux.org/packages/extra/x86_64/fzf/">fzf</a> package name is the same name as the command.</p>

<p>I would like to say I came up with this command myself, but I did not. The unfortunate part is I have no idea who
originally did, let alone recall the minor tweaks I did. Too much time has passed to remember the details.</p>

<h2 id="bash-alias">Bash Alias</h2>

<p>Here is how to implement the alias command I named <code class="language-plaintext highlighter-rouge">pkgdep</code>, short for package dependencies by editing the Bash user
configuration file, and adding an alias command as desired to the file.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.bashrc
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">pkgdep</span><span class="o">=</span><span class="s2">"pacman -Qq | fzf --preview 'pactree -lur {} | sort' --layout reverse --bind 'enter:execute(pactree -lu {} | sort | less)'"</span>
</code></pre></div></div>

<h2 id="fish-alias">Fish Alias</h2>

<p>Aliases in fish are called functions, and are each stored separately in their own file. We will create a new function
called <code class="language-plaintext highlighter-rouge">pkgdep</code> (package dependencies) by following the below instructions.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.config/fish/functions/pkgdep.fish
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function </span>pkgdep <span class="nt">--description</span> <span class="s1">'package depedencies'</span>
 <span class="nb">command </span>pacman <span class="nt">-Qq</span> | fzf <span class="nt">--preview</span> <span class="s1">'pactree -lur {} | sort'</span> <span class="nt">--layout</span> reverse <span class="nt">--bind</span> <span class="s1">'enter:execute(pactree -lu {} | sort | less)'</span><span class="p">;</span>
end
</code></pre></div></div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        Arch User Repository (AUR) helpers can be used by replacing "pacman" command as desired (e.g. pikaur, yay, etc.).
    </p>
</div>

<h2 id="usage">Usage</h2>

<p>Simply run the new alias command in the console or terminal, and begin the search. The left-hand side will be a list of
all the packages installed on the system, and the right is the packages that are required for the selected package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pkgdep
</code></pre></div></div>

<p>The screenshot below shows a user searching for “electron”, and then selecting the “electron” package to see on the
right what packages require it.</p>

<p><img src="/assets/img/posts/pkgdep-screenshot.webp" alt="Screenshot of results from running pkgdep alias command." width="1080" height="256" class="img-fluid" loading="lazy" /></p>

<p>This is post 74 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="archlinux" /><category term="commandline" /><category term="BASH" /><summary type="html"><![CDATA[Make life easier to maintain a clean Arch Linux system by listing reverse package dependencies using pacman, pactree, and fzf.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pacman-reverse-package-dependencies.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pacman-reverse-package-dependencies.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add kramdown Attributes with Jekyll or Bridgetown</title><link href="https://www.adamsdesk.com/posts/add-kramdown-attributes/" rel="alternate" type="text/html" title="Add kramdown Attributes with Jekyll or Bridgetown" /><published>2023-01-01T14:32:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/add-kramdown-attributes</id><content type="html" xml:base="https://www.adamsdesk.com/posts/add-kramdown-attributes/"><![CDATA[<p>Markdown is great file format to help simplify the process of creating, and focusing on the content itself. However, at
times we need to set attributes on the text, lists, images, etc. that we end up writing for a website. Static site
generators such as <a href="https://jekyllrb.com/">Jekyll</a> or <a href="https://www.bridgetownrb.com/">Bridgetown</a> use a Markdown parser,
and converter called <a href="https://kramdown.gettalong.org/">kramdown</a>. Using kramdown provides a way to set attributes
without having to use HTML code.</p>

<h2 id="what-is-kramdown">What is kramdown?</h2>

<p>A software parser, and converter that written in the Ruby language. Text is read by kramdown, and if formatted with the
correct syntax will convert Markdown to another file format such as HTML.</p>

<h2 id="the-basics">The Basics</h2>

<p>To assign attributes to an element when converted to HTML, the syntax must start with <code class="language-plaintext highlighter-rouge">{:</code> and end with <code class="language-plaintext highlighter-rouge">}</code>.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{: }
</code></pre></div></div>

<p>To add a CSS class (table-hover), and then a CSS identifier (custom), one would do it like so.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{:.table-hover #custom}
</code></pre></div></div>

<p>Specific attributes can be added by the attribute name, equal sign, and then enclosing the value within double quotes.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{:title="View source"}
</code></pre></div></div>

<p>Add multiple attributes at once.</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{: .table-striped .table-hover .mb-4 #custom }
</code></pre></div></div>

<h2 id="block-attributes">Block Attributes</h2>

<p>On a new line directly following a block-level element place the desired attribute list. Here is an example where the
CSS class attribute will bet set with three class styles onto a table in Markdown, and then what it will look like
converted to HTML.</p>

<figure class="highlight"><code class="language-markdown" data-lang="markdown"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="code"><pre>Model | SDSQUA4-128GB-CCCMB
Capacity | 128GB
Dimensions (L x W x H) | 0.04" x 0.59" x 0.43"
{: .table-striped .table-hover .mb-4 }
</pre></td></tr></tbody></table></code></figure>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre><span class="nt">&lt;table</span> <span class="na">class=</span><span class="s">"table-striped table-hover mb-4"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;tbody&gt;</span>
    <span class="nt">&lt;tr&gt;</span>
      <span class="nt">&lt;td&gt;</span>Model<span class="nt">&lt;/td&gt;</span>
      <span class="nt">&lt;td&gt;</span>SDSQUA4-128GB-CCCMB<span class="nt">&lt;/td&gt;</span>
    <span class="nt">&lt;/tr&gt;</span>
    <span class="nt">&lt;tr&gt;</span>
      <span class="nt">&lt;td&gt;</span>Capacity<span class="nt">&lt;/td&gt;</span>
      <span class="nt">&lt;td&gt;</span>128GB<span class="nt">&lt;/td&gt;</span>
    <span class="nt">&lt;/tr&gt;</span>
    <span class="nt">&lt;tr&gt;</span>
      <span class="nt">&lt;td&gt;</span>Dimensions (L x W x H)<span class="nt">&lt;/td&gt;</span>
      <span class="nt">&lt;td&gt;</span>0.04” x 0.59” x 0.43”<span class="nt">&lt;/td&gt;</span>
    <span class="nt">&lt;/tr&gt;</span>
  <span class="nt">&lt;/tbody&gt;</span>
<span class="nt">&lt;/table&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="inline-attributes">Inline Attributes</h2>

<p>Similar to block-level attributes, the attribute list must follow directly after a span-level element.
Here are a few examples of an image, paragraph, and link in Markdown, and then the output converted to HTML.</p>

<h3 id="image">Image</h3>

<figure class="highlight"><code class="language-markdown" data-lang="markdown"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="p">![</span><span class="nv">Select device in GParted.]</span><span class="p">](</span><span class="sx">/assets/img/website-logo.webp</span><span class="p">)</span>{:width="795" height="125" loading="lazy" .img-fluid}
</pre></td></tr></tbody></table></code></figure>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"/assets/img/posts/gparted-select-device.webp"</span> <span class="na">alt=</span><span class="s">"Select device in GParted."</span> <span class="na">class=</span><span class="s">"img-fluid"</span> <span class="na">loading=</span><span class="s">"lazy"</span> <span class="na">width=</span><span class="s">"795"</span> <span class="na">height=</span><span class="s">"125"</span><span class="nt">&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h3 id="paragraph">Paragraph</h3>

<figure class="highlight"><code class="language-markdown" data-lang="markdown"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre>I’m publishing this as part of <span class="ge">*100 Days To Offload*</span>{:.text-decoration-underline}.
</pre></td></tr></tbody></table></code></figure>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="nt">&lt;p&gt;</span>I’m publishing this as part of <span class="nt">&lt;em</span> <span class="na">class=</span><span class="s">"text-decoration-underline"</span><span class="nt">&gt;</span>100 Days To Offload<span class="nt">&lt;/em&gt;</span>.<span class="nt">&lt;/p&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="link">Link</h2>

<figure class="highlight"><code class="language-markdown" data-lang="markdown"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="p">[</span><span class="nv">100DaysToOffload.com</span><span class="p">](</span><span class="sx">https://100daystooffload.com</span><span class="p">)</span>{:title="View website"}
</pre></td></tr></tbody></table></code></figure>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://100daystooffload.com"</span> <span class="na">title=</span><span class="s">"View website"</span><span class="nt">&gt;</span>100DaysToOffload.com<span class="nt">&lt;/a&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<p>This is post 71 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="webdev" /><category term="jekyll" /><summary type="html"><![CDATA[Learn to easily apply HTML attributes by writing Markdown when using kramdown, and Jekyll or Bridgetown static site generators.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/markdown-kramdown-attributes.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/markdown-kramdown-attributes.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Happy New Year 2023</title><link href="https://www.adamsdesk.com/posts/happy-new-year-2023/" rel="alternate" type="text/html" title="Happy New Year 2023" /><published>2023-01-01T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/happy-new-year-2023</id><content type="html" xml:base="https://www.adamsdesk.com/posts/happy-new-year-2023/"><![CDATA[<p>Happy New Year to all my wonderful readers! It’s hard to believe another year has come, and gone. Some many of us I’m
sure would agree the past several years have been like no other that brought challenges in so many areas of our lives.
The time to me that forced upon personal growth whether one chose to have it or not.</p>

<h2 id="thoughts">Thoughts</h2>

<p>Here are some thoughts that can help shape the future we are building right now.</p>

<ul>
  <li>Do not allow the passed to form your future</li>
  <li>Do not empower fear to control your life</li>
  <li>Do not stress over what you cannot control</li>
  <li>Focus on the positive, negativity will only ruin you</li>
  <li>Focus on being productive, instead of busy</li>
  <li>Your past is just a story, and once you realize this, it has no power over you</li>
  <li>Do more things that make you forget to check your phone</li>
  <li>Accept the person you are now, so that you can grow into the person you want to become</li>
</ul>

<p>Though times can be tough we are all fortunate in ways we may not yet see. We all have the power to create how we live
our life. Give yourself the chance to be happy, remember you are strong enough to overcome it.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Take this time to reflect on your life with gratitude. May the coming year be full of grand adventures, and
opportunities towards building a life of sustainable happiness, health, and wealth.</p>

<p>This is post 72 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="MentalHealth" /><summary type="html"><![CDATA[A happy new year message, and thoughts that can empower each of us for a brighter future of tomorrow by starting today.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/happy-new-year-2023.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/happy-new-year-2023.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Must Have Essential Applications For Desktop Linux</title><link href="https://www.adamsdesk.com/posts/essential-desktop-linux-applications/" rel="alternate" type="text/html" title="Must Have Essential Applications For Desktop Linux" /><published>2022-12-31T00:00:00-06:00</published><updated>2023-01-23T17:37:38-06:00</updated><id>https://www.adamsdesk.com/posts/essential-desktop-linux-applications</id><content type="html" xml:base="https://www.adamsdesk.com/posts/essential-desktop-linux-applications/"><![CDATA[<p>I’ve tried hard to make this list different from the majority of similar posts online. This list in intended as a
reference when building a fresh Linux system or just looking to discover software that one was not aware existed.
We can’t recall every application, so hopefully this will fill that void as well as those that are curious.</p>

<h2 id="applications">Applications</h2>

<p>I’ve sorted the list by application use or category for ease of browsing. All software applications listed must meet
the following criteria.</p>

<ul>
  <li>A graphical user interface</li>
  <li>A native application
    <ul>
      <li>Does not require container or virtualization</li>
      <li>Does not require a client/server configuration</li>
      <li>Runs locally</li>
    </ul>
  </li>
  <li>Active project development</li>
  <li>Has an open source license (not freeware)</li>
  <li>Runs on the Linux operating system</li>
</ul>

<h2 id="animation">Animation</h2>

<ul>
  <li><a href="https://www.synfig.org/">Synfig Studio</a></li>
</ul>

<h2 id="archive-manager">Archive Manager</h2>

<ul>
  <li><a href="https://apps.kde.org/ark/">Ark</a></li>
  <li><a href="https://github.com/tsujan/Arqiver">Arqiver</a></li>
  <li><a href="https://wiki.mate-desktop.org/mate-desktop/applications/engrampa/">Engrampa</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Archive_Manager">GNOME Archive Manager</a> (file-roller)</li>
  <li><a href="https://peazip.github.io/">PeaZip</a></li>
  <li><a href="https://en.wikipedia.org/wiki/Xarchiver">Xarchiver</a></li>
</ul>

<h2 id="audio-editor">Audio Editor</h2>

<ul>
  <li><a href="https://ardour.org/">Ardour</a></li>
  <li><a href="https://lmms.io/">LMMS</a></li>
  <li><a href="https://ossia.io/score/about.html">Ossia Score</a></li>
  <li><a href="https://tenacityaudio.org/">Tenacity</a></li>
</ul>

<h2 id="document-viewer">Document Viewer</h2>

<ul>
  <li><a href="https://johnfactotum.github.io/foliate/">Foliate</a></li>
  <li><a href="https://en.wikipedia.org/wiki/Evince">GNOME Document Viewer</a> (evince)</li>
  <li><a href="https://okular.kde.org/">Okular</a></li>
</ul>

<h2 id="email-client">Email Client</h2>

<ul>
  <li><a href="https://www.claws-mail.org/">Claws Mail</a></li>
  <li><a href="https://en.wikipedia.org/wiki/Geary_(e-mail_client)">Geary</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Evolution">GNOME Evolution</a></li>
  <li><a href="https://kontact.kde.org/components/kmail/">KMail</a></li>
  <li><a href="https://www.thunderbird.net/en-US/">Thunderbird</a></li>
</ul>

<h2 id="file-manager">File Manager</h2>

<ul>
  <li><a href="https://apps.kde.org/dolphin/">Dolphin</a></li>
  <li><a href="https://doublecmd.sourceforge.io/">Double Commader</a></li>
  <li><a href="https://gcmd.github.io/">GNOME Commander</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Files">GNOME Files</a> (nautilus)</li>
  <li><a href="https://krusader.org/">Krusader</a></li>
  <li><a href="https://github.com/linuxmint/nemo/#nemo">Nemo</a></li>
  <li><a href="https://docs.xfce.org/xfce/thunar/">Thunar</a></li>
</ul>

<h2 id="image-viewer">Image Viewer</h2>

<ul>
  <li><a href="https://en.wikipedia.org/wiki/Eye_of_GNOME">GNOME Image Viewer</a> (Eye of GNOME)</li>
  <li><a href="https://en.wikipedia.org/wiki/GThumb">gThumb</a></li>
  <li><a href="https://apps.kde.org/gwenview/">Gwenview</a></li>
  <li><a href="https://github.com/wkjarosz/hdrview/">HDRView</a></li>
  <li><a href="https://www.kphotoalbum.org/">KPhotoAlbum</a></li>
  <li><a href="https://gitlab.gnome.org/GNOME/sushi">Sushi</a> for GNOME Files (nautilus)</li>
</ul>

<h2 id="image-editor">Image Editor</h2>

<ul>
  <li><a href="https://www.darktable.org/">Darktable</a></li>
  <li><a href="https://www.gimp.org/">GIMP</a></li>
  <li><a href="https://inkscape.org/">Inkscape</a></li>
  <li><a href="https://krita.org/">Krita</a></li>
  <li><a href="https://www.pinta-project.com/">Pinta</a></li>
  <li><a href="https://rawtherapee.com/">RawTherapee</a></li>
</ul>

<h2 id="media-player">Media Player</h2>

<ul>
  <li><a href="https://celluloid-player.github.io/">Celluloid</a></li>
  <li><a href="https://github.com/Rafostar/clapper">Clapper</a></li>
  <li><a href="https://apps.kde.org/dragonplayer/">Dragon Player</a></li>
  <li><a href="https://invent.kde.org/multimedia/haruna">Haruna</a></li>
  <li><a href="https://apps.kde.org/kaffeine/">Kaffeine</a></li>
  <li><a href="https://mplayerhq.hu/">MPlayer</a></li>
  <li><a href="https://mpv.io/">MPV</a></li>
  <li><a href="https://docs.xfce.org/apps/parole/">Parole</a></li>
  <li><a href="https://github.com/zaps166/QMPlay2">QMPlay2</a></li>
  <li><a href="https://www.smplayer.info/">SMPlayer</a></li>
  <li><a href="https://www.videolan.org/vlc/">VLC Media Player</a></li>
</ul>

<h2 id="messaging">Messaging</h2>

<ul>
  <li><a href="https://dino.im/">Dino</a> (Jabber/XMPP)</li>
  <li><a href="https://element.io/">Element</a> (Matrix)</li>
  <li><a href="https://gitlab.gnome.org/GNOME/fractal">Fractal</a> (Matrix)</li>
  <li><a href="https://gajim.org/">Gajim</a> (Jabber/XMPP)</li>
  <li><a href="https://hexchat.github.io/">HexChat</a> (IRC)</li>
  <li><a href="https://konversation.kde.org/">Konversation</a> (IRC)</li>
  <li><a href="https://nheko-reborn.github.io/">Nheko</a> (Matrix)</li>
  <li><a href="https://pidgin.im/">Pidgin</a> (ICQ, IRC, Jabber/XMPP, etc.)</li>
  <li><a href="https://wiki.gnome.org/Apps/Polari">Polari</a> (IRC)</li>
  <li><a href="https://schildi.chat/">SchildiChat</a> (Matrix)</li>
  <li><a href="https://getsession.org/">Session</a></li>
  <li><a href="https://status.im/">Status</a></li>
</ul>

<h2 id="password-manager">Password Manager</h2>

<ul>
  <li><a href="https://authpass.app/">AuthPass</a></li>
  <li><a href="https://buttercup.pw/">Buttercup</a></li>
  <li><a href="https://keepassxc.org/">KeePassXC</a></li>
  <li><a href="https://keeweb.info/">KeeWeb</a></li>
</ul>

<h2 id="presentation">Presentation</h2>

<ul>
  <li><a href="https://www.openoffice.org/product/impress.html">Apache OpenOffice Impress</a></li>
  <li><a href="https://calligra.org/stage/">Calligra Stage</a></li>
  <li><a href="https://www.libreoffice.org/discover/impress/">LibreOffice Impress</a></li>
</ul>

<h2 id="screenshot-tool">Screenshot Tool</h2>

<ul>
  <li><a href="https://flameshot.org/">Flameshot</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Screenshot">GNOME Screenshot</a></li>
  <li><a href="https://github.com/ksnip/ksnip">Ksnip</a></li>
  <li><a href="https://apps.kde.org/spectacle/">Spectacle</a></li>
  <li><a href="https://docs.xfce.org/apps/screenshooter/">XFCE Screenshooter</a></li>
</ul>

<h2 id="spreadsheets">Spreadsheets</h2>

<ul>
  <li><a href="https://www.openoffice.org/product/calc.html">Apache OpenOffice Calc</a></li>
  <li><a href="https://calligra.org/sheets/">Calligra Sheets</a></li>
  <li><a href="http://www.gnumeric.org/">Gnumeric</a></li>
  <li><a href="https://www.jamovi.org/">Jamovi</a></li>
  <li><a href="https://www.libreoffice.org/discover/calc/">LibreOffice Calc</a></li>
</ul>

<h2 id="system-backup">System Backup</h2>

<ul>
  <li><a href="https://github.com/bit-team/backintime">Back In Time</a></li>
  <li><a href="https://wiki.gnome.org/Apps/DejaDup">Déjà Dup</a></li>
  <li><a href="https://apps.kde.org/kbackup/">KBackup</a></li>
  <li><a href="https://github.com/linuxmint/timeshift">Timeshift</a></li>
</ul>

<h2 id="system-monitoring">System Monitoring</h2>

<ul>
  <li><a href="https://github.com/brndnmtthws/conky">Conky</a></li>
  <li><a href="https://wiki.gnome.org/Apps/SystemMonitor">GNOME System Monitor</a></li>
  <li><a href="https://apps.kde.org/ksysguard/">KDE System Monitor</a> (KSysGuard)</li>
  <li><a href="https://oguzhaninan.github.io/Stacer-Web/">Stacer</a></li>
  <li><a href="https://github.com/MatthiasSchinzel/sysmon">Sysmon</a></li>
  <li><a href="https://github.com/hakandundar34coding/system-monitoring-center">System Monitoring Center</a></li>
  <li><a href="https://docs.xfce.org/apps/xfce4-taskmanager/">XFCE Task Manager</a></li>
</ul>

<h2 id="text-editor">Text Editor</h2>

<ul>
  <li><a href="https://netbeans.apache.org/">Apache NetBeans</a></li>
  <li><a href="https://cudatext.github.io/">CudaText</a></li>
  <li><a href="https://eclipseide.org/">Eclipse</a></li>
  <li><a href="https://geany.org/">Geany</a></li>
  <li><a href="https://en.wikipedia.org/wiki/Gedit">Gedit</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Text_Editor">GNOME Text Editor</a></li>
  <li><a href="https://www.gnu.org/software/emacs/">GNU Emacs</a></li>
  <li><a href="https://kate-editor.org/">Kate</a></li>
  <li><a href="https://apps.kde.org/kwrite/">KWrite</a></li>
  <li><a href="https://vscodium.com/">VSCodium</a></li>
</ul>

<h2 id="video-editor">Video Editor</h2>

<ul>
  <li><a href="https://kdenlive.org/">Kdenlive</a></li>
  <li><a href="https://shotcut.org/">Shotcut</a></li>
</ul>

<h2 id="web-browser">Web Browser</h2>

<ul>
  <li><a href="https://brave.com/">Brave</a> (chromium)</li>
  <li><a href="https://www.chromium.org/">Chromium</a> (chromium)</li>
  <li><a href="https://en.wikipedia.org/wiki/GNOME_Web">GNOME Web</a> (Epiphany, WebKit)</li>
  <li><a href="https://apps.kde.org/konqueror/">Konqueror</a> (KHTML)</li>
  <li><a href="https://librewolf.net/">LibreWolf</a> (gecko)</li>
  <li><a href="https://www.mozilla.org/firefox/">Mozilla Firefox</a> (gecko)</li>
  <li><a href="https://www.qutebrowser.org/">Qutebrowser</a> (chromium)</li>
  <li><a href="https://www.waterfox.net/">Waterfox</a> (gecko)</li>
</ul>

<h2 id="word-prosessor">Word Prosessor</h2>

<ul>
  <li><a href="https://www.abisource.com/">AbiWord</a></li>
  <li><a href="https://www.openoffice.org/product/writer.html">Apache OpenOffice Writer</a></li>
  <li><a href="https://calligra.org/words/">Calligra Words</a></li>
  <li><a href="https://gottcode.org/focuswriter/">FocusWriter</a></li>
  <li><a href="https://www.libreoffice.org/discover/writer/">LibreOffice Writer</a></li>
</ul>

<p>This is post 70 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><summary type="html"><![CDATA[Explore the vast curated list of free open source software applications by category of use for the graphical user interface of a Linux desktop.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/yoda-foss.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/yoda-foss.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Experimenting with Jekyll Relatable Posts</title><link href="https://www.adamsdesk.com/posts/experimenting-jekyll-relatable-posts/" rel="alternate" type="text/html" title="Experimenting with Jekyll Relatable Posts" /><published>2022-12-30T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/experimenting-jekyll-relatable-posts</id><content type="html" xml:base="https://www.adamsdesk.com/posts/experimenting-jekyll-relatable-posts/"><![CDATA[<p>For quite some time I’ve wanted to add related posts for each post on this website, but I just haven’t gotten around to
it out of frustration. To me the list of related posts should be actually relatable to the post a user is currently
viewing. Ultimately you want to expose more posts of interest that may otherwise be buried in the sea of content.
Doing so also helps search engines with indexing, which then just makes it easier for people to discover your wonderful
content.</p>

<h2 id="built-in">Built-in</h2>

<p>Jekyll has a built-in <a href="https://jekyllrb.com/docs/variables/#site-variables">site variable</a> “site.related_posts”, that
contains a list of up to ten related posts. The unfortunate part is the list is not related posts, but rather a list of
recent posts. Having this feature built-in is wonderful, however not fitting to what I’m wanting to achieve.</p>

<p>I realize there is another option by running Jeklly with <code class="language-plaintext highlighter-rouge">--lsi</code> parameter or by adding configuration option
<code class="language-plaintext highlighter-rouge">lsi: true</code>. Going this route does require the <a href="https://jekyll.github.io/classifier-reborn/">classifier-reborn</a> plugin.
I prefer to limit the use of plugins if at all possible, so I’ve not experimented with this option. Apparently it is
quite a slow process, though I still question if it will actually return related posts instead of recent posts.</p>

<h2 id="building-my-own">Building My Own</h2>

<p>At first, I thought this should be quite simple to create my own using an include file that would be loaded from the
post layout file. Though after spending quite some time messing around with it, I’m not sure that it is as simple as it
sounds, or it may be it’s just me complicating the situation.</p>

<p>My initial thought was to create three variables that would be put within the front matter of each post to determine
how the related posts would be generated, and then maybe a few site variables for ease of configuration later.</p>

<p>The liquid code below will generate related posts based upon the following criteria.</p>

<ul>
  <li>Generated based upon a post category, tag or title
    <ul>
      <li>Post title is case-sensitive</li>
    </ul>
  </li>
  <li>Up to five related posts can be listed</li>
  <li>Duplicate posts are ignored</li>
  <li>Generation ends once the counter reaches maximum related posts (e.g. 5)</li>
  <li>A post front matter must have at least one of the variables defined
    <ul>
      <li>related_by_category</li>
      <li>related_by_tag</li>
      <li>related_by_title</li>
    </ul>
  </li>
</ul>

<p>The following is the include file “_includes/related_posts.html” code.</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_category</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_tag</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_title</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="cp">-%}</span>
&lt;div class="card-footer"&gt;
    &lt;p class="fw-bold mb-2"&gt;Related Posts&lt;/p&gt;
    &lt;ul class="related-posts"&gt;
<span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">counter</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="cp">-%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span><span class="nv">post</span><span class="w"> </span><span class="nt">in</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">posts</span><span class="w"> </span><span class="cp">-%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="cp">-%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_category</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">categories</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_category</span><span class="w"> </span><span class="cp">-%}</span>
            &lt;li&gt;&lt;a href="<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="cp">}}</span>&lt;/a&gt;&lt;/li&gt;
            <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">counter</span><span class="o">=</span><span class="nv">counter</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">plus</span><span class="p">:</span><span class="mi">1</span><span class="w"> </span><span class="cp">-%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">elsif</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_tag</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">tags</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_tag</span><span class="w"> </span><span class="cp">-%}</span>
            &lt;li&gt;&lt;a href="<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="cp">}}</span>&lt;/a&gt;&lt;/li&gt;
            <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">counter</span><span class="o">=</span><span class="nv">counter</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">plus</span><span class="p">:</span><span class="mi">1</span><span class="w"> </span><span class="cp">-%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="nt">elsif</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_title</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">related_by_title</span><span class="w"> </span><span class="cp">-%}</span>
            &lt;li&gt;&lt;a href="<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="cp">}}</span>&lt;/a&gt;&lt;/li&gt;
            <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">counter</span><span class="o">=</span><span class="nv">counter</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">plus</span><span class="p">:</span><span class="mi">1</span><span class="w"> </span><span class="cp">-%}</span>
        <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">counter</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="cp">-%}</span>
        <span class="cp">{%</span><span class="w"> </span><span class="kr">break</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>
<span class="cp">{%-</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="cp">-%}</span>
    &lt;/ul&gt;
&lt;/div&gt;
<span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

<p>The include file easily integrated by adding the following code into the desired layout file (e.g. post.html).</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>related_posts.html<span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="usage">Usage</h2>

<p>Using my own solution each post must be manually configured with one of the following variables followed by an
associated value (e.g. <code class="language-plaintext highlighter-rouge">related_by_tag: mastodon</code>) to have the related posts feature.</p>

<ul>
  <li>related_by_category</li>
  <li>related_by_tag</li>
  <li>related_by_title</li>
</ul>

<h2 id="the-problems">The Problems</h2>

<p>This method does work, and quite quickly based on my tests. Unfortunately I see a few problems.</p>

<ol>
  <li>No protection if two or more variables are set
    <ul>
      <li>related_by_category</li>
      <li>related_by_tag</li>
      <li>related_by_title</li>
    </ul>
  </li>
  <li>Related posts listed are always going to be the most recent or oldest</li>
  <li>Related posts that are in between recent, and oldest are never exposed</li>
  <li>Requires manual configuration per post</li>
  <li>No ability to list relatable yet random posts</li>
  <li>Maintenance requires manual editing per post</li>
  <li>A post with only one duplicate relatable post will output related posts with no items</li>
  <li>A post with no relatable categories, tags or titles will still output related posts with no items</li>
</ol>

<p>I would prefer to have this done automatically based upon the categories, and/or tags of a post. However, how does one
achieve this yet still keeping the categories, and tags in control. What I mean by this is, not allowing for endless categories
and tags. For example, if I have a post with tags #100DaysToOffload, #mastodon, and #linux I would want to ignore the tag
#100DaysToOffload, and #linux as those are not as relatable to the content. Maybe I’m not creating the categories or tags properly, and that
is why I have my self uncertain as to what to do. If the categories, and tags are figured out, then one could do it based
upon how many categories, and tags match the post, so it is the most relatable as possible.</p>

<h2 id="conclusion">Conclusion</h2>

<p>I’m not looking for perfection, but I would like to come up with a solution that eliminates problems 2, 3, 4, 5, and 6.
In the end I need a solution that is easy to use, and maintain over time. As it stands now, I consider this attempt
incomplete.</p>

<p>You can see how this looks thus far by viewing the following posts with related posts enabled.</p>

<ul>
  <li><a href="/posts/list-mastodon-resources/">List of Helpful Mastodon Resources</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-one/">Slice of Life Wallpaper: Part One</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-two/">Slice of Life Wallpaper: Part Two</a></li>
  <li><a href="/posts/slice-of-life-wallpaper-part-three/">Slice of Life Wallpaper: Part Three</a></li>
</ul>

<p>What are your thoughts? Let’s continue the conversion by <a href="/contact/">contacting me</a>.</p>

<p>This is post 69 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="jekyll" /><category term="webdev" /><summary type="html"><![CDATA[Dive into my attempt at creating the related posts feature to each post page using Jekyll, Liquid template language and HTML.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/post-it-posts-vortex.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/post-it-posts-vortex.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">List of Helpful Mastodon Resources</title><link href="https://www.adamsdesk.com/posts/list-mastodon-resources/" rel="alternate" type="text/html" title="List of Helpful Mastodon Resources" /><published>2022-12-29T00:00:00-06:00</published><updated>2023-11-07T21:32:11-06:00</updated><id>https://www.adamsdesk.com/posts/list-mastodon-resources</id><content type="html" xml:base="https://www.adamsdesk.com/posts/list-mastodon-resources/"><![CDATA[<p>Mastodon is growing by the day, and there seems to be many people that are seeking help in some form or another.
So I thought it may be of help to list what I’ve come across in my travels reading about Mastodon.</p>

<p>If I’m missing a good resource, or you think I should remove a link, then please consider <a href="/contact/">contacting me</a>.</p>

<h2 id="how-to-use-mastodon">How To Use Mastodon</h2>

<ul>
  <li><a href="https://axbom.com/mastodon-tips/">10 Quick Mastodon Tips</a> by Per Axbom</li>
  <li><a href="https://jgayfer.com/inside-mastodon/">A Look Inside Mastodon</a> by James Gayfer</li>
  <li><a href="https://www.adamsdesk.com/posts/mastodon-link-verification-gitea/">Add Mastodon Link Verification for Gitea</a> by Adam Douglas</li>
  <li><a href="https://edtechfactotum.com/adding-alt-text-and-more-to-images-in-mastodon/">Adding alt text (and more) to images in Mastodon</a> by Clint Lalonde</li>
  <li><a href="https://clivethompson.medium.com/come-join-me-on-mastodon-folks-bbb073ff05d2">Come Join Me On Mastodon, Folks</a> by Clive Thompson</li>
  <li><a href="https://youtu.be/rvI3mgCMgfE">Complete guide to Mastodon for beginners</a> by eGPlearning</li>
  <li><a href="https://www.adamsdesk.com/posts/confusing-mastodon-features/">Confusion In The Land of Mastodon Features</a> by Adam Douglas</li>
  <li><a href="https://blog.djnavarro.net/posts/2022-11-03_what-i-know-about-mastodon/">Everything I know about Mastodon</a> by Danielle Navarro</li>
  <li><a href="https://fedi.tips/">Fedi.Tips</a> An unofficial guide to Mastodon and the Fediverse.</li>
  <li><a href="https://kevquirk.com/getting-started-with-mastodon/">Getting Started with Mastodon</a> by Kev Quirk</li>
  <li><a href="https://github.com/joyeusenoelle/GuideToMastodon">Guide To Mastodon</a> by Noëlle Anthony</li>
  <li><a href="https://kevquirk.com/how-does-mastodon-work/">How Does Mastodon Work?</a> by Kev Quirk</li>
  <li><a href="https://gizmodo.com/how-to-join-mastodon-twitter-alternative-elon-musk-1849739031">How to Join Mastodon, the Ad-Free Social Network Billionaires Can’t Buy</a> by Dell Cameron</li>
  <li><a href="https://www.coywolf.news/social/twitter-alternative-mastodon/">How to switch to Mastodon, the best Twitter alternative</a> by Jon Henshaw</li>
  <li><a href="https://prototypr.io/post/how-to-write-an-image-description">How to write an image description</a> by Alex Chen</li>
  <li><a href="https://www.youtube.com/watch?v=y9L1pAlW96M">Mastodon 101</a> (video) by Ryan Kawailani Ozawa</li>
  <li><a href="https://www.fosslife.org/mastodon-basics">Mastodon Basics</a> by Paul Brown</li>
  <li><a href="https://docs.joinmastodon.org/">Mastodon documentation</a></li>
  <li><a href="https://blindjournalist.wordpress.com/2022/05/01/mastodon-for-writers-and-readers/">Mastodon for writers/readers</a> by Robert Kingett</li>
  <li><a href="https://guide.toot.as/">Mastodon Guide</a></li>
  <li><a href="https://kb.adamsdesk.com/application/mastodon-profile-setup/">Mastodon Profile Setup</a> by Adam Douglas</li>
  <li><a href="https://github.com/DanielSchuman/Policy/wiki/Mastodon">Mastodon Wiki</a> by Daniel Schuman</li>
  <li><a href="https://mastodon.help/">Mastodon.help</a></li>
  <li><a href="https://initialcharge.net/2022/11/twitter-to-mastodon/">Migrating From Twitter to Mastodon</a> by Mike Rockwell</li>
  <li><a href="https://www.fabriziomusacchio.com/blog/2022-12-28-mastodon_server_migration/">Moving a Mastodon account to another server</a> by Fabrizio Musacchio</li>
  <li><a href="https://rusingh.com/new-to-mastodon-10-minutes-tips/">New to Mastodon? These 10 minutes are very important</a> by Ru Singh</li>
  <li><a href="https://uxdesign.cc/mastodon-is-antiviral-design-42f090ab8d51">Twitter alternative: how Mastodon is designed to be “antiviral”</a> by Clive Thompson</li>
  <li><a href="https://www.pcmag.com/how-to/how-to-get-started-on-mastodon-and-leave-twitter-behind">Twitter Quitter? Here’s How to Get Started on Mastodon</a> by Max Eddy</li>
</ul>

<h2 id="find-an-instance">Find an Instance</h2>

<ul>
  <li>
    <p><a href="https://fedi.garden/">Fedi.garden</a></p>

    <p>An easy and stress-free way to choose a Fediverse server.</p>
  </li>
  <li>
    <p><a href="https://fediverse.party/en/portal/servers/">Fediverse.party</a></p>

    <p>Curated list of instances by categories.</p>
  </li>
  <li>
    <p><a href="https://fediverse.space/">Fediverse.space</a></p>

    <p>Visualize networks and communities by finding instances within the fediverse.</p>
  </li>
  <li>
    <p><a href="https://joinmastodon.org/servers">joinmastodon.org</a></p>

    <p>Official instance directory that can be filtered by region, and topic.</p>
  </li>
  <li>
    <p><a href="https://instances.social/">Mastodon instances</a></p>

    <p>Search for an instance by using a wizard or a list.</p>
  </li>
  <li>
    <p><a href="https://mastodonservers.net/">Mastodon Servers</a></p>
  </li>
  <li>
    <p><a href="https://www.fediverse.to/">To The Fediverse</a> by Ayush Sharma</p>

    <p>Search or browse by category, software, language or by domain.</p>
  </li>
</ul>

<h2 id="find-people">Find People</h2>

<ul>
  <li>
    <p><a href="https://github.com/nathanlesage/academics-on-mastodon#serverscommunities">Academics on Mastodon</a></p>

    <p>Curated lists of academics on Mastodon.</p>
  </li>
  <li>
    <p><a href="https://debirdify.pruvisto.org/">Debirdify</a></p>

    <p>Find people you follow-on Twitter for possible Mastodon accounts.</p>
  </li>
  <li>
    <p><a href="https://fedifinder.glitch.me/">Fedifinder</a></p>

    <p>Join the Fediverse in 5 easy steps.</p>
  </li>
  <li>
    <p><a href="https://fedi.directory/">Fedi.Directory</a></p>

    <p>Interesting accounts to follow on Mastodon and the Fediverse.</p>
  </li>
  <li>
    <p><a href="https://followgraph.vercel.app/">Followgraph for Mastodon</a> <a href="https://github.com/gabipurcaru/followgraph">GitHub</a></p>

    <p>Find new people to follow by looking up your follows’ follows.</p>
  </li>
  <li>
    <p><a href="https://www.presscheck.org/">PressCheck.org</a></p>

    <p>Find journalists on Mastodon.</p>
  </li>
  <li><a href="https://communitywiki.org/trunk/">Trunk for the Fediverse</a></li>
  <li>
    <p><a href="https://twittodon.com/">Twittodon</a></p>

    <p>Find and follow your Twitter friends on Mastodon.</p>
  </li>
</ul>

<h2 id="hosting">Hosting</h2>

<ul>
  <li><a href="https://tomroyal.com/2022/11/07/deploying-a-tiny-mastodon-server-on-digitalocean/">Deploying a tiny Mastodon server on DigitalOcean</a> by Tom Royal</li>
  <li>
    <p><a href="https://masto.host/">Masto.Host</a></p>

    <p>Fully managed Mastodon hosting provider.</p>
  </li>
  <li><a href="https://decoded.legal/blog/2022/11/notes-on-operating-fediverse-services-mastodon-pleroma-etc-from-an-english-law-point-of-view">Notes on operating fediverse services (Mastodon, Pleroma etc) from an English law point of view</a> by Neil</li>
  <li><a href="https://rixx.de/blog/on-running-a-mastodon-instance/">On Running a Mastodon Instance</a> by Tobias Kunze</li>
  <li><a href="https://www.makeuseof.com/best-fediverse-servers-create-online-community/">The Best Fediverse Servers to Create Your Own Online Community</a> by David Rutland</li>
</ul>

<h2 id="tools">Tools</h2>

<ul>
  <li>
    <p><a href="https://fed.brid.gy/">Bridgy Fed</a></p>

    <p>Connect your website to Mastodon, and the fediverse directly or cross posting.</p>
  </li>
  <li>
    <p><a href="https://emojos.in/">Emoji list</a></p>

    <p>List of custom emojis by instance.</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/chaica/feed2toot">Feed2toot</a></p>

    <p>Automatically parses RSS feeds, identifies new posts, and posts them on Mastodon.</p>
  </li>
  <li>
    <p><a href="https://github.com/swaldman/fossilphant">Fossilphant</a></p>

    <p>A static-site generator for Mastodon archives.</p>

    <p>Language: Scala, License: GNU AGPL v3.0</p>
  </li>
  <li>
    <p><a href="https://github.com/kensanata/mastodon-archive">Mastodon Archive</a></p>

    <p>Backup your statuses, favorites, and media using Mastodon API (application programming interface).</p>
  </li>
  <li>
    <p><a href="https://mastodoncontentmover.github.io/">MastodonContentMover</a></p>

    <p>A command-line tool that will download posts from one instance and then re-post them on another instance.</p>
  </li>
  <li>
    <p><a href="https://www.mastofeed.com/">Mastofeed</a></p>

    <p>Embedded Mastodon feeds for blogs, websites, etc.</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/idotj/mastodon-embed-feed-timeline">Mastodon timeline feed widget</a></p>

    <p>Embed a Mastodon feed timeline in your web page, using CSS and JavaScript.</p>
  </li>
  <li><a href="https://scheduler.mastodon.tools/">Mastodon scheduler</a></li>
  <li>
    <p><a href="https://moa.party/">Moa</a></p>

    <p>Link your Mastodon account to Twitter.</p>
  </li>
  <li><a href="https://search.mastodon.tools/">Search Mastodon tools</a></li>
  <li>
    <p><a href="https://pleromabot.robertoszek.xyz/pleroma-bot/">Stork (pleroma-bot)</a></p>

    <p>Mirror your favorite Twitter accounts in the Fediverse, so you can follow on the desired instance or migrate to
  the Fediverse using a Twitter archive.</p>
  </li>
  <li>
    <p><a href="https://toot.pics/">toot.pics</a></p>

    <p>Quickly and easily view Mastodon media descriptions from any app using the share function on a mobile device.</p>
  </li>
  <li>
    <p><a href="https://github.com/steinareliassen/trunkfriends">Trunkfriends</a></p>

    <p>A tool to track your connections in the fediverse.</p>
  </li>
</ul>

<h2 id="statistics">Statistics</h2>

<ul>
  <li>
    <p><a href="https://fedidb.org/">FediDB</a></p>

    <p>Fediverse stats database for instances (servers) on user count, status count, software version, etc.</p>
  </li>
  <li>
    <p><a href="https://fediverse.observer">Fediverse Observer</a></p>

    <p>Another database for viewing stats of user count, up and down times, network traffic speed, etc. Additionally, a visual
  map to list each instance, and also helps to find an instance close to you.</p>
  </li>
  <li>
    <p><a href="https://the-federation.info/">The Federation</a></p>

    <p>Fediverse stats database for instances (servers) with graphs, user count, status count, software version, etc.</p>
  </li>
</ul>

<h2 id="other">Other</h2>

<ul>
  <li>
    <p><a href="https://github.com/emilebosch/awesome-fediverse">Awesome Fediverse</a></p>

    <p>Curated, collaborative list of awesome Fediverse resources.</p>
  </li>
  <li>
    <p><a href="https://project-awesome.org/tleb/awesome-mastodon">Awesome Mastodon</a></p>

    <p>Curated list of Mastodon related stuff.</p>
  </li>
  <li>
    <p><a href="https://github.com/hueyy/awesome-mastodon">Awesome Mastodon</a></p>

    <p>Curated list of awesome Mastodon-related stuff.</p>
  </li>
  <li><a href="https://blog.platypush.tech/article/Create-a-Mastodon-bot-to-forward-Twitter-and-RSS-feeds-to-your-timeline">Create a Mastodon bot to forward Twitter and RSS feeds to your timeline</a> by Fabio Manganiello</li>
  <li><a href="https://tilde.town/~petegozz/Fediverse_Glossary/">Fediverse Glossary</a></li>
  <li><a href="https://joinmastodon.org/apps">Mastodon apps</a></li>
  <li><a href="https://joinmastodon.org/branding">Mastodon Brand Toolkit</a></li>
  <li><a href="https://fediverse.party/en/mastodon/">Mastodon Fediverse.party</a></li>
  <li><a href="https://fontawesome.com/icons/mastodon?s=solid&amp;f=brands">Mastodon icon - Font Awesome</a></li>
  <li><a href="https://www.svgrepo.com/vectors/mastodon/">Mastodon logos - SVG Repo</a></li>
  <li><a href="https://commons.wikimedia.org/w/index.php?search=mastodon+logo&amp;title=Special:MediaSearch&amp;go=Go&amp;type=image">Mastodon logos - Wikimedia Commons</a></li>
  <li><a href="https://commons.wikimedia.org/w/index.php?search=mastodon+mascot&amp;title=Special:MediaSearch&amp;go=Go&amp;type=image">Mastodon mascot - Wikimedia Commons</a></li>
  <li><a href="https://botwiki.org/resource/guide/the-definitive-guide-to-creative-botmaking/">The Definitive Guide to Creative Botmaking</a></li>
</ul>

<p>This is post 68 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="mastodon" /><summary type="html"><![CDATA[Handmade list of resources for the federated social network Mastodon covering, how to use, find an instance, find people, tools and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mastodon-mascot-alt.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mastodon-mascot-alt.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Joy of Gaming</title><link href="https://www.adamsdesk.com/posts/joy-of-gaming/" rel="alternate" type="text/html" title="The Joy of Gaming" /><published>2022-12-28T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/joy-of-gaming</id><content type="html" xml:base="https://www.adamsdesk.com/posts/joy-of-gaming/"><![CDATA[<p>I’ve not been able to come up with the right words to even describe the level of shock I had when I opened one of my
Christmas gift boxes, and then realized what I was looking at. Never would I have thought someone would buy me a gift
like this.</p>

<h2 id="the-gift">The Gift</h2>

<p>I was presented a gift in a very large peculiar box sealed up with painters tape. I thought to myself, what on earth
could be in this large box that I would be gifted. Slowly I started to rip off the wrapping paper, and once the gift was
exposed I had a loss of words. At some point I think I said, “this is crazy”. The gift I saw was a Nintendo Switch, and
the video game Mario Kart 8 Deluxe. Then I was handed another gift, and opened it to find a Nintendo Switch Pro
controller. I just couldn’t believe this.</p>

<h2 id="games">Games</h2>

<p>In addition to Mario Kart 8 Deluxe, I’ve been allowed to borrow Metroid Dread, and Super Mario Odyssey. These two games
at first I thought I wouldn’t be interested in, but that is so far from the truth. I’m quite impressed by the two
games, and how much fun they are.</p>

<p>While out shopping today for a few items for New Years, I couldn’t help myself. I ended up purchasing Flashback, as well
as Streets of Rage 4 for the Nintendo Switch. I’ve only played for about an hour with Streets of Rage 4, and it is
indeed worth every cent. So now this puts me to 4 games to play, and not enough time in the day to play them like I want
to (smile). :-)</p>

<h2 id="nostalgia">Nostalgia</h2>

<p>Even as I write this now, I can’t believe I have this system, and that I can’t stop thinking about wanting to go, and
play the Nintendo Switch. It is as if spark of excitement has been lit, and I feel like a child again. The day I
received the first Nintendo Entertainment System, and the joy I recall playing on that system is as if I’m reliving
it all over again.</p>

<h2 id="conclusion">Conclusion</h2>

<p>This may not been for everyone, but I’ve always loved Nintendo for its focus on the joy of gaming, and encouraging
people to engage with one another through playing video games. To top that off they seem to always find a way to innovate
when it feels like there is nothing more to add.</p>

<p>This is post 67 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="gaming" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[A shocking gift for Christmas takes me back as a child causing me to rediscover the joy of gaming again.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/nintendo-switch-game-screenshots.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/nintendo-switch-game-screenshots.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Taking Time To Slow Down</title><link href="https://www.adamsdesk.com/posts/slow-down/" rel="alternate" type="text/html" title="Taking Time To Slow Down" /><published>2022-12-27T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/slow-down</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slow-down/"><![CDATA[<p>Today has been one of those slow days, not that I want it to be a slow day. I just felt so tired, and just no energy to get at it.
As one can see, even this post is rather dull. However, may be that is just me not looking at it all correctly. It may come down
to that I need to slow down.</p>

<h2 id="slow-down">Slow Down</h2>

<p>I’ve noticed over the past year, that if I keep pushing hard, and not allowing for time to care for myself my body will
just end up forcing me to do so. Today to me is one of those days. Experiencing this happening to me several times now or
at least being aware of it has started to make me think about it. For a lot of people we live our life quite differently
from how we used to live our lives. Too much time is spent consuming, learning, and just simply overloading ourselves. I
believe we need to slow down, and take time for some self-care.</p>

<h2 id="refuelling">Refuelling</h2>

<p>Do something relaxing, and fun that is not over whelming. This can look quite different from person to person. It’s a
state of mind we need to put ourselves into, once, and awhile to allow ourselves to recharge. Overall less time spent
staring at a screen the healthier, and happier I believe we would all be.</p>

<p>For myself, I spend a lot of time on digital devices actively engaged. I need to find time to do passive tasks, that is
not just exercise, but such things as reading a book, getting a massage, meditation, going for a walk, arts ‘n crafts,
etc. If I did on a regular schedule I think I wouldn’t be having a wasted day or days sometimes. Winter for me is harder due to
the harsh cold temperatures where I live. Cycling is really not doable to me, maybe if I had the cycling winter gear
possibly that maybe different. The point is, we need to do a variety of activities to have a balanced life, so we do
not run out of fuel to do what we want to do.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Hopefully this makes sense, and may help someone else out there. I feel so tired that I’m not even sure I’m getting
my entire point across. Lets all focus on our health, and well-being that includes healthy boundaries with the people
we have on our lives. I’m off to bed, awaiting to be blessed with another day full of energy. Good night.</p>

<p>This is post 66 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[At times I feel our bodies seem to know us better than ourselves. A discussion of self-care by choosing to slow down to refuel.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slow-down-peace.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slow-down-peace.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">‘Tis The Season For Stress and Anxiety?</title><link href="https://www.adamsdesk.com/posts/seasonal-stress/" rel="alternate" type="text/html" title="‘Tis The Season For Stress and Anxiety?" /><published>2022-12-26T00:00:00-06:00</published><updated>2023-11-07T23:04:54-06:00</updated><id>https://www.adamsdesk.com/posts/seasonal-stress</id><content type="html" xml:base="https://www.adamsdesk.com/posts/seasonal-stress/"><![CDATA[<p>I’ve been thinking a lot about the whole preparation that so many of us seem to get caught up into during the various
celebrations we may have each year. In particular events such as Christmas, Thanksgiving, New Years, etc. are quite
common times to bring on an onslaught of advertisements trying to influence us all on a social level. Then there is the
individual people and our own self unhealthy expectations such as overspending, over planing, buying gifts for
themselves for others, or putting social pressure and expectations on to others. This to me all leads to taking away
from the entire reason for celebrations that should bring a joyful experience. Let’s break down the stress, anxiety and
burden we at one time or another have gotten ourselves into and see how we can change this for the better.</p>

<h2 id="inspiration">Inspiration</h2>

<p>I originally didn’t think to write about this subject until I came across Greg Morris’ post entitled,
“<a href="https://www.gr36.com/2022/12/26/no-perfect-christmas.html">No Perfect Christmas</a>”. Greg’s post inspired me
to make my own post and, give a different take on the matter. Hopefully my take can make a positive change and be
helpful for others.</p>

<h2 id="stress--anxiety">Stress &amp; Anxiety</h2>

<p>Too often I find that such celebrations as Christmas creates stress, and even anxiety that is in most cases completely
unwarranted. For instance this year, I felt the need that I had to get the perfect gift for everyone, and may have
even felt that I had to beyond my own children when I technically there is nothing that is forcing me that I absolutely
have to for anyone. It comes down to putting this onto myself or feeling the need to, because others are doing it.
Gifting should be about the desire to want to make someone happy or help them through act of giving. As well the gift
should come with no strings attached. What I mean by this, have no expectations of someone that receives your gifts. Be
respectful, and understanding that the gift you gave is the love, joy, and happiness you wish to give them, not directly
the gift itself. As well once the gift has been received, they giftee can choose to do with the present as they wish.
Do not take offense, as their actions are not directly related to your act, and hard work to get, and give the gift.
A perfect gift doesn’t exist, the best one can do is being thoughtful, and caring in whatever your gift may be.</p>

<h2 id="burden">Burden</h2>

<p>We are overwhelmed with advertisements during Christmas that in itself can bring on the burden of stress that certain
expectations must be met. We all have the power to not allow ads to influence us, and alter our thoughts. Plus I feel
times have changed, and it has been forgotten that a gift is not always something that one purchases in a store. The gift
can be anything, an act of helping, self-made, cooking a meal, etc. It is entirely okay as well to not give a gift no
matter the reason. That is ones free will and choice to make. How someone else may react is their choice, even if that
means the reaction is not respectful to you. Let that burden go, because you have the power to control not allowing
negative situations ruin times of joy.</p>

<p>Another burden that comes indirectly is over committing one self, whether that be trying to do too much in too little
time, or by over spending on the various gifts, food, drinks, etc. for the celebrations. What helps is to choose to
change one’s thoughts or perspective on the situation that it is not a burden, but rather a time to share joy
together. Having a budget and planning ahead helps to stop the unnecessary stress or anxiety to build. Remember, none of
us should be putting ourselves into a situation that we go into debt just so a gift can be given or trying to create
that perfect celebration that is not realistic to our present reality.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Celebration is a time of which we get to spend time with the ones we love and care about. The joy of interacting with
one another is where the focus should be, and seeing smiles on peoples faces as they have fun together. Allow such times
to be a great experience instead of focusing on the negative. In the end, everything will work out.</p>

<p>This is post 65 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Should major events we all celebrate such as Christmas be a time of stress, anxiety, and burden when they all could be a positive joyful experience?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/seasonal-stress-anxiety.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/seasonal-stress-anxiety.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Merry Christmas from Adamsdesk</title><link href="https://www.adamsdesk.com/posts/merry-christmas-2022/" rel="alternate" type="text/html" title="Merry Christmas from Adamsdesk" /><published>2022-12-25T00:00:00-06:00</published><updated>2023-07-30T20:22:21-06:00</updated><id>https://www.adamsdesk.com/posts/merry-christmas-2022</id><content type="html" xml:base="https://www.adamsdesk.com/posts/merry-christmas-2022/"><![CDATA[<p>Life is about enjoying our experiences and interactions with one another, so choose to have fun in these moments, and
remember to stay safe. May everyone have a wonderful time with family and friends during this holiday season.</p>

<p>Merry Christmas and best wishes!</p>

<p>This is post 64 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[A thoughtful message to remember the reasons why we enjoy these times with seasons greetings, and best wishes for 2022 celebrations from Adamsdesk.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/merry-christmas-2022.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/merry-christmas-2022.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add Copyright Year Automatically to any Website</title><link href="https://www.adamsdesk.com/posts/automatic-copyright-year/" rel="alternate" type="text/html" title="Add Copyright Year Automatically to any Website" /><published>2022-12-24T00:00:00-06:00</published><updated>2023-01-11T20:15:19-06:00</updated><id>https://www.adamsdesk.com/posts/automatic-copyright-year</id><content type="html" xml:base="https://www.adamsdesk.com/posts/automatic-copyright-year/"><![CDATA[<p>The copyright year on a website is pretty much a given no matter what license one ends up choosing. As the years go by,
the copyright should be updated, yet more often then not it ends up getting forgotten. The best way to handle it is,
to write a little bit of code to have the year automatically be updated for you. No more having to remember to do it,
it’s done from the beginning. Here are some simple code examples to accomplish having the year updated for you
automatically in various common web languages.</p>

<p>All the solutions provided below will display the copyright year in two different ways. If the “currentYear” is not
equal to the “startYear”, then the “startYear” and “currentYear” will be displayed (e.g. 2004 - 2022). Each example
requires the “startYear” variable to be set to the first year of copyright. Else if the current year is the “startYear”
then only one year will be displayed (e.g. 2004).</p>

<h2 id="liquid">Liquid</h2>

<p>Copy the Liquid template language code and paste into the desired file.</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">startYear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"2004"</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">currentYear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"now"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">date</span><span class="p">:</span><span class="w"> </span><span class="s2">"%Y"</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">currentYear</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nv">startYear</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">capture</span><span class="w"> </span><span class="nv">copyrightYear</span><span class="w"> </span><span class="cp">%}{{</span><span class="w"> </span><span class="nv">startYear</span><span class="w"> </span><span class="cp">}}</span> - <span class="cp">{{</span><span class="w"> </span><span class="nv">currentYear</span><span class="w"> </span><span class="cp">}}{%</span><span class="w"> </span><span class="nt">endcapture</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">else</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">capture</span><span class="w"> </span><span class="nv">copyrightYear</span><span class="w"> </span><span class="cp">%}{{</span><span class="w"> </span><span class="nv">currentYear</span><span class="w"> </span><span class="cp">}}{%</span><span class="w"> </span><span class="nt">endcapture</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

<p>Reference the Liquid variable “copyrightYear” where the copyright year is to be displayed.</p>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="code"><pre><span class="nt">&lt;footer&gt;</span>
    <span class="nt">&lt;p&gt;</span>
        Copyright <span class="ni">&amp;copy;</span> {{ copyrightYear }}
    <span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/footer&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="php">PHP</h2>

<p>Add the following code to the desired PHP file.</p>

<figure class="highlight"><code class="language-php" data-lang="php"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="code"><pre><span class="cp">&lt;?php</span>
<span class="k">function</span> <span class="n">getCopyrightYear</span><span class="p">(){</span>
    <span class="nv">$startYear</span> <span class="o">=</span> <span class="mi">2004</span><span class="p">;</span>
    <span class="nv">$currentYear</span> <span class="o">=</span> <span class="nb">date</span><span class="p">(</span><span class="s1">'Y'</span><span class="p">);</span>
    <span class="k">return</span> <span class="p">(</span><span class="nv">$startYear</span> <span class="o">!=</span> <span class="nv">$currentYear</span> <span class="o">?</span> <span class="nv">$startYear</span> <span class="mf">.</span> <span class="s1">' - '</span> <span class="o">:</span> <span class="s1">''</span><span class="p">)</span> <span class="mf">.</span> <span class="nv">$currentYear</span><span class="p">;</span>
<span class="p">}</span>
<span class="cp">?&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<p>To display the copyright year call the function <code class="language-plaintext highlighter-rouge">getCopyrightYear()</code>.</p>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="code"><pre><span class="nt">&lt;footer&gt;</span>
    <span class="nt">&lt;p&gt;</span>
        Copyright <span class="ni">&amp;copy;</span> <span class="cp">&lt;?php echo getCopyrightYear(); ?&gt;</span>
    <span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/footer&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="javascript">JavaScript</h2>

<p>Add the simple JavaScript code to the footer on a website.</p>

<figure class="highlight"><code class="language-html" data-lang="html"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre><span class="nt">&lt;footer&gt;</span>
    <span class="nt">&lt;p&gt;</span>
        Copyright <span class="ni">&amp;copy;</span> <span class="nt">&lt;script&gt;</span>
            <span class="nx">startYear</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">2004</span><span class="dl">"</span><span class="p">;</span>
            <span class="nx">currentYear</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Date</span><span class="p">().</span><span class="nf">getFullYear</span><span class="p">();</span>
            <span class="k">if</span><span class="p">(</span><span class="nx">currentYear</span> <span class="o">!=</span> <span class="nx">startYear</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">copyrightYear</span> <span class="o">=</span> <span class="nx">startYear</span> <span class="o">+</span> <span class="dl">"</span><span class="s2"> - </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">currentYear</span>
            <span class="p">}</span>
            <span class="k">else</span> <span class="p">{</span>
                <span class="nx">copyrightYear</span> <span class="o">=</span> <span class="nx">startYear</span>
            <span class="p">}</span>
            <span class="nb">document</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="nx">copyrightYear</span><span class="p">);</span>
        <span class="nt">&lt;/script&gt;</span>
    <span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/footer&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<p>This is post 63 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[How to add the copyright year to a website and have it updated automatically using Liquid template language, PHP or JavaScript.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/copyright-symbol.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/copyright-symbol.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Little Bits: Issue #1</title><link href="https://www.adamsdesk.com/posts/little-bits-issue-1/" rel="alternate" type="text/html" title="Little Bits: Issue #1" /><published>2022-12-23T00:00:00-06:00</published><updated>2023-01-11T21:25:58-06:00</updated><id>https://www.adamsdesk.com/posts/little-bits-issue-1</id><content type="html" xml:base="https://www.adamsdesk.com/posts/little-bits-issue-1/"><![CDATA[<p>Welcome to the very first issue of the series “Little Bits”. Each issue of the series will contain two parts, a
brief intro, and then no more than 10 unique or interesting bits (links)) of the Internet I find worthy to share. The
format is intended to be short and to the point.</p>

<p>At first this will be a work in progress as I figured this out. As it stands right now, I’m not even sure how often an
issue should come out. I’m open to hearing your feedback. Do I have too many links or not enough? Should I be adding
something? What are your thoughts on the bits shared? Care to share a bit with me? Either way feel free to
<a href="/contact/">contact me</a>.</p>

<h2 id="bits">Bits</h2>

<ul>
  <li>
    <p><a href="https://dzuk.zone/emoji">Free emoji packs</a> by Dzuk</p>

    <p>Choose from a variety of colorful and modern emoji packs available for download under the Creative Commons BY-NC-SA 4.0 license.</p>
  </li>
  <li>
    <p><a href="https://tomlehrersongs.com/">Songs, Lyrics and Music Sheets</a> by Tom Lehrer</p>

    <p>As of November 1, 2022 the lyrics, music written or composed by Tom Lehrer has been release into the public domain.
  I suggest checking it sooner than later, as who knows how long the website will remain online.</p>
  </li>
  <li>
    <p><a href="https://design.google/library/catching-up-with-erik-spiekermann/">Catching up with Erik Spiekermann</a></p>

    <p>The well known author Erik Spiekermann teams up with Google Fonts to release a new edition of his book “Stop
  Stealing Sheep and find out how type works” available free in portable document format (PDF) to all under a Creative
  Commons license. The book is a guide to typography and is explained in everyday layman’s terms what it is and how to
  use it. A print book is available for purchase,
  <a href="https://www.isdistribution.com/BookDetail.aspx?aId=162311">ISD Book Distributor</a> or
  <a href="https://www.toc.berlin/products/erik-spiekermann">The Other Collection</a>.</p>
  </li>
  <li>
    <p><a href="https://whitebataudio.com/">White Bat Audio</a> by Karl Casey</p>

    <p>A wonderful resource for the modern age, whether you are streaming or requiring music for a video. Karl has you
  covered by providing royalty free stream safe music. For those wishing to download the music, checkout the YouTube
  videos to find the link in the description and of course read the
  <a href="https://whitebataudio.com/license-agreement/">Free Music license agreement</a>.</p>
  </li>
  <li>
    <p><a href="https://detexify.kirelabs.org/classify.html">Detexify LaTex handwritten symbol recognition</a> by Philipp Kühl &amp; Daniel Kirsch</p>

    <p>Search for LaTex symbols with ease by drawing the symbol by simply using your finger or mouse.</p>
  </li>
  <li>
    <p><a href="https://systemd-by-example.com/">systemd by example</a> by Sebastian Jambor</p>

    <p>Learn systemd interactively from a web browser without the danger of breaking your system.</p>
  </li>
  <li>
    <p><a href="https://ssl-config.mozilla.org/">SSL Configuration Generator</a> by Mozilla</p>

    <p>A helpful resource to generate 20 different software configuration files to help keep your service secure.</p>
  </li>
  <li>
    <p><a href="https://www.theleagueofmoveabletype.com/">The League of Moveable Type</a></p>

    <p>Beautiful free open source fonts along with a newsletter and podcast to feed your design desires.</p>
  </li>
  <li>
    <p><a href="http://www.sierrachest.com/">The Sierra Chest</a></p>

    <p>A fan site dedicated to preserving the legacy of the gaming giant Sierra. This isn’t just about the games, this site
  has everything related to Sierra. Such things include, magazines, walkthroughs, hints, music, etc.</p>
  </li>
  <li>
    <p><a href="https://darebee.com/">DAREBEE</a></p>

    <p>Free fitness resources by a non-profit, ad-free and product placement-free, DAREBEE. All resources are available
  free of charge to download and print. The site claims all information is thoroughly researched and tested. The
  system is funded by donations only.</p>

    <p>Resources include…</p>

    <ul>
      <li>The manual (getting started guide)</li>
      <li>Programs</li>
      <li>Individual workouts</li>
      <li>Exercise of the day</li>
      <li>Workout of the day</li>
      <li>Challenges</li>
      <li>Video exercise library</li>
      <li>The HIVE community (support/discussion)</li>
    </ul>
  </li>
</ul>

<p>This is post 62 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Come with me on a journey to discover the unique, creative, and joyful side of the Internet with these bits (links).]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-1.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/little-bits-issue-1.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Markdown Viewers for the Linux Command Line</title><link href="https://www.adamsdesk.com/posts/linux-markdown-viewers/" rel="alternate" type="text/html" title="Markdown Viewers for the Linux Command Line" /><published>2022-12-22T00:00:00-06:00</published><updated>2023-05-18T13:24:15-06:00</updated><id>https://www.adamsdesk.com/posts/linux-markdown-viewers</id><content type="html" xml:base="https://www.adamsdesk.com/posts/linux-markdown-viewers/"><![CDATA[<p>Though Markdown files are text based, at times it would be handy to have syntax highlighting or rendering of the
document for ease of reading in the Linux terminal. Viewers usually solve this by providing a simple, light weight and
fast user experience. Let’s find out what these solutions have to offer.</p>

<h2 id="bat">Bat</h2>

<p>The software application here is not directly intended as a markdown viewer, but rather as cat clone with syntax
highlighting and Git integration. However, it does work quite well. The project is primarily written in Rust and
describes Bat as “A cat clone with wings”. When launching the application, you are presented with a nice clean
interface, with filename at the top and a column on the left showing the line numbers, and on the right the document
content. Syntax highlighting is definitely Bat’s strong suite with over 166 supported language as of this post. On top
of that when viewing files there are indicators shown beside the line numbers which lines have been altered according
to the git index. Another nice feature of this viewer is the fact that it can be told to show non-printable characters,
which is always handy when trying to locate that problem character. The pager used is less by default, but can be
changed to the desired command. One last feature that I have to say can be nice to use, is the ability to view multiple
files at once. Each file is shown in the viewer one after another. I would suggest looking at the command line help, as
there is quite a lot that can be done.</p>

<p><img src="/assets/img/posts/bat-screenshot.webp" alt="Screenshot of the Bat rendering a Markdown document within the Kitty terminal." loading="lazy" width="1080" height="540" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/sharkdp/bat">GitHub</a></li>
  <li>License: <a href="https://github.com/sharkdp/bat/blob/master/LICENSE-APACHE">Apache-2.0</a>, <a href="https://github.com/sharkdp/bat/blob/master/LICENSE-MIT">MIT</a></li>
  <li>Tested version: 0.23.0</li>
</ul>

<h2 id="frogmouth">Frogmouth</h2>

<p>The command line Markdown browser as it is described achieves a polished look and feel utilizing the Textual Python
framework within a text user interface (TUI) that allows for ease of navigation with the use of a keyboard or mouse.
The interface supports both a light and dark mode theme. Markdown documents can be opened directly from the command
line, through its own local file browser or by using the address bar. While viewing Markdown documents one can easily
scroll with the mouse or use the keyboard to page up and down. It is nice to see that links are clickable, though I
could not figure how to navigate the document itself to open a link using the keyboard. Additional features include a
document table of contents shown within the navigation bar under “Contents” along with a local file browser, bookmarks,
and history. From what I’ve tested Markdown rendering seems to handle basic syntax along with some extended syntax, such
as headings, bold, italic, blockquote, ordered lists, unordered lists, code with syntax highlighting, horizontal rule,
links, tables, task list and more. The application configuration settings, bookmarks and history are all stored in JSON
(JavaScript Object Notation) format in their applicable location. On Linux the configuration is stored within the user’s
home directory at “~/.config/textualize/frogmouth/” and the bookmarks along with history is stored at
“~/.local/share/textualize/frogmouth/”. With the use of Python this makes the application quite portable for support of
running on Linux, macOS, and Windows operating systems.</p>

<p><img src="/assets/img/posts/frogmouth-screenshot.webp" alt="Screenshot of the Frogmouth rendering a Markdown document within the Kitty terminal." loading="lazy" width="1080" height="540" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/textualize/frogmouth">GitHub</a></li>
  <li>License: <a href="https://github.com/Textualize/frogmouth/blob/main/LICENSE">MIT</a></li>
  <li>Tested version: 0.5.0</li>
</ul>

<h2 id="glow">Glow</h2>

<p>This colorful Go language based viewer is definitely the one with the most pizzazz as the project describes it. It
works directly from the command line, but also provides a text user interface (TUI) with optional mouse support. To use
TUI-mode simply run the command without providing a filename and once loaded all the markdown files are shown in a list
for ease of browsing. The app can be configured to set styles (dark, light, auto), show local files only (TUI-mode
only), mouse support (TUI-mode only), pager, word-wrap width. An added feature called stash provides the ability to
store markdown files into your own private encrypted collection. To top this all off the viewer also is able to edit
local files and copy file contents.</p>

<p><img src="/assets/img/posts/glow-screenshot.webp" alt="Screenshot of the Glow rendering a Markdown document within the Kitty terminal." loading="lazy" width="1080" height="540" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/charmbracelet/glow">GitHub</a></li>
  <li>License: <a href="https://github.com/charmbracelet/glow/blob/master/LICENSE">MIT</a></li>
  <li>Tested version: 1.5.1</li>
</ul>

<h2 id="inlyne">Inlyne</h2>

<p>A Rust based browserless markdown viewer powered by the GPU (graphics processing unit) that doesn’t require the use of
Electron or Chrome. This slim viewer handles basic HTML rendering with the power of detecting live file modifications
along with optional mouse support and clickable links. A handy feature to use alongside your favorite text editor.
Presently Inlyne supports tables, sizable images, code blocks, lists, check/task lists, links, hidden details, alignment
of text/image, quote blocks, and text styles (bold, italics, underline, small). If you want something fast with basic
support this viewer maybe for you.</p>

<p><img src="/assets/img/posts/inlyne-screenshot.webp" alt="Screenshot of the Inlyne rendering a Markdown document within the Kitty terminal." loading="lazy" width="1080" height="540" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/trimental/inlyne">GitHub</a></li>
  <li>Licnese: <a href="https://github.com/trimental/inlyne/blob/main/LICENSE">MIT</a></li>
  <li>Tested version: 0.3.0</li>
</ul>

<h2 id="mdcat">Mdcat</h2>

<p>Command line application mdcat is refereed to as a fancy cat for Markdown and is intended to be used with
<a href="https://sw.kovidgoyal.net/kitty/index.html">Kitty</a> or <a href="https://iterm2.com/">iTerm2</a> terminals with a good font that has
italic characters. When opening a document the rendering shows the title at the top with modified front matter and then
the body. Code blocks have syntax highlighting using <a href="https://github.com/trishume/syntect">syntect</a>. Links within the
document a rendered nicely hiding the link address and making the link clickable to view. If images are present they
will be loaded inline in supported terminals only. One observation I noticed is, the viewer by default does not use a
pager. The pager though can be enabled with the parameter <code class="language-plaintext highlighter-rouge">-p</code>.</p>

<p><img src="/assets/img/posts/mdcat-screenshot.webp" alt="Screenshot of the mdcat rendering a Markdown document within the Kitty terminal." loading="lazy" width="1080" height="540" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/swsnr/mdcat">GitHub</a></li>
  <li>License: <a href="https://github.com/swsnr/mdcat/blob/main/LICENSE">MPL-2.0</a></li>
  <li>Tested version: 2.0.3</li>
</ul>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>There were a few areas that I was disappointed in, mdcat doesn’t support rendering tables, not all viewers have the
ability to search within a document, Frogmouth opens up the last viewed document and Frogmouth doesn’t allow for
disabling the history feature. Overall I feel each viewer has its strong points and anyone of them could easily do the
job. It really comes down to an individual of what is preferred, and how it can all work together in one’s workflow.</p>

<p>This is post 61 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="commandline" /><summary type="html"><![CDATA[Investigate, play, and explore the benefits of using one of these Linux command line interface application Markdown viewers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/linux-markdown-viewers.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/linux-markdown-viewers.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Are Quality Products a Thing of the Past?</title><link href="https://www.adamsdesk.com/posts/quality-products/" rel="alternate" type="text/html" title="Are Quality Products a Thing of the Past?" /><published>2022-12-21T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/quality-products</id><content type="html" xml:base="https://www.adamsdesk.com/posts/quality-products/"><![CDATA[<p>I’ve spent more time than I care to admit researching for various products and what brand I would purchase. My reasoning
to justify the time I spend researching is, I work hard for my money, why create unnecessary waste and I want to feel
satisfied with my purchase. In my mind we are in times for quite a while where far too often products are produced
for the primary goal to break and be thrown away, so another purchase is done and then so we can repeat this process.</p>

<h2 id="quality">Quality</h2>

<p>Products cannot not necessarily last forever and that is understandable, but products have become a problem in itself by
not lasting as long as they should within reason and cause one to have issues or even harm that makes one have to
purchase another product to solve the problem. There was a time when products and even services for that matter were
created for the purchase to solve a problem and provide a solution with quality assurance and then make money from it.
Now the new norm is make the highest amount of money first while selling a cheap product that encourages consumers to
buy more. A perfect example is our simple, yet necessary home appliances like, stoves, refrigerators, washing machine,
etc. use to be manufacture to last 25+ years, now one is lucky to sometimes even reach 5 years. Another example is small
appliances like a toaster, used to last 20+ years and now your lucky they even work properly from the day of purchase.
Where I live and even online, I’ve noticed that more and more product with quality are only found under industrial or
commercial use. Heck some many not even exist anymore. I’m not saying products in general have not improved, what I’m
saying is that far too often many quality products either do not exist now or are not obtainable to the average person
due to absurd price tag.</p>

<h2 id="saturation">Saturation</h2>

<p>It’s pretty hard to deny that in the manufacturing market was long ago reached a point of saturation. Which in turn
makes it hard for a consumer to make the decision on what brand of product to purchase due endless choices. Due to so
many businesses in the market they seem to not have much care or thought. I’ve noticed for many years now that due to
this saturation business now have to either acquire other business or try to find an area in the market that is lacking
focus in order to survive.</p>

<h2 id="capitalism">Capitalism</h2>

<p>It’s hard to me not to wonder that capitalism is the major part of the problem. At least from a social standpoint. It
seems to be viewed in a general sense as work hard, take advantage, and maximize profitability. As a business it makes
complete sense to want to maximize profits, but what is missing is balance. There is more to a business then profits.</p>

<p>A company is created to either produce/distribute or provide services for the main reason to solve a problem or need.
Then the said product or services is sold based upon the why. Majority of purchases are based upon what the company
represents, stands for and their goals which is the why. It just all feels to me that the focus and balance of
a good business seems to be lost for a lot that operate today.</p>

<p>My belief is that a company should reflect regularly to ensure that it, solves a problem, provides quality solutions,
positively impacts the environment, and fosters healthy treatment of their consumers and employees. The new norm on
the other hand, fosters unrealistic industries with false expectations in sales goals, profit margins, throughput,
worker environment and treatment, etc. without considering the harm it does to our market, environment, consumers and
workers.</p>

<h2 id="communication--education">Communication &amp; Education</h2>

<p>Not all, but many companies now lack proper communication and education. An example of this is, when go to look up
a product one is presented with marketing material (communication) that lacks substance and seems to focus on
providing useless facts as I call fluff. The fluff draws the consumer away from what matters and what should be
taught and educated on. Another is when a product is purchased there is limited or no documentation provided.
A really important one that seems lost is the lack of training employees. This part just completely baffles my mind.</p>

<p>It is import to educate and communicate to the consumer in helping them make decisions and have understanding why
their brand should be chosen. As well train employees on how they can best do their job to help consumers and follow
company processes. Though it is not just the company’s responsibility, but also the consumer, and employee.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In the end of it all, I just want quality product that doesn’t make me feel like I’ve flushed my money down the drain
and that I voted for a company that doesn’t deserve it. How we choose to spend our money is an individual’s choice, but
just remember each time money is spent we are voting for that company to continue on operating.</p>

<p>This is post 60 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[A consumer's perspective on quality products and how market saturation, capitalism, communication and education has contributed to the problem.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/broken-light-bulb-smoke.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/broken-light-bulb-smoke.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Slice of Life Wallpaper: Part Three</title><link href="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-three/" rel="alternate" type="text/html" title="Slice of Life Wallpaper: Part Three" /><published>2022-12-20T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-three</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-three/"><![CDATA[<p>I’ve always loved looking a photographs or artwork that truly captures ones mind. Such pieces to me can never stop to
amaze you how many times you study the image, there is always something new to discover. Artwork like this seems to
have an effect almost like it’s communicating to you. I’ve not quite figured this it out honestly. I can understand
the beauty and how there is so much detail, but not too much detail that it still draws you in no matter how long
you’ve had time with it. What I’ve not been able to figure out is, what creates that interest for the piece that
never seems to end? What is it that one enjoys so much about it? Something for my future self to figure out.</p>

<p>Hopefully one or more of the following curated slice of life wallpapers will capture you mind and allow for
contemplation.</p>

<h2 id="wallpapers">Wallpapers</h2>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/yxjg5d" title="View source">
        <img src="/assets/img/posts/wallpaper-lofi-girl-zelda-juan-pablo-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Colorful cartoon style of Zelda working at a desk with headphones, quill in hand and a lamp on with the light shinning down on to the paper." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/yxjg5d" title="View source">
            Lofi Girl by Juan Pablo Machado (Zelda) (2560 x 1440 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/ym3wus/untitled_by_me/" title="View source">
        <img src="/assets/img/posts/wallpaper-untitled-eh_dang-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A child sitting on the floor playing a video game in front of an entertainment shelving." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/ym3wus/untitled_by_me/" title="View source">
            Untitled by eh_dang (2792 x 2792 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/g7z7gd" title="View source">
        <img src="/assets/img/posts/wallpaper-lofi-girl-sleeping-juan-pablo-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="An overview of bedroom, girl and cat sleeping on the bed while listen to music with a warm sunlight coming into the room." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/g7z7gd" title="View source">
            Lofi Girl Sleeping by Juan Pablo Machado (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/g7d96e" title="View source">
        <img src="/assets/img/posts/wallpaper-pickup-truck-igor-artyomenko-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Cloudy blue sky with a blue pickup truck parked in a field of grass next to a girl laying down reading." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/g7d96e" title="View source">
            Pickup Truck by Igor Artyomenko (5120x3509 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/q2zrdl" title="View source">
        <img src="/assets/img/posts/wallpaper-mystery-shack-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Rain falls as one looks into the distance between trees, a triangle shaped building with the name, Mystery Shack." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/q2zrdl" title="View source">
            Mystery Shack (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/Art/comments/wvgz2v/metropolitan_madness_me_3d_2022/" title="View source">
        <img src="/assets/img/posts/wallpaper-metropolitan-madness-aliabbasx-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Person sits on top of a building with the glow of the lights from the surrounding billboards and buildings." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/Art/comments/wvgz2v/metropolitan_madness_me_3d_2022/" title="View source">
            Metropolitan Madness by aliabbasX (3750 x 5250 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/EaDPkK" title="View source">
        <img src="/assets/img/posts/wallpaper-tophx-panda-cover-voyager-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Japanese Lofi Cover Arts for Tophat's Panda EP: Samurai Bebop &amp; Beauty." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/EaDPkK" title="View source">
            Samurai Bebop / Beauty EP Cover by Christian Benavides (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/q6dg5q" title="View source">
        <img src="/assets/img/posts/wallpaper-driving-fireworks-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Three people in a car are sleeping as fireworks go off in the distance while one drives." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/q6dg5q" title="View source">
            Driving (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.wallpaperflare.com/anime-anime-girls-brunette-long-hair-brown-eyes-looking-away-wallpaper-ypmkm" title="View source">
        <img src="/assets/img/posts/wallpaper-parked-cars-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A woman lays between two lanes of parked cars while holding on to a car sitting on her stomach." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.wallpaperflare.com/anime-anime-girls-brunette-long-hair-brown-eyes-looking-away-wallpaper-ypmkm" title="View source">
            Parked Cars (5120 x 3200 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.wallpaperflare.com/female-anime-character-sitting-on-chair-near-laptop-computer-wallpaper-wallpaper-cnri" title="View source">
        <img src="/assets/img/posts/wallpaper-student-at-work-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Student sitting at a desk in front of laptop while looking away." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.wallpaperflare.com/female-anime-character-sitting-on-chair-near-laptop-computer-wallpaper-wallpaper-cnri" title="View source">
            Student at Work (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/D5Q6D9" title="View source">
        <img src="/assets/img/posts/wallpaper-commission-work-faiz-azhar-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A scene of people within a restaurant busy eating and socializing." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/D5Q6D9" title="View source">
            Commission Work by Faiz Azhar, illustration by Kyokaz (1920 x 863, scalable)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/2xnDax" title="View source">
        <img src="/assets/img/posts/wallpaper-respark-faiz-azhar-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Various patrons go about their business within a restaurant setting." loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/2xnDax" title="View source">
            Respark by Faiz Azhar (1920 x 1080)
        </a>
    </figcaption>
</figure>

<p>This is post 59 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="100DaysToOffload" /><category term="artwork" /><summary type="html"><![CDATA[Will you join in this series of curated high resolution wallpapers to find a sense of connection that will allow for contemplation?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-three.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-three.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cleaning Up Blog Tags and Categories</title><link href="https://www.adamsdesk.com/posts/clean-tags-categories/" rel="alternate" type="text/html" title="Cleaning Up Blog Tags and Categories" /><published>2022-12-19T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/clean-tags-categories</id><content type="html" xml:base="https://www.adamsdesk.com/posts/clean-tags-categories/"><![CDATA[<p>For quite some time now I’ve been wanting to sit down and clean up the topics (categories) and tags that I use on this
website. I’ve not come up with a detailed strategy on when, how and why I would create another topic or tag. However,
I’ve made some major headway on reducing the use overall to try and keep things clean and optimized.</p>

<h2 id="clean-up">Clean Up</h2>

<p>Looking over my topics I noticed that I had quite a few that really were duplicates of the main topic I wanted to use,
so I eliminated those topics and moved the posts under the topic I wanted. After that I just removed the topics that
were barely being used and just outright unnecessary. As I was doing this I kept asking myself do I want this to become
content on my website that warranted a topic for it? In a lot of cases my answer was no and that the post could easily
be associated to another topic.</p>

<p>Next I tackled the tags, again I found a lot of tags that were just either duplicates or useless to have such as 2k,
4k, adapter, etc. This kind of tags to me are not benefiting anyone. After that I looked for tags that were not
necessary to have due to the fact that the tag duplicated what was already written in the title and didn’t need yet
another tag.</p>

<p>In the process of cleaning things up I discovered on the pages that listed the topics and tags that the last item would
get duplicated. Thankfully it was just a simple logic bug, though it did take about 20 minutes to spot the obvious
(smile) mistake.</p>

<h2 id="making-a-plan">Making a Plan</h2>

<p>In all honesty I really want to make a strategy or guidelines that I would refer upon to determine when a topic or tag
is created. Unfortunately at the moment of writing this I’ve oddly not been able to locate decent articles on this
subject. The few articles I did find were not that helpful and seemed to imply that one should stick to 5 to 10 topics
(categories) total with one per post and tags about 6 maximum per post. No mention of maximum tags, nor was there
explanation as to the reason why. Past articles, I’ve read I swear covered this topic. I can vaguely remember even
talking about this on Mastodon with people, but I was unable recall them and do not have a bookmark either.</p>

<p>Keeping the benefits of search engine optimization and ease of human discover to me should be important. So, if anyone
happens to know of good content that helps with this process in having effective topics and tags please let me know.</p>

<h2 id="stats">Stats</h2>

<p>Here are the end results of several hours of work.</p>

<table class="table table-striped table-hover mb-4">
  <tbody>
    <tr>
      <td>Item Name</td>
      <td>Before</td>
      <td>After</td>
      <td>Removed</td>
    </tr>
    <tr>
      <td>Paginated pages</td>
      <td>136</td>
      <td>51</td>
      <td>85</td>
    </tr>
    <tr>
      <td>Topics (categories)</td>
      <td>38</td>
      <td>16</td>
      <td>22</td>
    </tr>
    <tr>
      <td>Tags</td>
      <td>139</td>
      <td>29</td>
      <td>110</td>
    </tr>
  </tbody>
</table>

<p>This is post 58 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="jekyll" /><summary type="html"><![CDATA[How I tackled cleaning up over use of blog categories (topics) and tags resulting in quite a reduction of unnecessary pages.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/broom-clean-tags-categories.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/broom-clean-tags-categories.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Cyberspace Inquisition #6: The End</title><link href="https://www.adamsdesk.com/posts/a-cyberspace-inquisition-6/" rel="alternate" type="text/html" title="A Cyberspace Inquisition #6: The End" /><published>2022-12-18T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/a-cyberspace-inquisition-6</id><content type="html" xml:base="https://www.adamsdesk.com/posts/a-cyberspace-inquisition-6/"><![CDATA[<p>The blog series “A Cyberspace Inquisition” was created to share the interesting content that I would discover throughout
my journey of browsing the Internet. Each issue would start off with a short paragraph highlighting a theme (e.g.
imagination, wonder, insight, etc.), then list the featured content links each with short description. The main goal
was to show the joy, excitement of what can be discovered online all in a nice short format as in TLDR (too long;
didn’t read).</p>

<h2 id="contemplation">Contemplation</h2>

<p>Quite some time has past since the last issue of “A Cyberspace Inquisition”, and I’ve been giving it a lot of thought
recently to decide whether to continue it or to end the series. Even though there were only five issues ever released I
began to no longer enjoy the process. I struggled to come up with a theme to write about, and the name of the series
never really worked for me. I don’t know why, it just didn’t feel right. One thing is for certain, I enjoyed the
aspect of sharing, and promoting the amazing people that create the various content of software, music, art, stories,
etc.</p>

<p>A list of all the past issues…</p>

<ul>
  <li><a href="/posts/a-cyberspace-inquisition-1/">A Cyberspace Inquisition #1: The Beginning</a> (Mar 24, 2021)</li>
  <li><a href="/posts/a-cyberspace-inquisition-2/">A Cyberspace Inquisition #2: Impressions</a> (Mar 28, 2021)</li>
  <li><a href="/posts/cyberspace-inquisition-3/">A Cyberspace Inquisition #3: Insight</a> (Apr 4, 2021)</li>
  <li><a href="/posts/a-cyberspace-inquisition-4/">A Cyberspace Inquisition #4: Wonder</a> (Apr 24, 2021)</li>
  <li><a href="/posts/a-cyberspace-inquisition-5-imagination/">A Cyberspace Inquisition #5: Imagination</a> (May 25, 2021)</li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>What I’ve decided to do is close the chapter on the series of “A Cyberspace Inquisition”. With me not liking the
name and having to write a theme, I think in the end this is best. Plus let’s be honest, it’s been almost 5 months
since the last issue. Too much time has past.</p>

<h2 id="a-new-beginning">A New Beginning</h2>

<p>A new series will start that will allow for me to focus on sharing freely, and allow the reader to discover the vast
joy the Internet can bring. The format will remain short, and to the point. It will still have a list of featured
links with brief descriptions. I’m uncertain exactly when this new series will start, but what I can tell you is
that name of the series will be called “Little Bits”. The idea is “Little” refers to the short format, and bits, as in
a computer bit yet inferring to each item shared as a bit. The title has more meaning to me, easier to say, and
remember. So stay tuned for the first issue of “Little Bits” coming soon.</p>

<p>This is post 57 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="LittleBits" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Find the answers to what happened to the series, A Cyberspace Inquisition, and what new chapters will open in the future.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/road-start-finish-the-end.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/road-start-finish-the-end.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Codeberg Forks Gitea to Forgejo</title><link href="https://www.adamsdesk.com/posts/fork-gitea-to-forgejo/" rel="alternate" type="text/html" title="Codeberg Forks Gitea to Forgejo" /><published>2022-12-17T00:00:00-06:00</published><updated>2023-07-29T11:05:08-06:00</updated><id>https://www.adamsdesk.com/posts/fork-gitea-to-forgejo</id><content type="html" xml:base="https://www.adamsdesk.com/posts/fork-gitea-to-forgejo/"><![CDATA[<p>A few months ago the community of Gitea project was shocked by a <a href="https://blog.gitea.com/open-source-sustainment/">blog post</a> written by techknowlogick that a new company was
formed, Gitea Limited to act as a steward. Furthermore, Lunny the project creator transferred the domains (gitea.io and
gitea.com) and trademarked names to Gitea Ltd. According to the open letter the transfer of the domains and trademarks
to Gitea Ltd. were done without the community knowledge or approval. About 5 days later another
<a href="https://blog.gitea.io/2022/10/a-message-from-lunny-on-gitea-ltd.-and-the-gitea-project/">blog post</a> was made this time
by Lunny that really just reiterated what was said previously with a bit more detail. It was nice to see how the
community engagement would work, though the unfortunate part of the post is that did not answer the communities
concerns, and just affirmed that this is what is going to happen no matter what. A sure fire way to break down a
community, and it’s trust.</p>

<h2 id="gitea-limited">Gitea Limited</h2>

<p>The idea is that the company will help move the project forward allowing for more sustained funding, training, and
also offering professional support, Gitea hosting, and an enhanced enterprise version. On the surface this sounds good,
but my initial thought was, this sounds like a company that will primarily control an open source project for commercial
means. Then I thought why would you not just form company for consulting and services? This would allow the project to
continue independently by the community. How it appears from an outsider, is Gitea Ltd. has handle things poorly in the
area of communication and treatment of the community members.</p>

<p>In the end it seems Gitea Ltd. wants the community to follow their goals. How can this work when this comes off as a
conflict of interest, for-profit company with a commercial agenda vs. free open source software community?</p>

<h2 id="open-letter">Open Letter</h2>

<p>The Gitea community wrote an <a href="https://gitea-open-letter.coding.social/">open letter</a> stating their concerns of these
recent changes. Here are the major points that were listed.</p>

<ul>
  <li>Form a non-profit organization owned by the Gitea community</li>
  <li>Gitea trademark and domains are transferred to the non-profit</li>
  <li>Change the company name to avoid confusion with the non-profit</li>
</ul>

<p>In the future some ideas were mentioned the non-profit could work on to build trust and build a healthy future.</p>

<ul>
  <li>Implementing an intuitive and fair election process</li>
  <li>Describing the ways in which democratic decisions are to be made</li>
  <li>Providing accessible places where all relevant information can be found</li>
  <li>Establishing a <a href="https://communitywiki.org/wiki/DoOcracy">DoOcracy</a> that works and continue to improve it</li>
</ul>

<p>For the progression of events from this open letter, feel free to read
<a href="https://gitea-open-letter.coding.social/updates/">updates</a> page.</p>

<p>Ultimately the community trust was broken and felt ignored since Gitea Ltd. did not end up agreeing to the demands the
open letter brought forward.</p>

<h2 id="governance">Governance</h2>

<p>To me the entire point of free open source software is that is driven by the community for the community. As a result
the community forms a governance of the project along with its goals, values, etc. Having a for-profit company ends up
forming an incorporation that will retain control over the project permanently without the possibility for the
community to govern such things as the legal structure. Gitea Ltd. can promise to listen to the community, but what is
in place to prevent the company from suddenly choosing to not listen? This is one of the reasons why I say Gitea Ltd.
has conflict of interest. I honestly can’t see the interests of the community and the company to be aligned.</p>

<h2 id="forgejo-is-born">Forgejo Is Born</h2>

<p>The community was torn apart, and it seemed something had to be done. A <a href="https://codeberg.org/forgejo/meta/issues/3">proposal</a>
was made by Codeberg to fork Gitea. As a result of the proposal on December 15, 2022 an
<a href="https://forgejo.org/2022-12-15-hello-forgejo/">official announcement</a> was made to fork Gitea to create Forgejo. The
vision of this new project is to liberate software development, allow the community to remain in control to ensure
development addresses the community needs without using proprietary tools. Let’s hope this project will end up fostering
good alternative to Gitea and allow for the community to flourish with trust and respect.</p>

<p>This is post 56 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="SelfHosted" /><category term="git" /><category term="development" /><summary type="html"><![CDATA[A summary and opinions of the events that lead to the break-down of the Gitea community trust and respect that ended with Codeberg forking Gitea.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/forgejo-mascot-david-revoy.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/forgejo-mascot-david-revoy.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pulsar Project: A New Text Editor</title><link href="https://www.adamsdesk.com/posts/pulsar-project-text-editor/" rel="alternate" type="text/html" title="Pulsar Project: A New Text Editor" /><published>2022-12-16T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/pulsar-project-text-editor</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pulsar-project-text-editor/"><![CDATA[<p>Just over 11 months has past since I talked about the <a href="/posts/atom-text-editor-project-ends/">Atom Text Editor Project Ending</a>.
Since then the Atom project has now been archived, and new hope has been started with a fork of Atom called Pulsar. As
I predicated I knew this would happen, and I wouldn’t surprise me if there will be a few more. When the community loves
the software they use, it’s open source, and a demand for a new text editor builds people will come together to make it
happen. Free open source software is the beauty of what allows for the freedom of choice to continue building off of
what was previously existing.</p>

<h2 id="pulsar">Pulsar</h2>

<p>The Pulsar project is quite new, however they now have a stable <a href="https://github.com/pulsar-edit/pulsar/releases">release</a>
of “the community-led hyper-hackable text editor” as they describe it. Every commit to the master branch of the Pulsar
project is treated as beta according to
“<a href="https://fosstodon.org/@mauricioszabo@mastodon.social/109547244658982674">Maurício Szabo</a>”, one of the maintainers.
What we can see from the official website is hard work being done to communicate the project
intentions. The text editor is available for the following operating systems, Linux (x86_64), ARM 64
(e.g. Raspberry Pi, Pinebook, etc.), macOS, and Windows. This related to being able to get the application via,
Debian/Ubuntu package (deb), Fedora/RHEL package (rpm), Appimage, macOS (Intel/Apple M1/M2), Windows (setup/portable),
and as an archive (zip, tar.gz). Seems to cover just about every major system, which is wonderful to see. What
surprised me the most thus far is seeing manual instructions to build the binaries for various operating systems.
Typically, in my experience this is found on the project Git website.</p>

<figure class="text-center">
    <img src="/assets/img/posts/pulsar-text-editor-screenshot.avif" width="1920" height="1080" alt="Screenshot of editing a document within Pulsar text editor with a tree view of files on the left." class="figure-img img-fluid rounded" loading="lazy" />
    <figcaption class="figure-caption">
        Screenshot of Pulsar v1.104.0 x64, Arch Linux with GNOME v43.5
    </figcaption>
</figure>

<h2 id="features">Features</h2>

<p>Though the list of features shown is not uncommon in a text editor like this, I still thought it would be nice to see an
overview.</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Item</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Archive Viewer</td>
      <td>Browse the contents of compressed archives (egg, epub, jar, love, nupkg, tar, tar,gz, tgz, war, whl, xpi, zip).</td>
    </tr>
    <tr>
      <td>Block Folding</td>
      <td>Collapse and expand code blocks by using the mouse or keyboard.</td>
    </tr>
    <tr>
      <td>Built-in Package Manager</td>
      <td>Search and install new packages or create your own right from Pulsar.</td>
    </tr>
    <tr>
      <td>Command Line</td>
      <td>Control the application as well as manage packages from the command line.</td>
    </tr>
    <tr>
      <td>Cross-platform Editing</td>
      <td>Pulsar works across operating systems. Use it on OS X, Windows, or Linux.</td>
    </tr>
    <tr>
      <td>File System Browser</td>
      <td>Easily browse and open a single file, a whole project, or multiple projects in one window.</td>
    </tr>
    <tr>
      <td>Find and Replace</td>
      <td>Find, preview, and replace text as you type in a file or across all your projects with regular expression support.</td>
    </tr>
    <tr>
      <td>Markdown Preview</td>
      <td>A live preview/rendered text of Markdown (<a href="https://github.com/pulsar-edit/markdown-preview">markdown-preview</a>).</td>
    </tr>
    <tr>
      <td>Multiple Cursor Selection</td>
      <td>Manipulate text on multiple lines or selections at once.</td>
    </tr>
    <tr>
      <td>Multiple Panes</td>
      <td>Split the interface into multiple panes to compare and edit code across files.</td>
    </tr>
    <tr>
      <td>Smart Autocompletion</td>
      <td>Pulsar helps you write code faster with a smart and flexible autocomplete (<a href="https://github.com/pulsar-edit/autocomplete-plus">autocomplete-plus</a>).</td>
    </tr>
    <tr>
      <td>Snippets</td>
      <td>Quickly generate common code with a shortcut written in <a href="https://github.com/bevry/cson#what-is-cson">CoffeeScript Object Notation</a> (<a href="https://github.com/pulsar-edit/snippets">snippets</a>).</td>
    </tr>
    <tr>
      <td>Spell Check</td>
      <td>Spelling will automatically be checked in text including plain text files, GitHub Markdown and git commit messages (<a href="https://github.com/pulsar-edit/spell-check">spell-check</a>).</td>
    </tr>
    <tr>
      <td>Syntax Highlighting</td>
      <td>Code syntax highlighting with default support of C, C#, C++, Clojure, CoffeeScript, CSS, GFM, Git, Go, HTML, Java, JavaScript, JSON, Less, Make, Mustache, Objective-C, Perl, PHP, Property list, Python, Ruby, Ruby on Rails, Rust, SASS, Shell script, Source, SQL, Text, Todo, TOML, TypeScript, XML, and YAML.</td>
    </tr>
    <tr>
      <td>Themes</td>
      <td>Easily customize the look and feel of the editor using themes.</td>
    </tr>
    <tr>
      <td>Tree View</td>
      <td>Explore and open project files using a tree (<a href="https://github.com/pulsar-edit/tree-view">tree-view</a>).</td>
    </tr>
    <tr>
      <td>Version Control</td>
      <td>Built-in version control with basic <a href="https://git-scm.com/">Git</a> and <a href="https://github.com/">GitHub</a> integration.</td>
    </tr>
  </tbody>
</table>

<h2 id="packages">Packages</h2>

<p>By default, Pulsar comes with the following 46 packages (excluding 34 language packages).</p>

<ul>
  <li><a href="https://web.pulsar-edit.dev/packages/about">about</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/archive-view">archive-view</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autocomplete-atom-api">autocomplete-atom-api</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autocomplete-css">autocomplete-css</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autocomplete-html">autocomplete-html</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autocomplete-plus">autocomplete-plus</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autocomplete-snippets">autocomplete-snippets</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autoflow">autoflow</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/autosave">autosave</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/background-tips">background-tips</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/bookmarks">bookmarks</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/bracket-matcher">bracket-matcher</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/command-palette">command-palette</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/dalek">dalek</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/deprecation-cop">deprecation-cop</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/dev-live-reload">dev-live-reload</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/encoding-selector">encoding-selector</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/exception-reporting">exception-reporting</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/find-and-replace">find-and-replace</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/fuzzy-finder">fuzzy-finder</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/github">github</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/git-diff">git-diff</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/go-to-line">go-to-line</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/grammar-selector">grammar-selector</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/image-view">image-view</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/incompatible-packages">incompatible-packages</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/keybinding-resolver">keybinding-resolver</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/link">link</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/markdown-preview">markdown-preview</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/notifications">notifications</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/open-on-github">open-on-github</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/package-generator">package-generator</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/settings-view">settings-view</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/snippets">snippets</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/spell-check">spell-check</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/status-bar">status-bar</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/styleguide">styleguide</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/symbols-view">symbols-view</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/tabs">tabs</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/timecop">timecop</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/tree-view">tree-view</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/update-package-dependencies">update-package-dependencies</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/welcome">welcome</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/whitespace">whitespace</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/wrap-guide">wrap-guide</a></li>
</ul>

<h2 id="themes">Themes</h2>

<p>By default, the 12 following themes are included.</p>

<ul>
  <li><a href="https://web.pulsar-edit.dev/packages/atom-dark-syntax">atom-dark-syntax</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/atom-dark-ui">atom-dark-ui</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/atom-light-syntax">atom-light-syntax</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/atom-light-ui">atom-light-ui</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/base16-tomorrow-dark-theme">base16-tomorrow-dark-theme</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/base16-tomorrow-light-theme">base16-tomorrow-light-theme</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/one-dark-ui">one-dark-ui</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/one-light-ui">one-light-ui</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/one-dark-syntax">one-dark-syntax</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/one-light-syntax">one-light-syntax</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/solarized-dark-syntax">solarized-dark-syntax</a></li>
  <li><a href="https://web.pulsar-edit.dev/packages/solarized-light-syntax">solarized-light-syntax</a></li>
</ul>

<h2 id="community">Community</h2>

<p>I’ve not gone in to the areas of community to see what activity is going on, but I’m happy to see a variety of options
are already available. It’s wonderful to see that the project has chosen to be on Mastodon, which I will happily follow.</p>

<ul>
  <li><a href="https://github.com/orgs/pulsar-edit/discussions">GitHub Discussions</a></li>
  <li><a href="https://discord.gg/7aEbB9dGRT">Discord</a></li>
  <li><a href="https://www.reddit.com/r/pulsaredit/">Reddit</a></li>
  <li><a href="https://lemmy.ml/c/pulsaredit">Lemmy</a></li>
  <li><a href="https://fosstodon.org/@pulsaredit">Mastodon</a></li>
</ul>

<h2 id="support">Support</h2>

<p>For those interested in supporting Pulsar financially with a donation then feel free to check out their
<a href="https://opencollective.com/pulsar-edit">Open Collective</a> page.</p>

<h2 id="whats-missing">What’s Missing</h2>

<p>I’ve been playing around with Pulsar for the past few days and here is what I’ve found missing thus far.</p>

<ul>
  <li>No built-in sort</li>
  <li>No built-in clickable links</li>
  <li>No multi syntax highlighting</li>
  <li>No variable support for snippets</li>
</ul>

<p>The ability to sort content to me is an important feature and should be available by default. However, this feature can be
added by installing the <a href="https://web.pulsar-edit.dev/packages/sort-lines">sort-lines</a> package.</p>

<p>I’ve found hyperlinks (links) are not clickable within Markdown and plain text files. I’m not certain if this affects
all files, but it is quite annoying to not have this ability.</p>

<p>As for multi syntax highlighting, I’m referring to when editing a Markdown file that also contains HTML and YAML, only
the Markdown receives the syntax highlighting. I hope this issue can be resolved.</p>

<p>Then there is code snippets, they are a very powerful feature that I’ve grown to love and not having access to variables
within the snippets is quite a disadvantage. Hopefully this will be seen in the future.</p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>At this stage it all sounds promising, and nice to see another potential option available for text editors. Over time I
hope to see this editor become more polished to provide a more enjoyable experience. With this said though I do have a
concern of having the editor based upon the Electron engine. In my own personally experience I found it to be slow, and
bloated. However, for all I know this could be just how it has been implemented into software I’ve used.
Ultimately we will all have to wait, and see what becomes of this new community-led effort.</p>

<p>This is post 55 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="development" /><summary type="html"><![CDATA[A project overview and my thoughts about the new community-led hyper-hackable text editor Pulsar, that is based upon the Atom text editor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pulsar-new-text-editor.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pulsar-new-text-editor.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add Mastodon Link Verification for Gitea</title><link href="https://www.adamsdesk.com/posts/mastodon-link-verification-gitea/" rel="alternate" type="text/html" title="Add Mastodon Link Verification for Gitea" /><published>2022-12-15T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/mastodon-link-verification-gitea</id><content type="html" xml:base="https://www.adamsdesk.com/posts/mastodon-link-verification-gitea/"><![CDATA[<p>The Mastodon link verification feature can be useful to identify which links you own or control. Unfortunately it is not
always possible to have all links verified due to one’s circumstances. All one needs is the ability to edit the linked
page and add the Mastodon verification link (HTML code). What some may not realize is that Gitea allows adding HTML code
within the biography field of a profile page. Even I was not aware until recently talking to someone on Mastodon.</p>

<h2 id="what-is-mastodon-link-verification">What is Mastodon Link Verification?</h2>

<p>A process to cross-reference Mastodon profile metadata links to prove that you are the real owner of the links listed.
Think of it is a user controlled link identity verification.</p>

<div class="admonition info rounded">
    <p class="admonition-title">Info</p>
    <p>
        Mastodon does not have a centralized authority to do further validation due to being a self-hosted and decentralized software.
    </p>
</div>

<h2 id="environment">Environment</h2>

<p>Tested and verified with the following.</p>

<ul>
  <li>Mastodon v4.0.2</li>
  <li>Gitea v1.17.3</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>A Mastodon account has been previously created</li>
  <li>A Gitea account has been previously created</li>
  <li>The Mastodon web application will be used as the primary base of reference</li>
</ul>

<h2 id="add-verification-link">Add Verification Link</h2>

<ol>
  <li>Login to Mastodon.</li>
  <li>Edit Mastodon profile.</li>
  <li>
    <p>Copy Mastodon verification link.</p>

    <p>Under “Verification” section copy the verification link by clicking on the “copy” button.</p>
  </li>
  <li>Login to Gitea.</li>
  <li>
    <p>Edit Gitea profile.</p>

    <p>Click on the avatar (top right corner) &gt; “Settings” &gt; “Profile”.</p>
  </li>
  <li>
    <p>Edit the Biography field.</p>

    <p>Paste the verification link into the Biography field.</p>

    <p>Here is an example of what my Gitea biography field looks like with my Mastodon verification link added.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> A technology enthusiast and privacy, security and FOSS advocate that specialized in DevOps
 for companies and individuals across North America and Europe. Founder and operator of
</span><span class="gp"> Adamsdesk. &lt;a href="https://fosstodon.org/@adamsdesk" rel="me"&gt;</span>Mastodon&lt;/a&gt;
</code></pre></div>    </div>
    <p><strong>Note:</strong> The Gitea biography field only allows for a maximum of 255 characters.</p>
  </li>
  <li>Click on the button “Update Profile”.</li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        The link back to the Mastodon profile must have the attribute, rel="me".
    </p>
</div>

<h2 id="mastodon-profile-example">Mastodon Profile Example</h2>

<p>Verified links on a profile will have a colored background and checkmark icon before each link. Unverified links will
not have a green background or checkmark.</p>

<p>Here is my profile as an example with two verified links and one unverified link (Git).</p>

<p><img src="/assets/img/posts/mastodon-profile-link-verification.webp" width="720" height="333" alt="Mastodon profile with two verified links and one unverified link." loading="lazy" class="img-fluid" /></p>

<h2 id="learn-more">Learn More</h2>

<p>Gain better understanding of each a feature or enhance your Mastodon profile by reading the knowledge base
article, <a href="https://kb.adamsdesk.com/application/mastodon-profile-setup/">Mastodon Profile Setup</a>.</p>

<p>This is post 54 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="mastodon" /><summary type="html"><![CDATA[Uncover the wonders of Mastodon link verification by using these steps to have a Mastodon verified link for your Gitea profile web page.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mastodon-link-verification-gitea.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mastodon-link-verification-gitea.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building a Point of Sale System</title><link href="https://www.adamsdesk.com/posts/building-point-of-sale-system/" rel="alternate" type="text/html" title="Building a Point of Sale System" /><published>2022-12-14T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/building-point-of-sale-system</id><content type="html" xml:base="https://www.adamsdesk.com/posts/building-point-of-sale-system/"><![CDATA[<p>Many months ago I suggested to a small struggling non-profit food co-op business that does not have a point of sales
system (POS), that I could be the one to build the system as a volunteer. The co-op unfortunately is in a tough
financial situation and cannot afford to purchase a commercial point of sales solution. A short time passed and after a
few meetings the board of directors approved my adventurous idea along with a $5,000 for the cause. This was very
exciting indeed for me as I enjoy jumping into a new challenge, especially one that could greatly impact the Co-op’s
operations in a positive direction.</p>

<h2 id="what-is-a-point-of-sale">What is a Point of Sale?</h2>

<p>A system used to handle and manage a retail transaction, by calculating the amount owed by the customer and then allows
for the customer to make payment. Afterwards the customer may be issued a receipt.</p>

<h2 id="researching-and-learning">Researching and Learning</h2>

<p>I’ve spent a lot of time researching and learning what hardware would be required in a very proprietary industry. I
found this part frustrating, as I believe this should be open industry that allows for freedom of choice. Either way I
continued onward working on determining the point of sale software system to use, and choosing an operating system. Once
decisions where made what was going to be purchased, I had to try and find businesses to purchase the hardware.
Finding the solutions for everything was overwhelming to say the least. Thankfully I had some help with choosing and
pricing out the hardware.</p>

<h2 id="purchase-hardware">Purchase Hardware</h2>

<p>The following hardware items have been purchased to build the system. A lot of the items were purchased online, but
luckily I was able support a couple of local businesses in purchasing the remaining hardware.</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Type</th>
      <th>Description</th>
      <th>Quantity</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Case</td>
      <td>SilverStone Technology Computer Case SST-GD09B-C (black)</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Case Fan</td>
      <td>Noctua NF-A8 80mm</td>
      <td>2</td>
    </tr>
    <tr>
      <td>Cash Drawer</td>
      <td>POS-X 16” ION Slide Cash Drawer</td>
      <td>1</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>AMD Ryzen 5 5500 - Ryzen 5 5000 series 6-Core Socket AM5 65W Desktop Processor</td>
      <td>1</td>
    </tr>
    <tr>
      <td>CPU Cooler</td>
      <td>Noctua NH-L9x65 CPU Cooler</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Monitor</td>
      <td>Angel POS HD 17” Capacitive LED Backlit Multi-Touch Monitor, VGA &amp; HDMI Input</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Monitor</td>
      <td>Logic Controls LV4000U Pole Customer Display</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Motherboard</td>
      <td>Asus Prime B550-Plus AM4 AMD B550 SATA 6GB/s USB 3.0 HDMI ATX AMD</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Network Cable</td>
      <td>Amazon Basic RJ45 Cat-6 Ethernet Patch Internet Cable, 1.5 Meters (5 Foot)</td>
      <td>5</td>
    </tr>
    <tr>
      <td>Network Switch</td>
      <td>TP-Link TL-SG108, 8 Port Gigabit Unmanaged</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Power Supply</td>
      <td>Corsair RMx series (2021) RM750x CP-9020199-NA 750 W ATX12V / EPS12V 80 Plus Gold Certified</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Printer</td>
      <td>Epson TM-T20III Thermal Receipt Printer</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Printer Paper</td>
      <td>Receipt Paper Rolls 3 1/8” X 200’ Thermal Roll</td>
      <td>50</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>Corsair Vengeance LPX 16GB (2 x 8GB) 288-Pin PC RAM DDR4 3200 (PC4 25600)</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Scanner</td>
      <td>Adesso NuScan 3200U</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Scanner</td>
      <td>Honeywell MS9500 Voyager series</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Storage</td>
      <td>Samsung 980 M.2 2280 500GB, PCI-Express 3.0 x4, NVMe 1.4 V-NAND MLC</td>
      <td>2</td>
    </tr>
    <tr>
      <td>UPS</td>
      <td>APC Back-UPS Pro 1500VA Battery Backup</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Weigh Scale Adapter</td>
      <td>USB to RS232 (serial) FTDI adapter</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

<h2 id="software">Software</h2>

<p>I’m gone with the following items to keep the system as minimal as possible while still using free open source software.
Some may question, why are you using Docker than? Well this is one area of technology I’m still learning, and I’m
unfortunately most familiar with Docker. We will see how things end, I may end up using Podman as long as it doesn’t
hold me up. This system needs to be deployed as soon as possible.</p>

<table class="table table-striped table-hover mb-4">
  <thead>
    <tr>
      <th>Item</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Container</td>
      <td>Docker to run Odoo Community</td>
    </tr>
    <tr>
      <td>Operating System</td>
      <td>Alpine Linux</td>
    </tr>
    <tr>
      <td>Point of Sale</td>
      <td>Odoo Community</td>
    </tr>
    <tr>
      <td>Web Browser</td>
      <td>Chromium</td>
    </tr>
  </tbody>
</table>

<h2 id="building-the-system">Building The System</h2>

<p>All the hardware has been received except for the uninterrupted power supply (UPS). The UPS will be coming shortly.
Right now I’m working away on putting the system together. My hope is to have it done before Christmas. The entire
process will be documented, so keep an eye out for more posts to come.</p>

<p>This is post 53 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="hardware" /><category term="linux" /><summary type="html"><![CDATA[Come follow me on this journey of building a free open source point of sale system to help a non-profit food co-op.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/building-point-of-sale-system.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/building-point-of-sale-system.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">5 Easy Steps To Crop An Image in Inkscape</title><link href="https://www.adamsdesk.com/posts/inkscape-crop-image/" rel="alternate" type="text/html" title="5 Easy Steps To Crop An Image in Inkscape" /><published>2022-12-13T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/inkscape-crop-image</id><content type="html" xml:base="https://www.adamsdesk.com/posts/inkscape-crop-image/"><![CDATA[<p>Inkscape may be a free open source vector graphic editor, but that doesn’t mean the software cannot handle raster
images. One of those features we will be using today is called clipping, which will allow for cropping an image. This
may seem like a complicated process to some, but let me assure you this is a very common task that is quite simple to
achieve with the step-by-step instructions to help guide you along the entire process. You have the choice of choosing
between two methods to crop an image, “Crop by Clipping an Object” or “Crop by Clipping a Path”.</p>

<h2 id="what-is-cropping">What is Cropping?</h2>

<p>The removal of unwanted outer areas of an image. In other words, only the area that is selected will remain, and the
outer portion will be deleted.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Steps tested using Inkscape v1.2.1.</li>
</ul>

<h2 id="crop-by-clipping-an-object">Crop By Clipping An Object</h2>

<p>The clip method works by having an object, path or vector shape on top of an image to clip or cut an area out of the
image based upon the shape created. Another way to look at this is, it’s a digital form of using a cookie cutter to cut
out a shape from dough.</p>

<div class="d-flex flex-row justify-content-center ratio ratio-16x9">
    <video controls="" width="1080" preload="none" poster="/assets/img/posts/inkscape-crop-image-poster.webp">
        <source src="/assets/video/posts/inkscape-crop-clipping-object.webm" type="video/webm" />
    </video>
</div>
<p class="mt-3 d-flex flex-row justify-content-center">Video demonstration of cropping an image by clipping an object</p>

<ol>
  <li>
    <p>Import image into Inkscape.</p>

    <p>In the menu go to “File” &gt; “Import” or use the keyboard shortcut, <kbd>CTRL</kbd> + <kbd>I</kbd> to import a raster
 image (e.g. jpg, png, webp).</p>
  </li>
  <li>
    <p>Draw a shape over the image.</p>

    <p>You can use any desired shape (e.g. circle, rectangle, square, star, etc.).</p>

    <p><strong>Note:</strong> The shape or object must be on top of the image.</p>
  </li>
  <li>
    <p>Select image and shape.</p>

    <p>With the “Select and transform object tool” (<kbd>S</kbd>) hold down the <kbd>shift</kbd> key and then left mouse
 click on the image and shape to select both of them at once.</p>
  </li>
  <li>
    <p>Clip object.</p>

    <p>In the menu go to “Object” &gt; “Clip” &gt; “Set” or right mouse click on the shape or object and than left mouse click
 on “Set Clip”.</p>
  </li>
  <li>
    <p>Resize your document.</p>

    <p>Depending on the circumstance, you may have empty space around the cropped image which may not desired. This can
 easily be removed.</p>

    <ol>
      <li>Go to the menu “File” &gt; “Document properties” or use the keyboard shortcut,
 <kbd>CTRL</kbd> + <kbd>Shift</kbd> + <kbd>D</kbd>.</li>
      <li>Under the “Display” tab left mouse click on the button beside “Resize to content”.</li>
      <li>Close the Document properties dialog by left mouse clicking on the “x”.</li>
    </ol>
  </li>
</ol>

<h2 id="crop-by-clipping-a-path">Crop By Clipping a Path</h2>

<p>This is very similar to the previous method and only major difference is the pen tool or drawing tool is being used.
Using this method does allow for creating a free form shape since each node on the path can be manually adjusted
individually.</p>

<div class="d-flex flex-row justify-content-center ratio ratio-16x9">
    <video controls="" width="1080" preload="none" poster="/assets/img/posts/inkscape-crop-image-poster.webp">
        <source src="/assets/video/posts/inkscape-crop-clipping-path.webm" type="video/webm" />
    </video>
</div>
<p class="mt-3 d-flex flex-row justify-content-center">Video demonstration of cropping an image by clipping a path</p>

<ol>
  <li>
    <p>Import image into Inkscape.</p>

    <p>In the menu go to “File” &gt; “Import” or use the keyboard shortcut, <kbd>CTRL</kbd> + <kbd>I</kbd> to import a raster
 image (e.g. jpg, png, webp).</p>
  </li>
  <li>
    <p>Draw a path.</p>

    <p>Using the pen tool or drawing tool, create a path around the area that you wish to crop.</p>
  </li>
  <li>
    <p>Select image and shape.</p>

    <p>With the “Select and transform object tool” (<kbd>S</kbd>) hold down the <kbd>shift</kbd> key and then left mouse
 click on the image and shape to select both of them at once.</p>
  </li>
  <li>
    <p>Clip object.</p>

    <p>In the menu go to “Object” &gt; “Clip” &gt; “Set” or right mouse click on the shape or object and then left mouse click on “Set Clip”.</p>
  </li>
  <li>
    <p>Resize your document.</p>

    <p>Depending on the circumstance, you may have empty space around the cropped image which may not desired. This can
 easily be removed.</p>

    <ol>
      <li>Go to the menu “File” &gt; “Document properties” or use the keyboard shortcut,
 <kbd>CTRL</kbd> + <kbd>Shift</kbd> + <kbd>D</kbd>.</li>
      <li>Under the “Display” tab left mouse click on the button beside “Resize to content”.</li>
      <li>Close the Document properties dialog by left mouse clicking on the “x”.</li>
    </ol>
  </li>
</ol>

<h2 id="tips">Tips</h2>

<ul>
  <li>Multiple shapes or objects can be created and then cropped as long as all the shapes are grouped together</li>
  <li>Use a shape or object color that is easily visible and identifiable (e.g. red)</li>
  <li>Set the shape or object opacity to 50% to help with visibility of the area that will be cropped</li>
</ul>

<p>This is post 52 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Step-by-step instructions on how to use Inkscape to crop an image whether you are; beginner or advanced user.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/inkscape-crop-image.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/inkscape-crop-image.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Why Does Sudo Echo Fail with Permission Denied?</title><link href="https://www.adamsdesk.com/posts/sudo-echo-permission-denied/" rel="alternate" type="text/html" title="Why Does Sudo Echo Fail with Permission Denied?" /><published>2022-12-12T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/sudo-echo-permission-denied</id><content type="html" xml:base="https://www.adamsdesk.com/posts/sudo-echo-permission-denied/"><![CDATA[<p>It makes sense that if you try to echo something to a file, and you receive permission denied, it’s because the user is
not allowed to do so. What seems to be puzzling to some, is if you try to echo something again with the sudo
command, and still receive “permission denied”. Let’s solve this puzzling behaviour, so it all becomes clear, why the
command would fail with sudo.</p>

<h2 id="problem">Problem</h2>

<p>The command fails even though sudo is being used to elevate the user’s permissions.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sudo echo</span> <span class="s1">'Hello World!` &gt; /home/test.txt
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-bash: test.txt: Permission denied
</span></code></pre></div></div>

<h2 id="explanation">Explanation</h2>

<p>The reason this command fails with the use of sudo is because the redirection (e.g. &gt;, &gt;&gt;, etc.) is not executed with
elevated user permissions (e.g. root). Instead, the redirection is actually executed by the current user’s shell, thus
this is why an error of “permission denied” is returned.</p>

<p>There are several ways in which to overcome this problem.</p>

<h2 id="solution-tee">Solution: Tee</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">echo</span> <span class="s1">'Hello World!'</span> | <span class="nb">sudo tee</span> /home/test.txt
</code></pre></div></div>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        The tee command without -a or --append parameter will overwrite the file if it already exists.
    </p>
</div>

<p>The reason this works is that the command <code class="language-plaintext highlighter-rouge">echo 'Hello World!' | sudo</code> is executed under the user’s shell permission.
The pipe character (|) will then pass on the standard output to the tee command allowing the file to be written. The
tee works by reading from standard input, write to standard output and can also do the same with files.</p>

<h2 id="solution-bash">Solution: Bash</h2>

<p>By using the Bash command with the parameter “-c” the entire command will be executed with sudo that provides the
elevated permissions.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sudo </span>bash <span class="nt">-c</span> <span class="s2">"echo 'Hello World!' &gt; test.txt"</span>
</code></pre></div></div>

<p>This is post 51 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="linux" /><category term="unix" /><summary type="html"><![CDATA[Solve the puzzling question, why does sudo echo fail when trying to redirect the output to a file within a Linux or Unix shell?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/why-does-sudo-fail.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/why-does-sudo-fail.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tracking 100 Days To Offload</title><link href="https://www.adamsdesk.com/posts/tracking-100-days-to-offload/" rel="alternate" type="text/html" title="Tracking 100 Days To Offload" /><published>2022-12-11T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/tracking-100-days-to-offload</id><content type="html" xml:base="https://www.adamsdesk.com/posts/tracking-100-days-to-offload/"><![CDATA[<p>It is the second time around that I’m participating in the <a href="https://100daystooffload.com/">100 Days to Offload</a>
challenge and this time around I’m now determined to meet the goal of 100 posts or at least come dang near to it. Saying
this though, it is only been since November 29, 2022 that out of know where I’ve been posting every single day without
fail making it 13 days in a row. Though it seems like a small achievement, I’m personally thrilled that I’ve been able
to come up with something to write about without any issues. Honestly, I have so many ideas I can’t keep up. This is all
a good thing, so I decided to reflect on why is it that I agreed and wanted to do this challenge, yet I’ve only done 50
posts thus far and deadline is fast approaching on January 14, 2022.</p>

<h2 id="discovering-the-problems">Discovering The Problems</h2>

<p>Finding the issues as to why I’ve not been making posts has been tough. I’m just not certain the two reasons I found are
the only ones. Either way the one issue is, I’ve been doing so many things in my life that I’ve made myself feel
overwhelmed and as a result I’ve put this challenge on the bottom of my list even though it should be close to the top
of my list as this challenge contributes to my job as a content creator. The second issue is that I’ve not been keeping
track of my progress in the challenge and therefore for me at least takes me away from focusing on achieving the
intended goal.</p>

<h2 id="resolving-the-problems">Resolving The Problems</h2>

<p>To fix the first issue, I need to reduce the amount of tasks, projects, volunteering, etc. in my life and also make sure
to use task management tools consistently to help remove the feeling of being overwhelmed. As a result this should help
me to create healthy boundaries, which honestly we should all have in our lives. So far this has been working, and I
believe once I have a major project I’m working on done that will relieve a lot of stress for me. Now the second issue,
I’ve not fully completed, however it will do for now until I have exactly what I want. What I did was create a simple
Bash script that looks at all the posts I’ve done and return statistics for the 100 Days to Offload challenge as well as
general overall statistics for my website.</p>

<h2 id="stats-script">Stats Script</h2>

<p>The script only requires four settings, website build directory, website posts directory, website drafts directory and
the start date for 100 Days to Offload challenge. Once these settings have been configured, the script is ready to use.</p>

<p>Requirements to run the script is very minimal with using, Jekyll, Bash, date and du. As well, the published date must
be within the file name (e.g. 2022-12-11-tracking-100-days-to-offload) and formatted as “YYYY-MM-DD” (YYYY = 4 digit
year, MM = 2 digit month, DD = 2 digit day). The reason the date is taken from the file name is because, the file
creation date is not always representative of when a post was published. As long as the date is stored within the file
name this code should work with just about any static website.</p>

<p>Presently the following statistics are supported.</p>

<h3 id="100-days-to-offload-stats">100 Days to Offload Stats</h3>

<ul>
  <li>Start Date</li>
  <li>End Date</li>
  <li>Total Posts</li>
  <li>Total Remaining Posts</li>
</ul>

<h3 id="general-stats">General Stats</h3>

<ul>
  <li>Total posts</li>
  <li>Total post drafts</li>
  <li>Total website disk usage</li>
</ul>

<h3 id="script-code">Script Code</h3>

<p>Before running the script, make sure to have the execute permission set on the file name (e.g. <code class="language-plaintext highlighter-rouge">$ chmod +x stats</code>).</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/env bash</span>
<span class="nv">dirBuild</span><span class="o">=</span><span class="s2">"/home/adam/dev/adamsdesk.com/_site"</span>
<span class="nv">dirPosts</span><span class="o">=</span><span class="s2">"/home/adam/dev/adamsdesk.com/_posts"</span>
<span class="nv">dirDrafts</span><span class="o">=</span><span class="s2">"/home/adam/dev/adamsdesk.com/_drafts"</span>
<span class="c">#100 Days to Offload start date, value formatted as YYYYMMDD</span>
<span class="nv">startDate</span><span class="o">=</span>20220114
<span class="nv">endDate</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$startDate</span><span class="s2">+1 year"</span> <span class="s2">"+%Y%m%d"</span><span class="si">)</span><span class="s2">"</span>

prepare<span class="o">()</span> <span class="o">{</span>
    validateConfig
    getStats
<span class="o">}</span>
validateConfig<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$dirBuild</span><span class="s2">"</span> <span class="o">]]</span>
    <span class="k">then
        </span>quit <span class="s2">"The configuration setting </span><span class="se">\"</span><span class="s2">dirBuild</span><span class="se">\"</span><span class="s2"> is not defined."</span>
    <span class="k">fi
    if</span> <span class="o">[[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$dirPosts</span><span class="s2">"</span> <span class="o">]]</span>
    <span class="k">then
        </span>quit <span class="s2">"The configuration setting </span><span class="se">\"</span><span class="s2">dirPosts</span><span class="se">\"</span><span class="s2"> is not defined."</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$dirDrafts</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span>quit <span class="s2">"The configuration setting </span><span class="se">\"</span><span class="s2">dirDrafts</span><span class="se">\"</span><span class="s2"> is not defined."</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$startDate</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span>quit <span class="s2">"The configuration setting </span><span class="se">\"</span><span class="s2">startDate</span><span class="se">\"</span><span class="s2"> is not defined."</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$dirBuild</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span>quit <span class="s2">"The directory '</span><span class="nv">$dirBuild</span><span class="s2">' was not found or permission was denied. The operation has been halted."</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$dirPosts</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span>quit <span class="s2">"The directory '</span><span class="nv">$dirPosts</span><span class="s2">' was not found or permission was denied. The operation has been halted."</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$dirDrafts</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span>quit <span class="s2">"The directory '</span><span class="nv">$dirDrafts</span><span class="s2">' was not found or permission was denied. The operation has been halted."</span>
    <span class="k">fi</span>
<span class="o">}</span>
getStats<span class="o">()</span> <span class="o">{</span>
    getPostCount
    getDraftCount
    getDiskUsage
<span class="o">}</span>
getPostCount<span class="o">()</span> <span class="o">{</span>
    <span class="nv">postCount</span><span class="o">=</span>0
    <span class="nv">postCountChallenge</span><span class="o">=</span>0
    <span class="k">for </span>post <span class="k">in</span> <span class="s2">"</span><span class="nv">$dirPosts</span><span class="s2">"</span>/<span class="k">*</span>.md<span class="p">;</span>
    <span class="k">do</span>
        <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$post</span><span class="s2">"</span> <span class="o">]]</span> <span class="o">||</span> <span class="k">continue

        </span><span class="nv">postContents</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span> <span class="s2">"</span><span class="nv">$post</span><span class="s2">"</span><span class="si">)</span><span class="s2">"</span>
        <span class="nv">post</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">post</span><span class="p">##*/</span><span class="k">}</span><span class="s2">"</span>
        <span class="nv">post</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">post</span>:0:4<span class="k">}${</span><span class="nv">post</span>:5:2<span class="k">}${</span><span class="nv">post</span>:8:2<span class="k">}</span><span class="s2">"</span>
        <span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$postContents</span><span class="s2">"</span> <span class="o">=</span>~ .<span class="k">*</span><span class="se">\-\ </span>100DaysToOffload.<span class="k">*</span> <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$post</span><span class="s2">"</span> <span class="nt">-ge</span> <span class="s2">"</span><span class="nv">$startDate</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$post</span><span class="s2">"</span> <span class="nt">-le</span> <span class="s2">"</span><span class="nv">$endDate</span><span class="s2">"</span> <span class="o">]</span>
        <span class="k">then</span>
                <span class="o">((</span>postCountChallenge++<span class="o">))</span>
        <span class="k">else</span>
            <span class="o">((</span>postCount++<span class="o">))</span>
        <span class="k">fi
    done
    </span><span class="nv">postCount</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>postCount+postCountChallenge<span class="k">))</span><span class="s2">"</span>
<span class="o">}</span>
getDraftCount<span class="o">()</span> <span class="o">{</span>
    <span class="nv">draftCount</span><span class="o">=</span>0
    <span class="k">for </span>drafts <span class="k">in</span> <span class="s2">"</span><span class="nv">$dirDrafts</span><span class="s2">"</span>/<span class="k">*</span>.md<span class="p">;</span>
    <span class="k">do</span>
        <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$drafts</span><span class="s2">"</span> <span class="o">]]</span> <span class="o">||</span> <span class="k">continue
        </span><span class="nv">draft</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">drafts</span>:10<span class="k">}</span><span class="s2">"</span>
        <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="k">${</span><span class="nv">draft</span>:1:4<span class="k">}</span><span class="s2">"</span> <span class="o">!=</span> <span class="s1">'tpl-'</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="s2">"</span><span class="k">${</span><span class="nv">draft</span>:1<span class="k">}</span><span class="s2">"</span> <span class="o">!=</span> <span class="s1">'reminders.md'</span> <span class="o">]</span>
        <span class="k">then</span>
            <span class="o">((</span>draftCount++<span class="o">))</span>
        <span class="k">fi
    done</span>
<span class="o">}</span>
getDiskUsage<span class="o">(){</span>
    <span class="nv">diskUsage</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">du</span> <span class="nt">-hs</span> <span class="nv">$dirBuild</span> | <span class="nb">cut</span> <span class="nt">-f1</span><span class="si">)</span><span class="s2">"</span>
<span class="o">}</span>
displayStats<span class="o">()</span> <span class="o">{</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">%b</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="se">\0</span><span class="s2">33[1m100 Days to Offload Stats</span><span class="se">\0</span><span class="s2">33[0m"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s %s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Start Date:"</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$startDate</span><span class="s2">"</span> <span class="s2">"+%B %d, %Y"</span><span class="si">)</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s %s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"End Date:"</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$endDate</span><span class="s2">"</span> <span class="s2">"+%B %d, %Y"</span><span class="si">)</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Total Posts: </span><span class="nv">$postCountChallenge</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Total Remaining Posts: </span><span class="k">$((</span><span class="m">100</span><span class="o">-</span>postCountChallenge<span class="k">))</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">%b</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="se">\0</span><span class="s2">33[1mGeneral Stats</span><span class="se">\0</span><span class="s2">33[0m"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Total Posts: </span><span class="nv">$postCount</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Total Post Drafts: </span><span class="nv">$draftCount</span><span class="s2">"</span>
        <span class="nb">printf</span> <span class="s2">"</span><span class="se">\t</span><span class="s2">%s</span><span class="se">\n\n</span><span class="s2">"</span> <span class="s2">"Total Disk Usage: </span><span class="nv">$diskUsage</span><span class="s2">"</span>
<span class="o">}</span>
quit<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> 0 <span class="o">]]</span>
    <span class="k">then
            </span><span class="nb">exit </span>0
    <span class="k">else
            </span><span class="nb">printf</span> <span class="s2">"%b</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="se">\0</span><span class="s2">33[1mError:</span><span class="se">\0</span><span class="s2">33[0m </span><span class="nv">$1</span><span class="s2">"</span>
            <span class="nb">exit </span>1
    <span class="k">fi</span>
<span class="o">}</span>

prepare
displayStats
</code></pre></div></div>

<h2 id="example-output">Example Output</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>./stats
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">100 Days to Offload Stats
    Start Date: January 14, 2022
    End Date: January 14, 2023
    Total Posts: 50
    Total Remaining Posts: 50

General Stats
    Total Posts: 98
    Total Post Drafts: 49
    Total Disk Usage: 26M
</span></code></pre></div></div>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I believe with the changes I’ve made and by using of the stats script I will be better equipped to remain on track and
focus on achieving the goal I personally chose to participate in. I admit it’s going to be tight to get 100 posts by the
deadline, but at least I’m challenging myself and learning along the way.</p>

<p>How do you track your 100 Days to Offload progress? What challenges have you faced in participating in the 100 Days to
Offload challenge? I would love to hear your thoughts and experiences by <a href="/contact/">contacting me</a>.</p>

<p>This is post 50 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="BASH" /><category term="commandline" /><summary type="html"><![CDATA[Observe my reflections and resolve of participating in the 100 Days to Offload challenge in using a Bash script to track my progress.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/tracking-100-days-to-offload.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/tracking-100-days-to-offload.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Find The Linux Install Date</title><link href="https://www.adamsdesk.com/posts/linux-install-date/" rel="alternate" type="text/html" title="How To Find The Linux Install Date" /><published>2022-12-10T00:00:00-06:00</published><updated>2023-06-08T17:32:01-06:00</updated><id>https://www.adamsdesk.com/posts/linux-install-date</id><content type="html" xml:base="https://www.adamsdesk.com/posts/linux-install-date/"><![CDATA[<p>For the curious minds at heart, it can be interesting to know when a system was initially setup as in the installation
or creation date and time. Finding the date and time of when a system was initially setup can be done in numerous ways.
The unfortunate part is it all depends on each individual circumstance as to which method will work. Therefore, it can
be helpful to know before hand the approximate date of when a system was initially setup, because depending on the
solution used one may get a misleading data due to the data being deleted. Though I still strongly feel that it is best
to use file system based solutions instead of relying on a log file data.</p>

<p>In exploring this topic I was surprised to learn that I’ve been running Arch Linux on my main system since 2016. That’s
more than 6 years running without doing a re-install of the operating system. Believe me there has been times I’ve wanted
to just re-install the operating system, but I wanted to learn from my mistakes and learn how to fix issues along the
way. So for me, it makes me happy I’ve been able to keep this system going for so long.</p>

<p>After playing around with these solutions below, feel free to share your experience and age of a system over on
Mastodon.</p>

<h2 id="arch-linux-pacman-log">Arch Linux Pacman Log</h2>

<p>This solution will only work if the data is still available in the log file. A more reliable solution would be to use
“File System Creation Date” or “State Command” methods.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">head</span> <span class="nt">-n1</span> /var/log/pacman.log
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">[2016-08-08 21:13] [PACMAN] Running 'pacman -r /mnt -Sy --cachedir=/mnt/var/cache/pacman/pkg base base-devel abs linux-headers efibootmgr gnome nvidia-dkms'
</span></code></pre></div></div>

<h2 id="debian-based-systems-syslog">Debian-based Systems Syslog</h2>

<p>If the log file has been deleted, try using the “File System Creation Date” or “State Command” methods instead.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span><span class="nb">head</span> <span class="nt">-n1</span> /var/log/installer/syslog
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Sep 15 02:20:59 syslogd started: BusyBox v1.30.1
</span></code></pre></div></div>

<h2 id="fedora-rhel-and-variant-basesystem">Fedora, RHEL and Variant Basesystem</h2>

<p>Any distribution that is based upon Fedora or Red Hat Enterprise Linux (RHEL) that uses the Basesystem can use this
method. Such systems as CentOS, AlmaLinux or Rocky Linux will work.</p>

<p>The Basesystem defines the components of a basic operating system such as package installation order to use during
bootstrapping. As a result every installation should have the Basesystem.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>rpm <span class="nt">-qi</span> basesystem | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"install date"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Install Date: Thursday 30 June 2022 22:35:05 PM
</span></code></pre></div></div>

<h2 id="gentoo-linux-emerge-log">Gentoo Linux Emerge Log</h2>

<p>I’ve not been able to test this example as yet. It should work with Gentoo Linux and variant distributions.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">head</span> <span class="nt">-n</span> 1 /var/log/emerge.log | <span class="nb">cut</span> <span class="nt">-b</span> 31-43
</code></pre></div></div>

<h2 id="stat-command">Stat Command</h2>

<p>This method is more accurate as it looks at the file system itself instead of relying on log data that maybe missing.
I’ve also found this method works with NTFS (New Technology File System).</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">stat</span> <span class="nt">-c</span> %w /
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">2016-08-08 15:10:52.049347976 0000
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">-c      use the specified FORMAT instead of the default;</span><span class="w"> </span>output a newline after each use of FORMAT
<span class="gp">%w      time of file birth, human-readable;</span><span class="w"> </span>- <span class="k">if </span>unknown
</code></pre></div></div>

<p>The output can be formatted using the date command.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> %w /<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Mon 08 Aug 2016 03:10:52 PM UTC
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">date</span> <span class="nt">-d</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> %w /<span class="si">)</span><span class="s2">"</span> +<span class="s2">"%Y-%m-%d %H:%M:%S %z"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">2016-08-08 15:10:52 0000
</span></code></pre></div></div>

<h2 id="file-system-creation-date-ext2ext3ext4">File System Creation Date: Ext2/Ext3/Ext4</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>tune2fs <span class="nt">-l</span> /dev/sdd1 | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s1">'Filesystem created:'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Filesystem created:       Tue Jan  1 15:53:19 2019
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>dumpe2fs /dev/sdd1 | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s1">'Filesystem created:'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">dumpe2fs 1.46.5 (30-Dec-2021)
Filesystem created:       Tue Jan  1 15:53:19 2019
</span></code></pre></div></div>

<h2 id="file-system-creation-date-btrfs">File System Creation Date: BTRFS</h2>

<p>Find the desired subvolume.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>btrfs subvolume list <span class="nt">-a</span> /
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">ID 257 gen 1692588 top level 5 path &lt;FS_TREE&gt;</span>/ROOT
<span class="gp">ID 258 gen 1692588 top level 5 path &lt;FS_TREE&gt;</span>/home
<span class="gp">ID 259 gen 1691778 top level 5 path &lt;FS_TREE&gt;</span>/srv
</code></pre></div></div>

<p>Display the details of the subvolume (e.g. /ROOT) to see the “Creation time”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>btrfs subvolume show / | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"creation time:"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Creation time:      2016-08-08 15:10:52 0000
</span></code></pre></div></div>

<h3 id="install-date-script">Install-date Script</h3>

<p>The <a href="https://github.com/phosphorcube/install-date">install-date</a> script by Alice (phosphorcube) is useful if one needs
to do this on a variety of systems. Though I did find the script restrictive when one wants to check more than just the
root file system creation date.</p>

<p>Download the script to the current working directory as “install-date” using one of these commands.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl <span class="nt">-JLO</span> https://raw.githubusercontent.com/phosphorcube/install-date/main/install-date
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>wget https://raw.githubusercontent.com/phosphorcube/install-date/main/install-date
</code></pre></div></div>

<p>Set the execute permission.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">chmod</span> +x install-date
</code></pre></div></div>

<p>Run the script.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>./install-date
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">2016-08-08
</span></code></pre></div></div>

<p>This is post 49 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="linux" /><summary type="html"><![CDATA[How to determine the approximate installation or creation date and time of various Linux operating systems.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/linux-install-date.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/linux-install-date.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Find Your Most Frequently Used Terminal Commands</title><link href="https://www.adamsdesk.com/posts/find-most-used-terminal-commands/" rel="alternate" type="text/html" title="Find Your Most Frequently Used Terminal Commands" /><published>2022-12-09T00:00:00-06:00</published><updated>2023-03-28T13:47:04-06:00</updated><id>https://www.adamsdesk.com/posts/find-most-used-terminal-commands</id><content type="html" xml:base="https://www.adamsdesk.com/posts/find-most-used-terminal-commands/"><![CDATA[<p>I was inspired to write this post from watching the video
“Find Your Most Used Terminal Commands (Bash, Fish, Zsh)” (<a href="https://www.youtube.com/watch?v=vc5X1Kygat0">YouTube</a>, <a href="https://odysee.com/@DistroTube:2/find-your-most-used-terminal-commands:d">Odysee</a>)
on DistroTube by Derek Taylor and thought it could be interesting. For various reasons some of us want to know what
is the most used commands in the terminal. Getting this information is not hard, however there are many ways in which to
go about doing it. As well there is the whole criteria of what is considered a command. Some say it’s the entire line
that is executed and some believe that each command should be treated separately. Others argue what is the entire point
of doing this in the first place. I’m sure the debate will go on till the end of time. So let’s continue on down this
rabbit hole and see what we can dig up.</p>

<h2 id="bash-and-zsh">Bash and Zsh</h2>

<p>Here are a few variations that all provide the same output of 25 most used commands that displays the usage count and
command.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">awk</span> <span class="s1">'BEGIN {FS="[ \t]+|\\|"} {print $3}'</span> | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">awk</span> <span class="s1">'{print $2}'</span> | <span class="nb">sort</span>  | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">awk</span> <span class="s1">'{a[$2]++}END{for(i in a){print a[i] " " i}}'</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">3353 git
3201 pikaur
2601 ll
2451 sudo
2168 cd
1942 nano
1537 grep
1423 mv
1269 rm
 854 find
 799 cp
 728
 658 man
 585 eog
 550 ls
 534 pacaur
 454 which
 405 evince
 397 systemctl
 391 cat
 337 mkdir
 336 history
 295 t
 277 yarn
 274 scp
</span></code></pre></div></div>

<h2 id="fish">Fish</h2>

<p>Getting the most used commands in Fish is not directly possible as far as I know. The history of commands is recorded,
but the recording doesn’t allow for duplicates. Therefore, how can one count all the commands to determine the most
used? Presently there is a Fish project issue, “<a href="https://github.com/fish-shell/fish-shell/issues/2398">History should contain how often a command was executed</a>”
that talks about having this ability, however I really doubt it will happen. This is more of fun thing to do then a necessity.</p>

<p>With all that said, this doesn’t mean one cannot still see what the approximate most used commands are in Fish. Here are
a few variations of commands to get the most used 25 commands.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">cut</span> <span class="nt">-d</span> <span class="s1">' '</span> <span class="nt">-f1</span> | <span class="nb">sort</span>  | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">awk</span> <span class="s1">'{print $1}'</span> | <span class="nb">sort</span>  | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">history</span> | <span class="nb">awk</span> <span class="s1">'BEGIN {FS=" "} {print $1}'</span> | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-n25</span>
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">3353 git
3201 pikaur
2601 ll
2451 sudo
2168 cd
1942 nano
1537 grep
1423 mv
1269 rm
 854 find
 799 cp
 728
 658 man
 585 eog
 550 ls
 534 pacaur
 454 which
 405 evince
 397 systemctl
 391 cat
 337 mkdir
 336 history
 295 t
 277 yarn
 274 scp
</span></code></pre></div></div>

<h2 id="command-statistics">Command Statistics</h2>

<p>This is a very interesting approach I found online that outputs, line number, usage count, percentage used, and
command. I have not been able to figure out how to make this method work beyond using Bash. I would first need to learn
about what exactly the <code class="language-plaintext highlighter-rouge">fc</code> command does. I did figure out that the <code class="language-plaintext highlighter-rouge">fc</code> is a built-in command in Bash and Zsh.</p>

<p>Command example is intended for Bash and Zsh, but I have not tested the command in Zsh.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="k">function </span>shstats<span class="o">()</span> <span class="o">{</span> <span class="nb">fc</span> <span class="nt">-l</span> 1 | <span class="nb">awk</span> <span class="s1">'{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}'</span> | <span class="nb">grep</span> <span class="nt">-v</span> <span class="s2">"./"</span> | column <span class="nt">-c3</span> <span class="nt">-s</span> <span class="s2">" "</span> <span class="nt">-t</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">nl</span> | <span class="nb">head</span> <span class="nt">-n25</span><span class="p">;</span> <span class="o">}</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>shstats
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">1	75  15.0905%   exit
2	57  11.4688%   ls
3	39  7.84708%   echo
4	27  5.4326%    history
5	20  4.02414%   ll
6	19  3.82294%   cd
7	17  3.42052%   yarn
8	16  3.21932%   nano
9	14  2.8169%    sudo
10	14  2.8169%    find
11	12  2.41449%   man
12	12  2.41449%   composer
13	11  2.21328%   du
14	10  2.01207%   md5sum
15	8   1.60966%   which
</span><span class="gp">16	8   1.60966%   t=$</span><span class="o">(</span><span class="nb">df</span>|awk
<span class="go">17	7   1.40845%   sed
18	7   1.40845%   pwd
19	7   1.40845%   mv
20	6   1.20724%   rm
</span><span class="gp">21	5   1.00604%   windowID=$</span><span class="o">(</span>xprop
<span class="go">22	5   1.00604%   mount
23	4   0.804829%  cat
24	3   0.603622%  youtube-dl-gui
</span><span class="gp">25	3   0.603622%  windowID=$</span><span class="o">(</span>wmctrl
</code></pre></div></div>

<h2 id="powershell">PowerShell</h2>

<p>I thought it would be interesting to figure out how to accomplish getting PowerShell most frequently used commands. I’ve
not used PowerShell much, so it did take me awhile to figure out. Do keep in mind that as far as I understand it,
PowerShell history of commands are only tracked until the session ends. Each session one would have to save the
history and then import manually if one wants to have a more accurate most used commands. See my example below on how to
save and import history data.</p>

<p>The command example was tested using PowerShell for Linux. There could be some slight differences, but it should work
just fine in Microsoft Windows.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">group-object</span><span class="w"> </span><span class="nt">-Property</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nt">-Property</span><span class="w"> </span><span class="nx">Count</span><span class="p">,</span><span class="w"> </span><span class="nx">Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w"> </span><span class="nt">-Property</span><span class="w"> </span><span class="nx">Count</span><span class="w"> </span><span class="nt">-top</span><span class="w"> </span><span class="nx">10</span><span class="w"> </span><span class="nt">-Descending</span><span class="w">
</span></code></pre></div></div>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Count</span><span class="w"> </span><span class="nx">Name</span><span class="w">
</span><span class="o">-----</span><span class="w"> </span><span class="o">----</span><span class="w">
    </span><span class="mi">6</span><span class="w"> </span><span class="n">dir</span><span class="w">
    </span><span class="nx">5</span><span class="w"> </span><span class="nx">get-history</span><span class="w">
    </span><span class="mi">5</span><span class="w"> </span><span class="n">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">group-object</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w"> </span><span class="nx">Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nx">Name</span><span class="p">,</span><span class="w"> </span><span class="nx">Count</span><span class="w">
    </span><span class="mi">5</span><span class="w"> </span><span class="n">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nt">-property</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">get-unique</span><span class="w"> </span><span class="nt">-asstring</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nt">-first</span><span class="w"> </span><span class="nx">10</span><span class="w">
    </span><span class="mi">4</span><span class="w"> </span><span class="n">ls</span><span class="w">
    </span><span class="nx">3</span><span class="w"> </span><span class="nx">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">group-object</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nx">Count</span><span class="p">,</span><span class="w"> </span><span class="nx">Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w"> </span><span class="nt">-Descending</span><span class="w"> </span><span class="nx">Count</span><span class="w">
    </span><span class="mi">2</span><span class="w"> </span><span class="n">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">group-object</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w"> </span><span class="nx">Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nx">Count</span><span class="p">,</span><span class="w"> </span><span class="nx">Name</span><span class="w">
    </span><span class="mi">2</span><span class="w"> </span><span class="n">get-history</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">select-object</span><span class="w"> </span><span class="nt">-property</span><span class="w"> </span><span class="nx">CommandLine</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">sort-object</span><span class="w">
    </span><span class="nx">2</span><span class="w"> </span><span class="nx">help</span><span class="w"> </span><span class="nx">sort-object</span><span class="w">
    </span><span class="mi">1</span><span class="w"> </span><span class="n">get-help</span><span class="w"> </span><span class="nx">get-process</span><span class="w">
</span></code></pre></div></div>

<h3 id="save-command-history">Save Command History</h3>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">Get-History</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Export-Clixml</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="nx">c:\commands.xml</span><span class="w">
</span></code></pre></div></div>

<h3 id="import-command-history">Import Command History</h3>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">Add-History</span><span class="w"> </span><span class="nt">-InputObject</span><span class="w"> </span><span class="p">(</span><span class="n">Import-Clixml</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="nx">c:\commands.xml</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>This is post 48 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><summary type="html"><![CDATA[Determine the most used commands in the terminal using Bash, Fish, PowerShell and Zsh with these simple one line commands.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/history-most-used-commands.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/history-most-used-commands.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Bash Countdown To Christmas</title><link href="https://www.adamsdesk.com/posts/bash-countdown-christmas/" rel="alternate" type="text/html" title="A Bash Countdown To Christmas" /><published>2022-12-08T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/bash-countdown-christmas</id><content type="html" xml:base="https://www.adamsdesk.com/posts/bash-countdown-christmas/"><![CDATA[<p>Well trying to sleep last night I came up with the festive idea to post about how to create a countdown Bash script for
Christmas day. This feels random to me as I really have no reason to do this other than to have fun I suppose. I’m sure
many have done this, but I have never created one before so why not. I may learn something new, and hopefully, you may
too.</p>

<h2 id="countdown-script">Countdown Script</h2>

<p>The countdown script displays the total weeks, days, hours, minutes and seconds until Christmas day. Optionally one can
provide a parameter “figlet” to change the display from text to ASCII artwork using the Figlet application. The script
will run until the event date is reached, December 25 of the current year. Feel free to press <kbd>CTRL</kbd>-<kbd>C</kbd>
to quit the script earlier. I realize this script could easily be modified to accept parameters for the event date,
title, font, etc. For now though, the focus is just one simple date, December 25.</p>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code"><pre><span class="c">#!/usr/bin/env bash</span>
<span class="nv">eventdate</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-d</span> <span class="s1">'Dec 25'</span> +%s<span class="si">)</span><span class="s2">"</span>
<span class="nb">declare</span> <span class="nt">-a</span> <span class="nv">labels</span><span class="o">=(</span><span class="s2">"weeks"</span> <span class="s2">"days"</span> <span class="s2">"hours"</span> <span class="s2">"mins"</span> <span class="s2">"secs"</span><span class="o">)</span>
<span class="nv">title</span><span class="o">=</span><span class="s2">"Christmas Countdown"</span>

setLabels<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$diffweeks</span><span class="s2">"</span> <span class="nt">-le</span> 1 <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span>labels[0]<span class="o">=</span><span class="s2">"week"</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$diffdays</span><span class="s2">"</span> <span class="nt">-le</span> 1 <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span>labels[1]<span class="o">=</span><span class="s2">"day"</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$diffhours</span><span class="s2">"</span> <span class="nt">-le</span> 1 <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span>labels[2]<span class="o">=</span><span class="s2">"hour"</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$diffmins</span><span class="s2">"</span> <span class="nt">-le</span> 1 <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span>labels[3]<span class="o">=</span><span class="s2">"min"</span>
    <span class="k">fi
    if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$diffsecs</span><span class="s2">"</span> <span class="nt">-le</span> 1 <span class="o">]</span><span class="p">;</span> <span class="k">then
        </span>labels[4]<span class="o">=</span><span class="s2">"sec"</span>
    <span class="k">fi</span>
<span class="o">}</span>
checkCmdExists<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">!</span> <span class="o">[</span> <span class="nt">-x</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">command</span> <span class="nt">-v</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span><span class="si">)</span><span class="s2">"</span> <span class="o">]</span>
    <span class="k">then
        </span><span class="nv">cmdNotFound</span><span class="o">=</span><span class="s2">"</span><span class="nv">$cmdNotFound</span><span class="s2"> </span><span class="nv">$1</span><span class="s2">,"</span>
    <span class="k">fi

    if</span> <span class="o">[[</span> <span class="nv">$cmdNotFound</span> <span class="o">!=</span> <span class="s1">''</span> <span class="o">]]</span>
    <span class="k">then
        </span>quit <span class="s2">"Error: The following command(s) where not found:</span><span class="k">${</span><span class="nv">cmdNotFound</span>::-1<span class="k">}</span><span class="s2">."</span>
    <span class="k">fi</span>
<span class="o">}</span>
displayCountdown<span class="o">()</span> <span class="o">{</span>
    <span class="k">while</span> <span class="o">[</span> <span class="s2">"</span><span class="k">$((</span>eventdate-<span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="o">-</span><span class="m">1</span><span class="k">))</span><span class="s2">"</span> <span class="nt">-gt</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">do
        </span>clear
        <span class="nv">secsleft</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>eventdate-<span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="k">))</span><span class="s2">"</span>
        <span class="nv">diffweeks</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>secsleft <span class="o">/</span> <span class="m">604800</span><span class="k">))</span><span class="s2">"</span>
        <span class="nv">diffdays</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>secsleft <span class="o">/</span> <span class="m">86400</span><span class="k">))</span><span class="s2">"</span>
        <span class="nv">diffhours</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>secsleft <span class="o">%</span> <span class="m">86400</span> <span class="o">/</span> <span class="m">3600</span><span class="k">))</span><span class="s2">"</span>
        <span class="nv">diffmins</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>secsleft <span class="o">%</span> <span class="m">3600</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span><span class="s2">"</span>
        <span class="nv">diffsecs</span><span class="o">=</span><span class="s2">"</span><span class="k">$((</span>secsleft <span class="o">%</span> <span class="m">60</span><span class="k">))</span><span class="s2">"</span>
        setLabels

        <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"figlet"</span> <span class="o">]</span>
        <span class="k">then
            </span>checkCmdExists <span class="s2">"figlet"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$title</span><span class="s2">"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$diffweeks</span><span class="s2"> </span><span class="k">${</span><span class="nv">labels</span><span class="p">[0]</span><span class="k">}</span><span class="s2">"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$diffdays</span><span class="s2"> </span><span class="k">${</span><span class="nv">labels</span><span class="p">[1]</span><span class="k">}</span><span class="s2">"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$diffhours</span><span class="s2"> </span><span class="k">${</span><span class="nv">labels</span><span class="p">[2]</span><span class="k">}</span><span class="s2">"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$diffmins</span><span class="s2"> </span><span class="k">${</span><span class="nv">labels</span><span class="p">[3]</span><span class="k">}</span><span class="s2">"</span>
            figlet <span class="nt">-ct</span> <span class="s2">"</span><span class="nv">$diffsecs</span><span class="s2"> </span><span class="k">${</span><span class="nv">labels</span><span class="p">[4]</span><span class="k">}</span><span class="s2">"</span>
        <span class="k">else
            </span><span class="nb">printf</span> <span class="s2">"%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$title</span><span class="s2">"</span>
            <span class="nb">printf</span> <span class="s2">"%s </span><span class="k">${</span><span class="nv">labels</span><span class="p">[0]</span><span class="k">}</span><span class="s2"> %s </span><span class="k">${</span><span class="nv">labels</span><span class="p">[1]</span><span class="k">}</span><span class="s2"> %s </span><span class="k">${</span><span class="nv">labels</span><span class="p">[2]</span><span class="k">}</span><span class="s2"> %s </span><span class="k">${</span><span class="nv">labels</span><span class="p">[3]</span><span class="k">}</span><span class="s2"> %s </span><span class="k">${</span><span class="nv">labels</span><span class="p">[4]</span><span class="k">}</span><span class="se">\n</span><span class="s2">"</span> <span class="nv">$diffweeks</span> <span class="nv">$diffdays</span> <span class="nv">$diffhours</span> <span class="nv">$diffmins</span> <span class="nv">$diffsecs</span>
        <span class="k">fi

        </span><span class="nb">printf</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">%s</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"Press CTRL-C to quit"</span>
        <span class="nb">sleep </span>1
    <span class="k">done</span>
<span class="o">}</span>
quit<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> <span class="o">=</span> 0 <span class="o">]]</span>
    <span class="k">then
            </span><span class="nb">exit </span>0
    <span class="k">else
            </span><span class="nb">printf</span> <span class="s2">"%b</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>
            <span class="nb">exit </span>1
    <span class="k">fi</span>
<span class="o">}</span>

displayCountdown <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>
quit 0
</pre></td></tr></tbody></table></code></figure>

<h2 id="install-script">Install Script</h2>

<ol>
  <li>Copy and paste the script above into a desired text editor.</li>
  <li>Save the script with the name “countdown” to a desired location.</li>
  <li>
    <p>Set the script execute permission.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">chmod</span> +x countdown
</code></pre></div>    </div>
  </li>
  <li>
    <p>Verify script permission.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">ls</span> <span class="nt">-al</span> countdown
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> -rwxr-xr-x 1 adam adam 2593 Dec  8 17:37 countdown
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="run-script">Run Script</h2>

<p>In the terminal or console run the script as shown below in default mode or Figlet mode.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>./countdown
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Christmas Countdown
2 weeks 16 days 6 hours 9 mins 50 secs

Press CTRL-C to quit
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>./countdown figlet
</code></pre></div></div>

<p><img src="/assets/img/posts/bash-countdown-christmas-figlet.webp" width="1080" height="813" alt="Countdown to Christmas script displayed in ASCII artwork using Figlet" class="img-fluid" loading="lazy" /></p>

<p>This is post 47 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="programming" /><category term="100DaysToOffload" /><category term="BASH" /><summary type="html"><![CDATA[Find the festive joy in this countdown script for Christmas using Bash along with three simple commands, date, clear and sleep.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/bash-countdown-christmas.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/bash-countdown-christmas.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Add New Disk Drive to a Linux System</title><link href="https://www.adamsdesk.com/posts/add-disk-drive-linux/" rel="alternate" type="text/html" title="How to Add New Disk Drive to a Linux System" /><published>2022-12-07T00:00:00-06:00</published><updated>2023-07-23T21:34:06-06:00</updated><id>https://www.adamsdesk.com/posts/add-disk-drive-linux</id><content type="html" xml:base="https://www.adamsdesk.com/posts/add-disk-drive-linux/"><![CDATA[<p>Today I was asked, “how do I add another disk drive to a Linux system?”. So I thought this would be a good post
for today (smile). There is not a lot of discussion on how to do this, and I can understand why. You see, this is not a
light topic to write about. It would be more of a series of posts since there is a lot of technology knowledge one
should know such as, how file systems work, what file system to use, how disk drives are configured, how the mounting
system works, etc. As you can see there is more to it than one would think. I believe though I can make some
assumptions and present a general idea of how a disk drive would be added to a Linux system.</p>

<h2 id="assumptions">Assumptions</h2>

<p>Adding and configuring a drive can be done in multitude of ways, therefore I will make the following assumptions.</p>

<ul>
  <li>General understanding of using a Linux terminal (command-line interface)</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>A new internal disk drive (hard disk drive, solid state drive, etc.) is already installed into the computer system</li>
  <li>The new disk drive will be represented by the device name of <code class="language-plaintext highlighter-rouge">/dev/sdb</code> or UUID of “234d9f5b-bfbd-4f46-a37b-420ed6940690”</li>
  <li>The new disk drive will be configured to have one primary partition with ext4 as the file system</li>
  <li>The new disk drive will be automatically mounted at each boot using the <code class="language-plaintext highlighter-rouge">/etc/fstab</code></li>
  <li>The new disk drive will have a mount point of “/mnt/data”</li>
</ul>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        The instructions outlined below are done at your own risk. Data loss may occur if not done carefully.
    </p>
</div>

<h2 id="locate-new-disk-drive">Locate New Disk Drive</h2>

<p>Use one of the following commands, <code class="language-plaintext highlighter-rouge">lsblk</code> or <code class="language-plaintext highlighter-rouge">fdisk</code> to get device name for the new disk drive.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>lsblk
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">sda      8:32   0 238.5G  0 disk
├─sda1   8:33   0   499M  0 part /boot
└─sda2   8:34   0   238G  0 part /
sdb      8:48   0   1.8T  0 disk
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>fdisk <span class="nt">-l</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Disk /dev/sda: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: Samsung SSD 850
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 286D3D8A-D1C8-44FC-8277-73403A448BF8

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1048576   1046529  511M EFI System
/dev/sda2  1050624 500118158 499067535  238G Linux filesystem

Disk /dev/sdb: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: WDC WD2003FZEX-0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
</span></code></pre></div></div>

<h2 id="create-partition">Create Partition</h2>

<ol>
  <li>
    <p>Change disk partition with fdisk.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>fdisk /dev/sdb
</code></pre></div>    </div>
  </li>
  <li>
    <p>Set disk label type.</p>

    <p>Choose one of the desire disk label type. Most will use GPT (g).</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> g   create a new empty GPT partition table
 G   create a new empty SGI (IRIX) partition table
 o   create a new empty MBR (DOS) partition table
 s   create a new empty Sun partition table
</span></code></pre></div>    </div>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Command (m for help): g
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create new partition.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>fdisk /dev/sdb
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Command (m for help): n
 Partition type
    p   primary (0 primary, 0 extended, 4 free)
    e   extended (container for logical partitions)
 Select (default p): p
 Partition number (1-4, default 1): 1
</span><span class="gp"> First sector (2048-3907029167, default 2048): &lt;press-enter&gt;</span><span class="w">
</span><span class="gp"> Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3907029167, default 3907029167): &lt;press-enter&gt;</span><span class="w">
</span><span class="go">
 Created a new partition 1 of type 'Linux' and of size 1.8 TiB.
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Change partition type.</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Command (m for help): t
</code></pre></div>    </div>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Selected partition 1
 Partition type or alias (type L to list all): 20
</code></pre></div>    </div>
  </li>
  <li>
    <p>Verify changes.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Command (m for help): p
</span></code></pre></div>    </div>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Disk /dev/sdb: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
 Disk model: WDC WD2003FZEX-0
 Units: sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disklabel type: gpt
 Disk identifier: 0x20a1e5f0

 Device     Boot Start        End    Sectors  Size Id Type
 /dev/sdb1        2048 3907029167 3907027120  1.8T 83 Linux filesystem
</code></pre></div>    </div>
  </li>
  <li>
    <p>Save changes and exit.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Command (m for help): w
</span></code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Calling ioctl() to re-read partition table.
 Syncing disks.
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="format-partition">Format Partition</h2>

<p>Format the drive partition using the file system ext4 and set the volume partition label to “new-volume-label”.
The value of “new-volume-label” can be replaced with whatever name one desires.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>mkfs.ext4 <span class="nt">-L</span> new-volume-label /dev/sb1
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-L  Set the volume label for the file system. The maximum length of the volume label is 16 characters.
</span></code></pre></div></div>

<h2 id="mount-drive">Mount Drive</h2>

<ol>
  <li>
    <p>Create a directory for the mount point.</p>

    <p>The directory created will be used to mount (attach) the drive to the current file system.</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span><span class="nb">mkdir</span> /mnt/data
</code></pre></div>    </div>
  </li>
  <li>
    <p>Get the UUID of the disk drive.</p>

    <p>The use of the UUID or Universally unique identifier is used instead of the device name, because device names often
  change due to hardware detection order, and can change when other disks are added or removed.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>lsblk <span class="nt">-f</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> NAME   FSTYPE FSVER LABEL          UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
 sda
 ├─sda1 vfat   FAT32                5352-AC6C                             250.5M    50% /boot
 └─sda2 ext4         ArchLinux      cce03871-dc3b-4418-90f9-87ca427d4223   29.4G    87% /
 sdb
 └─sdb1 ext4   1.0                  234d9f5b-bfbd-4f46-a37b-420ed6940690
</span></code></pre></div>    </div>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> -f  Output info about filesystems.
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Add disk drive to fstab.</p>

    <p>From the previous step copy the UUID of the sdb1 device and enter it into the fstab configuration file. This will
 allow for the system to automatically mount the drive at each time the system is turned on or rebooted. The last
 line shown below is our new disk drive.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>nano /etc/fstab
</code></pre></div>    </div>
    <div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># &lt;file system&gt; &lt;dir&gt;   &lt;type&gt;  &lt;options&gt;   &lt;dump&gt;  &lt;pass&gt;
</span> <span class="c"># /dev/sda1 LABEL=ArchLinux
</span> <span class="n">UUID</span>=<span class="n">cce03871</span>-<span class="n">dc3b</span>-<span class="m">4418</span>-<span class="m">90</span><span class="n">f9</span>-<span class="m">87</span><span class="n">ca427d4223</span>   /           <span class="n">ext4</span>    <span class="n">defaults</span>,<span class="n">errors</span>=<span class="n">remount</span>-<span class="n">ro</span> <span class="m">0</span> <span class="m">1</span>
 <span class="c"># /dev/sdb1 LABEL=new-volume-label
</span> <span class="n">UUID</span>=<span class="m">234</span><span class="n">d9f5b</span>-<span class="n">bfbd</span>-<span class="m">4</span><span class="n">f46</span>-<span class="n">a37b</span>-<span class="m">420</span><span class="n">ed6940690</span>   /<span class="n">mnt</span>/<span class="n">data</span>   <span class="n">ext4</span>    <span class="n">defaults</span>,<span class="n">errors</span>=<span class="n">remount</span>-<span class="n">ro</span> <span class="m">0</span> <span class="m">2</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Mount disk drive.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>mount <span class="nt">-a</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> -a  Mount all filesystems (of the given types) mentioned in fstab (except for those whose line contains the noauto keyword).
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Verify drive is mounted.</p>

    <p>To verify the drive has been mounted, use one of the following commands, <code class="language-plaintext highlighter-rouge">lsblk</code> or <code class="language-plaintext highlighter-rouge">mount</code>.
 The output will show the drive mounted with the mount point of “/mnt/data”.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>lsblk
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
 sda      8:32   0 238.5G  0 disk
 ├─sda1   8:33   0   499M  0 part /boot
 └─sda2   8:34   0   238G  0 part /
 sdb      8:48   0   1.8T  0 disk
 └─sdb1   8:34   0   1.8T  0 part /mnt/data
</span></code></pre></div>    </div>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>mount
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> /dev/sda1 on /boot type vfat (rw,relatime,errors=remount-ro)
 /dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro)
 /dev/sdb1 on /mnt/data type ext4 (rw,relatime,errors=remount-ro)
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="set-permissions">Set Permissions</h2>

<p>The file system of a drive can be configured in many ways, therefore in this example I will assume the drive is being
used by one person. By default, a drive will have user and group ownership (group) set to “root”. Let’s change this to
grant the primary user, “adam” access to the entire drive.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span><span class="nb">chown</span> <span class="nt">-R</span> adam:adam /mnt/data
</code></pre></div></div>

<p>This will change the user and group ownership as follows.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">ls</span> <span class="nt">-al</span> /mnt
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>drwxr-xr-x  1 root root  208 Nov 30 14:23 ..
drwxr-xr-x 12 adam adam 4096 Dec  7 19:05 data
</code></pre></div></div>

<h2 id="accessing-the-drive">Accessing the Drive</h2>

<p>The new disk drive can be accessed by browsing to the path, “/mnt/data”.</p>

<p>This is post 46 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="hardware" /><summary type="html"><![CDATA[Learn the steps on how to add a new disk drive to a Linux system from finding the device, creating a partition, formatting and mounting.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/add-disk-drive.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/add-disk-drive.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Restrict PHP Version for Composer Packages</title><link href="https://www.adamsdesk.com/posts/composer-php-platform/" rel="alternate" type="text/html" title="Restrict PHP Version for Composer Packages" /><published>2022-12-06T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/composer-php-platform</id><content type="html" xml:base="https://www.adamsdesk.com/posts/composer-php-platform/"><![CDATA[<p>It’s quite common in having the web development environment with one version of PHP and then using another version in
the production environment. This can cause quite a hassle and make it difficult to manage. Therefore, a developer needs
to be able to set restrictions to not just for the dependencies, but also the platform itself, PHP. Luckily there is a
solution for those using Composer to manage PHP dependency packages.</p>

<h2 id="php-platform">PHP Platform</h2>

<p>By setting the PHP platform version in the “composer.json” file, this will restrict Composer packages and extensions
being installed to only install versions that are compatible to the fake PHP platform version, not the actually PHP
version. So next time an installation or update is done with Composer the PHP platform version will be used instead of
the actual PHP version installed. This will ensure both development and production environment remain compatible. Though
do keep in mind that you may need to require certain package versions to also work within both environments.</p>

<p>The platform setting can be achieved manually by using a text editor or just be simply running a command within your
project directory.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer config platform.php 8.0.0
</code></pre></div></div>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"platform"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"php"</span><span class="p">:</span><span class="w"> </span><span class="s2">"8.0.0"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>For global system setting add the option, “-g” as shown below.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer config <span class="nt">-g</span> platform.php 8.0.0
</code></pre></div></div>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"platform"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"php"</span><span class="p">:</span><span class="w"> </span><span class="s2">"8.0.0"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="ignoring-platform-requirement">Ignoring Platform Requirement</h2>

<p>If for some reason you need to ignore the PHP platform setting, you can run the following command to override. Just
replace the package name “symfony/mailer” in the example below to any package you desired.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer update symfony/mailer <span class="nt">--ignore-platform-reqs</span>
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer <span class="nb">install</span> <span class="nt">--ignore-platform-reqs</span>
</code></pre></div></div>

<h2 id="check-platform-requirements">Check Platform Requirements</h2>

<p>It is recommended to verify platform requirements by running the following command as a part of the deployment process.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer check-platform-reqs
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Checking platform requirements for packages in the vendor dir
ext-gd         8.1.13  success
ext-mbstring *         success provided by symfony/polyfill-mbstring
ext-pcre      8.1.13   success
php            8.1.13   success
</span></code></pre></div></div>

<h2 id="find-php-version">Find PHP Version</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>php <span class="nt">-v</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">PHP 8.1.13 (cli) (built: Nov 23 2022 16:30:12) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
</span></code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>php7 <span class="nt">-v</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">PHP 7.4.33 (cli) (built: Nov  7 2022 21:50:25) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
</span></code></pre></div></div>

<p>This is post 45 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="programming" /><category term="100DaysToOffload" /><category term="development" /><summary type="html"><![CDATA[There are many advantages to using Composer, but one stands out from the rest. Learn about the benefits of setting the PHP platform version.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/composer-php-platform.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/composer-php-platform.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Slice of Life Wallpaper: Part Two</title><link href="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-two/" rel="alternate" type="text/html" title="Slice of Life Wallpaper: Part Two" /><published>2022-12-05T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-two</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-two/"><![CDATA[<p>Slice of life desktop/mobile wallpaper for me brings a sense of calm, peace and relaxation. At the same time it
also is captivating no matter how many times one looks at a specific wallpaper. Having wallpaper like this helps to set
ones mindset and allow for focus instead of distraction. The piece can bring appreciation of the work or even
what great fortunes we have in our own lives. With appreciation, we can also gain realization of the beauty one person
can create or capture from the real world.</p>

<p>Some of the artwork I’ve selected are merely a scene that in my mind indirectly shows a slice of life (time) or as if
someone out of frame is overlooking the surrounds. Like all art appreciation is in the eye of the beholder. Lets us
continue this series on from <a href="/posts/slice-of-life-wallpaper-part-one/">part one</a> in exploring and discovering more of
these high quality slice of life wallpapers.</p>

<h2 id="wallpapers">Wallpapers</h2>

<p>Please remember to respect the artists of each one of these art wallpapers. If I have missed anything in properly
giving credit to where it is due, please let me know.</p>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/6odlkq" title="View source">
        <img src="/assets/img/posts/wallpaper-retro-bedroom-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/6odlkq" title="View source">
            Morning bedroom by Evgeniy Slushev (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/e77g8k" title="View source">
        <img src="/assets/img/posts/wallpaper-landscape-forest-warcraft-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/e77g8k" title="View source">
            Landscape Forest, Warcraft (3849 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/e77x6r" title="View source">
        <img src="/assets/img/posts/wallpaper-night-street-zhuang-yao-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/e77x6r" title="View source">
            Night Street by Zhuang Yao (6237 x 3508 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/8o7oz2" title="View source">
        <img src="/assets/img/posts/wallpaper-sythnwave-city-sunset-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/8o7oz2" title="View source">
            Sythnwave City Sunset (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/pk3kde" title="View source">
        <img src="/assets/img/posts/wallpaper-nature-trees-water-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/pk3kde" title="View source">
            Nature Trees and Water (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/Art/comments/ubezio/city_on_the_sea_me_digital_2022/" title="View source">
        <img src="/assets/img/posts/wallpaper-city-on-the-sea-perfectionistsun-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/Art/comments/ubezio/city_on_the_sea_me_digital_2022/" title="View source">
            City on the Sea by perfectionistsun (5400 x 3600 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/futureporn/comments/tv1hgh/wanderers_by_artist_sergey_orlyansky/" title="View source">
        <img src="/assets/img/posts/wallpaper-wanderers-by-sergey-orlyansky-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/futureporn/comments/tv1hgh/wanderers_by_artist_sergey_orlyansky/" title="View source">
            Wanderers by Sergey Orlyansky (3500 x 1969 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/ph26o6/lantern_fest_3840_x_2160/" title="View source">
        <img src="/assets/img/posts/wallpaper-lantern-fest-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/ph26o6/lantern_fest_3840_x_2160/" title="View source">
            Lantern Fest (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/ph255u/lo_fi_cafe_3840_x_2160/" title="View source">
        <img src="/assets/img/posts/wallpaper-lofi-cafe-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/ph255u/lo_fi_cafe_3840_x_2160/" title="View source">
            LO FI Cafe (3840 x 2160 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/nYVKJ1" title="View source">
        <img src="/assets/img/posts/wallpaper-swordfish-shack-alsu-rakhimova-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/nYVKJ1" title="View source">
            Swordfish Shack by Alsu Rakhimova, concept by Rebecca W. Chan (3741 x 1448 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.peppercarrot.com/en/viewer/wallpapers__2019-12-09_Unity-tree_by-David-Revoy.html" title="View source">
        <img src="/assets/img/posts/wallpaper-unity-tree-pepper-carrot-david-revoy-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.peppercarrot.com/en/viewer/wallpapers__2019-12-09_Unity-tree_by-David-Revoy.html" title="View source">
            Unity Tree - Pepper &amp; Carrot by David Revoy (4200 x 2625 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://framapiaf.org/@davidrevoy/109360176850811651" title="View source">
        <img src="/assets/img/posts/wallpaper-my-neighbor-mastodon-david-revoy-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://framapiaf.org/@davidrevoy/109360176850811651" title="View source">
            My Neighbor Mastodon by David Revoy (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<p>This is post 44 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="100DaysToOffload" /><category term="artwork" /><summary type="html"><![CDATA[Be mindful and begin the day with peace and relaxation using these curated artwork pieces of imaginary slice of life high resolution (2K/4K) wallpapers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-two.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-two.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Space Cadet Pinball</title><link href="https://www.adamsdesk.com/posts/space-cadet-pinball/" rel="alternate" type="text/html" title="Space Cadet Pinball" /><published>2022-12-04T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/space-cadet-pinball</id><content type="html" xml:base="https://www.adamsdesk.com/posts/space-cadet-pinball/"><![CDATA[<p>The games that came with the operating system Microsoft Windows were not exactly something to get excited about. Most
games were played for a bit and then forgotten. However, there was one of those games that was the exception.  A pinball
table Space Cadet was initially released as Full Tilt! Pinball developed by Cinematronics and published by Maxis in 1995.
The port of the pinball table was developed by David Plummer at Microsoft and was bundled with Microsoft
Plus! 95 and later included with Microsoft Windows NT 4.0, Windows 2000, Windows Me and Windows XP.</p>

<h2 id="reverse-engineered">Reverse Engineered</h2>

<p>This classic pinball game 3D Pinball for Windows - Space Cadet has been reverse engineered by Muzychenko Andrey. Thanks
to Muzychenko’s hard work the game can be played on 32-bit/64-bit Windows along with Windows XP. Other people have taken
this project and ported it to other platforms to play on AmigaOS 4, Android, MorphOS, Nintendo 3DS, Nintendo Switch,
Nintendo Wii, Nintendo Wii U, PS Vita, Web and webOS TV.</p>

<p>For Arch Linux user’s the game can be installed as an AUR package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> spacecadetpinball-git
</code></pre></div></div>

<h2 id="public-domain">Public Domain</h2>

<p>I’ve also noticed that apparently Microsoft has made the game available as public domain and is available for download
at Internet Archive, <a href="https://archive.org/details/SpaceCadet_Plus95">3D Pinball - Space Cadet (From Microsoft Plus! 95)</a>.</p>

<p>Arch Linux user’s can install this version as an AUR package. Though I should note that I haven’t been able to figure
out how to get this one in full screen mode without it screwing up and making it unplayable.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> mspinball-bin
</code></pre></div></div>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>I’m not exactly sure why, but I’ve always found pinball games very attractive type of game to play. One could say I’m
almost addicted to pinball, because for quite some time I’ve been collecting every pinball video game I can find. The
one aspect I do realize is that when I play a pinball game it seems to allow me to focus on the game entirely and allow
for everything else to disappear. Maybe it is my form of zen (smile).</p>

<p>Though Space Cadet Pinball is a simple game, it is still challenging and entertaining.</p>

<p>This is post 43 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="gaming" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Experience the classic and shockingly good game of 3D Pinball for Windows - Space Cadet on a modern device or operating system.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/space-cadet-pinball.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/space-cadet-pinball.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Send Email Messages Using Symfony Mailer</title><link href="https://www.adamsdesk.com/posts/send-email-symfony-mailer/" rel="alternate" type="text/html" title="Send Email Messages Using Symfony Mailer" /><published>2022-12-03T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/send-email-symfony-mailer</id><content type="html" xml:base="https://www.adamsdesk.com/posts/send-email-symfony-mailer/"><![CDATA[<p>It is quite often a common practice now to see many websites with a contact form that will send the message to the
recipient via email. What is not always clear is how to achieve this. My intent here is to demonstrate how to
send email messages using the Symfony mailer component without using the Symfony framework. To keep things simple
the PHP code will be run via the command line and use SMTP (simple mail transfer protocol) for the mail transport.
I will not be covering how to create the HTML form, how to capture errors/exceptions, but rather focus on the just
the act of sending an email message using PHP.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Composer v2.4.4</li>
  <li>GNU bash v5.1.16</li>
  <li>PHP v8.0.0</li>
  <li>PHP Dotenv v5.5</li>
  <li>Symfony mailer v5.4</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>General understanding of how email operates</li>
  <li>General understanding of using a Linux terminal (command-line interface)</li>
  <li>General understanding of PHP and Composer</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>PHP is already installed and configured</li>
  <li>Composer is already installed and configured</li>
  <li>Have a test email account login credentials</li>
</ul>

<h2 id="create-project-directory">Create Project Directory</h2>

<p>This directory will be used to develop our simple email message sender.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">mkdir </span>symfony-mailer-example
</code></pre></div></div>

<p>Change to the project directory.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">cd </span>symfony-mailer-example
</code></pre></div></div>

<h2 id="install-dependencies">Install Dependencies</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>composer require symfony/mailer
<span class="gp">$</span><span class="w"> </span>composer require vlucas/phpdotenv
</code></pre></div></div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        This will create two files, "composer.json", "composer.lock" and a subdirectory, "vendor/".
    </p>
</div>

<h2 id="create-php-mailer">Create PHP Mailer</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano mailer.php
</code></pre></div></div>

<figure class="highlight"><code class="language-php" data-lang="php"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre><span class="cp">&lt;?php</span>
<span class="k">require_once</span> <span class="s1">'vendor/autoload.php'</span><span class="p">;</span>
<span class="kn">use</span> <span class="nc">Symfony\Component\Mailer\Mailer</span><span class="p">;</span>
<span class="kn">use</span> <span class="nc">Symfony\Component\Mailer\Transport</span><span class="p">;</span>
<span class="kn">use</span> <span class="nc">Symfony\Component\Mime\Email</span><span class="p">;</span>
<span class="kn">use</span> <span class="nc">Dotenv\Dotenv</span><span class="p">;</span>

<span class="nv">$dotenv</span> <span class="o">=</span> <span class="nc">Dotenv</span><span class="o">::</span><span class="nf">createImmutable</span><span class="p">(</span><span class="k">__DIR__</span><span class="p">);</span>
<span class="nv">$dotenv</span><span class="o">-&gt;</span><span class="nf">load</span><span class="p">();</span>
<span class="nv">$dotenv</span><span class="o">-&gt;</span><span class="nf">required</span><span class="p">([</span><span class="s1">'MAILER_PREFIX'</span><span class="p">,</span><span class="s1">'MAILER_PWD'</span><span class="p">,</span><span class="s1">'MAILER_SUFFIX'</span><span class="p">]);</span>
<span class="nv">$dotenv</span><span class="o">-&gt;</span><span class="nf">required</span><span class="p">(</span><span class="s1">'MAILER_PREFIX'</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">notEmpty</span><span class="p">();</span>
<span class="nv">$dotenv</span><span class="o">-&gt;</span><span class="nf">required</span><span class="p">(</span><span class="s1">'MAILER_PWD'</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">notEmpty</span><span class="p">();</span>
<span class="nv">$dotenv</span><span class="o">-&gt;</span><span class="nf">required</span><span class="p">(</span><span class="s1">'MAILER_SUFFIX'</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">notEmpty</span><span class="p">();</span>

<span class="nv">$dsn</span> <span class="o">=</span> <span class="nv">$_ENV</span><span class="p">[</span><span class="s1">'MAILER_PREFIX'</span><span class="p">]</span> <span class="mf">.</span> <span class="nb">urlencode</span><span class="p">(</span><span class="nv">$_ENV</span><span class="p">[</span><span class="s1">'MAILER_PWD'</span><span class="p">])</span> <span class="mf">.</span> <span class="nv">$_ENV</span><span class="p">[</span><span class="s1">'MAILER_SUFFIX'</span><span class="p">];</span>
<span class="nv">$transport</span> <span class="o">=</span> <span class="nc">Transport</span><span class="o">::</span><span class="nf">fromDsn</span><span class="p">(</span><span class="nv">$dsn</span><span class="p">);</span>
<span class="nv">$mailer</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Mailer</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
<span class="nv">$email</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nc">Email</span><span class="p">())</span>
    <span class="o">-&gt;</span><span class="nf">from</span><span class="p">(</span><span class="s1">'Tester'</span> <span class="mf">.</span> <span class="s1">'&lt;'</span> <span class="mf">.</span> <span class="s1">'tester@example.com'</span> <span class="mf">.</span><span class="s1">'&gt;'</span><span class="p">)</span>
    <span class="o">-&gt;</span><span class="nf">to</span><span class="p">(</span><span class="s1">'hello@example.com'</span><span class="p">)</span>
    <span class="o">-&gt;</span><span class="nf">subject</span><span class="p">(</span><span class="s1">'Contact Form Submission'</span><span class="p">)</span>
    <span class="o">-&gt;</span><span class="nf">text</span><span class="p">(</span><span class="s1">'Hello world, this is a test of the PHP email sender.'</span><span class="p">);</span>
<span class="nv">$mailer</span><span class="o">-&gt;</span><span class="nf">send</span><span class="p">(</span><span class="nv">$email</span><span class="p">);</span>
<span class="cp">?&gt;</span>
</pre></td></tr></tbody></table></code></figure>

<p>Line by line code explanation.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">01 - PHP opening tag, signals the PHP parser to look at code between "&lt;?php" and "?&gt;</span><span class="s2">".
</span><span class="go">02 - Automatically load require libraries.
03 - Use Symfony mailer component.
04 - Use Symfony mailer transport component.
05 - Use Symfony mailer email mime component.
06 - Use Dotenv component.
08 - Initiate Dotenv.
09 - Load dotenv files.
10 - Set required variables.
11 - Require variable to be not empty.
12 - Require variable to be not empty.
13 - Require variable to be not empty.
15 - Set the data source name schema (e.g. protocol://username:password@mailhostname:port). Password is URL encoded.
16 - Set mail transport.
17 - Create mailer object.
18 - Create email object.
</span><span class="gp">19 - Set email message "from" value (e.g. "Tester &lt;&gt;</span>tester@example.com&gt;<span class="s2">").
</span><span class="go">20 - Set email message "to" value (e.g. "hello@example.com").
21 - Set email message "subject" (e.g. "Contact form Submission").
22 - Set email message "text body" (e.g. "Hello world, this is a test of the PHP email sender.").
23 - Send email message.
24 - Close PHP tag.
</span></code></pre></div></div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Before the password is used, it will be URL encoded to ensure compatibility. See <a href="https://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a> for reserved characters.
    </p>
</div>

<h2 id="create-configuration-file">Create Configuration File</h2>

<p>This configuration file is used by Symfony mailer to authenticate to the email server in order to send an email message.
It is best practice to store this information separately to help avoid people stealing it.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano .env
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MAILER_PWD="enter-password"
MAILER_PREFIX="smtp://username@example.com:"
MAILER_SUFFIX="@mail.example.com:465"
</code></pre></div></div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Enclose the variables in double quotes to avoid the value being truncated.
    </p>
</div>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        TLS (SSL) peer verification is done by default. This can be disabled by adding "?verify_peer=0" to the end of `MAILER_SUFFIX` (e.g. MAILER_SUFFIX="@mail.example.com:465?verify_peer=0"), though this is not advisable.
    </p>
</div>

<h2 id="project-directory">Project Directory</h2>

<p>The contents of the project directory should now have the following files.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">.
</span><span class="go">├── .env
├── composer.json
├── composer.lock
├── mailer.php
└── vendor/
</span></code></pre></div></div>

<h2 id="run-the-code">Run The Code</h2>

<p>At this point if everything was entered correctly the code should be able to run successfully. As successful run will
return the prompt and not display a message in the terminal. Check your email inbox for the sent email message.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>php mailer.php
</code></pre></div></div>

<h2 id="git-repository">Git Repository</h2>

<p>For a fast initial setup, you may use the git repository I created, <a href="https://git.nixnet.services/adamsdesk/symfony-mailer-example">symfony-mailer-example</a>.</p>

<p>This is post 42 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="programming" /><category term="100DaysToOffload" /><category term="webdev" /><summary type="html"><![CDATA[Learn how to send email messages using the Symfony mailer component without the use of the Symfony framework.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/send-email-symfony-mailer.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/send-email-symfony-mailer.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pairing to a Logitech Unifying Receiver</title><link href="https://www.adamsdesk.com/posts/pair-device-logitech-unifying-receiver/" rel="alternate" type="text/html" title="Pairing to a Logitech Unifying Receiver" /><published>2022-12-02T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/pair-device-logitech-unifying-receiver</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pair-device-logitech-unifying-receiver/"><![CDATA[<p>I have a home theatre PC (HTPC) setup with a really ancient Logitech cordless keyboard and mouse (820-000176) that
doesn’t work very well. I’m always fighting with it to get the signal to reach across the room. I’ve been wanting to
replace it with anything more modern, but just haven’t been able to. I was surprised one day by my son gifting me a
used Logitech K400r with a trackpad. The only downside to this wonderful gift was that it didn’t include a Logitech
Unifying receiver so that I could use it. Lucky I had a few extra ones kicking around that should work just fine. Now I
just need to figure out is how to pair the device to the receiver under Linux. I’ve never had to pair a device to
another Unifying receiver that wasn’t already setup. Here is how I was able to get the keyboard working using Linux from
the command line and from a graphical user interface (GUI) application.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Fish v3.5.1</li>
  <li>GNOME v43.1</li>
  <li>GNU bash v5.1.16</li>
  <li>Pikaur v1.14.5</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Understanding how to use an AUR helper (e.g. Pikaur)</li>
</ul>

<h2 id="ltunify">ltunify</h2>

<ol>
  <li>
    <p>Install ltunify.</p>

    <p>Arch Linux AUR</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>pikaur <span class="nt">-Syu</span> ltunify
</code></pre></div>    </div>

    <p>Debian</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>apt <span class="nb">install </span>ltunify
</code></pre></div>    </div>
  </li>
  <li>
    <p>Turn on pair mode.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>ltunify pair
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Please turn your wireless device off and on to start pairing.
 Found new device, id=0x03 Keyboard
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Verify device is paired.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>ltunify list
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> Devices count: 3
 Connected devices:
 idx=1	Mouse	Performance MX
 idx=2	Keyboard	K800
 idx=3	Keyboard	K400
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Reboot the system.</p>

    <p>Rebooting the system is necessary for all features of the device to operate correctly.</p>
  </li>
</ol>

<h2 id="solaar">Solaar</h2>

<ol>
  <li>
    <p>Install Solaar.</p>

    <p>Arch Linux</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>pacman <span class="nt">-Syu</span> solaar
</code></pre></div>    </div>

    <p>Debian</p>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>apt <span class="nb">install </span>solaar
</code></pre></div>    </div>
  </li>
  <li>Open the Solaar application.</li>
  <li>
    <p>Click on the text “Unifying Receiver”.</p>

    <p><img src="/assets/img/posts/solaar-screenshot-main-screen.webp" alt="Screenshot of Solaar application main screen" width="720" height="394" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>Click on the “Pair new device” button.</p>

    <p><img src="/assets/img/posts/solaar-screenshot-pair-mode.webp" alt="Screenshot of Solaar application in pairing new device mode" width="720" height="394" loading="lazy" class="img-fluid" /></p>
  </li>
  <li>
    <p>Turn on the device.</p>

    <p><img src="/assets/img/posts/solaar-screenshot-pair-mode-found-device.webp" alt="Screenshot of Solaar application in pairing new device mode, device found" width="694" height="430" loading="lazy" class="img-fluid" /></p>

    <p>If device is already turned on, turn it off and then back on again in order to pair the device.</p>
  </li>
  <li>
    <p>Reboot the system.</p>

    <p>Rebooting the system is necessary for all features of the device to operate correctly.</p>
  </li>
</ol>

<p>This is post 41 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="linux" /><summary type="html"><![CDATA[How to pair a device to a Logitech Unifying receiver using Linux in the command line or using a graphical application.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/logitech-unifiying-receiver-pair-keyboard.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/logitech-unifiying-receiver-pair-keyboard.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Confusion In The Land of Mastodon Features</title><link href="https://www.adamsdesk.com/posts/confusing-mastodon-features/" rel="alternate" type="text/html" title="Confusion In The Land of Mastodon Features" /><published>2022-12-01T00:00:00-06:00</published><updated>2023-08-22T18:44:47-06:00</updated><id>https://www.adamsdesk.com/posts/confusing-mastodon-features</id><content type="html" xml:base="https://www.adamsdesk.com/posts/confusing-mastodon-features/"><![CDATA[<p>Ever since the release of Mastodon version 4 has been deployed on my Mastodon instance, Fosstodon, I’ve been lost in
understanding some software features of the web application. Though it is my understanding these features are a part of
the system no matter what client would be used. Saying that though I can understand that not all clients have all the
features implemented let alone updated to Mastodon version 4. For purpose of this post I will focus on the web
application so to not create further confusion.</p>

<p>First off, I must say I love Mastodon and I appreciate the hard work everyone that is involved in the Mastodon
software project. These complaints, frustrations or confusion of features is just me putting my thoughts out there
to see what I may learn from my readers.</p>

<h2 id="what-is-mastodon">What is Mastodon?</h2>

<p>A free and open source software for running a self-hosted decentralized social network. Each node or instance has its
own code of conduct, terms of service and privacy policy, privacy options and moderation policies.</p>

<h2 id="what-is-an-end-user">What is an End User?</h2>

<p>A user that uses a product (e.g. Mastodon web application) and is not associated to the development or support of the
product.</p>

<h2 id="featured-hashtags">Featured Hashtags</h2>

<p>Each user has the ability to feature up to 10 desired hashtags on one’s own profile. This is a helpful feature as it
allows for others to browse through certain types of posts. The part that comes confusing is the fact that for
whatever reason only a maximum of 3 hashtags are ever shown on the user’s profile. This doesn’t seem to matter if you
are logged in or not. Nor does it appear to randomize which hashtags are shown. So we are left with the question, how
does this feature suppose to behave?</p>

<h2 id="featured-profiles">Featured Profiles</h2>

<p>Each user can choose to feature someone else’s profile on your own profile. This is done by clicking a user’s context
menu on a specific user’s profile page and then adding or removing as a featured profile. In the past 4 random featured
profiles would be displayed on the user’s profile page no matter if you were logged in or not. Now however, I have
no idea where the featured profiles are supposed to appear. What is the maximum amount of featured profiles one can
have?</p>

<p>Another issue is how does one manager featured profiles? There is no known list to manage them which is rather odd since
this ability has been provided for featured hashtags under preferences &gt; profile &gt; featured hashtags. I don’t know how
someone is to remember all the people one has chosen as a featured profile. Then there is the whole questions of what
if that featured profile doesn’t exist or has changed? Can’t seem to remove these.</p>

<h2 id="pinned-posts">Pinned Posts</h2>

<p>I find pinned posts not clear enough to the reader. As it stands a user can choose to pin up to 5 public posts to the top
of all other chronological posts, and they are located under the “posts” tab of a profile page. This seems clear yet it is
not. For some reason one can pin more than 5 posts now, yet it doesn’t seem work. No error message is displayed. Pinned
posts are identified by a pin icon next to text that reads “Pinned post”. Though this isn’t always the case. I’ve found
some of mine are not displaying the icon or text yet if I check it is marked as pinned. As well this identification is
too subtle in my opinion and should have something more dramatic. Though not sure what exactly. Some clients I’ve noticed
have a separate tab called “Pinned Posts”.</p>

<h2 id="closing-thoughts">Closing Thoughts</h2>

<p>Hopefully as the software progresses such issues will be ironed out. As a new user or even a veteran the official
documentation does not seem to match all these features I’ve talked about and just leaves more questions than answers.
I’ve searched through Mastodon software project issues, and I’ve yet to see a response if the problems will be fixed or
even explain them, let alone be acknowledged. Here are a few issues I found that you might find interesting, and hopefully
we will get some answers or fixes in the near future.</p>

<ul>
  <li><a href="https://github.com/mastodon/mastodon/issues/21270">"Feature on Profile" does nothing on 4.0 #21270</a></li>
  <li><a href="https://github.com/mastodon/mastodon/issues/21231">Features Hashtags on user profile only display 3 Hashtags (out of 6) #21231</a></li>
  <li><a href="https://github.com/mastodon/mastodon/issues/8162">Managing featured accounts #8162</a></li>
</ul>

<p>In the meantime why not gain some clarity in reading my <a href="https://kb.adamsdesk.com/application/mastodon-profile-setup/">Mastodon Profile Setup</a>
documentation?</p>

<p>This is post 40 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="mastodon" /><summary type="html"><![CDATA[Gain insight into some of the confusing features on the wonderful Mastodon software that so many of us have grown to love.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mastodon-mascot-confused.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mastodon-mascot-confused.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pikaur System Update Returns TypeError</title><link href="https://www.adamsdesk.com/posts/pikaur-type-error/" rel="alternate" type="text/html" title="Pikaur System Update Returns TypeError" /><published>2022-11-30T00:00:00-06:00</published><updated>2023-01-10T20:43:05-06:00</updated><id>https://www.adamsdesk.com/posts/pikaur-type-error</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pikaur-type-error/"><![CDATA[<p>A few days ago I tried to upgrade my home theatre PC (HTPC) running Arch Linux using pikaur. To my surprise pikaur
failed with a TypeError message, for the most part this just simply doesn’t happen. I didn’t think much of it as
I just re-install pikaur and carried on my way. The next day I experienced the same issue again on my main system.
This time I decided I would venture out to understand the situation better.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Fish v3.5.1</li>
  <li>GNU bash v5.1.16</li>
  <li>Pikaur v1.13.2</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>Understanding how to use an AUR helper (e.g. Pikaur)</li>
</ul>

<h2 id="problem">Problem</h2>

<p>When running the following pikaur command a TypeError message is returned.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>pikaur <span class="nt">-Syu</span>                                       1634ms  2022-11-30 13:04:32 - m:Nov d:Wed w:48
<span class="go">[sudo] password for adam:
:: Synchronizing package databases...
 core is up to date
 extra is up to date
</span><span class="gp"> community                                               7.2 MiB  6.85 MiB/s 00:01 [#</span><span class="c">##############################################] 100%</span>
<span class="go"> multilib is up to date

:: Starting full AUR upgrade...
Reading repository package databases...
Reading local package database...
Reading AUR packages info...
Traceback (most recent call last):
</span><span class="gp">  File "/usr/bin/pikaur", line 36, in &lt;module&gt;</span><span class="w">
</span><span class="go">    main()
  File "/usr/lib/python3.10/site-packages/pikaur/main.py", line 328, in main
    cli_entry_point()
  File "/usr/lib/python3.10/site-packages/pikaur/main.py", line 245, in cli_entry_point
    run_with_sudo_loop(pikaur_operation)
  File "/usr/lib/python3.10/site-packages/pikaur/core.py", line 365, in run_with_sudo_loop
    raise catched_exc
  File "/usr/lib/python3.10/site-packages/pikaur/core.py", line 359, in run_with_sudo_loop
    result = main_thread.get()
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 774, in get
    raise self._value
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.10/site-packages/pikaur/main.py", line 91, in cli_install_packages
    InstallPackagesCLI()
  File "/usr/lib/python3.10/site-packages/pikaur/install_cli.py", line 163, in __init__
    self.main_sequence()
  File "/usr/lib/python3.10/site-packages/pikaur/install_cli.py", line 170, in main_sequence
    self.get_all_packages_info()
  File "/usr/lib/python3.10/site-packages/pikaur/install_cli.py", line 251, in get_all_packages_info
    self.install_info = InstallInfoFetcher(
  File "/usr/lib/python3.10/site-packages/pikaur/install_info_fetcher.py", line 69, in __init__
    self.get_all_packages_info()
  File "/usr/lib/python3.10/site-packages/pikaur/install_info_fetcher.py", line 211, in get_all_packages_info
    self.get_aur_pkgs_info(self.not_found_repo_pkgs_names)
  File "/usr/lib/python3.10/site-packages/pikaur/install_info_fetcher.py", line 464, in get_aur_pkgs_info
    aur_updates_list, not_found_aur_pkgs = find_aur_updates()
  File "/usr/lib/python3.10/site-packages/pikaur/updates.py", line 122, in find_aur_updates
    aur_pkgs_info, not_found_aur_pkgs = find_aur_packages(package_names)
  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 176, in find_aur_packages
    results = [request.get() for request in requests]
</span><span class="gp">  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 176, in &lt;listcomp&gt;</span><span class="w">
</span><span class="go">    results = [request.get() for request in requests]
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 774, in get
    raise self._value
  File "/usr/lib/python3.10/multiprocessing/pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 135, in aur_rpc_info_with_progress
    result = aur_rpc_info(search_queries)
  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 125, in aur_rpc_info
    return [
</span><span class="gp">  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 126, in &lt;listcomp&gt;</span><span class="w">
</span><span class="go">    AURPackageInfo(**{key.lower(): value for key, value in aur_json.items()})
  File "/usr/lib/python3.10/site-packages/pikaur/aur.py", line 52, in __init__
    super().__init__(**kwargs)
  File "/usr/lib/python3.10/site-packages/pikaur/core.py", line 84, in __init__
    setattr(self, key, value)
  File "/usr/lib/python3.10/site-packages/pikaur/core.py", line 98, in __setattr__
    raise TypeError(
TypeError: 'AURPackageInfo' does not have attribute 'submitter'
</span></code></pre></div></div>

<h2 id="solution">Solution</h2>

<p>Simply re-install pikaur following my knowledge base article, <a href="https://kb.adamsdesk.com/operating_system/arch_linux_install_aur_helper/">Arch Linux Install AUR Helper</a>. Once this has been completed pikaur will function again as normal.</p>

<p>I found confirmation from pikaur project issue #680,
<a href="https://github.com/actionless/pikaur/issues/680">TypeError: ‘AURPackageInfo’ does not have attribute ‘submitter’</a>.
I was not able to figure out anything more on the direct cause of the error.</p>

<p>After the re-install of pikaur I have the following version.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ pikaur --version
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Pikaur v1.14.5.r1.g40c98ca
</code></pre></div></div>

<p>This is post 39 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="archlinux" /><summary type="html"><![CDATA[During a system upgrade I discovered pikaur is no longer working due to it failing with a TypeError message. Here's how I resolved it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pikaur-typeerror-archlinux.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pikaur-typeerror-archlinux.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Challenges of Scheduling Meetings</title><link href="https://www.adamsdesk.com/posts/schedule-meetings/" rel="alternate" type="text/html" title="Challenges of Scheduling Meetings" /><published>2022-11-29T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/schedule-meetings</id><content type="html" xml:base="https://www.adamsdesk.com/posts/schedule-meetings/"><![CDATA[<p>I found the task of scheduling a meeting a lot more challenging nowadays compared to the past. In the past most people
that would attend a meeting where already a member of the group whether that be co-workers, family or a group of
friends. A quick chat would usually come to a conclusion of when to have a meeting. Even in a business environment, one
could just check your co-worker’s calendar for availability, or a quick email to those few remote people and resolve
what would be the best fit to schedule a meeting that would work for the majority. In our current modern times this is
not the case. The group for the meeting often entails people from all over the world with many different timezones. Sure
meetings are easier than ever to host online than in the past with all the software and services we now have. Yet, in my
experience most of these services do not make it easy to solve the problem of, when is the best time for all involved.</p>

<h2 id="the-lost-solution">The Lost Solution</h2>

<p>I’ve found over time that a simple poll is best to resolve the problem. Saying this though, I thought
I finally found a free/libre open source software solution called Framadate, to just find out when I was sitting down
to write a post about it that the project has been put into maintenance mode according to <a href="https://framagit.org/framasoft/framadate/framadate/-/issues/545#note_920869">issue #545</a>. I even went to the work of writing up a <a href="https://kb.adamsdesk.com/application/framadate-install/">knowledge base article</a> on how to install the
software to host it yourself. So now the struggle is to find another open source software solution.</p>

<p>These are the reasons why I was excited about this software and service, Framadate by The Framasoft association.</p>

<ul>
  <li>Self-host or free hosted service without an account</li>
  <li>Make standard polls</li>
  <li>Make date event polls</li>
  <li>Visual poll results</li>
  <li>Polls automatically delete</li>
  <li>Export poll data to a spreadsheet</li>
  <li>Minimum software dependencies
    <ul>
      <li>PHP</li>
      <li>MySQL database</li>
    </ul>
  </li>
  <li>Runs on almost all hosting providers</li>
  <li>Free without advertisements</li>
  <li>Respects your freedoms</li>
</ul>

<p>I’ve come across a few interesting solutions, but more often than not I find that they require such things as Go,
Rust, Redis, PostgreSQL, etc. that would therefore require a hosting provider with dedicated server, virtual private
server or cloud services. Most people including myself do not have the financial means to accomplish this and in all
honestly is far beyond what should be required in the first place.</p>

<p>New work has been started on <a href="https://framagit.org/framasoft/framadate/funky-framadate-front">Funky Framadate Front</a>
and <a href="https://framagit.org/tykayn/date-poll-api">Date Poll API</a> as replacements to Framadate. However, I’ve not been
able to make sense of it as yet, and there hasn’t been a release in over a year.</p>

<h2 id="what-now">What Now?</h2>

<p>I honestly do not know what I’m going to use. For the time being I will continue to use Framadate’s free hosted service
until I’m able to find a good replacement. Do you happen to know of a good solution that fits the criteria listed above?
Please feel free to <a href="/contact/">contact me</a> to pass on your possible solution.</p>

<p>This is post 38 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[The struggle of setting a date and time for a meeting can be challenging, though there must be a way with the use of open source software.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/schedule-meeting-calendar.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/schedule-meeting-calendar.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Setting Up a Mastodon Profile</title><link href="https://www.adamsdesk.com/posts/setting-up-mastodon-profile/" rel="alternate" type="text/html" title="Setting Up a Mastodon Profile" /><published>2022-11-13T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/setting-up-mastodon-profile</id><content type="html" xml:base="https://www.adamsdesk.com/posts/setting-up-mastodon-profile/"><![CDATA[<p>Understanding how Mastodon works and how to interact with it can be challenging for some. The Mastodon project
does provide documentation for the end user, which is great to see. However, the end user documentation to me is
missing some formatting improvements, and it also lacks some important information. So I decided to write up my own
documentation to supplement the official documentation.</p>

<h2 id="assumptions">Assumptions</h2>

<p>The docs assumes a Mastodon instance has been chosen and an account has already been created. If you need help
understanding Mastodon as a whole, check out Kev Quirk’s posts below.</p>

<ul>
  <li><a href="https://kevquirk.com/how-does-mastodon-work/">How Does Mastodon Work</a></li>
  <li><a href="https://kevquirk.com/getting-started-with-mastodon/">Getting Started with Mastodon</a></li>
</ul>

<h2 id="documentation">Documentation</h2>

<p>The documentation has been posted on my knowledge base at
<a href="https://kb.adamsdesk.com/application/mastodon-profile-setup/">Mastodon Profile Setup</a>.</p>

<p>This is post 37 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="mastodon" /><summary type="html"><![CDATA[Detailed documentation explaining how to setup a Mastodon social network profile with screenshot examples.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mastodon-profile-setup.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mastodon-profile-setup.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Slice of Life Wallpaper: Part One</title><link href="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-one/" rel="alternate" type="text/html" title="Slice of Life Wallpaper: Part One" /><published>2022-11-12T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-one</id><content type="html" xml:base="https://www.adamsdesk.com/posts/slice-of-life-wallpaper-part-one/"><![CDATA[<p>I’ve recently found myself enjoying slice of life content without even realizing it. I just seemed to naturally browse
slice of life digital art online. I was recommended to watch <a href="https://www.themoviedb.org/tv/134581-1">Kotaro Lives Alone</a>
(2022) and I quite oddly enjoyed it. Though I never thought I would appreciate and enjoy slice of life type content.
With this new found pleasure, I desire having my wallpaper fit this narrative as well. To me I find it is all calming,
relaxing and somehow provides appreciation to not just the artist that creates them, but for the enjoyment of what is
captured within each wallpaper. With this realization I began browsing the Internet to start collecting high resolution
wallpapers that are at least 2K or better yet 4K resolution. I will not deny it has been challenging, however I have
been able to locate some to showcase here these beautiful art pieces for your personal enjoyment.</p>

<h2 id="what-is-slice-of-life">What is Slice of Life?</h2>

<p>A depiction of mundane experiences in art and entertainment. Often this creates content that focuses on a narrative
approach that showcases simple life of events without much character development or conflict. Though slice of life is
often found in anime and manga, it is also found in other forms of literature, film and theatre.</p>

<h2 id="wallpapers">Wallpapers</h2>

<p>Please remember to respect the artists of each one of these art wallpapers. If I have missed anything in properly
giving credit to where it is due, please let me know.</p>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vzqv4l/fleeting_feeling_by_nathanstefv/" title="View source">
        <img src="/assets/img/posts/wallpaper-fleeting-feeling-nathanstefv-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Two people laying on the ground admiring the sunset sky of clouds" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vzqv4l/fleeting_feeling_by_nathanstefv/" title="View source">
            Fleeting Feeling by nathanstefv (2000 x 1126 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vz22oe/contemplate_by_kaiwan_shaban/" title="View source">
        <img src="/assets/img/posts/wallpaper-contemplate-kaiwan-shaban-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Parked G-wagon automobile with wet ground beside a person over looking a bridge in the distance" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vz22oe/contemplate_by_kaiwan_shaban/" title="View source">
            Contemplate by Kaiwan Shaban (3240 x 4050 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vyryg2/ember_lehal%C3%ADe_a_confused_seer_by_me/" title="View source">
        <img src="/assets/img/posts/wallpaper-confused-seer-lawrence-sagabaen-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A redheaded person leaning on the ground of grass on one hand and the other hand holding a card with a confused look" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vyryg2/ember_lehal%C3%ADe_a_confused_seer_by_me/" title="View source">
            Ember Lehalíe, a confused Seer by Lawrence Sagabaen (4700 x 2000 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vy7vss/like_thunder_dangiuz/" title="View source">
        <img src="/assets/img/posts/wallpaper-like-thunder-dangiuz-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Cyberpunk style scene of flying cars around tall buildings with a shadow of a person and cat" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vy7vss/like_thunder_dangiuz/" title="View source">
            Like Thunder by Dangiuz (2200 x 2750 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vxjc44/hikikomori_me_3d/" title="View source">
        <img src="/assets/img/posts/wallpaper-hikikomori-3d-kitsch0-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Overview look of a messy bedroom with a stressed person sitting on the bed" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vxjc44/hikikomori_me_3d/" title="View source">
            Hikikomori by kitsch0 (1920 x 1920 px, 3D)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vwlfxk/the_night_in_the_lonesome_october_octopus_izakaya/" title="View source">
        <img src="/assets/img/posts/wallpaper-night-in-lonesome-october-yunny-wong-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A cartoon styled art showing a slice into a busy restaurant with many customers and an octopus as the chief" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vwlfxk/the_night_in_the_lonesome_october_octopus_izakaya/" title="View source">
            The Night in the Lonesome October - Octopus Izakaya by Yunny Wong (1920 x 1358 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.artstation.com/artwork/B1RmVk" title="View source">
        <img src="/assets/img/posts/wallpaper-last-sunset-mehrdad-malek-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A couple sitting on top of a large industrial automobile enjoying the view as the sun sets" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.artstation.com/artwork/B1RmVk" title="View source">
            The Last Sunset by Mehrdad Malek  (1920 x 1200 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vyaije/animal_crossing_by_totoroguo/" title="View source">
        <img src="/assets/img/posts/wallpaper-animal-crossing-totoroguo-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A view of a busy road intersection as various creatures carry on their day like humans" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vyaije/animal_crossing_by_totoroguo/" title="View source">
            Animal Crossing by TotoroGuo (2500 x 1504 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vvcqb3/waiting_by_1eni1/" title="View source">
        <img src="/assets/img/posts/wallpaper-waiting-1eni1-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="Night time view of a parking lot with bushes, a lady waiting for someone and trees/houses in the background" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vvcqb3/waiting_by_1eni1/" title="View source">
            Waiting by 1Eni1 (1920 x 1080 px, animated)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vjhe61/time_comes_by_lifeline/" title="View source">
        <img src="/assets/img/posts/wallpaper-time-comes-lifeline-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A gloomy apocalyptic industrial tall buildings with a person walking down the center of the road" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/vjhe61/time_comes_by_lifeline/" title="View source">
            Time Comes by Lifeline (6000 x 2600 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/yst8az/dream_sequence_by_devin_elle_kurtz/" title="View source">
        <img src="/assets/img/posts/wallpaper-dream-sequence-devin-elle-kurtz-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A girl in the water enjoying the massive waves of the ocean" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginarySliceOfLife/comments/yst8az/dream_sequence_by_devin_elle_kurtz/" title="View source">
            Dream Sequence by Devin Elle Kurtz (1638 x 2048 px)
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/ImaginaryInteriors/comments/yopet1/residential_trailer_by_alex_papadin/" title="View source">
        <img src="/assets/img/posts/wallpaper-residential-trailer-alex-papadin-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="A messy and clean residential trailer with light shinning through the window blinds" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/ImaginaryInteriors/comments/yopet1/residential_trailer_by_alex_papadin/" title="View source">
            Residential Trailer by Alex Papadin (1920 x 1080 px)
        </a>
    </figcaption>
</figure>

<p>This is post 36 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="100DaysToOffload" /><category term="artwork" /><summary type="html"><![CDATA[Bring joy to your desktop or mobile device using these curated artwork pieces of imaginary slice of life high resolution (2K/4K) wallpapers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-one.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/slice-of-life-wallpaper-part-one.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Change Background Color In Geany</title><link href="https://www.adamsdesk.com/posts/geany-background-color-schemes/" rel="alternate" type="text/html" title="Change Background Color In Geany" /><published>2022-10-17T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/geany-background-color-schemes</id><content type="html" xml:base="https://www.adamsdesk.com/posts/geany-background-color-schemes/"><![CDATA[<p>With the dark style or mode in various software and web applications becoming a norm there are still some
applications that do not provide clear direction on how to accomplish this. Geany a powerful, lightweight, and open
source IDE (integrated development environment)/editor seems to not make it clear to everyone how one can achieve a dark
style or mode. However, there is a way and it is not as hard as one may think.</p>

<h2 id="background-color">Background Color</h2>

<p>By default, as of Geany v1.38 the background edit area of the application has a white background color even if the
system is set to use dark style mode. Unfortunately there is no known setting within the Geany’s graphical interface
that can manually set the editor background color. There is however one option by inverting the syntax highlighting
colors which by default changes to white text on black background. This can be done as follows.</p>

<ol>
  <li>Open the Geany application.</li>
  <li>Go to the menu “Edit” &gt; “Preferences” &gt; “Editor” &gt; Display.</li>
  <li>Click on “Invert syntax highlighting colors”.</li>
  <li>Click on the “OK” button to apply changes.</li>
</ol>

<p>This solution may not be for everyone and is quite limiting if you desire more control over the colors used.</p>

<h2 id="color-schemes">Color Schemes</h2>

<p>Geany themes, called color schemes provide almost complete control over the colors used within the application interface.
The color scheme can be easily modified as desired by simply editing the text configuration file. The background color
is set within a color scheme by the variable default within “[named_styles]” section. The value is broken up into 4
parts (e.g. default=#baae9e;#28211c;false;false), foreground color, background color, use foreground color and use
background color. The 3rd and 4th arguments determine if colors are used when overridden, therefore if not overridden
the colors will be used as default.</p>

<p>Refer to the Geany documentation for further details.</p>

<ul>
  <li><a href="https://www.geany.org/manual/current/index.html#named-styles-section">[named_styles] section</a></li>
  <li><a href="https://www.geany.org/manual/current/index.html#named-colors-section">[named_colors] section</a></li>
  <li><a href="https://www.geany.org/manual/current/index.html#id4">[styling] section</a></li>
</ul>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Color scheme support requires Geany v1.22 or greater.
    </p>
</div>

<h2 id="install-color-schemes">Install Color Schemes</h2>

<h3 id="arch-linux-package">Arch Linux Package</h3>

<ol>
  <li><a href="https://kb.adamsdesk.com/operating_system/arch_linux_install_aur_helper/">Install an AUR helper</a>.</li>
  <li>
    <p>Install package
 Replace “pikaur” with the installed AUR helper command.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>pikaur <span class="nt">-Syu</span> geany-themes
<span class="go"> [sudo] password for username:
</span></code></pre></div>    </div>
  </li>
</ol>

<h3 id="manual-installation">Manual Installation</h3>

<ol>
  <li>Download desired theme (color scheme).
    <ul>
      <li><a href="https://www.geany.org/download/themes">Geany Themes</a></li>
      <li><a href="https://github.com/geany/geany-themes">Geany Themes project</a></li>
      <li><a href="https://git.geany.org/geany-themes/">Geany Themes project (mirror)</a></li>
    </ul>
  </li>
  <li>
    <p>Place the color scheme file(s) within the configuration file paths.</p>

    <p>By default, one of the following directories is used.</p>

    <ul>
      <li>~/.config/geany/colorschemes (Linux, user configuration)</li>
      <li>/usr/share/geany/colorschemes/ (Linux, system configuration)</li>
      <li>C:\Documents and Settings\UserName\Application Data\geany (Windows XP, user configuration)</li>
      <li>C:\users\UserName\Roaming\geany (Windows 7 or greater, user configuration)</li>
    </ul>
  </li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        The ~ (tilde) represents the $HOME (/home/username) of the current user.
    </p>
</div>

<h2 id="change-color-scheme">Change Color Scheme</h2>

<p>Once color scheme(s) are installed, it is quite simple to switch to another color scheme following these instructions.</p>

<ol>
  <li>Open the Geany application.</li>
  <li>Click on the menu “View” &gt; “Change color scheme…”.</li>
  <li>Click on desired theme to select.</li>
  <li>Click on the “Close” button.</li>
</ol>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        Disable "Invert syntax highlighting colors" to ensure color scheme works as intended.
    </p>
</div>

<p>This is post 35 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[A guide on how to change the background color or color scheme (theme) using the open source IDE (integrated development environment) editor Geany.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/geany-screenshot.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/geany-screenshot.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add Custom Metadata to MkDocs</title><link href="https://www.adamsdesk.com/posts/mkdocs-add-metadata/" rel="alternate" type="text/html" title="Add Custom Metadata to MkDocs" /><published>2022-10-04T00:00:00-06:00</published><updated>2023-06-27T19:31:52-06:00</updated><id>https://www.adamsdesk.com/posts/mkdocs-add-metadata</id><content type="html" xml:base="https://www.adamsdesk.com/posts/mkdocs-add-metadata/"><![CDATA[<p>MkDocs only provides the ability to set metadata (key/value pairs) for <code class="language-plaintext highlighter-rouge">title</code> (document title) and <code class="language-plaintext highlighter-rouge">template</code> (template
of page). Outside of this metadata can only be defined and set by passing to a page template. Therefore, if the MkDocs
theme being used supports the desired metadata then they will be displayed on a page or control how the page is
rendered. How this is done is determined by the theme’s configuration and built-in features. Thus, this
means unless the theme being used supports the metadata, one must create or modify a theme in order to make use of
metadata. The focus will be on modifying the theme that does not support the desired metadata, rather than creating a
new theme.</p>

<h2 id="what-is-metadata">What is Metadata?</h2>

<p>A specific type of data that provides information for the associated primary data.</p>

<p>An example would be an email message, the message is the primary data, but the date and time it was sent or received is
metadata. Another example of metadata for a website would be social media account links, authors of a post, etc.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li><a href="https://archlinux.org/">Arch Linux</a> x86_64</li>
  <li><a href="https://www.mkdocs.org/">MkDocs</a> v1.4.0</li>
  <li><a href="https://squidfunk.github.io/mkdocs-material/">MkDocs Material</a> v8.5.4 (theme)</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>General understanding of using a Linux terminal (command-line interface)</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>MkDocs is already installed and configured</li>
  <li>The directory “project” represents the root of the website</li>
</ul>

<h2 id="set-metadata-for-all-pages">Set Metadata for All Pages</h2>

<p>The example below will add metadata to the HTML <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head">head</a>
element on all pages by using MkDocs <a href="https://squidfunk.github.io/mkdocs-material/customization/#overriding-blocks">overriding block</a>
to modify the theme. This method will not overwrite what is already present, and I will reference metadata set in the
MkDocs configuration file, <code class="language-plaintext highlighter-rouge">mkdocs.yml</code>.</p>

<ol>
  <li>
    <p>Edit MkDocs configuration file</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/mkdocs.yml
</code></pre></div>    </div>
    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">theme</span><span class="pi">:</span>
     <span class="na">custom_dir</span><span class="pi">:</span> <span class="s">overrides</span>
 <span class="na">extra</span><span class="pi">:</span>
     <span class="na">social</span><span class="pi">:</span>
         <span class="pi">-</span> <span class="na">icon</span><span class="pi">:</span> <span class="s">fontawesome/brands/mastodon</span>
           <span class="na">link</span><span class="pi">:</span> <span class="s">https://fosstodon.org/@adamsdesk</span>
           <span class="na">name</span><span class="pi">:</span> <span class="s">Adamsdesk on Mastodon</span>
         <span class="pi">-</span> <span class="na">icon</span><span class="pi">:</span> <span class="s">fontawesome/brands/youtube</span>
           <span class="na">link</span><span class="pi">:</span> <span class="s">https://www.youtube.com/channel/UCILZ-ICjQ5diK0kSmElfyXQ</span>
           <span class="na">name</span><span class="pi">:</span> <span class="s">Adamsdesk YouTube</span>
         <span class="pi">-</span> <span class="na">icon</span><span class="pi">:</span> <span class="s">fontawesome/brands/gitlab</span>
           <span class="na">link</span><span class="pi">:</span> <span class="s">https://git.nixnet.services/adamsdesk/</span>
           <span class="na">name</span><span class="pi">:</span> <span class="s">Adam's Gitlab</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create overrides directory</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">mkdir </span>project/overrides
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create desired document to override</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/overrides/main.html
</code></pre></div>    </div>
    <div class="language-jinja highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"base.html"</span> <span class="cp">%}</span>

 <span class="cp">{%</span> <span class="k">block</span> <span class="nv">extrahead</span> <span class="cp">%}</span>
     <span class="cp">{{</span> <span class="nv">super</span><span class="p">()</span> <span class="cp">}}</span>
     <span class="cp">{%</span> <span class="k">for</span> <span class="nv">data</span> <span class="ow">in</span> <span class="nv">config.extra.social</span> <span class="cp">%}</span>
             <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"me"</span> <span class="na">href=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">data.link</span> <span class="cp">}}</span><span class="s">"</span><span class="nt">&gt;</span>
     <span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span>
 <span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> extrahead               Add custom meta tags within the head element
 super()                 Load the original block content
</span><span class="gp"> config.extra.social   References the Extra &gt;</span><span class="w"> </span>Social settings within mkdocs.yml
</code></pre></div>    </div>
  </li>
</ol>

<h2 id="set-metadata-per-page">Set Metadata Per Page</h2>

<p>The example below will add metadata to the HTML <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head">head</a>
element per applicable pages by using MkDocs <a href="https://squidfunk.github.io/mkdocs-material/customization/#overriding-blocks">overriding block</a>
to modify the theme. This method will not overwrite what is already present, and I will reference metadata set in the
page’s front matter if it exists, else it will use a default metadata.</p>

<ol>
  <li>
    <p>Edit MkDocs configuration file</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/mkdocs.yml
</code></pre></div>    </div>
    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">theme</span><span class="pi">:</span>
     <span class="na">custom_dir</span><span class="pi">:</span> <span class="s">overrides</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create overrides directory</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">mkdir </span>project/overrides
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create desired document to override</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/overrides/main.html
</code></pre></div>    </div>
    <div class="language-jinja highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"base.html"</span> <span class="cp">%}</span>

 <span class="cp">{%</span> <span class="k">block</span> <span class="nv">extrahead</span> <span class="cp">%}</span>
     <span class="cp">{{</span> <span class="nv">super</span><span class="p">()</span> <span class="cp">}}</span>
     <span class="cp">{%</span> <span class="k">if</span> <span class="nv">page</span> <span class="ow">and</span> <span class="nv">page.meta</span> <span class="ow">and</span> <span class="nv">page.meta.robots</span> <span class="cp">%}</span>
         <span class="nt">&lt;meta</span> <span class="na">property=</span><span class="s">"robots"</span> <span class="na">content=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">page.meta.robots</span> <span class="cp">}}</span><span class="s">"</span> <span class="nt">/&gt;</span>
     <span class="cp">{%</span> <span class="k">else</span> <span class="cp">%}</span>
         <span class="nt">&lt;meta</span> <span class="na">property=</span><span class="s">"robots"</span> <span class="na">content=</span><span class="s">"index, follow"</span> <span class="nt">/&gt;</span>
     <span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
 <span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> extrahead           Add custom meta tags within the head element
 super()             Load the original block content
</span><span class="gp"> page.meta.robots    References the Page &gt;</span><span class="w"> </span>Meta <span class="o">&gt;</span> Robots settings within a page
</code></pre></div>    </div>
  </li>
</ol>

<h2 id="set-metadata-for-an-entire-directory">Set Metadata for an Entire Directory</h2>

<p>The meta plugin comes with Material MkDocs and allows for setting front matter (metadata) per directory (folder).
Doing so will set front matter for all pages found within the specified directory.</p>

<ol>
  <li>
    <p>Enable MkDocs Meta plugin</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/mkdocs.yml
</code></pre></div>    </div>
    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">plugins</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="s">meta</span>
</code></pre></div>    </div>

    <p>If desired, the default meta file name can be changed as follows.</p>

    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">plugins</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="na">meta</span><span class="pi">:</span>
         <span class="na">meta_file</span><span class="pi">:</span> <span class="s1">'</span><span class="s">**/.metadata.yml'</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create meta file</p>

    <p>The default meta files are named <code class="language-plaintext highlighter-rouge">.meta.yml</code>. Create one within a directory to apply metadata to all nested pages.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>nano project/docs/apps/.meta.yml
</code></pre></div>    </div>
  </li>
</ol>

<p>This is post 34 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="100DaysToOffload" /><category term="webdev" /><summary type="html"><![CDATA[Learn the ins and outs of adding custom metadata to MkDocs with overriding blocks and meta files for all pages, per page or per directory.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mkdocs.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mkdocs.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Automatically Remove Website Tracking Parameters</title><link href="https://www.adamsdesk.com/posts/remove-tracking-parameters/" rel="alternate" type="text/html" title="Automatically Remove Website Tracking Parameters" /><published>2022-09-23T00:00:00-06:00</published><updated>2023-11-27T14:32:44-06:00</updated><id>https://www.adamsdesk.com/posts/remove-tracking-parameters</id><content type="html" xml:base="https://www.adamsdesk.com/posts/remove-tracking-parameters/"><![CDATA[<p>uBlock Origin is a free and open source ad content blocker web browser extension that has become a must-have accessory
to one’s online privacy when browsing websites. This wonderful tool provides the ability of putting the user back in
control of what you are viewing and allowing into your own computer network.</p>

<p>In my experience users of uBlock Origin usually do one of two things, install the extension and forget it or install it
and add a few additional filter lists. Though this no doubt does help a lot in protecting ones privacy, but this does
not block everything that maybe tracking your every move online. I recently discovered an ability that can remove
specific query parameters at the end of a web address to limit or stop this type of tracking.</p>

<h2 id="what-is-a-query-parameter">What is a Query Parameter?</h2>

<p>The query parameter is a part of the query string of a web address (e.g. ?utm_medium=email) that provides the
ability to assign a value to the parameter.</p>

<p>The web address query must start with a “?” followed by the parameter name and value. Multiple query parameters can be
provided by delimiting each parameter using an “&amp;”.</p>

<p>Here is an example of a web address with a single query parameter named “utm_medium” and has a value of “email”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://example.com/post/article/?utm_medium=email
</code></pre></div></div>

<p>Here is an example of web address with multiple query parameters, “utm_medium” and “utm_source”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://example.com/post/article/?utm_medium=email&amp;utm_source=newsletter
</code></pre></div></div>

<h2 id="why-should-i-care">Why Should I Care?</h2>

<p>We all should have the right to privacy weather that is online or offline without someone or something tracking our
every move. Query parameters when used in a manner that does not respect your right to privacy allows a company to
track where you came from, where you have been, what products you have viewed, political views,
and many more. On the surface some may think this is not a big deal, however when you combine this type of tracking
over time and build upon the previous actions can now start to amount to a lot of data that invades your privacy.
When these types of data and more are used in none respectful way, a company can now start to manipulate what content
you see which can affect your opinions, decision-making or may even cause refusal for a service. In the end you are
the consumer who drives the industry, and you are the only one that has your best interest at heart.</p>

<h2 id="how-does-removeparam-work">How Does $removeparam Work?</h2>

<p>When visiting a website while uBlock Origin is installed and enabled Before a website is visited the <code class="language-plaintext highlighter-rouge">$removeparam</code>
filter rules will be applied by removing the desired query parameter. As an example of this behaviour if one has a
filter rule of <code class="language-plaintext highlighter-rouge">*$removeparam=utm_source</code>, it means to remove the query parameter <code class="language-plaintext highlighter-rouge">utm_source</code> from a all web
addresses. You can see below how the web address changes with this filter rule applied.</p>

<p>Before Filter</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://example.com/post/article/?utm_medium=email&amp;utm_source=newsletter
</code></pre></div></div>

<p>After Filter</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://example.com/post/article/?utm_medium=email
</code></pre></div></div>

<h2 id="add-custom-filters-to-ublock-origin">Add Custom Filters to uBlock Origin</h2>

<p>The filters are applied before visiting a web address and can be entered using regular expressions or exactly as typed.
Refer to the wiki article,
<a href="https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#removeparam">uBlock Origin Static filter syntax</a> for
specifics.</p>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Use at your own risk. Poorly crafted removeparam filters can have harmful effects on performance or break a website's functionality.
    </p>
</div>

<ol>
  <li>Under the uBlock Origin Dashboard click on “My filters”</li>
  <li>Copy the desired filters shown below
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>*$removeparam=fbclid
*$removeparam=gclid
*$removeparam=/^utm_/
*$removeparam=/^utm-/
*$removeparam=igshid
*$removeparam=ICID
*$removeparam=rb_clickid
*$removeparam=track_click
*$removeparam=link_id
*$removeparam=mc_cid
*$removeparam=mc_eid
*$removeparam=mcID
*$removeparam=ref
*$removeparam=qid
*$removeparam=cid
*$removeparam=pid
||etsy.com$removeparam=click_key
||etsy.com$removeparam=click_sum
||etsy.com$removeparam=ga_order
||etsy.com$removeparam=ga_search_type
||etsy.com$removeparam=ga_view_type
||etsy.com$removeparam=ga_search_query
||etsy.com$removeparam=sr_gallery
||amazon.*$removeparam=/^pd_rd_/
||amazon.*$removeparam=/^pf_rd_/
||amazon.*$removeparam=content-id
||amazon.*$removeparam=psc
||amazon.*$removeparam=crid
||amazon.*$removeparam=sprefix
||amazon.*$removeparam=qu
||amazon.*$removeparam=sr
||amazon.*$removeparam=th
||amazon.*$removeparam=coliid
||amazon.*$removeparam=colid
||amazon.*$removeparam=ref_
</code></pre></div>    </div>
  </li>
  <li>Paste into “My filters” text area</li>
  <li>Click on the “Apply changes” button</li>
</ol>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        Protect your email client too by installing uBlock Origin and apply the custom filters (e.g. Mozilla Thunderbird).
    </p>
</div>

<p>This is post 33 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="privacy" /><summary type="html"><![CDATA[A privacy guide on how to automatically remove query parameters before a website is visited with the use of uBlock Origin custom filters.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/surveillance-spy-pigeon.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/surveillance-spy-pigeon.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Adding Admonitions to Jekyll</title><link href="https://www.adamsdesk.com/posts/admonitions-jekyll/" rel="alternate" type="text/html" title="Adding Admonitions to Jekyll" /><published>2022-09-22T00:00:00-06:00</published><updated>2023-07-29T16:33:29-06:00</updated><id>https://www.adamsdesk.com/posts/admonitions-jekyll</id><content type="html" xml:base="https://www.adamsdesk.com/posts/admonitions-jekyll/"><![CDATA[<p>I came across some great admonitions when I installed the theme <a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs</a> on
my website, <a href="https://kb.adamsdesk.com/">Adamsdesk Knowledge Base</a>. The admonitions worked out well for me, but I also
wanted admonitions for my main website too, <a href="https://www.adamsdesk.com/">Adamsdesk.com</a>. So keep things small yet
effective I decided to create my own iteration within Jekyll.</p>

<h2 id="what-is-an-admonition">What is an admonition?</h2>

<p>A distinct area of text to emphasize significant attention that is not a part of the main body. The purpose of admonition
is drawing attention towards what you want a reader to remember without significantly interrupting the document flow.
Admonitions are more commonly referred to as a callout or call-out.</p>

<h2 id="the-code">The Code</h2>

<p>My approach was to create a Jekyll include file for the HTML with Liquid template language and Cascading Style Sheets
(CSS) with syntactically awesome style sheets (SASS). This will allow for ease of adding admonitions without having
to type out all the code manually each time. The styles are not completely identical to Material as I felt it needed
to be more fitting to my theme. The Scalable Vector Graphics (SVG) icons I used are from
<a href="https://fontawesome.com">Font Awesome Free</a>. However, I believe one could also use
<a href="https://www.svgrepo.com/">SVG Repo</a>.</p>

<p>I’ve tested this code on multiple web browsers without issues, so it should work fine under most circumstances.</p>

<nav>
    <div class="nav nav-tabs code" id="nav-tab" role="tablist">
        <a class="nav-link active" id="nav-home-tab" data-bs-toggle="tab" href="#nav-home" role="tab" aria-controls="nav-home" aria-selected="true">_includes/admonition.html</a>
        <a class="nav-link" id="nav-profile-tab" data-bs-toggle="tab" href="#nav-profile" role="tab" aria-controls="nav-profile" aria-selected="false">__sass/admonition.scss</a>
    </div>
</nav>
<div class="tab-content" id="nav-tabContent">
    <div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab">


<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">type</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">title</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">body</span><span class="p">.</span><span class="nf">size</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">types</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"note, abstract, info, tip, success, question, warning, failure, danger, bug, example, quote"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">split</span><span class="p">:</span><span class="w"> </span><span class="s2">", "</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">types</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">type</span><span class="w"> </span><span class="cp">%}</span>
&lt;div class="admonition <span class="cp">{{</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">type</span><span class="w"> </span><span class="cp">}}</span> rounded"&gt;
    &lt;p class="admonition-title"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="cp">}}</span>&lt;/p&gt;
    &lt;p&gt;
        <span class="cp">{{</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">body</span><span class="w"> </span><span class="cp">}}</span>
    &lt;/p&gt;
&lt;/div&gt;
    <span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
<span class="cp">{%</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

    </div>
    <div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab">


<figure class="highlight"><code class="language-scss" data-lang="scss"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code"><pre><span class="nv">$primary-color</span><span class="p">:</span> <span class="mh">#fc0</span><span class="p">;</span>
<span class="nv">$primary-bgcolor</span><span class="p">:</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">55</span><span class="mi">.59%</span><span class="o">,</span> <span class="m">44</span><span class="mi">.41%</span><span class="o">,</span> <span class="m">0%</span><span class="o">,</span> <span class="mi">.4</span><span class="p">);</span>
<span class="nv">$admonitions</span><span class="p">:</span>
    <span class="o">//</span><span class="nf">class</span> <span class="p">(</span><span class="n">type</span><span class="p">)</span><span class="o">,</span> <span class="nb">icon</span> <span class="n">filename</span><span class="o">,</span> <span class="nb">icon</span><span class="o">/</span><span class="n">border</span> <span class="n">color</span><span class="o">,</span> <span class="n">title</span> <span class="n">bg</span> <span class="nf">color</span>
    <span class="p">(</span><span class="s1">'note'</span><span class="o">,</span> <span class="s1">'pen-solid.svg'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'abstract'</span><span class="o">,</span> <span class="s1">'align-left-solid.svg'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'info'</span><span class="o">,</span> <span class="s1">'info-circle-solid.svg'</span><span class="o">,</span> <span class="s1">'#00b0ff'</span><span class="o">,</span> <span class="s1">'#293d52'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'tip'</span><span class="o">,</span> <span class="s1">'fire-solid.svg'</span><span class="o">,</span> <span class="s1">'#ff9100'</span><span class="o">,</span> <span class="s1">'#433a38'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'success'</span><span class="o">,</span> <span class="s1">'check-circle-solid.svg'</span><span class="o">,</span> <span class="s1">'#00c953'</span><span class="o">,</span> <span class="s1">'#294040'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'question'</span><span class="o">,</span> <span class="s1">'question-circle-solid.svg'</span><span class="o">,</span> <span class="s1">'#00b8d4'</span><span class="o">,</span> <span class="s1">'#293e4e'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'warning'</span><span class="o">,</span> <span class="s1">'exclamation-triangle-solid.svg'</span><span class="o">,</span> <span class="s1">'#ff9100'</span><span class="o">,</span> <span class="s1">'#564b3c'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'failure'</span><span class="o">,</span> <span class="s1">'times-circle-solid.svg'</span><span class="o">,</span> <span class="s1">'#ff5252'</span><span class="o">,</span> <span class="s1">'#564444'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'danger'</span><span class="o">,</span> <span class="s1">'bolt-solid.svg'</span><span class="o">,</span> <span class="s1">'#ff1744'</span><span class="o">,</span> <span class="s1">'#563e43'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'bug'</span><span class="o">,</span> <span class="s1">'bug-solid.svg'</span><span class="o">,</span> <span class="s1">'#f50057'</span><span class="o">,</span> <span class="s1">'#553c45'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'example'</span><span class="o">,</span> <span class="s1">'list-ol-solid.svg'</span><span class="o">,</span> <span class="s1">'#9e9e9e'</span><span class="o">,</span> <span class="s1">'#4c4c4c'</span><span class="p">)</span>
    <span class="p">(</span><span class="s1">'quote'</span><span class="o">,</span> <span class="s1">'quote-right-solid.svg'</span><span class="o">,</span> <span class="s1">'#9e9e9e'</span><span class="o">,</span> <span class="s1">'#4c4c4c'</span><span class="p">)</span>
<span class="p">;</span>
<span class="nc">.admonition</span> <span class="p">{</span>
	<span class="nl">margin</span><span class="p">:</span> <span class="m">1</span><span class="mi">.5625em</span> <span class="m">0</span><span class="p">;</span>
	<span class="nl">overflow</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
	<span class="nl">color</span><span class="p">:</span> <span class="mh">#808080</span><span class="p">;</span>
	<span class="nl">page-break-inside</span><span class="p">:</span> <span class="nb">avoid</span><span class="p">;</span>
	<span class="nl">background-color</span><span class="p">:</span> <span class="mh">#212121</span><span class="p">;</span>
	<span class="nl">border-left</span><span class="p">:</span> <span class="mi">.3rem</span> <span class="nb">solid</span> <span class="nv">$primary-color</span><span class="p">;</span>
	<span class="nl">border-radius</span><span class="p">:</span> <span class="mi">.1rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.admonition</span> <span class="nt">p</span> <span class="p">{</span>
    <span class="nl">padding</span><span class="p">:</span> <span class="m">0</span> <span class="m">1rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.admonition</span> <span class="nc">.admonition-title</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#ddd</span><span class="p">;</span>
    <span class="nl">background-color</span><span class="p">:</span> <span class="nv">$primary-bgcolor</span><span class="p">;</span>
    <span class="nl">font-weight</span><span class="p">:</span> <span class="m">700</span><span class="p">;</span>
    <span class="nl">line-height</span><span class="p">:</span> <span class="m">3rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="err">.</span><span class="na">admonition-title</span><span class="p">:</span><span class="o">:</span><span class="n">before</span> <span class="p">{</span>
    <span class="nl">margin-right</span><span class="p">:</span> <span class="mi">.5rem</span><span class="p">;</span>
    <span class="nl">width</span><span class="p">:</span> <span class="m">1</span><span class="mi">.2rem</span><span class="p">;</span>
    <span class="nl">height</span><span class="p">:</span> <span class="m">1</span><span class="mi">.2rem</span><span class="p">;</span>
    <span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="p">;</span>
    <span class="nl">content</span><span class="p">:</span> <span class="s1">''</span><span class="p">;</span>
    <span class="na">-webkit-mask-size</span><span class="p">:</span> <span class="n">cover</span><span class="p">;</span>
    <span class="na">mask-size</span><span class="p">:</span> <span class="n">cover</span><span class="p">;</span>
    <span class="nl">background-color</span><span class="p">:</span> <span class="nv">$primary-color</span><span class="p">;</span>
    <span class="nl">vertical-align</span><span class="p">:</span> <span class="nb">text-bottom</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">@each</span> <span class="nv">$name</span><span class="o">,</span> <span class="nv">$icon</span><span class="o">,</span> <span class="nv">$icon-color</span><span class="o">,</span> <span class="nv">$title-color</span> <span class="n">in</span> <span class="nv">$admonitions</span> <span class="p">{</span>
    <span class="k">@if</span> <span class="nv">$icon-color</span> <span class="p">{</span>
        <span class="nc">.admonition.</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="p">{</span>
            <span class="nl">border-left-color</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$icon-color</span><span class="si">}</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">@if</span> <span class="nv">$title-color</span> <span class="p">{</span>
        <span class="nc">.admonition.</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="nc">.admonition-title</span> <span class="p">{</span>
            <span class="nl">background-color</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$title-color</span><span class="si">}</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="nc">.admonition.</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="nc">.admonition-title</span><span class="nd">::before</span> <span class="p">{</span>
        <span class="na">-webkit-mask</span><span class="p">:</span> <span class="sx">url("/assets/img/icons/</span><span class="si">#{</span><span class="nv">$icon</span><span class="si">}</span><span class="sx">")</span> <span class="nb">no-repeat</span> <span class="m">50%</span> <span class="m">50%</span><span class="p">;</span>
        <span class="nl">mask</span><span class="p">:</span> <span class="sx">url("/assets/img/icons/</span><span class="si">#{</span><span class="nv">$icon</span><span class="si">}</span><span class="sx">")</span> <span class="nb">no-repeat</span> <span class="m">50%</span> <span class="m">50%</span><span class="p">;</span>
        <span class="k">@if</span> <span class="nv">$icon-color</span> <span class="p">{</span>
            <span class="nl">background-color</span><span class="p">:</span> <span class="si">#{</span><span class="nv">$icon-color</span><span class="si">}</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></figure>

    </div>
</div>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>General understanding of using a Linux terminal (command-line interface)</li>
  <li>~ (tilde) represents the $HOME (/home/username) of the current user when using BASH</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Jekyll is already installed and configured</li>
  <li>The directory “project” represents the root of the website</li>
</ul>

<h2 id="add-admonitions-to-jekyll">Add Admonitions to Jekyll</h2>

<ol>
  <li>Install the <code class="language-plaintext highlighter-rouge">admonition.html</code> file to the <code class="language-plaintext highlighter-rouge">_includes/</code> directory.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">mv</span> ~/Downloads/admonition.html /project/_includes/
</code></pre></div>    </div>
  </li>
  <li>Install the <code class="language-plaintext highlighter-rouge">admonition.scss</code> file to the <code class="language-plaintext highlighter-rouge">_sass/</code> directory.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">mv</span> ~/Downloads/admonition.scss /project/_sass/
</code></pre></div>    </div>
  </li>
  <li>Edit style sheets to import admonition styles.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano /project/assets/css/styles.scss
</code></pre></div>    </div>
    <div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@import</span> <span class="s2">"admonition"</span><span class="p">;</span>
</code></pre></div>    </div>
  </li>
  <li>Add admonition icons.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">mv</span> ~/Downloads/<span class="k">*</span>.svg /project/assets/img/icons/
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">pen-solid.svg
align-left-solid.svg
info-circle-solid.svg
fire-solid.svg
check-circle-solid.svg
question-circle-solid.svg
exclamation-triangle-solid.svg
times-circle-solid.svg
bolt-solid.svg
bug-solid.svg
list-ol-solid.svg
quote-right-solid.svg
</span></code></pre></div>    </div>
  </li>
</ol>

<h2 id="usage">Usage</h2>

<p>Adding an admonition to a post or page is a simple line of Liquid code. See the example of an info admonition below.</p>

<figure class="highlight"><code class="language-liquid" data-lang="liquid"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>admonition.html<span class="w"> </span><span class="na">type</span><span class="o">=</span><span class="s2">"info"</span><span class="w"> </span><span class="na">title</span><span class="o">=</span><span class="s2">"Info"</span><span class="w"> </span><span class="na">body</span><span class="o">=</span><span class="s2">"This is information intended to draw attention."</span><span class="w"> </span><span class="cp">%}</span>
</pre></td></tr></tbody></table></code></figure>

<h3 id="parameters">Parameters</h3>

<p>All three parameters are required in order to render an admonition and have values which has a character
length greater than zero (0). The <code class="language-plaintext highlighter-rouge">type</code> parameter must be valid value, see
<a href="#parameter-values">parameter values</a>.</p>

<dl>
  <dt>type</dt>
  <dd>Specifies the rendering style of admonition.</dd>
  <dt>title</dt>
  <dd>The heading text displayed at the top of the admonition.</dd>
  <dt>body</dt>
  <dd>The primary message displayed in the body area of the admonition.</dd>
</dl>

<h3 id="parameter-values">Parameter Values</h3>

<h4 id="type">Type</h4>

<p>Must be one of the following values. If an invalid type value is provided the admonition will not be rendered.</p>

<ul>
  <li>abstract</li>
  <li>bug</li>
  <li>danger</li>
  <li>example</li>
  <li>failure</li>
  <li>info</li>
  <li>note</li>
  <li>question</li>
  <li>quote</li>
  <li>success</li>
  <li>tip</li>
  <li>warning</li>
</ul>

<h4 id="title">Title</h4>

<p>A string value that must have a length greater than zero (0). No maximum length.</p>

<h4 id="body">Body</h4>

<p>A string value that must have a length greater than zero (0). No maximum length.</p>

<h2 id="rendered-examples">Rendered Examples</h2>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Well look at you reading this admonition.
    </p>
</div>

<div class="admonition abstract rounded">
    <p class="admonition-title">Abstract</p>
    <p>
        Abstract can be difficult to understand.
    </p>
</div>

<div class="admonition info rounded">
    <p class="admonition-title">Info</p>
    <p>
        This is very informative, would you not agree?
    </p>
</div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        Add this admonition to level up your website.
    </p>
</div>

<div class="admonition question rounded">
    <p class="admonition-title">Question</p>
    <p>
        What is the question again?
    </p>
</div>

<div class="admonition success rounded">
    <p class="admonition-title">Success</p>
    <p>
        I was successful in making you read this message.
    </p>
</div>

<div class="admonition failure rounded">
    <p class="admonition-title">Failure</p>
    <p>
        Failure is a part of the learning process.
    </p>
</div>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Due to unpopular belief, most warnings go unnoticed with exception to this one.
    </p>
</div>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        Reading this website may result in growing your knowledge.
    </p>
</div>

<div class="admonition bug rounded">
    <p class="admonition-title">Bug</p>
    <p>
        This article may contain a bug, or it may not.
    </p>
</div>

<div class="admonition example rounded">
    <p class="admonition-title">Example</p>
    <p>
        This is an example of the admonition example.
    </p>
</div>

<div class="admonition quote rounded">
    <p class="admonition-title">Quote</p>
    <p>
        Reading an admonition a day keeps the bad code away.
    </p>
</div>

<p>This is post 32 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="web" /><category term="webdev" /><category term="jekyll" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Uncover what an admonition or call-out is and how to implement them in a website using Jekyll, HTML, Liquid and SASS.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/web-admonitions.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/web-admonitions.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tech Podcasts Recommendations</title><link href="https://www.adamsdesk.com/posts/tech-podcasts/" rel="alternate" type="text/html" title="Tech Podcasts Recommendations" /><published>2022-09-14T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/tech-podcasts</id><content type="html" xml:base="https://www.adamsdesk.com/posts/tech-podcasts/"><![CDATA[<p>When podcasts first started there wasn’t a lot to choose from. Now days there are endless choices which can make it
difficult trying to find the podcasts that will provide content that has substance along with authenticity, respect,
simplicity, transparency and aspiration to learn. This curated list of technology podcasts is intended to help bridge
that gap and hopefully meet your expectations whether that is for quality entertainment, learning or news.</p>

<p><img src="/assets/img/posts/logo-security-now.webp" width="256" height="256" alt="Blue background with white text, Twit Security Now with the O having a lock in the middle. TWiT logo walking around the text" class="img-fluid" loading="lazy" /></p>

<p><a href="https://twit.tv/shows/security-now">Security Now</a></p>

<p>Steve Gibson and Leo Laporte have a deep talk about the latest cybersecurity news by breaking them down for clarity with
a big-picture understanding. The informative podcast follows a conversational style along with a unique sense of humour.
This creates not just an entertaining podcast, but one which you can gain a better understanding on the various topics
presented in each episode.</p>

<ul class="list-unstyled">
  <li>Format(s): audio, video</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: Yes</li>
</ul>

<p><img src="/assets/img/posts/logo-privacy-security-osint-show.webp" width="256" height="256" alt="Text that says Privacy Security &amp; OSINT with Michael Bazzell" class="img-fluid" loading="lazy" /></p>

<p><a href="https://www.inteltechniques.com/podcast.html">The Privacy, Security &amp; OSINT Show</a></p>

<p>Michael Bazzell presents knowledge on privacy, digital security and open source intelligence (OSINT) news and opinions.
Updates are also provided on his own activities in these subject matters personally and in business. Each episode builds
on allowing the listener to learn new perspectives to aid in protecting your online privacy from cyber threats, becoming
a better online investigator and suggested tools to use.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: No</li>
</ul>

<p><img src="/assets/img/posts/logo-twit.webp" width="256" height="256" alt="Black background with multi-colored dots and white text saying This Week in Tech" class="img-fluid" loading="lazy" /></p>

<p><a href="https://twit.tv/shows/this-week-in-tech">This Week In Tech</a></p>

<p>Each week Leo Laporte meets with a panel of top tech journalists and experts in a roundtable discussion of the latest
global trends in tech. The panelists discussions cut through noise providing thought-provoking commentary with opinions.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: Yes</li>
</ul>

<p><img src="/assets/img/posts/logo-dtns.webp" width="256" height="256" alt="Text pushing forward leaving a trial of color behind (red, orange, purple) that says Daily Tech News Show (DTNS)" class="img-fluid" loading="lazy" /></p>

<p><a href="https://dailytechnewsshow.com/">Daily Tech News Show</a></p>

<p>Informative tech news headline coverage presented in just 30 minutes by Tom Merritt, Sarah Lane along with regular
contributors and guests in a fun and informative way.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: No</li>
</ul>

<p><img src="/assets/img/posts/logo-darknet-diaries.webp" width="256" height="256" alt="Worn text in white saying Darknet Diaries along with an open laptop with red fire coming out of it" class="img-fluid" loading="lazy" /></p>

<p><a href="https://darknetdiaries.com/">Darknet Diaries</a></p>

<p>Jack Rhysider takes on an investigative approach narrating stories covering hacking and cybersecurity, that captures,
preserves and educates the listeners of the culture that goes on behind the underground of our digital world.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English, Spanish (Español)</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: Yes</li>
</ul>

<p><img src="/assets/img/posts/logo-click-here.webp" width="256" height="256" alt="Binary background with a white key that has a left arrow and says Click Here" class="img-fluid" loading="lazy" /></p>

<p><a href="https://therecord.media/podcast/">Click Here</a></p>

<p>Get behind-the-scene coverage of the today’s biggest cyber and intelligence news stories of people and ideas that are
changing our digital world.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: Yes</li>
</ul>

<p><img src="/assets/img/posts/logo-late-night-linux.webp" width="256" height="256" alt="Black background with stars and gray crescent moon with penguin standing on it" class="img-fluid" loading="lazy" /></p>

<p><a href="https://latenightlinux.com/">Late Night Linux</a></p>

<p>Weekly Joe, Félim, Graham and Will talk about the latest news, releases, boarder issues and trends in the world of free
and open source software.</p>

<ul class="list-unstyled">
  <li>Format(s): audio, video</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: No</li>
</ul>

<p><img src="/assets/img/posts/logo-self-hosted.webp" width="256" height="256" alt="Background with ethernet port repeating, white rocket top right with text Self Hosted, O has an ethernet port in the middle" class="img-fluid" loading="lazy" /></p>

<p><a href="https://selfhosted.show/">Self-Hosted</a></p>

<p>Learn how to get the best out of your network hardware, devices and software while keeping your data secure by
self-hosting. Presented by Alex Kretzschmar and Chris Fisher.</p>

<ul class="list-unstyled">
  <li>Format(s): audio</li>
  <li>Language(s): English</li>
  <li>Show Notes: Yes</li>
  <li>Transcripts: No</li>
</ul>

<p>Do I miss a podcast that should be on this list? Why not continue the conversation by <a href="/contact/">contacting me</a>.</p>

<p>This is post 31 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Unearth technology podcasts that focus on authenticity, respect, simplicity, transparency and aspiration to learn in this curated list.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/tech-podcasts.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/tech-podcasts.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Configure Pi-hole Upstream DNS Servers</title><link href="https://www.adamsdesk.com/posts/pi-hole-set-upstream-dns-servers/" rel="alternate" type="text/html" title="Configure Pi-hole Upstream DNS Servers" /><published>2022-08-31T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/pi-hole-set-upstream-dns-servers</id><content type="html" xml:base="https://www.adamsdesk.com/posts/pi-hole-set-upstream-dns-servers/"><![CDATA[<p>For the most part Pi-hole makes things pretty straight forward to set settings. Whether you are more comfortable
with the web interface or the command-line, it can be done with a little bit of work. Of course there is the
assumption that the user understands quite a bit of knowledge or experience to make this all trivial to work with.
Let’s explore what is an upstream DNS is and then the ways in which we can change the upstream DNS servers.</p>

<h2 id="what-is-upstream-dns-servers">What is Upstream DNS Servers?</h2>

<p>The domain name system or better known as DNS is like a phone book. Every time a request is made to go to for example,
“adamsdesk.com” a lookup is made to the DNS server to determine the IP (Internet protocol) address in order to make the
connection.</p>

<p>In this context, an upstream DNS server is just another DNS server that is used when a domain name cannot be resolved
locally (e.g. Pi-hole). When a domain name cannot be resolved, this means there is no local record for the domain name
with an IP address in order to direct where to make the connection to.</p>

<h2 id="environment">Environment</h2>

<p>The following instructions were tested using the following.</p>

<ul>
  <li>Arch Linux Arm</li>
  <li>Pi-hole v5.12
    <ul>
      <li>AdminLTE v5.12</li>
      <li>FTL v5.15</li>
    </ul>
  </li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Pi-hole is already installed and configured</li>
</ul>

<h2 id="web-interface-change-upstream-dns-servers">Web Interface: Change Upstream DNS Servers</h2>

<ol>
  <li>Login to Pi-hole web interface (e.g. http://pi.hole).</li>
  <li>Click on the “Settings” in the menu.</li>
  <li>Click on the “DNS” tab at the top of page.</li>
  <li>
    <p>Set or select the desired DNS provider.</p>

    <p>Choose one of the following methods.</p>

    <ol>
      <li>
        <p>Select a provider under “Upstream DNS Servers”</p>

        <p>Make sure to select at least two per provider for redundancy for the desired group IPv4 or IPv6.</p>
      </li>
      <li>
        <p>Set a custom Upstream DNS Servers.</p>

        <p>Manually Enter IP address for Custom 1 (IPv4) and Custom 2 (IPv4) or Custom 1 (IPv6) and Custom 2 (IPv6). Make sure to the checkbox is checked next to the desired input fields.</p>
      </li>
    </ol>
  </li>
  <li>Click on the “Save” button at the bottom right of the page.</li>
</ol>

<h2 id="manually-change-upstream-dns-servers">Manually: Change Upstream DNS Servers</h2>

<p>Each DNS server address is configured within two files <code class="language-plaintext highlighter-rouge">/etc/pihole/setupVars.conf</code> and
<code class="language-plaintext highlighter-rouge">/etc/dnsmasq.d/01-pihole.conf</code>. By default, Pi-hole will use Google’s DNS servers.</p>

<ol>
  <li>Edit Pi-hole Setup Variables.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>nano /etc/pihole/setupVars.conf
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> PIHOLE_DNS_1=9.9.9.9
 PIHOLE_DNS_2=149.112.112.112
</span></code></pre></div>    </div>
  </li>
  <li>Edit Dnsmasq configuration file.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>nano /etc/dnsmasq.d/01-pihole.conf
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> server=9.9.9.9
 server=149.112.112.112
</span></code></pre></div>    </div>
  </li>
  <li>Restart Pi-hole DNS service for changes to take affect.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span>pihole restartdns
</code></pre></div>    </div>
  </li>
</ol>

<p>This is post 30 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="pihole" /><category term="archlinuxarm" /><summary type="html"><![CDATA[Learn how to change the Pi-hole's upstream DNS servers using a web browser or doing it manually in the command-line interface.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/pi-hole-dns-server.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/pi-hole-dns-server.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Inspiration for Mental Health</title><link href="https://www.adamsdesk.com/posts/inspiration-for-mental-health/" rel="alternate" type="text/html" title="Inspiration for Mental Health" /><published>2022-08-30T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/inspiration-for-mental-health</id><content type="html" xml:base="https://www.adamsdesk.com/posts/inspiration-for-mental-health/"><![CDATA[<p>I don’t believe there are even words that can describe how impactful what I’m going to talk about today is. You see
there are certain people in life that seem to grow inspiration beyond what one can even imagine. Eamon &amp; Bec and Craig
and Aimee are those types of people that just seem to continually challenge themselves while at the same time inspiring
others to keep moving in life. All four of them are doing what they love while creating great entertainment with honesty
and authenticity on their YouTube channels.</p>

<p>This week I sat down to watch the latest episodes of YouTube channels Eamon &amp; Bec and Kinging-It (Craig &amp; Aimee) like I
do every time they release new videos. However, this week I was surprised they made me cry several times throughout
their videos. This of course was a good thing. These videos were to me the most inspirational videos released to date by
these two couples working so hard to push awareness of their cause. The strong level of connection with other people was
great to see. I strongly recommend watching these two videos as they could positively impact your life or someone in your
life about mental health.</p>

<p><a href="https://youtu.be/skJe-qBg-fE" title="Play video via YouTube">
<img src="/assets/img/posts/bec-30-day-transformation.webp" width="1280" height="720" alt="video thumbnail with Eamon and Bec" class="img-fluid" loading="lazy" />
</a></p>

<p>My 30 Day Transformation (chemo to 5K) - <a href="https://youtu.be/skJe-qBg-fE">YouTube</a> | <a href="https://yewtu.be/watch?v=skJe-qBg-fE">Invidious</a> | <a href="https://support.cancer.ca/site/TR/RunfortheCure/RFTC_NW_odd_?team_id=492822&amp;pg=team&amp;fr_id=28556">Donate</a></p>

<p>Bec has being going through one of the hard times having to fight with breast cancer that included two breast surgeries,
8 rounds of intensive chemotherapy and 1 month of fertility treatment to treat the breast cancer. Before beginning 20
rounds of radiation therapy Bec decided to see how strong she can become both physically and mentally by challenging
herself to 30 days of meditation and training for a 5 KM (3.1 miles) run in the
<a href="https://support.cancer.ca/site/TR/RunfortheCure/RFTC_NW_odd_?team_id=492822&amp;pg=team&amp;fr_id=28556">Canadian Cancer Society CIBC Run for the Cure</a>.</p>

<p><a href="https://youtu.be/r73acOREcpU" title="Play video via YouTube">
<img src="/assets/img/posts/kinging-it-wheelie-bin-challenge.webp" width="1280" height="720" alt="video thumbnail with Craig and Aimee" class="img-fluid" loading="lazy" />
</a></p>

<p>Can We Push a Wheelie Bin Across An Entire Country? (200 miles!) -
<a href="https://youtu.be/r73acOREcpU">YouTube</a> | <a href="https://yewtu.be/watch?v=r73acOREcpU">Invidious</a> | <a href="https://www.justgiving.com/fundraising/kingingit">Donate</a></p>

<p>Craig and Aimee of Kinging-It decided to take on the challenge of pushing a garbage bin or as they call it a wheelie bin
across the country from Anglesea in North Wales to Cardiff in South Wales. The distance they are going to be travelling
is 321 KM (200 miles) while creating awareness and raising money for mental health. The initial goal is to raise
£15,000 for mental health by supporting <a href="https://www.bigmoosecoffeecompany.co/services">Bigmoose</a> of reaching £1,000,000
in 2022.</p>

<p>This is post 29 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="SpeakUpForLee" /><category term="MentalHealth" /><summary type="html"><![CDATA[Gain inspiration from these four YouTube creators as they spread awareness and fundraise for mental health!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/its-time-to-inspire.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/its-time-to-inspire.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Converting Address Book Contacts from vCard</title><link href="https://www.adamsdesk.com/posts/convert-address-book-contacts/" rel="alternate" type="text/html" title="Converting Address Book Contacts from vCard" /><published>2022-08-10T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/convert-address-book-contacts</id><content type="html" xml:base="https://www.adamsdesk.com/posts/convert-address-book-contacts/"><![CDATA[<p>One day I was presented with a problem of taking contacts exported to vCard file format from an old
iMac computer and then importing into Mozilla Thunderbird on Linux. It sounded simple, but for
some reason the import into Thunderbird will fail without an explanation. Quickly I started searching
for a simple vCard validator, but unfortunately came up empty. So I switched to looking into how to
convert the vCard v2.1 file of over 1,300 contacts to an LDIF (LDAP Data Interchange Format) or even
CSV (common-separated values) file format in hopes it would resolve the import problem.</p>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        Using online services to convert a contact file is strongly discouraged for privacy reasons. Such services quite often scrape (copy) the data for their own use.
    </p>
</div>

<h2 id="what-is-a-vcard">What is a vCard?</h2>

<p>A standard electronic file format for business cards that is also known as virtual contact file (vcf).
Each card can contain such data as anniversary date, birthday date, email addresses, phone numbers,
photograph, etc.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Arch Linux</li>
  <li>Git v2.37.1</li>
  <li>Nginx v1.22.0</li>
  <li>PHP-FPM v8.1.8</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Nginx, PHP-FPM and git is already installed and configured</li>
</ul>

<h2 id="problem">Problem</h2>

<p>When attempting to import the vCard file using Mozilla Thunderbird, the import fails with a message of “An error
occurred importing addresses from vCard file (.vcf). Error importing address book adamsdesk, all address may not
have been imported.” Refer to screenshot below.</p>

<p>After the import I looked in the address book and saw a new address book called “adamsdesk”. Within this address
book there was only 2 contacts out of 1,392. Those 2 contacts were primarily empty.</p>

<p><img src="/assets/img/posts/thunderbird-vcard-import-error.webp" width="633" height="600" alt="Mozilla Thunderbird vCard import error dialog" class="img-fluid" /></p>

<h2 id="solution---vcfconvert">Solution - Vcfconvert</h2>

<p>I decided to install a local copy of Vcfconvert so I can avoid potentially exposing private data.</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        It is assumed that the installation and configuration of web server software has been done prior to installing Vcfconvert.
    </p>
</div>

<ol>
  <li>Change directory.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">cd</span> /srv/http
</code></pre></div>    </div>
  </li>
  <li>Git clone project.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>git clone https://github.com/thomascube/vcfconvert
</code></pre></div>    </div>
  </li>
  <li>Create Nginx site configuration.
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># nano /etc/nginx/sites-available/vcfconvert.conf
</code></pre></div>    </div>
    <div class="language-nginx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">server</span> <span class="p">{</span>
 <span class="kn">listen</span> <span class="mi">80</span> <span class="s">default_server</span><span class="p">;</span>
 <span class="kn">listen</span> <span class="s">[::]:80</span> <span class="s">default_server</span> <span class="s">ipv6only=on</span><span class="p">;</span>
 <span class="kn">server_name</span> <span class="s">_</span><span class="p">;</span>

 <span class="kn">root</span> <span class="n">/srv/http/vcfconvert</span><span class="p">;</span>
 <span class="kn">index</span> <span class="s">index.php</span> <span class="s">index.html</span><span class="p">;</span>

 <span class="kn">access_log</span> <span class="n">/var/log/nginx/vcfconvert_access.log</span><span class="p">;</span>
 <span class="kn">error_log</span> <span class="n">/var/log/nginx/vcfconvert_error.log</span><span class="p">;</span>

 <span class="kn">location</span> <span class="p">~</span> <span class="sr">\.php$</span> <span class="p">{</span>
     <span class="kn">try_files</span> <span class="nv">$uri</span> <span class="p">=</span><span class="mi">404</span><span class="p">;</span>
     <span class="kn">fastcgi_split_path_info</span> <span class="s">^(.+</span><span class="err">\</span><span class="s">.php)(/.+)</span>$<span class="p">;</span>
     <span class="kn">fastcgi_pass</span> <span class="s">unix:/var/run/php-fpm/php-fpm.sock</span><span class="p">;</span>
     <span class="kn">fastcgi_index</span> <span class="s">index.php</span><span class="p">;</span>
     <span class="kn">fastcgi_param</span> <span class="s">SCRIPT_FILENAME</span> <span class="nv">$document_root$fastcgi_script_name</span><span class="p">;</span>
     <span class="kn">include</span> <span class="s">fastcgi_params</span><span class="p">;</span>
 <span class="p">}</span>
<span class="p">}</span>
</code></pre></div>    </div>
  </li>
  <li>Start Nginx and php-fpm.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>systemctl start nginx.service php-fpm.service
</code></pre></div>    </div>
  </li>
  <li>Open <a href="http://127.0.0.1">http://127.0.0.1</a> in a web browser and following on screen instructions.</li>
</ol>

<p>After I converted the vCard to an LDIF file format I was successfully able to import the contacts into Mozilla
Thunderbird.</p>

<h2 id="resources">Resources</h2>

<p>Here are some alternate resources I found for conversion tools.</p>

<ul>
  <li>
    <p><a href="https://github.com/tmo1/contacts2vcard">contacts2vcard</a></p>

    <p>An Android contacts (contacts2.db) to vCard format converter.</p>
  </li>
  <li>
    <p><a href="https://pypi.org/project/csvTovcf/">csvTovcf</a></p>

    <p>A Python script that parses a .csv file of contacts and automatically creates vCards.</p>
  </li>
  <li>
    <p><a href="https://github.com/jhermsmeier/node-vcf">node-vcf</a></p>

    <p>A not so forgiving vCard / vcf parser</p>
  </li>
  <li>
    <p><a href="https://github.com/jowave/vcard2to3">varc2to3</a></p>

    <p>Convert vcards from version 2.1 to version 3.0</p>
  </li>
  <li>
    <p><a href="https://gitlab.com/victor-engmark/vcard">vCard module</a></p>

    <p>vCard 3 validator, class and utility functions</p>
  </li>
  <li>
    <p><a href="https://github.com/jeroendesloovere/vcard">vCard PHP library</a></p>

    <p>This vCard PHP library can easily parse or generate/export vCards as .vcf.</p>
  </li>
  <li><a href="https://www.textcompare.org/vcard/">vCard Splitter &amp; Merger</a></li>
  <li><a href="https://www.textcompare.org/vcard/vcf-to-csv">vCard to CSV</a></li>
  <li>
    <p><a href="https://github.com/mbideau/vcardtools">vcardtools</a></p>

    <p>Automatically fix, convert, split, normalize, group, merge, deduplicate vCard and VCF files
  (even large ones). Imports vCard v2.1 and v3.0. Outputs vCard v3.0.</p>
  </li>
</ul>

<p>This is post 28 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[How to convert a VCF to LDIF file format to import into Mozilla Thunderbird address book while protecting the privacy of the contacts.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/address-book.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/address-book.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Share a Website Address Using a QR Code</title><link href="https://www.adamsdesk.com/posts/share-website-qrcode/" rel="alternate" type="text/html" title="Share a Website Address Using a QR Code" /><published>2022-08-06T00:00:00-06:00</published><updated>2023-09-01T13:45:33-06:00</updated><id>https://www.adamsdesk.com/posts/share-website-using-a-qr-code</id><content type="html" xml:base="https://www.adamsdesk.com/posts/share-website-qrcode/"><![CDATA[<p>No matter what we seem to share there can be issues either in communication or what was shared is recorded with errors.
Sharing a website address is no different, however these issues can be resolved by creating a QR Code (quick response
code). Think of the QR Code as specialized bar code one sees in a grocery store, only difference here is the bar code
when scanned will send the user to a website.</p>

<p>The following steps were done using a Linux terminal that generates a QR Code to share my website address. A
graphical interface maybe used on Linux called <a href="https://launchpad.net/qr-tools">QtQR</a> (<a href="https://archlinux.org/packages/community/any/qtqr/">Arch Linux package</a>).</p>

<h2 id="environment">Environment</h2>

<p>The following was used to test these instructions.</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Pacman v6.0.1</li>
  <li>qrencode v4.1.1</li>
  <li>ZBar v0.23.1</li>
</ul>

<h2 id="install-packages">Install Packages</h2>

<h3 id="arch-linux">Arch Linux</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Syu</span> qrencode zbar
</code></pre></div></div>

<h3 id="debian">Debian</h3>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>apt <span class="nb">install </span>qrencode zbar-tools
</code></pre></div></div>

<h2 id="generate-qr-code-terminal-output">Generate QR Code Terminal Output</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>qrencode <span class="nt">-s</span> 6 <span class="nt">-l</span> H <span class="nt">-o</span> - <span class="nt">-t</span> utf8 <span class="s2">"https://www.adamsdesk.com/"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-s    Specify the size of the dot (pixel). (default=3)
-l    Specify error correction level from L (lowest) to H (highest). (default=L)
-o    Write image to FILENAME. If '-' is specified, the result will be output to standard output.
-t    Specify the type of the generated image. (default=PNG)
</span></code></pre></div></div>

<figure class="figure">
    <img src="/assets/img/posts/adamsdesk-website-utf8-qrcode.webp" width="246" height="279" class="figure-img img-fluid rounded" alt="QR Code to share website address for Adamsdesk outputted to the terminal in UTF-8" />
    <figcaption class="figure-caption">An Example of a QR Code Sharing a Website Address (terminal output UTF-8)</figcaption>
</figure>

<h2 id="generate-qr-code-output-to-file">Generate QR Code Output To File</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>qrencode <span class="nt">-s</span> 6 <span class="nt">-l</span> H <span class="nt">-o</span> <span class="s2">"website-qrcode.png"</span> <span class="s2">"https://www.adamsdesk.com/"</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-s    Specify the size of the dot (pixel). (default=3)
-l    Specify error correction level from L (lowest) to H (highest). (default=L)
-o    Write image to FILENAME. If '-' is specified, the result will be output to standard output.
</span></code></pre></div></div>
<figure class="figure">
    <img src="/assets/img/posts/adamsdesk-website-qrcode.webp" width="246" height="246" class="figure-img img-fluid rounded" alt="QR Code to share website address for Adamsdesk" />
    <figcaption class="figure-caption">An Example of a QR Code Sharing a Website Address</figcaption>
</figure>

<h2 id="verify-qr-code">Verify QR Code</h2>

<p>By checking the contents of a QR Code one can verify that the QR Code has been generated as desired.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>zbarimg website-qrcode.png
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">QR-Code:https://www.adamsdesk.com/
scanned 1 barcode symbols from 1 images in 0.03 seconds

	. EAN/UPC (EAN-13, EAN-8, EAN-2, EAN-5, UPC-A, UPC-E, ISBN-10, ISBN-13)
	. DataBar, DataBar Expanded
	. Code 128
	. Code 93
	. Code 39
	. Codabar
	. Interleaved 2 of 5
	. QR code
	. SQ code
  - is the barcode large enough in the image?
  - is the barcode mostly in focus?
  - is there sufficient contrast/illumination?
  - If the symbol is split in several barcodes, are they combined in one image?
  - Did you enable the barcode type?
    some EAN/UPC codes are disabled by default. To enable all, use:
</span><span class="gp">    $</span><span class="w"> </span>zbarimg <span class="nt">-S</span><span class="k">*</span>.enable &lt;files&gt;
<span class="go">    Please also notice that some variants take precedence over others.
    Due to that, if you want, for example, ISBN-10, you should do:
</span><span class="gp">    $</span><span class="w"> </span>zbarimg <span class="nt">-Sisbn10</span>.enable &lt;files&gt;
</code></pre></div></div>

<p>This is post 27 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="linux" /><summary type="html"><![CDATA[Easily share a website address without errors in communication or recording by generating a QR Code locally on a computer using a Linux operating system.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/qrcode-puzzle.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/qrcode-puzzle.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">GIMP Image Processing Using Batch Mode</title><link href="https://www.adamsdesk.com/posts/gimp-batch-mode/" rel="alternate" type="text/html" title="GIMP Image Processing Using Batch Mode" /><published>2022-08-04T00:00:00-06:00</published><updated>2023-07-23T20:10:45-06:00</updated><id>https://www.adamsdesk.com/posts/gimp-batch-mode</id><content type="html" xml:base="https://www.adamsdesk.com/posts/gimp-batch-mode/"><![CDATA[<p>The majority of photos I receive require three basic steps to improve over all quality, auto sharpen, auto white balance
and auto color enhance. This seems to happen quite regularly, therefore I began searching for a solution to automate
these tasks in order to save time and reduce the chance of human error.</p>

<p>It turns out GIMP (GNU Image Manipulation Program) has an ability called “batch mode” that allows a user to do image
processing from the command line (terminal). I love the command line, though in this instance I’m not interested in
having to type out a long command and remember every detail of it in order to accomplish these tasks. So to simplify
further we will use a GIMP script.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following.</p>

<ul>
  <li>Arch Linux x86_64 operating system</li>
  <li>BASH v5.1.16</li>
  <li>fish v3.5.1</li>
  <li>GIMP v2.10.32</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>~ (tilde) represents the $HOME (/home/username) of the current user when using BASH</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
</ul>

<h2 id="script">Script</h2>

<p>The script I found was created by Daniel Buscombe back in 2010, and I was surprised to learn that the script still works
to this day.</p>

<figure class="highlight"><code class="language-gimp" data-lang="gimp"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre>define (batch-auto-fix pattern
                radius
                amount
                threshold)
  (let* ((filelist (cadr (file-glob pattern 1))))
   (while (not (null? filelist))
      (let* ((filename (car filelist))
          (image (car (gimp-file-load RUN-NONINTERACTIVE
                        filename filename)))
          (drawable (car (gimp-image-get-active-layer image))))
       (plug-in-unsharp-mask RUN-NONINTERACTIVE
                  image drawable radius amount threshold)
       (gimp-levels-stretch drawable)
       (plug-in-color-enhance RUN-NONINTERACTIVE
                  image drawable)
       (gimp-file-save RUN-NONINTERACTIVE
               image drawable filename filename)
       (gimp-image-delete image))
      (set! filelist (cdr filelist)))))
</pre></td></tr></tbody></table></code></figure>

<div class="admonition info rounded">
    <p class="admonition-title">Info</p>
    <p>
        Sharpen effect is applied using the filter called "unsharp" by comparing the difference of an image and a gaussian-blurred version of an image.
    </p>
</div>

<h2 id="install-script">Install Script</h2>

<p>Simply copy and paste the script into a text editor and save the script as “batch-auto-fix.scm” to
<code class="language-plaintext highlighter-rouge">~/.config/GIMP/2.10/scripts/</code> (e.g. /home/adam/.config/GIMP/2.10/scripts/). The filename extension must be “scm”.</p>

<h2 id="run-script">Run Script</h2>

<p>The script is intended to be run within the command line terminal and should be done so in the directory where the
image(s) are located. Here is an example of how to run the script.</p>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        Running this script will modify the image file(s). Always keep a backup of the original images.
    </p>
</div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>gimp <span class="nt">-i</span> <span class="nt">-b</span> <span class="s1">'(batch-auto-fix "*.jpg" 5.0 0.5 0)'</span> <span class="nt">-b</span> <span class="s1">'(gimp-quit 0)'</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-i Run without a user interface
-b Batch command to run (can be used multiple times)
    batch-auto-fix Script filename or command
    *.jpg A filename or group of files (e.g. *.jpg, wilber.jpg)
    5.0 Radius in pixels of the blur (&gt; 1, suggested 5)
    0.5 Amount or total strength of the effect (suggested 5)
    0 Threshold in pixels beyond which the effects are applied (0 to 255, suggested 5)
-b Quit with success exit status
</code></pre></div></div>

<p>This is post 26 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[How I automated the task of processing a group images by applying sharpen, white balance and color enhance using GIMP.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/gimp-batch-script.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/gimp-batch-script.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Replacing Pen Ink Cartridges</title><link href="https://www.adamsdesk.com/posts/replacing-pen-ink-cartrdiges/" rel="alternate" type="text/html" title="Replacing Pen Ink Cartridges" /><published>2022-08-03T00:00:00-06:00</published><updated>2023-01-24T15:11:38-06:00</updated><id>https://www.adamsdesk.com/posts/replacing-pen-ink-cartrdiges</id><content type="html" xml:base="https://www.adamsdesk.com/posts/replacing-pen-ink-cartrdiges/"><![CDATA[<p>For quite some time I’ve found quality pens interesting and enjoyable to use. I’ve tried to figure out why this is and
the only reasoning I have been able to come up with is, pens are a form of art and creativity. Odd thing is I’m not a
big fan off cursive or printing. I would sooner just type it out which then allows me to make endless corrections while
still having everything look nice and neat as well as gives me the ability to quickly search without having to do this
manually. Ultimately it saves me time. However, in a recent meeting with <a href="https://www.linkedin.com/in/loganhuynh/">Logan Huynh</a> I had I was encouraged to take up
journaling (writing) again to enjoy the process and allow myself to not focus on the details. This could provide another
means of relaxation. Even reading <a href="https://baty.net/">Jack Baty’s</a> posts have me interested and wanting to experience
this joy people seem to have.</p>

<p>I’ve owned many pens over the years, though most were not enjoyable to use. I have two pens which I’m sure is not
highest of quality, but the best quality pens I’ve owned that allow for the ink cartridge to be replaced. The wooden
pen with the case, I just love the look of. It was a gift given to me by a co-worker when he was married. It’s
beautifully personalized, but sadly it has not been used since I received it in 2015. The black pen (Bankers brand), I
purchased from my employer around 2002 and has been working great ever since. I love the weight of it and how nice it
writes or should I say flows.</p>

<p><img src="/assets/img/posts/pens-ink-cartridges.webp" alt="Pens laid out with ink cartridges removed" class="img-fluid mx-auto d-block" /></p>

<p>So here is the thing, I have no idea where to even start to figuring out what ink cartridge to buy for these
pens. It is my understanding there are many sizes or types and as you can see in the photo I have one cartridge that is
with the pen head and the other where the pen fountainhead is separate from the ink cartridge. An added note, I will
most likely have to buy the ink cartridges online, as I don’t believe I have a local store available for such products.
If dear reader you are so inclined, I would appreciate your help in resolving this problem of mine by continuing the conversation over
<a href="/contact/">email or on Mastodon</a>.</p>

<h2 id="update">Update</h2>

<p>I received feedback from <a href="https://baty.net/">Jack Baty’s</a> on Mastodon and learned that the wooden fountain pen uses a
piston filler. Now just need to figure out what cartridge the other pen takes.</p>

<p>This is post 25 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="hobby" /><category term="100DaysToOffload" /><category term="SelfImprovement" /><summary type="html"><![CDATA[Delve in on how I ended up looking into pen cartridge replacements, what pens I own and the help I'm seeking for resolution.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/wooden-pen-case.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/wooden-pen-case.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Recover and Prevent Depression</title><link href="https://www.adamsdesk.com/posts/recover-prevent-depression/" rel="alternate" type="text/html" title="How to Recover and Prevent Depression" /><published>2022-07-18T00:00:00-06:00</published><updated>2024-01-26T15:36:53-06:00</updated><id>https://www.adamsdesk.com/posts/recover-prevent-depression</id><content type="html" xml:base="https://www.adamsdesk.com/posts/recover-prevent-depression/"><![CDATA[<p>Just today I came across a good video where <a href="https://yapko.com/">Dr. Michael D. Yapko, Ph.D.</a> is presenting a talk entitled “Keys to Unlock Depression: Why Skills Work Better Than Pills” hosted by <a href="https://psychology.org.au/">Australian Psychological Society</a>. There was some very important points that Dr. Michael D. Yapko, Ph.D. makes that I feel could help many people around the world to recover or even potentially prevent depression.</p>

<p>Please take the time to watch the entirety of the video to gain full context on the matter. General assumptions or as Dr. Michael D. Yapko, Ph.D. calls it “global thinking” will not help speed up learning his insight and process to improve ones self.</p>

<h2 id="keys-to-unlock-depression-why-skills-work-better-than-pills">Keys to Unlock Depression: Why Skills Work Better Than Pills</h2>

<div class="ratio ratio-16x9">
    <iframe width="560" height="315" src="https://vid.puffyan.us/embed/TVgQ_tgWMyU" title="Video player via Invidious" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>Presented on May 10, 2018 (source Invidious)</p>

<ul>
  <li><a href="https://youtu.be/TVgQ_tgWMyU">How to recover from depression</a> via YouTube</li>
  <li><a href="https://yapko.com/keys-to-unlocking-depression/">Keys to Unlocking Depression</a> (book) by Dr. Michael D. Yapko, Ph.D.</li>
</ul>

<h2 id="no-amount-of-medication-can-teach">No Amount of Medication Can Teach:</h2>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        This list is written by Dr. Michael D. Yapko, Ph.D. and is listed here for ease of reference.
    </p>
</div>

<ul>
  <li>Effective coping (stress management) skills</li>
  <li>Realistic explanatory styles</li>
  <li>Skills to build and maintain positive relationships</li>
  <li>Flexible and discriminating cognitive skills</li>
  <li>Sophisticated problem-solving skills</li>
  <li>Effective decision-making strategies</li>
  <li>How to build and maintain a support network</li>
  <li>How to transcend an adverse personal history</li>
  <li>How to build a realistic and motivating future</li>
</ul>

<h2 id="things-not-to-do-when-youre-depressed">Things Not To Do When You’re Depressed</h2>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        This list is written by Dr. Michael D. Yapko, Ph.D. and is listed here for ease of reference.
    </p>
</div>

<ul>
  <li>Don’t dwell on the past. It’s gone. But, tomorrow hasn’t happened yet.</li>
  <li>Don’t compare yourself to others. “You have to do your own growing no matter how tall daddy was.” – Abraham Lincoln</li>
  <li>Don’t catastrophize; understand probability.</li>
  <li>Don’t leave important things unsaid or unresolved.</li>
  <li>Don’t analyze too deeply. Move on.</li>
  <li>Don’t ignore reality. Get the facts!</li>
  <li>Don’t ignore your own needs. Self-care is <strong>not</strong> the same as selfish.</li>
  <li>Don’t give up or be passive. Try again, <strong>BUT DO SOMETHING DIFFERENT!!</strong></li>
  <li>Don’t isolate. Find good people to be with.</li>
  <li>Don’t leave time unstructured.</li>
</ul>

<p>This is post 24 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="MentalHealth" /><summary type="html"><![CDATA[The insights, strategies and techniques on taking action to handling, preventing and overcoming depression by Dr. Michael D. Yapko, Ph.D.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/recover-prevent-depression.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/recover-prevent-depression.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Discover Surprising Benefits of Thrift Shopping</title><link href="https://www.adamsdesk.com/posts/thrifting-benefits/" rel="alternate" type="text/html" title="Discover Surprising Benefits of Thrift Shopping" /><published>2022-07-15T00:00:00-06:00</published><updated>2023-07-29T17:10:15-06:00</updated><id>https://www.adamsdesk.com/posts/thrifting-benefits</id><content type="html" xml:base="https://www.adamsdesk.com/posts/thrifting-benefits/"><![CDATA[<p>Recently my joy for thrifting was ignited by being able to go to various events selling used or second hand goods.
Though this hasn’t been always the case for me. I recall as a child going to various thrift stores, garage/yard sales,
flea markets and fundraisers over many years with various family members without much joy or excitement. I even had
experience helping out family members set up their own garage sales. Yet it wasn’t until later in my years as I became
an adult I soon realize the benefits.</p>

<h2 id="what-is-thrifting">What is Thrifting?</h2>

<p>The act of shopping for second hand or used goods at various events or stores such as flea markets, garage/yard sales or
charitable organizations.</p>

<h2 id="the-benefits-of-thrifting">The Benefits of Thrifting</h2>

<p>Thrifting can have many benefits depending on the individual, here are a few benefits I find that commercial
businesses cannot beat.</p>

<ol>
  <li>
    <p>The Hunt</p>

    <p>There is something about it that makes the act of hunting for an item or discovering an item (treasure) that you may
 not have even known it existed, joyful and exciting. Let’s be honest who doesn’t get excited when you discover an
 item before someone else?</p>
  </li>
  <li>
    <p>Exploration</p>

    <p>Provides the opportunity to travel around even where one lives seeing sights, sounds and people you may not have
 normally noticed let alone may have come in contact with. It provides an opportunity to talk and interact with
 people entirely different from yourself. Even if you do not talk, you can still discover and learn new perspectives
 that are entirely new to you.</p>
  </li>
  <li>
    <p>Socializing</p>

    <p>Just having simple conversations can lead to unknown opportunities. Providing a simple “hello”, “how has the sale
 being going today?” or saying thank you as you leave, can bring joy in people and allow your own self to grow. I’ve
 had a few good laughs in brief conversations and to me laughing is good for everyone.</p>
  </li>
  <li>
    <p>Environment</p>

    <p>Buying goods used, or second hand helps to reduce, reuse and recycle. Why waste something when an item can be used by
 someone else. Not everyone wants to have their own sale, but one can always donate to help others raise funds and
 help someone else that may not have been able to afford an item otherwise.</p>
  </li>
  <li>
    <p>Saving Money</p>

    <p>This one seems pretty obvious, but its true, saving money while thrifting can add up to a substantial sum if done
 within reason. I know myself I have been able to buy beautiful higher end brand clothing that I normally would
 have not had the opportunity to do so.</p>
  </li>
  <li>
    <p>Diversity</p>

    <p>Though you may not like every item found, you cannot find this much variety of goods since the selection is
 constantly changing and comes from people with a variety of lifestyles.</p>
  </li>
  <li>
    <p>Nostalgia</p>

    <p>Discovering an item from your past usually seems to spark joy as you go down memory lane. Talking about it just adds
 to the excitement and may even realize something about yourself or those around you forgot about.</p>
  </li>
</ol>

<h2 id="where-to-thrift">Where to Thrift</h2>

<p>Many businesses try to capitalize on used goods, but the fact is to me, it is not the same or as good as an experience
by going to a garage sale or flea market in person. I do realize though that one can still find great bargains at a
commercialized thrift store or even online. Here a few areas to find and fuel your thrifting desires.</p>

<h3 id="general">General</h3>

<ul>
  <li>Art and craft sales</li>
  <li>Auctions</li>
  <li>Charitable fundraisers</li>
  <li>Community associations</li>
  <li>Curbside Swap</li>
  <li>Estate/Garage/Yard sales</li>
  <li>Farmers market</li>
  <li>Festivals</li>
  <li>Flea markets</li>
  <li>Social media</li>
</ul>

<h3 id="services">Services</h3>

<ul>
  <li><a href="https://www.craigslist.org">craigslist</a></li>
  <li><a href="https://www.ebay.com/">eBay</a></li>
  <li><a href="https://www.etsy.com/">Etsy</a></li>
  <li><a href="https://www.freecycle.org/">Freecycle</a></li>
  <li><a href="https://www.kijiji.ca/">Kijiji</a></li>
  <li><a href="https://www.vinted.com/">Vinted</a></li>
</ul>

<p>This is post 23 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Learn why the joy, sights, sounds, and socializing are just some of the benefits when thrifting that cannot be replaced by traditional shopping.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/garage-sale-thrifting.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/garage-sale-thrifting.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Printable Paper Based Raspberry Pi Cases</title><link href="https://www.adamsdesk.com/posts/print-raspberry-pi-paper-case/" rel="alternate" type="text/html" title="Printable Paper Based Raspberry Pi Cases" /><published>2022-07-13T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/print-raspberry-pi-paper-case</id><content type="html" xml:base="https://www.adamsdesk.com/posts/print-raspberry-pi-paper-case/"><![CDATA[<p>An old Raspberry Pi 2 Model B board has been sitting around for quite some time not being used. You see, years ago I
bought three Raspberry Pi 2 Model B boards for my children to play around with and make their own cases. Unfortunately
that didn’t pan out. To make use of one of these boards, I connected a DHT22 temperature and humidity sensor, but it
bothers me that the device doesn’t have a case to protect it. I’ve tried searching for a case to purchase for quite
some time only ending up walking away in frustration. In fairness the Raspberry Pi board was released in 2015, so it
is quite old and understandable.</p>

<p>I decided the best solution is to go find a printable case using paper or cardboard using my computer printer. I would
love to 3D print one, however that is not an option for me at this time. Here are some solutions I was able to locate.</p>

<h2 id="printing-tips">Printing Tips</h2>

<p>Make sure when printing that the print settings are not altering the intended design. On my system I
made the following changes.</p>

<ul>
  <li>Page Setup &gt; Scale: 100%</li>
  <li>Page Handling &gt; Page Scaling: None
    <ul>
      <li>Auto Rotate and Center: Unchecked</li>
      <li>Select page size using document page size: Unchecked</li>
    </ul>
  </li>
</ul>

<h2 id="creative-cat-case">Creative Cat Case</h2>

<ul>
  <li>Model Support: Raspberry Pi 4 Model B</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF</li>
  <li>Template Page Size: ISO A4</li>
  <li>Author: Unknown</li>
  <li>Source: <a href="https://blog.mons.ws/?p=3911">Creative Cat Blog</a> (Russian, <a href="https://blog-mons-ws.translate.goog/?p=3911&amp;_x_tr_sl=auto&amp;_x_tr_tl=en&amp;_x_tr_hl=en-US&amp;_x_tr_pto=wapp">English</a>)</li>
</ul>

<p>An affective case that is available in 3 designs, pink, white and textured. Every major port is easily accessible
without having to open the case. The CSI (camera serial interface), DSI (display serial interface) or GPIO is indirectly
accessible by opening the side flap and would require it being left open while in use, unless you made your own
alternations to the case.</p>

<h2 id="yet-another-paper-case">Yet Another Paper Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model A/B</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: SVG</li>
  <li>Author: Peter Vojtek</li>
  <li>Source: <a href="https://petervojtek.github.io/diy/2015/04/24/raspberry-bi-paper-case.html">Remarks from DIY projects</a></li>
</ul>

<p>This is quite an interesting and unique case design with the Raspberry Pi logo on top. Plenty of passive ventilation
holes and provides access to every port. The only parts not accessible with ease is the CSI, DSI and GPIO (general
purpose input/output). One maybe able to make it work, but wouldn’t appear to be ideal. Being that the template is
provided in an SVG format, it does allow one to alter the design freely as desired.</p>

<h2 id="punnet-mk1-case">Punnet Mk1 Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model B</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF</li>
  <li>Template Page Size: ISO A4</li>
  <li>Author: Ian McPhee</li>
  <li>Source: <a href="https://www.raspberrypi.com/news/the-punnet-a-card-case-for-you-to-print-for-free/">Punnet Mk1 case</a> (<a href="https://cdn.instructables.com/ORIG/FDT/KK1F/HE081KFP/FDTKK1FHE081KFP.pdf">pdf</a>)</li>
</ul>

<p>One of the simpler designs that I was unfortunately unable to locate from the original source due to broken links.
Thankfully I was able to locate a copy of it. The top flap can be left open to allow for access to the CSI, DSI and
GPIO connections. A circle opening on the top may provide additional access.</p>

<ul>
  <li>Model Support: Raspberry Pi Model B</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF, Visio</li>
  <li>Template Page Size: 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: Andrew Klopper</li>
  <li>Source: <a href="https://forums.raspberrypi.com/viewtopic.php?f=40&amp;t=6500">Printable case based on an actual Pi</a></li>
</ul>

<p>This is a modified version of the Punnet Mk1 case that apparently fits the actual measurements of the device.</p>

<h2 id="kraft-case">Kraft Case</h2>

<ul>
  <li>Model Support: Raspberry Pi 2</li>
  <li>CSI Access: Yes</li>
  <li>DSI Access: Yes</li>
  <li>GPIO Access: Yes</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: DXF</li>
  <li>Author: Seeed Studio</li>
  <li>Source: <a href="https://www.instructables.com/Raspberry-Pi-2-Kraft-Case/">Raspberry Pi 2 Kraft Case</a></li>
</ul>

<p>This particular one is more of a brace or pad for the Raspberry Pi and a power bank than a case. The case is intended to
be used with a bracket. The entire board is accessible including all ports and connections. Protecting the board is not
the focus on this case. It is unfortunate that the template is only available in DXF file format.</p>

<h2 id="compact-case">Compact Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model B+</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: DWG, DXF, PDF</li>
  <li>Template Page Size: 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: quantumSequoia</li>
  <li>Source: <a href="https://github.com/Ardakilic/raspberry-pi-b-plus-paper-case">Raspberry Pi Model B+ Paper Case</a></li>
</ul>

<p>Out of all the cases this has to be the most compact design I’ve been able to find. It is so compact that the USB and
ethernet ports protrude beyond the height of the case. The original source appears to be on the Raspberry Pi forums at
<a href="https://forums.raspberrypi.com/viewtopic.php?f=40&amp;t=83818">B+ case made out of paper or card! Inspired by Punnet</a> by
quantumSequoia. Based on what I can see the CSI, DSI and GPIO will not be accessible at all without removing the case.
Though one does have the freedom to alter the schematics provided.</p>

<h2 id="engineered-cardboard-case">Engineered Cardboard Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model B</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>GPIO Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF (dimensions)</li>
  <li>Author: Jude Pullen</li>
  <li>Source: <a href="http://www.judepullen.com/designmodelling/raspberry-pi-case/">Modelling a Raspberry Pi Case from Cardboard</a></li>
</ul>

<p>This is an amazingly engineered case created in cardboard by an engineer. This template and design is a lot more involved
and not just a simple print, cut and build. However, there is <a href="https://www.youtube.com/watch?v=qfqdGsqUqcw&amp;list=PLC1AF230EB1C3FF7E&amp;index=16">step-by-step videos</a> available to guide you along the build process and diagram of dimensions (PDF). As an advantage though I feel due to
the approach of how this case is to be built, one could easily modify the design to work with newer models of a
Raspberry Pi.</p>

<h2 id="glueless-case">Glueless Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model B, Raspberry Pi 2 B</li>
  <li>CSI Access: Yes</li>
  <li>DSI Access: Yes</li>
  <li>GPIO Access: Yes</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF, SVG</li>
  <li>Template Page Size: ISO A4, 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: Unknown</li>
  <li>Source: <a href="https://www.iammer.com/raspi/case.html">Glueless Raspberry Pi Case</a></li>
</ul>

<p>The design of this case is more of box than a case that fully protects the board. The focus is to keep it simple without
the use of any adhesive. The case does not have a cover to protect the top of the device.</p>

<h2 id="raspberry-pi-case">Raspberry-pi-case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model A, Raspberry Pi Model B, Raspberry Pi 2 Model B</li>
  <li>GPIO Access: No</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF, studio</li>
  <li>Template Page Size: 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: Alton Jensen</li>
  <li>Source: <a href="https://github.com/AltJ/raspberry-pi-case">Raspberry-pi-case</a></li>
</ul>

<p>Though a very old design now it is still nice to see a simple 4 square ventilation holes on the top of the case for
aesthetic reason. I do also find that this case has an advantage since it provides the Silhouette Cameo files. Though I
have no idea if these files would still work with the more modern Silhouette Cameo products available today.</p>

<h2 id="raspberry-pi-2-blus-paper-case">Raspberry-pi-2-blus-paper-case</h2>

<ul>
  <li>Model Support: Raspberry Pi B+, Raspberry Pi 2 Model B</li>
  <li>GPIO Access: No</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF</li>
  <li>Template Page Size: 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: Ömer Tunç</li>
  <li>Source: <a href="https://github.com/Ardakilic/omer-tunc-raspberry-pi-2-blus-paper-case">omer-tunc-raspberry-pi-2-blus-paper-case</a> (archive)</li>
</ul>

<p>Very similar case to the Punnet Mk1 with some added instructions written in Turkish and a Raspberry Pi logo on top of
the case. The source linked here is an archive by Arda Kılıçdağı that provides steps in English along with some visual
photos of the process.</p>

<h2 id="dummies-case">Dummies Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Model B+, Raspberry Pi 2, Raspberry Pi 3</li>
  <li>GPIO Access: No</li>
  <li>CSI Access: No</li>
  <li>DSI Access: No</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF</li>
  <li>Template Page Size: ISO A4, 216 mm x 279 mm (8.5” x 11”)</li>
  <li>Author: Sean McManus, Mike Cook</li>
  <li>Source: <a href="https://news.sean.co.uk/2017/10/download-free-raspberry-pi-paper-case.html">Download a free Raspberry Pi paper case template</a></li>
</ul>

<p>An altered case of the Punnet Mk1 for the Raspberry Pi for Dummies book. This case comes in three different editions,
branded, lightly branded and old branded. Indirect access to CSI, DSI and GPIO connections is available by opening the
top flap.</p>

<h2 id="dashi-cardboard-cases">Dashi Cardboard Cases</h2>

<ul>
  <li>Model Support: Raspberry Pi Zero W</li>
  <li>GPIO Access: No</li>
  <li>CSI Access: No</li>
  <li>DSI Access: n/a</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF</li>
  <li>Template Page Size: ISO A4</li>
  <li>Author: Dashi Ltd.</li>
  <li>Source: <a href="http://www.superdashi.com/pi/cases/index.html">Cardboard Raspberry Pi Cases</a></li>
</ul>

<p>These unique case designs are intended to be used with a Raspberry Pi Zero W along with either <a href="https://www.adafruit.com/product/3401">Speaker Phat</a> or
<a href="https://www.adafruit.com/product/3531">Adafruit 128×64 OLED</a>. The detailed instructions are beautifully done, so much
so that they even provide a scale check to ensure the case is printed properly.</p>

<h2 id="marutan-case">Marutan Case</h2>

<ul>
  <li>Model Support: Raspberry Pi Zero, Raspberry Pi Zero W</li>
  <li>GPIO Access: No</li>
  <li>CSI Access: No</li>
  <li>DSI Access: n/a</li>
  <li>Memory Card Access: Yes</li>
  <li>Template Format: PDF, SVG</li>
  <li>Template Page Size: ISO A4</li>
  <li>Author: Peter Howkins</li>
  <li>Source: <a href="https://www.marutan.net/picase/">Raspberry Pi Cardboard Cases</a></li>
</ul>

<p>The case allows for GPIO headers to be fitted and provides a flap for indirect access to the GPIO. Two editions of the
case are available, plain box case and a BBC Micro style. It is recommended to fasten the board to the case.</p>

<hr />

<p>For reference this <a href="https://www.raspberrypi-spy.co.uk/2012/11/raspberry-pi-mounting-hole-positions-and-template/">Raspberry Pi Mounting Hole Template</a>
(A4 PDF) by Matt Hawkins may come in handy. Just because the case is paper or cardboard doesn’t mean you cannot mount
it (smile).</p>

<p>This is post 22 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="hobby" /><category term="100DaysToOffload" /><category term="raspberrypi" /><summary type="html"><![CDATA[Explore my discoveries in searching for an inexpensive do-it-yourself printable template paper based Raspberry Pi enclosures.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/graph-paper.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/graph-paper.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What are Keyboard Shortcuts?</title><link href="https://www.adamsdesk.com/posts/keyboard-shortcuts-explained/" rel="alternate" type="text/html" title="What are Keyboard Shortcuts?" /><published>2022-06-13T00:00:00-06:00</published><updated>2024-02-19T11:59:04-06:00</updated><id>https://www.adamsdesk.com/posts/keyboard-shortcuts-explained</id><content type="html" xml:base="https://www.adamsdesk.com/posts/keyboard-shortcuts-explained/"><![CDATA[<p>A computer keyboard which has been modelled after a typewriter is an essential input device when working with almost any
electronic device today. Even in cases where a physical keyboard is not present there is almost always a virtual
keyboard available. The fact is a keyboard is universal in taking input in almost all applications and cannot be
replaced. With this said, we can however improve upon our keyboard skills to be more effective in our time and make
working with various software applications more enjoyable by incorporating the use of keyboard shortcuts.</p>

<h2 id="what-is-a-keyboard-shortcut">What is a Keyboard Shortcut?</h2>

<p>In computing a keyboard shortcut or also known as a hotkey or a key binding is done by pressing one or more keys to
preform a specific action. The actions can be built into a given application, operating system or added in by using
another application or scripting language.</p>

<h2 id="why-should-i-use-keyboard-shortcuts">Why Should I Use Keyboard Shortcuts</h2>

<p>Depending on the circumstances using one hand on the keyboard to do shortcuts and the other on the mouse can provide
quick actions. However, using a keyboard alone can accomplish even more once perfected.</p>

<p>Here are a few reasons as to why keyboard shortcuts are so valuable to use and memorize.</p>

<ul>
  <li>Allows for completing actions faster</li>
  <li>Reduces stress due to keeping your hands on the keyboard instead of jumping back and forth between keyboard and mouse</li>
  <li>Makes some tasks easier to perform</li>
  <li>Automate repetitive tasks</li>
  <li>Repetitive tasks become more productive and accurate</li>
</ul>

<h2 id="how-to-use-keyboard-shortcuts">How To Use Keyboard Shortcuts</h2>

<p>A keyboard shortcut is achieved by pressing one or more key combinations at the same time. Let’s be clear this doesn’t
mean you have to press both <kbd>Ctrl</kbd> and <kbd>C</kbd> key on the board exactly at the same time. Press and hold
down the <kbd>Ctrl</kbd> key and then press the <kbd>C</kbd> key on the keyboard, now lift your fingers off the keys.</p>

<h2 id="what-are-modifier-keys">What Are Modifier Keys?</h2>

<p>A special key on a computer keyboard that temporarily modifies the normal behaviour of a key when pressed together.
Using a modifier key by itself typically doesn’t trigger any action at all.</p>

<h2 id="common-modifier-keys">Common Modifier Keys</h2>

<dl>
  <dt><kbd>⎇ Alt</kbd></dt>
  <dd>Keys pressed along with the “Alt” (alternate) key provide an alternative action than what would be typically be performed. Unlike the most modifier keys, “Alt” has been found to function on its own without any other keys being pressed. An example of this is when in an application and one presses the “Alt” key by itself it will cause the menu to gain focus even if the menu system is hidden.</dd>
  <dt><kbd>AltGr</kbd></dt>
  <dd>Most keyboards sold in North America do not have this key and is usually found on non-English keyboards. The AltGr is also known as “Alt Graph” and often takes place of the right “Alt” key on a keyboard. The key functions as an additional shift key in order to produce accent or symbol characters. The capabilities of this key varies between operating systems.</dd>
  <dt><kbd>⌘ Command</kbd></dt>
  <dd>A key found on Apple keyboards and can be seen abbreviated as “Cmd” key. Formerly this key was known as the “Apple key” or “open Apple key”. The key acts like the “Super” or “Windows” key and can be used in key combinations with other modifier keys.</dd>
  <dt><kbd>^ Ctrl</kbd></dt>
  <dd>The control key is commonly referred to as “Ctrl”, “Ctl” or “Strg” (German) and provides another way to modify the key combination action. When using an Apple keyboard the “Command” key is used in place of the “Ctrl” key.</dd>
  <dt><kbd>Fn</kbd></dt>
  <dd>A function or Fn key is commonly found on a compact keyboard layouts such as on a laptop. This key is not to be confused with the non-modifier function keys (e.g. F1, F2, etc.). The main purpose of the “Fn” key is used in combinations with one more key as indicated visually on the keyboard to adjust monitor brightness, audio volume, home, page up, page down, end and more. As a result this key usually cannot be used with other key combinations or custom keyboard shortcuts.</dd>
  <dt><kbd>◆ Meta</kbd></dt>
  <dd>A now obsolete key that is no longer found on a modern keyboard. However, documentation may still be found referring to its name. It is now used as a generic name for a custom key and would now refer to the “Command”, “Super” or “Windows” key.</dd>
  <dt><kbd>⌥ Option</kbd></dt>
  <dd>The “Option” key is found on an Apple keyboard and acts similar to the “Alt” key on non-Apple keyboards. Therefore, when the “Alt” key is referenced the “Option” key would be used instead when using an Apple keyboard.</dd>
  <dt><kbd>⇧ Shift</kbd></dt>
  <dd>Typically used to type capital (uppercase) letters, buy may also be used in key combination with other modifier keys. When the Caps Lock key is toggled on using the Shift key will produce a lowercase letter.</dd>
  <dt><kbd>❖ Super</kbd></dt>
  <dd>This key is typically found on Linux or Unix keyboards, but is just an older alternative name for what is commonly referred to as the “Windows” or “Command” key. Unlike other modifier keys this one can be used by itself to bring up a system menu or an overview of activities when using Microsoft Windows or Linux The key can be used in key combinations with other modifier keys.</dd>
  <dt><kbd>⊞ Windows</kbd></dt>
  <dd>This modifier key is common on Microsoft Windows keyboards, but has become a standard on PC keyboards. They key simply emulates the “Super” key. On a Linux or Unix operating system this key can be referred to as “Super” or “Meta”. The key can be used in key combinations with other modifier keys.</dd>
</dl>

<h2 id="what-are-function-keys">What are Function keys?</h2>

<p>Function keys are special keys that are labelled as <kbd>F1</kbd> through <kbd>F12</kbd>. One may have more depending on the keyboard. These
type of keys are not considered a modifier key, because it doesn’t alter the behaviour of another key. The function keys
are used directly, meaning you just have the press the key by itself to perform an action. It’s common that some of
these keys are already configured by the operating system to adjust the brightness of the monitor, adjust the audio
volume or play/pause music. Though these keys can have special uses within a specific application.</p>

<h2 id="how-to-learn-keyboard-shortcuts">How To Learn Keyboard Shortcuts</h2>

<p>Most software applications today indicate the keyboard shortcut by an underline within the menu system. Some may list
the keyboard shortcut beside a menu item. In recent years applications started to list the keyboard shortcuts within
the settings or preferences which often provides a nice search to locate the shortcut you are looking for quickly and
easily. Commonly the main menu items in an application are accessed using the <kbd>Alt</kbd> followed by the underlined
character.</p>

<p>Good software applications usually provide a list of default keyboard shortcuts. If by chance your application doesn’t
have this, there are many websites that have cheat sheets or keyboard reference documents or images one can freely
download and memorize.</p>

<h2 id="common-keyboard-shortcuts">Common Keyboard Shortcuts</h2>

<table class="table table-striped table-hover mb-4&quot;">
  <thead>
    <tr>
      <th>Action</th>
      <th>Shortcut</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Close Tab/Child</td>
      <td><kbd>Ctrl</kbd>+<kbd>W</kbd></td>
    </tr>
    <tr>
      <td>Close Window</td>
      <td><kbd>Alt<kbd>+<kbd>F4</kbd></kbd></kbd></td>
    </tr>
    <tr>
      <td>Copy Text</td>
      <td><kbd>Ctrl</kbd>+<kbd>C</kbd></td>
    </tr>
    <tr>
      <td>Cut Text</td>
      <td><kbd>Ctrl</kbd>+<kbd>X</kbd></td>
    </tr>
    <tr>
      <td>Find</td>
      <td><kbd>Ctrl</kbd>+<kbd>F</kbd></td>
    </tr>
    <tr>
      <td>Highlight Text</td>
      <td><kbd>Shift</kbd>+<kbd>Arrows</kbd></td>
    </tr>
    <tr>
      <td>Lock Screen</td>
      <td><kbd>Super</kbd>+<kbd>L</kbd></td>
    </tr>
    <tr>
      <td>Lock Screen</td>
      <td><kbd>Windows</kbd>+<kbd>L</kbd></td>
    </tr>
    <tr>
      <td>Open File</td>
      <td><kbd>Ctrl</kbd>+<kbd>O</kbd></td>
    </tr>
    <tr>
      <td>Overview</td>
      <td><kbd>Super</kbd></td>
    </tr>
    <tr>
      <td>Overview</td>
      <td><kbd>Windows</kbd></td>
    </tr>
    <tr>
      <td>Paste Text</td>
      <td><kbd>Ctrl</kbd>+<kbd>V</kbd></td>
    </tr>
    <tr>
      <td>Print</td>
      <td><kbd>Ctrl</kbd>+<kbd>P</kbd></td>
    </tr>
    <tr>
      <td>Save</td>
      <td><kbd>Ctrl</kbd>+<kbd>S</kbd></td>
    </tr>
    <tr>
      <td>Select All</td>
      <td><kbd>Ctrl</kbd>+<kbd>A</kbd></td>
    </tr>
    <tr>
      <td>Switch Application</td>
      <td><kbd>Alt</kbd>+<kbd>Tab</kbd></td>
    </tr>
    <tr>
      <td>Switch Application</td>
      <td><kbd>Windows</kbd>+<kbd>Tab</kbd></td>
    </tr>
    <tr>
      <td>Undo</td>
      <td><kbd>Ctrl</kbd>+<kbd>Z</kbd></td>
    </tr>
  </tbody>
</table>

<p>This is post 21 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Learn everything there is to know about what a keyboard shortcut is, why one should use them, how to use them, and what are common keyboard shortcuts.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/keyboard-shortcuts-explained.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/keyboard-shortcuts-explained.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Atom Text Editor Project Ends</title><link href="https://www.adamsdesk.com/posts/atom-text-editor-project-ends/" rel="alternate" type="text/html" title="Atom Text Editor Project Ends" /><published>2022-06-09T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/atom-text-editor-project-ends</id><content type="html" xml:base="https://www.adamsdesk.com/posts/atom-text-editor-project-ends/"><![CDATA[<p>I found out from a friend of mine that the Atom application, a free and open-source text editor project will be retired
and cease development. This didn’t overly surprise me much. Let me explain my thoughts and opinion on this concerning
matter to many.</p>

<h2 id="history">History</h2>

<p>The first release of Atom was on February 26, 2014, 8 years ago as I write this post. At first extensions and everything
else not part of the core was released under an open-source license. However, on May 6, 2014 the rest of Atom which
included the package manager, core application and desktop framework Electron were released as free and open-source
software under the MIT license.</p>

<p>I believe I started using Atom around 2015 or 2016. It was a joy to see something so visually polished and able to make
it easy on the eyes using what we now call dark theme or dark mode. Though I admit I am maybe recalling; things in the
wrong timeline. It did the job for the most part, but had issues loading large files which I still find frustrating.
It is one reason why I stopped using Atom and moved onto using VSCodium, a fork of Visual Studio Code.</p>

<h2 id="project-retirement">Project Retirement</h2>

<p>Atom was one of the projects GitHub developed that impacted many people’s lives. Heck GitHub brought Git to the main
stream making it more user-friendly and more of joy to use. The Atom editor was no different considering what
was available in the market at the time. I myself have used a lot of text editors over the years such as, BBEdit,
Bluefish, Geany, Gnome Edit (gedit), Komodo, Metapad, Notepad++, let’s just say I’ve tried too many to list them all
without boring you. The point I’m trying to make is that I can see how the end the development of Atom can be a painful
thought for so many and quite an investment to move on to something different. We all don’t exactly enjoy change even
though change is inevitable. With all this said, the retirement of the Atom project is still no surprise to me.
Microsoft owns GitHub and has their own editor Visual Studio and more specifically the comparable editor to Atom called
Visual Studio Code. So there is some level of conflict in regard to effort and resources from a business standpoint.
However, it does lead to less competition in the marketplace and available options for one to choose from.</p>

<p>All the repositories along with Atom itself will be archived on December 15, 2022.</p>

<h2 id="promising-future">Promising Future</h2>

<p>I wouldn’t be surprised if people in the community end up forking Atom and continuing the development as they see fit.
This in the end could be a good thing for everyone. It would sever ties with Microsoft and GitHub that would remove
the conflict of interest and allow for focus on just the editor itself.</p>

<p>A new editor is entering the market called <a href="https://zed.dev/">Zed</a> which will be written in the Rust programming
language. It should be blazing fast and hopefully allow for editing large files. As well this editor will be GPU
powered using a new framework they call GPUI. Though I cannot deny that I have concerns about this editor having
collaborative support. What does this mean? I want an editor that runs locally on my system without requirement of a
constant Internet connection or even having to have another dang account. It should have self-hosted aspects to allow
one to be independent, in control of your own circumstances and your data.</p>

<p>We will all have to see what the future brings.</p>

<p>This is post 20 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="development" /><summary type="html"><![CDATA[Hear my thoughts and opinions on the retirement of Atom, a popular open-source text editor application created by GitHub and community.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/sunset-atom-icon.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/sunset-atom-icon.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rants of Exporting YouTube Subscriptions</title><link href="https://www.adamsdesk.com/posts/export-youtube-subscriptions/" rel="alternate" type="text/html" title="Rants of Exporting YouTube Subscriptions" /><published>2022-05-30T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/export-youtube-subscriptions</id><content type="html" xml:base="https://www.adamsdesk.com/posts/export-youtube-subscriptions/"><![CDATA[<p>Having the ability to export your YouTube subscriptions can be quite useful and understandably a
very important feature to have. A simple export is good for a variety of valid reasons such as
backup, importing into an application or importing into another Google account. Unfortunately
Google has decided to remove the ability to export YouTube subscriptions via the
<a href="https://www.youtube.com/feed/subscriptions">Subscriptions</a> &gt; <a href="https://www.youtube.com/feed/channels">Manage</a>
page. The export process has changed for some time now which I think is good and bad. This is my pursuit in
finding a solution that would work for most people and my frustration a long the way.</p>

<h2 id="frustration">Frustration</h2>

<p>The process started within my YouTube subscriptions page and immediately came up with no obvious solution to export.
I spent some time reading online what I could find and honestly came up empty for the majority of the results. In my mind
this should be a simple intuitive process starting from going to your YouTube subscriptions and clicking on an area to export
the data. Unfortunately this is not the case at least any more strangely. Instead, one is to use Google Takeout, which
is fine to me, but not the way it was implemented. Why can’t I have an export function at least linked from the
manage subscriptions page as that would be logical. It then would redirect me to Google Takeout to export just the
YouTube subscriptions with the option to do more if desired. The current process is focused on someone wanting to export
all or multiple parts of data from various Google services as a whole. It is as if this process I’m trying to achieve
has not been thought of. We’ve lost the thought of making a backup or wanting to use your list you created in a different
manner. What is even more frustrating is that the solutions I’ve found works best on a desktop computer in my opinion.</p>

<p>Why I get frustrated is because we should be creating applications and/or websites that are intuitive and logical. I
doubt an average user would even know what Google Takeout is due to it be being so buried. In all honestly if the
application is created properly most wouldn’t even need to read material like I’m writing up to instruct how to
achieve the simple task of exporting YouTube subscriptions.</p>

<h2 id="finding-resolution">Finding Resolution</h2>

<p>As I’m sure by no surprise that the first solution is using Google Takeout and the second is a more manual process
utilizing a one line JavaScript statement within the Web Developer Tools console. Take a read of my knowledge base on
how to <a href="https://kb.adamsdesk.com/application/youtube-export-subscriptions/">Export YouTube Subscriptions</a>.</p>

<p>From the perspective of a developer I would imagine there is a way to obtain a list of YouTube subscriptions using
YouTube Data API. However, this area I’ve not ventured into yet.</p>

<p>If you are aware of another way to accomplish an export, please feel free to <a href="/contact/">contact me</a>.</p>

<p>This is post 19 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[The journey of rants as I figured how to export YouTube subscriptions for backup or use with another Google Account or application.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/wild-geese-chatter.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/wild-geese-chatter.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building The Mastodon Mascot</title><link href="https://www.adamsdesk.com/posts/building-the-mastodon-mascott/" rel="alternate" type="text/html" title="Building The Mastodon Mascot" /><published>2022-05-22T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/building-the-mastodon-mascott</id><content type="html" xml:base="https://www.adamsdesk.com/posts/building-the-mastodon-mascott/"><![CDATA[<p>Almost all my life I feel I’ve had a creative mind and wanting to making things, whether that is physically or digitally.
To me if you are creating a website, graphics, writing, photography, videography, etc., it all brings a sense of joy,
satisfaction and expression. It’s as if it’s a puzzle piece of who you are within, being expressed outwardly. Several
years ago I got into paper models and oddly enough I quite enjoy it. I stumbled across roughly a month ago a toot (post)
by <a href="https://mastodon.social/@Poudingue/104268850028274433">Poudingue</a> of a Mastodon (social network) Mascot paper model.
So I figured why not try and build the Mastodon Mascot to add to my collection.</p>

<h2 id="tools">Tools</h2>

<p>I suggest the following tools at a minimum. The reason for card stock is to make the model more ridged and durable.
Ruler or credit card is used to create clean firm creases.</p>

<ul>
  <li>Glue stick</li>
  <li>Printer Paper (card stock)
    <ul>
      <li>Color: White</li>
      <li>Weight: 199 g/m<sup>2</sup> / 110 lb</li>
      <li>Size: 216 x 279 mm / 8 1/2” x 11” (letter size)</li>
    </ul>
  </li>
  <li>Printer with color</li>
  <li>Ruler or credit card</li>
  <li>Scissors</li>
</ul>

<p>In additional to the minimum tools I would recommend the following to be more detailed and precise.</p>

<ul>
  <li>Craft knife (optional)</li>
  <li>Cutting board (optional)</li>
  <li>Patients (optional)</li>
</ul>

<h2 id="paper-model">Paper Model</h2>

<p>Unfortunately the Mastodon post was posted almost a year ago and the link to the paper model no longer works. After some
searching and a nice comment from <a href="https://mstdn.io/@escuco/108226714739474061">Jan</a> I was able to find the paper model
and print it out. Here are the alternative sources to the paper model that were found.</p>

<ul>
  <li><a href="https://davidson.k12.ok.us/document/mastodon-papertoy-test-document/">Mastodon Papertoy</a> (pdf)</li>
  <li><a href="https://codeberg.org/lostinlight/distributopia/src/branch/main/papertoys">Distributopia/papertoys</a> (jpg)</li>
</ul>

<h2 id="building-the-model">Building the Model</h2>

<p>The model is quite simple to make following the step-by-step instructions on the print-out. Simply cut along the black
outlines, then begin to fold/crease along dotted lines. After that begin to glue each part together to hold the model
firmly together.</p>

<p><img src="/assets/img/posts/mastodon-mascot-model-cutout.webp" width="720" height="523" alt="Mastodon model cutout laying on brown table face up" class="img-fluid rounded mx-auto d-block my-4" />
<img src="/assets/img/posts/mastodon-mascot-model-front.webp" width="720" height="624" alt="Mastodon model front view sitting on top of a brown table" class="img-fluid rounded mx-auto d-block mb-4" />
<img src="/assets/img/posts/mastodon-mascot-model-back.webp" width="720" height="614" alt="Mastodon model back view sitting on top of a brown table" class="img-fluid rounded mx-auto d-block mb-4" /></p>

<p>This is post 18 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="hobby" /><category term="100DaysToOffload" /><category term="mastodon" /><summary type="html"><![CDATA[Come on down the path of discovery to learn the tools I use to build the paper model of a Mastodon Mascot by Poudingue.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mastodon-logo-mascot.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mastodon-logo-mascot.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Breathing Life Back Into An Old Laptop with Manjaro</title><link href="https://www.adamsdesk.com/posts/breathing-life-back-into-an-old-laptop/" rel="alternate" type="text/html" title="Breathing Life Back Into An Old Laptop with Manjaro" /><published>2022-05-10T00:00:00-06:00</published><updated>2024-01-07T18:30:39-06:00</updated><id>https://www.adamsdesk.com/posts/breathing-life-back-into-an-old-laptop</id><content type="html" xml:base="https://www.adamsdesk.com/posts/breathing-life-back-into-an-old-laptop/"><![CDATA[<p>My son had an old laptop that he gave me, because he didn’t have a use for it. So yesterday I got to thinking this could
be a challenge to see what I can do with it and at the same time finally get around to trying out <a href="https://manjaro.org/">Manjaro</a>
operating system for the first time. Manjaro is a Linux distribution based upon Arch Linux operating system that is
intended to be user-friendly and accessible. I’m a big fan of using the terminal or console, however I decided this time
that I would force myself to accomplish everything only using the graphical user interface (GUI). Here is my experience
exploring Manjaro from installation to a functional desktop laptop computer.</p>

<h2 id="the-laptop">The Laptop</h2>

<p>The laptop itself is an HP Notebook 15-ay013ca that as far as I can confirm was released in December 2016. Reading the
specifications below one can see the hardware is quite low. The system original came with Windows 10 Home 64-bit and
quite frankly it ran terrible and provided a horrible user experience.</p>

<table class="table table-striped table-hover mb-4&quot;">
  <tbody>
    <tr>
      <td>Product number</td>
      <td>W7B87UA</td>
    </tr>
    <tr>
      <td>Product name</td>
      <td>HP Notebook - 15-ay013ca (ENERGY STAR)</td>
    </tr>
    <tr>
      <td>Microprocessor</td>
      <td>Intel® Pentium® N3710 (1.6 GHz, 2 MB cache, 4 cores)</td>
    </tr>
    <tr>
      <td>Memory, standard</td>
      <td>4 GB DDR3L-1600 SDRAM (1 x 4 GB)</td>
    </tr>
    <tr>
      <td>Video graphics</td>
      <td>Intel® HD Graphics 405 (up to 2.04 GB)</td>
    </tr>
    <tr>
      <td>Hard drive</td>
      <td>500 GB 5400 rpm SATA</td>
    </tr>
    <tr>
      <td>Optical drive</td>
      <td>SuperMulti DVD burner</td>
    </tr>
    <tr>
      <td>Display</td>
      <td>15.6” diagonal HD SVA BrightView WLED-backlit (1366 x 768)</td>
    </tr>
    <tr>
      <td>Keyboard</td>
      <td>Full-size island-style with numeric keypad</td>
    </tr>
    <tr>
      <td>Pointing device</td>
      <td>Touchpad with multi-touch gesture support</td>
    </tr>
    <tr>
      <td>Wireless connectivity</td>
      <td>Intel 802.11a/b/g/n/ac (1x1) and Bluetooth® 4.0 combo</td>
    </tr>
    <tr>
      <td>Network interface</td>
      <td>Integrated 10/100 BASE-T Ethernet LAN</td>
    </tr>
    <tr>
      <td>Expansion slots</td>
      <td>1 multi-format SD media card reader</td>
    </tr>
    <tr>
      <td>External ports</td>
      <td>1 USB 3.0; 2 USB 2.0; 1 HDMI; 1 RJ-45; 1 headphone/microphone combo</td>
    </tr>
    <tr>
      <td>Minimum dimensions (W x D x H)</td>
      <td>38.4 x 25.5 x 2.37 cm</td>
    </tr>
    <tr>
      <td>Weight</td>
      <td>2.01 kg</td>
    </tr>
    <tr>
      <td>Power supply type</td>
      <td>45 W AC power adapter</td>
    </tr>
    <tr>
      <td>Battery type</td>
      <td>3-cell, 31 Wh Li-ion</td>
    </tr>
    <tr>
      <td>Webcam</td>
      <td>HP TrueVision HD Webcam (front-facing) with integrated digital microphone</td>
    </tr>
    <tr>
      <td>Audio features</td>
      <td>DTS Studio Sound™ with 2 speakers</td>
    </tr>
  </tbody>
</table>

<h2 id="manjaro-install">Manjaro Install</h2>

<p>Manjaro currently is available in 3 editions, XFCE, KDE Plasma and GNOME. As well each edition has 3 builds to choose
from, standard, minimal and minimal LTS (long term support). I felt this hardware can’t handle a lot, so I decided to go
with <a href="https://manjaro.org/download/">XFCE minimal</a>. I downloaded the ISO image for XFCE minimal and then
copied it over to my USB flash drive that uses <a href="/posts/ventoy-the-ultimate-multi-boot-manager/">Ventoy</a> (a multiboot
manager). I simply plugged in the USB flash drive into the laptop and powered it on. After a few seconds I was
presented with the Ventoy boot menu allowing me to select Manjaro. Shortly after that I was booted into the live Manjaro
desktop environment using open source drivers and greeted with Manjaro Hello. This application is quite thought out to
allow for the experienced or inexperienced Linux users find what they are looking for to get started. At this stage of
course you can just play around with the operating system without installing if one so chooses to do so, but I chose to
go all in and launch the installer. The installer is quite nice and guides you through step by step. I’m quite impressed
how easy and smooth everything went.</p>

<h2 id="post-install">Post Install</h2>

<p>I was notified that there were some updates in the Manjaro Settings Manager (MSM) and I was able to quickly open the
application and apply the updates without issue. Next I began installing some essential applications using the
Add/Remove Programs as listed below.</p>

<ul>
  <li><a href="https://www.claws-mail.org/">Claws Mail</a></li>
  <li><a href="https://keepassxc.org/">KeePassXC</a></li>
  <li><a href="https://www.libreoffice.org/">LibreOffice</a></li>
  <li><a href="https://www.mozilla.org/firefox/">Mozilla Firefox</a></li>
  <li><a href="https://remarkableapp.github.io/">Remarkable</a></li>
  <li><a href="https://www.jwz.org/xscreensaver/">Xscreensaver</a></li>
</ul>

<p>For a productivity system I figured I might as well set up my printer in case that is ever required, following the
knowledge base article I wrote,
<a href="https://kb.adamsdesk.com/operating_system/arch_linux_install_network_printer/">Arch Linux Install Network Printer</a>,
I installed the following via Add/Remove Programs.</p>

<ul>
  <li><a href="https://www.cups.org/">CUPS</a></li>
  <li>cups-pdf (print to PDF)</li>
  <li>epson-inkjet-printer-workforce-635-nx625-series (printer driver)</li>
</ul>

<p>All of this went quite smoothly until I tried to open “Manage Printing” (CUPS web interface). The web page was unable
to load. Though I was not surprised this had happened, as one needs to start a systemd unit, <code class="language-plaintext highlighter-rouge">cups.service</code> or
<code class="language-plaintext highlighter-rouge">cups.socket</code>. So at this stage I was forced to use the terminal to complete the setup of my printer. To keep things
minimal I opted to start <code class="language-plaintext highlighter-rouge">cups.socket</code> using the following command, <code class="language-plaintext highlighter-rouge">sudo systemctl start cups.socket</code>. Once this was
done I was able to complete adding my printer and setting printer defaults via the web interface.</p>

<h2 id="testing">Testing</h2>

<p>For the rest of the day or so I used the laptop without any issues. Doing simple tasks such as email, reading documents
and word processing whether that be markdown in Remarkable or LibreOffice Writer. I was even able to play numerous
videos/movies using services such as YouTube, Tubi and Netflix smoothly without any problems in full screen at 720p and
1080p. Sure the system was a little slow at time and especially during the initial load time, but surprisingly it was
enjoyable to use considering the age and lack of hardware. Playing games was not something I tried to test out. I’m sure
the system can do it without issues as long as the game is the era of the laptop or just requires low hardware to play.</p>

<h2 id="summarizing-the-experience">Summarizing the Experience</h2>

<p>The most challenging part of this experience was myself. Many times I wanted to just go to the terminal and get the
task done. However, I only did this once due to not having a choice in the matter. Overall this was an interesting
experience and I would highly recommend Manjaro for new users of Linux or for those that are just not interested in
learning the finer details of any operating system. Saying this though, Manjaro is just as powerful as Arch Linux,
and with no limits other than what the user desires. With a good experience and praise though I wouldn’t want to
use this laptop as my daily driver mainly due to the lack of hardware and I just prefer using a desktop computer.</p>

<p>This is post 17 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="hardware" /><category term="linux" /><summary type="html"><![CDATA[Restoring life back into an old laptop to make it useful again without using a terminal, while experiencing Manjaro for the first time.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/servicing-old-laptop.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/servicing-old-laptop.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Update Firmware On Canon EOS Rebel T7i DSLR</title><link href="https://www.adamsdesk.com/posts/canon-update-firmware-t7i/" rel="alternate" type="text/html" title="Update Firmware On Canon EOS Rebel T7i DSLR" /><published>2022-05-09T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/canon-update-firmware-t7i</id><content type="html" xml:base="https://www.adamsdesk.com/posts/canon-update-firmware-t7i/"><![CDATA[<p>Recently I discovered that I cannot remove the on-screen display when recording videos with autofocus on my Canon EOS
Rebel T7i DSLR. So I was hoping that a firmware update may resolve the problem. I realize some will think, the changes
listed do not mention this, so why would you bother with a firmware update? Well, in my experience most firmware updates
do not list all changes, so I figured why not try. I’m running firmware version 1.0.1 and the latest version is 1.1.0.
So then this lead me to writing this article, as I’m sure many are not aware how to apply a firmware update.</p>

<p>Please be aware, as far as I know it is not possible to remove the on-screen display (autofocus) on an entry level
Canon camera. Also, I applied the firmware updates starting with the version 1.0.2 and then version 1.1.0.</p>

<p>Want to learn more, read <a href="/posts/what-is-firmware-and-why-should-firmware-be-updated/">What is Firmware and Why Should Firmware Be Updated?</a></p>

<h2 id="environment">Environment</h2>

<p>Tested using the following.</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Fish v3.4.1</li>
  <li>GNU bash v5.1.16</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>General understanding of using a Linux terminal (command-line interface)</li>
  <li>General understanding of how navigate and operate a Canon EOS camera</li>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Memory card has already been initialized with the camera</li>
  <li>Memory card reader is already connected to the computer and functional</li>
  <li><a href="https://archlinux.org/packages/extra/x86_64/unzip/">Unzip</a> is already installed on the operating system</li>
</ul>

<h2 id="items-required">Items Required</h2>

<ul>
  <li>Camera body</li>
  <li>Power supply (fully charged battery pack or dedicated AC adapter kit)</li>
  <li>Memory card</li>
  <li>Memory card reader</li>
</ul>

<h2 id="copy-firmware">Copy Firmware</h2>

<p>These instructions only cover updating the camera’s firmware via a compatible memory card along with the use of a
memory card reader.</p>

<ol>
  <li>
    <p>Download the camera’s firmware using a web browser from Canon Support.</p>

    <p><strong>Note:</strong> You may have to select Windows as the operating system in order to download the firmware on Linux.</p>
  </li>
  <li>Insert memory card into the memory card reader slot.</li>
  <li>
    <p>Decompress archive.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">cd</span> ~/Downloads/
<span class="gp"> $</span><span class="w"> </span>unzip v102-t7i-800d-x9i-win.zip
</code></pre></div>    </div>
  </li>
  <li>
    <p>Find memory card device.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>lsblk
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> sdf      8:80   1 238.3G  0 disk
 └─sdf1   8:81   1 238.3G  0 part /run/media/adam/EOS_DIGITAL
</span></code></pre></div>    </div>
  </li>
  <li>
    <p>Copy the firmware file to the memory card.</p>

    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">cp </span>CCF24102.FIR /run/media/adam/EOS_DIGITAL/
<span class="gp"> $</span><span class="w"> </span><span class="nb">sync</span>
</code></pre></div>    </div>
  </li>
  <li>Remove memory card from the memory card reader.</li>
</ol>

<h2 id="update-firmware">Update Firmware</h2>

<div class="admonition warning rounded">
    <p class="admonition-title">Disclaimer</p>
    <p>
        These instructions are intended as an example and as such are used at your own risk and liability. Always follow manufacture instructions.
    </p>

</div>
<div class="admonition danger rounded">
    <p class="admonition-title">Caution</p>
    <p>
        If these points are not followed the camera may malfunction.
    </p>
    <ul>
        <li>Only use a fully charged Battery Pack or dedicated AC Adapter Kit when doing a firmware update</li>
        <li>Remove the lens, external speedlite, and all other accessories from the camera before proceeding with firmware update</li>
        <li>Do not turn the camera's power off or touch any buttons during the firmware update</li>
        <li>Do not open the card slot cover during a firmware update</li>
        <li>Do not operate any of the camera's buttons, dials or switches during a firmware update</li>
    </ul>
</div>

<ol>
  <li>Insert memory card into the camera’s memory slot.</li>
  <li>Power on the camera.</li>
  <li>Set the shooting mode to “P”.</li>
  <li>Press the “Menu” button.</li>
  <li>Go to “Function settings” (wrench icon).</li>
  <li>In “Functions settings” go to age 4 or until you see “Firmware”.</li>
  <li>Select “Firmware” and then press the “SET” button to continue.</li>
  <li>
    <p>At the “Update camera firmware” screen, select the “OK” button and then press “SET” button to continue.</p>

    <p><strong>Note:</strong> If this screen is not displayed, the firmware file may have not been correctly copied to the memory card. Please start from the beginning.</p>
  </li>
  <li>At the “Firmware update program” screen, firmware file name will be displayed, press the “SET” button to continue.</li>
  <li>Confirm firmware version, then start the firmware update by selecting the “OK” button and pressing the “SET” button.</li>
  <li>When the message of “Update is complete” is displayed, press the “SET” button.</li>
</ol>

<h2 id="verify-the-firmware-version">Verify the Firmware version</h2>

<ol>
  <li>Power on the camera.</li>
  <li>Set the shooting mode to “P”.</li>
  <li>Press the “Menu” button.</li>
  <li>Go to “Functions settings” (wrench icon)</li>
  <li>Touch “OK” or press the “SET” button to continue.</li>
  <li>In “Functions settings” go to page 4.</li>
  <li>Towards the bottom of the screen the “Firmware” and the version number will be listed for verification.</li>
</ol>

<p>This is post 16 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[How to update a Canon EOS Rebel T7i firmware using SD Card and a card reader using a Linux terminal.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/canon-update-firmware-t7i.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/canon-update-firmware-t7i.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What is Firmware and Why Should Firmware Be Updated?</title><link href="https://www.adamsdesk.com/posts/what-is-firmware-and-why-should-firmware-be-updated/" rel="alternate" type="text/html" title="What is Firmware and Why Should Firmware Be Updated?" /><published>2022-04-21T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/what-is-firmware-and-why-should-firmware-be-updated</id><content type="html" xml:base="https://www.adamsdesk.com/posts/what-is-firmware-and-why-should-firmware-be-updated/"><![CDATA[<p>Many of us go about our day using various electronic hardware devices such as a mobile phone to aid in getting a
specific task achieved or just simply for entertainment purposes without the thought of how they function, let alone
know that the device contains firmware. Being curious and wanting to push the limits of my devices I have ventured into
discovering firmware to the point of going as far as to replacing the manufacture’s firmware with third party firmware.
As an example, I’ve updated or replaced firmware on network routers, music players (e.g. iPod Classic), Nintendo Wii,
and even on mobile phones. Join me in the journey of learning about firmware by starting from the beginning.</p>

<h2 id="what-is-firmware">What is Firmware?</h2>

<p>A group of computer software that is embedded in memory on the device that provides low-level control of the hardware
device. Shortly described as, software for the hardware. Most devices would not be able to function as the user desires
without the use of firmware. The frequency of firmware updates varies between each manufacture and circumstances at the
time.</p>

<p>Some common devices known to have firmware are:</p>

<ul>
  <li>Gaming consoles</li>
  <li>Mobile telephones</li>
  <li>Motherboards</li>
  <li>Network routers</li>
  <li>Peripherals (e.g. mice, keyboards)</li>
  <li>Printers</li>
  <li>Streaming devices</li>
  <li>Television remotes</li>
  <li>Televisions</li>
</ul>

<h2 id="why-update-firmware">Why Update Firmware?</h2>

<p>The most common reasons to update a device’s firmware are by adding features or fixing bugs. To be even more specific,
a security vulnerability may have been discovered in the firmware and thus requires an update in order to continue to
safely use the device. By updating firmware this will provide the opportunity to receive new features, efficiency
improvements, security vulnerability patches, etc. Though firmware is a special type of software, the firmware
update is no different from software application or app updates, they add or rewrite the existing software. Under most
circumstances firmware updates are a necessary and even recommended doing regularly by some company manufactures.</p>

<p>In a more advanced case, one can use the firmware update system to install unofficial firmware that is created by a
third party to extend the original intended use, unlock hidden features or to even prolong the use of a given device.
Sometimes third party firmware is referred to as custom, aftermarket or hacking firmware. The majority of this type of
firmware is provided for free or even provided as open source allowing anyone to review and modify the firmware code.
Though, be aware that applying third party firmware can void manufacture warranty and also has similar risks.</p>

<p>It should be noted though that not all hardware devices allow for the firmware to be updated. This entirely depends
on the design and what type of memory storage is used.</p>

<h2 id="dangers-of-updating-firmware">Dangers of Updating Firmware</h2>

<p>Generally updating firmware if done properly according to the instructions provided by the company manufacture is
completely safe. Though this is not done without risks involved. Here are some general cautions and rules to
following when applying a firmware update.</p>

<ul>
  <li>Read the official device instruction manual about firmware updates</li>
  <li>Read the official firmware update documentation</li>
  <li>Backup the device before a firmware update</li>
  <li>Download the firmware locally if possible</li>
  <li>Download the firmware version already installed if possible (in case something goes wrong)</li>
  <li>Do not update firmware using the Internet when possible</li>
  <li>Do not use Wi-Fi (wireless) connection to update firmware when possible</li>
  <li>Do not operate the device in any form during the firmware update</li>
  <li>Do not power off the device during the firmware update</li>
  <li>Use dedicated power when possible</li>
  <li>Use a fully charged battery if you cannot use dedicated power</li>
  <li>Malfunction of the device may occur, if the loss of power during update</li>
  <li>Malfunction of the device may occur, if the wrong firmware is applied</li>
  <li>Malfunction of the device may occur, if firmware is corrupted or incomplete</li>
</ul>

<p>All this does sound concerning and may make one feel like it’s too risky. Yet, there can be far greater risks by not
updating the firmware due say for example a bug that makes the device vulnerable to remote attacks to gain control. This
all depends on the circumstances and ultimately one’s own decision whether to update a device’s firmware or not.</p>

<h2 id="how-to-update-firmware">How To Update Firmware</h2>

<p>This is a tough one to explain, because depending on the hardware device determines how the firmware can be updated if
even permitted to do so by the design and memory storage type used. For the purpose of better understanding firmware, I
can give a simplified example of how this may be done by updating a digital camera’s firmware that has been provided by
the manufacture company.</p>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Always follow the instructions provided by the device's company manufacture when applying a firmware update.
    </p>
</div>

<ol>
  <li>Confirm firmware version already installed.</li>
  <li>Download the firmware update.</li>
  <li>Remove the memory card from the camera.</li>
  <li>Insert the memory card into the computer memory slot.</li>
  <li>Copy the firmware file onto the memory card.</li>
  <li>Insert the memory card into the camera memory slot.</li>
  <li>Power on the camera.</li>
  <li>Go to camera settings.</li>
  <li>Select the firmware file on memory card to install.</li>
  <li>When firmware update has completed, verify firmware version.</li>
</ol>

<p>This is post 15 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Learn about firmware software, such as what firmware is, why should firmware be updated, the dangers of firmware, and how to update firmware.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/abstract-printed-circuit-board.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/abstract-printed-circuit-board.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">My Experience With Cancer</title><link href="https://www.adamsdesk.com/posts/cancer-experience/" rel="alternate" type="text/html" title="My Experience With Cancer" /><published>2022-03-09T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/cancer-experience</id><content type="html" xml:base="https://www.adamsdesk.com/posts/cancer-experience/"><![CDATA[<p>Cancer is one of those things in life that no one ever wants to deal with and from my experience I
find most usually think that it will never happen to me. The unfortunate reality is, anyone can get
cancer, and we have to deal with it directly or indirect at some point in time in our life. I
honestly wish this was not the case, and it could be a rare occurrence or one of those things we’ve
cured and/or prevented from happening in the first place. I myself never gave much thought to
cancer, and was one that didn’t think it would be something I would have to deal with personally.
The idea of never dealing with cancer was going to be tested.</p>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Do not proceed if the discussion of surgery, blood and post surgery photo may bother you.
    </p>
</div>

<h2 id="the-beginning">The Beginning</h2>

<p>Many years ago, around roughly when I was 31 years of age I started noticing a growth protruding on the
back edge of my ear. Never thought much
about it as just figured it was growth that could be easily removed. I went into to see my general
practitioner (doctor) to see about having it removed. The doctor said that it appears fine, so he
would try to freeze it off with what I recall was liquid nitrogen. As the doctor was applying the
liquid nitrogen, I can tell you this didn’t have a wonderful feeling. There were lots of sharp spikes
of pain, but it was over quite quickly, and I went on with my day. The misfortune in all this though was
that none of the growth fell off, but rather more than doubled in size in a short period of time.
The size of growth had now become roughly of a very large pea. I made another appointment to see my
doctor. The conclusion of the appointment was that I would be refereed to a surgeon to have it
removed by a professional so not botch up the appearance of my ear. The wait time for the
surgery was I think more a year away. I was not happy about this, but what could I do about it.
Life continued as normal except now that the growth was so large even though it doesn’t sound it, it
started becoming quite a nuisance. You see I had a job at the time that I was in an office setting,
but frequently had to go on to the manufacturing production floor which required safety glasses that
had to go over top of my prescription eyeglasses. Every time I had to put them on it would bump
or rub against the growth on my ear. At this stage it was quite sensitive, but not painful. I of
course was able to just make it work, but still found the ordeal frustrating. One day sitting at my
desk working away on something, the growth on my ear started to squirt blood behind me just as some
happen to be walking by the office cubicle I was working at. Quickly I grabbed some facial tissue
to put over the squirting blood. After that I can’t recall exactly what happened, but the
co-worker did help me by talking about it. After this I was tired of waiting to get this dang growth
removed. I made a phone call to my doctor and was fortunate enough to get a referral appointment to
finally get something done about this.</p>

<h2 id="cancer-diagnosis">Cancer Diagnosis</h2>

<p>The day finally came, and it was my appointment time to see the surgeon at my local
university hospital. I can’t recall all the details now, but basically I saw the doctor several
times. One noticeable thing that happened was the resident doctors (doctors learning to be doctors)
were overly interested in my medical situations for some reason. So it was explained to me that the
reason for the rapid increase in the growth was due to the fact that the growth was cancerous. Yes I
said cancerous. Now, I was to not worry as it was thought that being external that they should be
able to remove the entirety of the growth off of my ear in surgery. Due to time passing I’ve also
forgotten what exact cancer it was called. Then again, maybe I’ve forgotten this intentionally, who
knows. Continuing with this wonderful news, I learned that this is a very unusual case for someone
as young as I was. Apparently what I have was more common with someone in or around 80 years of age.
I was a far cry away from my 80s that was for sure. As well to make this more unusual situation, I
was quite healthy I was told, and I never smoked cigarettes or did any other form of drugs in my
entire life, except for consuming alcohol. At the time I recall my wife making a joke
about the situation saying that the cause of the cancer was all my endless hours sitting at those
old CRT computer monitors giving off radiation. Never really know why or how I ended up with cancer,
but to me that joke didn’t make sense since my ears don’t face the monitor (smile).</p>

<h2 id="facing-cancer">Facing Cancer</h2>

<p>So I went on with my life but, I mentally struggled with the knowledge of having cancer. My emotions
were up and down though I don’t recall outwardly expressing this or talking about it much to anyone.
Reflecting back on this now, it was an emotional roller coaster going from sad, anger, disappointment
and then acceptance. My disappointment was not being able to be involved in my children’s lives and
watching them grow up. Worse I was very disappointed in myself because of the current situation my
family was in, wife and 4 children. You see I made acceptance of having cancer to the point that I
may die and leave everyone behind with the burden of not stabilizing the family financially and how
they would survive without me. I had no life insurance as money was very tight due to various
reasons. I was the rock that kept the family going and ran the majority of the household
responsibilities. What I’m trying to say is at some points in time I was accepting that I would die
even though this was completely not true from what I was told and that the cancer I had was external
not internal. Far from the horrible stories one usually hear about dealing with cancer. It was
trying times to me.</p>

<h2 id="surgery">Surgery</h2>

<p>I asked a lot of questions about
my situation and how the surgery would go. I even went to the effort of studying medical material
online on the subject, how the procedure was done and learned the medical terms around it all. My
curiosity was quite high, and I wanted to be aware of everything that was going on. It’s just too
bad that since I don’t work in the medical field I’ve lost pretty much all of what I taught myself.
The one thing I do remember well is that due to the location of the growth there is very little
skin and as such would require removing a small portion of the ear cartilage. This allows for the
skin to be stitched back together, so it can heal properly.</p>

<p>The day of surgery finally came. I went into the surgery room and laid down on bed with my head
titled slightly to the left. I have a few strong memories of the surgery. One was when I was given
the local anesthetic, it was the strangest feeling I’ve ever had for local anesthetics. It felt
like the needle just kept going in deeper and deeper. The other memory I have is when the surgeon
started to remove some cartilage, it was quite the sound and loud considering I could hear
everything little thing happening. Throughout the operation I talked quite a bit, asking many
questions as the surgeon proceeded. At one time I remember the surgeon and the nurse helping both
stopped what they were doing and asked how do I know all this medical information and terminology.
My response I believe was that I studied using the Internet, and they still couldn’t believe it.
Oddly that is a happy memory for me, not entirely sure why. Anyway, the surgery was a success and
just now had to wait for everything to heal.</p>

<div class="d-flex justify-content-center flex-wrap mb-3">
    <img src="/assets/img/posts/post-ear-surgery-behind.webp" width="256" height="256" alt="photo of ear after surgery from behind" class="m-2 img-fluid rounded" />
    <img src="/assets/img/posts/post-ear-surgery-side.webp" width="256" height="256" alt="photo of ear after surgery from the side" class="m-2 img-fluid rounded" />
</div>

<p>Not too long after the surgery I received a call from the surgeon’s office stating that not all
the cancer was removed. I would have to come in again for surgery to remove more skin to ensure all
the cancer is indeed removed. This was not what I wanted to hear, but I went in again and got it
done. I thought I was calm in this surgery, but I was told I was shaking a lot. My nerves I guess
where getting to me and I suppose it is understandable considering the circumstances I’m dealing
with.</p>

<h2 id="conclusion">Conclusion</h2>

<p>It only took two surgeries, and it was a success in removing the cancer from my ear. Later
small skin samples were taken from various parts of my body to ensure I didn’t have cancer else
where. The results were in my favour, and I was cancer free. This was quite exciting news and happy to
say that I’m still cancer free. Looking back on this now I definitely treated this situation far
worse than it was. I didn’t have to do chemotherapy or any other extreme measure. So many people
have to face far worse situations with cancer such as dealing with loosing hair, throwing up, no
energy to anything productive. Heck even for those that don’t have financial coverage this can be
quit devastating for someone in dealing with the medical costs involved. The best advice I can give
in all this, is to just keep having hope and to keep pushing forward no matter how hard it can be
because life is worth the challenge!</p>

<p>Do you wish to share your experience or provide feedback on my story? Please <a href="/contact/">contact me</a>.</p>

<p>This is post 14 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="MentalHealth" /><summary type="html"><![CDATA[A story about my journey being diagnosed with cancer and then dealing with mental challenges it brought upon me and how it all ended.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/alone-reflecting-cancer.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/alone-reflecting-cancer.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Canadian Income Tax Software</title><link href="https://www.adamsdesk.com/posts/canadian-income-tax-software/" rel="alternate" type="text/html" title="Canadian Income Tax Software" /><published>2022-03-07T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/canadian-income-tax-software</id><content type="html" xml:base="https://www.adamsdesk.com/posts/canadian-income-tax-software/"><![CDATA[<p>Every year, that time comes where we are faced with having to file our income tax return. We may not
all enjoy doing it, but it’s one of those things we all have to get done. This year I was prompted
to look into tax software again by questions from my son about what to do. For my son, this is his
first year ever submitting and my 25th tax return. So off I went in search of desktop or online
software that will handle doing income taxes returns for the best of us at a reasonable price while
still having control over my data, privacy and security as best I can accomplish. A part of me
wishes that if we have to do an income tax return, why is the Canadian Government not directly
providing software to get it done? Something I may never have an answer for.</p>

<h2 id="the-quest">The Quest</h2>

<p>With a search engine, I began my quest to find software that would preferably run on my desktop
Linux operating system natively or, at the minimum, run using <a href="https://www.winehq.org/">Wine</a>. I
dream of a day that the software is offer open source, but as far as I know that doesn’t exist at
this point in time. Most income tax software offered for the desktop is available on Windows, with a
few offering macOS. In recent years, I’ve started noticing software being offered to do it online
via a website and eventually on Android and iOS. Anyway, the search results I was getting resulted
in me not finding much and was starting to feel that I would be forced to have to use an online
solution or use Windows. This didn’t make me happy, but I thought fine, maybe I just give in and
starting filing via an online solution. Well I started looking into a few companies that offered
online solutions by reading their terms of use and privacy polices. Well, let’s just say that what I
found was scary to read and in a lot of cases there was next to nothing stating what their practices
are or how my data was going to be handled. So with that, I was determined to completely forget about
using an online solution. Heck, even using Android and iOS based software is dangerous in itself.
However, I do understand, some just do not have the luxury of choice. Since I was not finding a
solution, I decided to go through each certified tax software listed on the <a href="https://www.canada.ca/en/revenue-agency/services/e-services/e-services-individuals/netfile-overview/certified-software-netfile-program.html">Government of Canada</a> website. I learned
there are quite a few offering free solutions and how this industry seems to love having extremely
outdated website designs. The unfortunate part about this list software is that it doesn’t state
which one works on Linux. In the end I believe I found a few a solution plus a few backup options
just in case.</p>

<h2 id="solutions">Solutions</h2>

<p>After spending quite some time going through all the offered software listed, I settled on using
“myTaxExpress”. The main reason is it works on Linux natively! Also, it appears to look easy to
use with an auto-fill feature to assist those not overly familiar with taxes and that the software
seems to allow for growth if one’s fiances get more complex. Since I’m new to this software, I will
have to come back and update this article as I learn more. Just in case, I’ve decided potentially on
using the following below if this solution doesn’t work. They all appear to be promising
alternatives, but I must add other than “myTaxExpress” the rest do not work  natively on Linux.</p>

<p>The solutions I’ve listed may require purchasing a license in order to submit your tax return.
Submitting the return is only free when one fits within the free criteria.</p>

<ul>
  <li>
    <p><a href="https://mytaxexpress.com/">myTaxExpress</a> (Linux, macOS, Windows) by Acadia
Solutions Corp.</p>

    <p>Read <a href="https://kb.adamsdesk.com/application/mytaxexpress/">myTaxExpress</a> knowledge base article
  on how to install and run on Linux.</p>
  </li>
  <li><a href="https://www.futuretax.ca/netfile">FutureTax</a> (Windows) by Future Corp.</li>
  <li><a href="https://www.studiotax.com/">StudioTax</a> (macOS, Windows) by BHOK It Consulting</li>
  <li><a href="https://www.eachtax.com/">EachTax</a> (online) by XInfo Technology Inc.</li>
</ul>

<p>Good luck to everyone in this year’s income tax return journey. Make the best of it!</p>

<p>Have any suggestions or wish to provide your experience, please <a href="/contact/">contact me</a>.</p>

<p>This is post 13 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Join my quest in finding a solution for Canadian income tax software that will run on desktop Linux, with bonus solutions for macOS and Windows.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/income-tax-files.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/income-tax-files.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Quick Reference Commands</title><link href="https://www.adamsdesk.com/posts/quick-reference-commands/" rel="alternate" type="text/html" title="Quick Reference Commands" /><published>2022-03-03T00:00:00-06:00</published><updated>2023-03-16T19:14:40-06:00</updated><id>https://www.adamsdesk.com/posts/quick-reference-commands</id><content type="html" xml:base="https://www.adamsdesk.com/posts/quick-reference-commands/"><![CDATA[<p>I’m sure we’ve all been there where one knows the desired command to execute but can’t quite recall
it exactly. So you head off to searching through the long pages of documents, forums or even search
results to just end up being frustrated over the whole process taking so long. For this exact reason
I always enjoyed having quick reference documents organized by task with examples. This is a quick
way to get the answer you are looking for by just browsing the document or by using the web
browser’s built-in search to locate the answer.</p>

<p>Here is a list of my knowledge base articles for quick reference.</p>

<ul>
  <li><a href="https://kb.adamsdesk.com/operating_system/alpine-linux-quick-reference-commands/">Alpine Linux Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/operating_system/arch_linux_quick_reference_commands/">Arch Linux Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/application/docker-quick-reference-commands/">Docker Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/operating_system/fedora_quick_reference_commands/">Fedora Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/development/git_quick_reference_commands/">Git Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/application/gitlab_ce/#gitlab-command-quick-reference">Gitlab Command Quick Reference</a></li>
  <li><a href="https://kb.adamsdesk.com/operating_system/linux_quick_reference_commands/">Linux Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/application/microsoft_sql_server_quick_reference/">Microsoft SQL Server Quick Reference</a></li>
  <li><a href="https://kb.adamsdesk.com/application/mysql_quick_reference_commands/">MySQL Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/application/pi-hole-quick-reference-commands/">Pi-hole Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/application/postgresql_quick_reference_commands/">PostgreSQL Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/development/regular_expressions_quick_reference/">Regular Expressions Quick Reference</a></li>
  <li><a href="https://kb.adamsdesk.com/application/sqlite_quick_reference/">SQLite Quick Reference Commands</a></li>
  <li><a href="https://kb.adamsdesk.com/operating_system/the_basic_linux_manual/">The Basic Linux Manual</a></li>
</ul>

<p>Have a suggestion, notice an error or omission? Please <a href="/contact/">contact me</a>.</p>

<p>This is post 12 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="pihole" /><category term="linux" /><category term="git" /><category term="knowledgebase" /><summary type="html"><![CDATA[Find answers to a command quickly and easily with these articles covering topics such as Linux, Git, SQL, Pi-hole, regular expressions and more.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/old-reference-books.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/old-reference-books.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Postman API Client Open Source Alternatives</title><link href="https://www.adamsdesk.com/posts/postman-open-source-alternatives/" rel="alternate" type="text/html" title="Postman API Client Open Source Alternatives" /><published>2022-02-28T00:00:00-06:00</published><updated>2023-06-08T11:48:57-06:00</updated><id>https://www.adamsdesk.com/posts/postman-open-source-alternatives</id><content type="html" xml:base="https://www.adamsdesk.com/posts/postman-open-source-alternatives/"><![CDATA[<p>I’ve been using Postman client for many years and in all honesty without much thought.
It was just what was used when I started to use it and was the best option I knew of at that time to
test application programming interfaces (APIs). In recent years I’ve begun to notice Postman
changing in ways I do not enjoy and if I think about it Postman does not fit my values. It is an
application that is not open source but rather proprietary software and platform. I cannot deny that
Postman is a good application, but that doesn’t make up for the fact that it is focused on
proprietary methods and not open source. So I’ve decided to venture out in look for an alternative
application solution which meetings the following list of criteria.</p>

<ul>
  <li>Free/Libre open source</li>
  <li>Runs locally</li>
  <li>Graphical user interface</li>
  <li>Doesn’t require the Internet (an account)</li>
  <li>Supports REST and GraphQL APIs</li>
</ul>

<h2 id="what-is-an-api-client">What is an API Client?</h2>

<p>An application that allows a software developer to test, explore and debug application programming
interfaces (APIs) using a variety of request methods (e.g. REST, SOAP, GraphQL, etc.) to interact
with another software program or service. It simplifies the interaction between another program or
service without having to reinvent the wheel every time. In return this can speed up the development
process and allow for the developer to focus on their primary goals.</p>

<h2 id="hoppscotch">Hoppscotch</h2>

<p>This client takes a different approach entirely by being a web based development suite with support for REST, GraphQL
and realtime protocols. The open source application can be used for free using Hoppscotch Cloud or self-hosted
solution. Features entail API testing, environments, workspaces, interceptor, scripts, collections, authorization, and
more. In addition to the web application, Hoppscotch CLI is in development for use in the terminal or continuous
integration/continuous delivery (CI/CD) pipelines. Enterprise support is coming with Hoppscotch Enterprise.
Overall Hoppscotch is a well-rounded solution for most API needs, and I’m happy to see this one filling the open source
void in the market.</p>

<p><img src="/assets/img/posts/hoppscotch-screenshot.webp" alt="Screenshot of the Hoppscotch client showing the results of fetched JSON weather data." loading="lazy" width="1080" height="515" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/hoppscotch/hoppscotch">GitHub</a></li>
  <li>Website: <a href="https://hoppscotch.io/">Hoppscotch</a></li>
  <li>License: <a href="https://github.com/hoppscotch/hoppscotch/blob/main/LICENSE">MIT</a></li>
  <li>Tested version: 2023.4.5</li>
</ul>

<h2 id="httpie">HTTPie</h2>

<p>For those that love the terminal HTTPie is for you. However, those not wanting to use the terminal there is now a
desktop and web based clients available. HTTPie is a powerful API client with output that has syntax highlighting, with
beautified JSON output. On top of all that is has support for forms, file uploads, HTTP/HTTPS with optional
authentication, custom headers, persistent sessions, Wget like downloads, plugins and much more. It’s nice to see as
well that one can organize work within spaces, collections and tabs. All this can run on Linux, macOS, Windows, and
FreeBSD. If that is not enough the application can be installed using a Snap or AppImage. Shockingly this client is
quite mature being in development since 2012. The only questionable thing I’ve found is the software license seems to be
missing along with source code for the desktop edition of the client. Outside that, this is quite an impressive piece of
software.</p>

<p><img src="/assets/img/posts/httpie-desktop-screenshot.webp" alt="Screenshot of the HTTPie desktop client showing the results of fetched JSON weather data." loading="lazy" width="1080" height="513" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/httpie">GitHub</a></li>
  <li>Website: <a href="https://httpie.io/">HTTPie</a></li>
  <li>License: <a href="https://github.com/httpie/httpie/blob/master/LICENSE">BSD 3-Clause</a> (CLI) / Unknown (desktop)</li>
  <li>Tested version: 3.2.1 (CLI) / 2023.2.4 (desktop)</li>
</ul>

<h2 id="thunder-client">Thunder Client</h2>

<p>Thunder Client is an extension for use with VSCodium or Microsoft Visual Studio Code. Supports REST API, collections,
environment variables, offline/local storage, testing, query parameters, and HTTP headers with optional authentication.
API endpoints can be organized into groups called collections. Though this extension is free, there are pay plans
available.</p>

<p>Saying all this though it’s not ideal to me, and it doesn’t seem to be truly available as open source. I suppose if I
had to use this it would work for the time being, but I feel I would just sooner use Postman instead even though it
doesn’t fit my criteria.</p>

<p><img src="/assets/img/posts/thunder-client-screenshot.webp" alt="Screenshot of the Thunder Client showing the results of fetched JSON weather data." loading="lazy" width="1080" height="515" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/rangav/thunder-client-support">GitHub</a></li>
  <li>Website: <a href="https://www.thunderclient.com/">Thunder Client</a></li>
  <li>License: Proprietary</li>
  <li>Tested version: 2.7.4</li>
</ul>

<h2 id="advanced-rest-client">Advanced REST Client</h2>

<p>Advanced REST Client (ARC) is an Electron based application supporting REST API, header attributes, HTTP authentication,
actions and projects. Overall the application just feels very clunky and a limited feature set. It does the job, but
doesn’t make the experience enjoyable.</p>

<p><img src="/assets/img/posts/advanced-rest-client-screenshot.webp" alt="Screenshot of the Advanced REST Client showing the results of fetched JSON weather data." loading="lazy" width="1080" height="515" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/advanced-rest-client/arc-electron">GitHub</a></li>
  <li>Website: <a href="https://www.advancedrestclient.com/">Advanced REST Client</a></li>
  <li>License: <a href="https://github.com/advanced-rest-client/arc-electron/blob/master/LICENSE.md">Apache v2.0</a></li>
  <li>Tested version: 17.0.9</li>
</ul>

<h2 id="insomnia">Insomnia</h2>

<p>I was suggested to check out another API client called Insomnia by <a href="https://fosstodon.org/@ellotheth@bsd.network" title="View Mastodon profile">@ellotheth</a>.
The Insomnia API client is Electron based and indeed open source with support of using REST, SOAP, GraphQL and GRPC
requests. As well the interface appears to encourage design using OpenAPI which seems like a good
thing to me, but this is not required. Work is organized by project and collections (groups).
There is also the option if one chooses to do so, using Insomnia’s platform. I’m quite impressed.
This fits all the criteria I was looking for and more.</p>

<p><img src="/assets/img/posts/insomnia-screenshot.webp" alt="Screenshot of the Insomnia showing the results of fetched JSON weather data." loading="lazy" width="1080" height="515" class="img-fluid mx-auto d-block" /></p>

<ul class="list-unstyled">
  <li>Project: <a href="https://github.com/Kong/insomnia">GitHub</a></li>
  <li>Website: <a href="https://insomnia.rest/">Insomnia</a></li>
  <li>License: <a href="https://github.com/Kong/insomnia/blob/develop/LICENSE">MIT</a></li>
  <li>Tested version: 2023.2.2</li>
</ul>

<p>This is post 11 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="development" /><summary type="html"><![CDATA[An overview of what an API Client is and the discovery of free open source application alternatives.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/api.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/api.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To View WebP Images</title><link href="https://www.adamsdesk.com/posts/view-webp-images/" rel="alternate" type="text/html" title="How To View WebP Images" /><published>2022-02-27T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/view-webp-images</id><content type="html" xml:base="https://www.adamsdesk.com/posts/view-webp-images/"><![CDATA[<p>Not all default image or gallery viewers on an operating system support the image format WebP. Sure,
the majority of web browsers support opening a WebP image, but that is not exactly ideal when
wanting to view an image or a collection of images quickly along with image rotating, flip, view
metadata, etc. However, that doesn’t mean it’s not possible to still be able to view those images
quickly.</p>

<h2 id="what-is-webp">What Is WebP?</h2>

<p>An image file format that was developed by Google as a replacement for GIF, JPEG and PNG. The
format uses a .webp file name extension and has the advantage of producing smaller file sizes,
while still keeping quality along with support of lossy and lossless compression, animation and
alpha transparency. The WebP related software is released under a BSD free software license.</p>

<h2 id="viewing-webp-images-on-android">Viewing WebP Images On Android</h2>

<p>Some default gallery / image viewers support WebP by default. There are many apps that can be
used to view WebP images when using Android. Here is what I use as an alternative app that is open
source and that can be easily installed via Google Play, F-Droid or APK Mirror.</p>

<dl>
  <dt><a href="https://www.simplemobiletools.com/gallery">Simple Gallery</a></dt>
  <dd>As the name implies it is a simple photo gallery that provides the features to view, edit,
create galleries, set wallpaper, share, manage, have private photo/video/file protection and more.
The minimalistic aspect is great but the selling point for me is added benefits of no ads,
no unnecessary permissions and does not require Internet access to use for your privacy protection.</dd>
</dl>

<p><a href="https://play.google.com/store/apps/details?id=com.simplemobiletools.gallery">Google Play</a> /
<a href="https://f-droid.org/en/packages/com.simplemobiletools.gallery.pro/">F-Droid</a> /
<a href="https://www.apkmirror.com/apk/simple-mobile-tools/simple-gallery/">APK Mirror</a></p>

<h2 id="viewing-webp-images-on-linux">Viewing WebP Images On Linux</h2>

<p>The behaviour I’ve experienced on a Linux operating system is that WebP is not always supported by
default. Though WebP support can be added by installing an additional software library or by using
an alternative image viewer application.</p>

<h3 id="gnome-image-viewer">GNOME Image Viewer</h3>

<p>Once webp-pixbuf-loader library is installed, GNOME Image Viewer (Eye of GNOME) will have the
ability to open WebP images along with seeing thumbnails of images in GNOME Files (Nautilus).</p>

<p>Here are a few examples of how to install the software library within the terminal.
You may also install using a graphical user interface (GUI) such as
<a href="https://en.wikipedia.org/wiki/GNOME_Software">GNOME Software</a> or
<a href="https://apps.kde.org/discover/">KDE Discover</a>.</p>

<h4 id="arch-linux">Arch Linux</h4>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Sy</span> webp-pixbuf-loader
</code></pre></div></div>

<h4 id="debian">Debian</h4>

<p>This should also work with other Debian based distributions such as Pop! OS or Ubuntu.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>add-apt-repository ppa:krifa75/eog-ordissimo
<span class="gp">#</span><span class="w"> </span>apt update
<span class="gp">#</span><span class="w"> </span>apt <span class="nb">install </span>webp-pixbuf-loader
</code></pre></div></div>

<h4 id="fedora">Fedora</h4>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>dnf <span class="nb">install </span>webp-pixbuf-loader
</code></pre></div></div>

<h3 id="alternative-linux-image-viewers">Alternative Linux Image Viewers</h3>

<p>Here are few known free and open source image viewers that support WebP image file format.</p>

<ul>
  <li><a href="https://feh.finalrewind.org/">feh</a> with <a href="https://github.com/gawen947/imlib2-webp">imlib2-webp</a></li>
  <li><a href="https://en.wikipedia.org/wiki/GThumb">gThumb</a></li>
  <li><a href="https://apps.kde.org/gwenview/">Gwenview</a> (KDE)</li>
  <li><a href="https://nomacs.org/">Nomacs</a></li>
  <li><a href="https://photoqt.org/">PhotoQt</a></li>
  <li><a href="https://interversehq.com/qview/">qView</a></li>
</ul>

<h2 id="viewing-webp-images-on-macos">Viewing WebP Images On macOS</h2>

<p>Since I cannot confirm my findings I will summarize what I’ve found for reference. As far as I
understand it by default, WebP is not fully supported within Finder via Quick Look. However, it
seems it is possible if you install a Quick Look plugin called <a href="https://github.com/emin/WebPQuickLook">WebPQuickLook</a>.
The only native support that I know of is Safari v14 available in <a href="https://en.wikipedia.org/wiki/MacOS_Big_Sur">macOS Big Sur</a>
v11.</p>

<h3 id="finder">Finder</h3>

<p>Here are a few links that should provide the relevant information required to get WebP support
working within Finder on macOS.</p>

<ul>
  <li><a href="https://www.addictivetips.com/mac-os/preview-webp-quick-look/">How to preview webp files with Quick Look on macOS</a></li>
  <li><a href="https://apple.stackexchange.com/questions/285698/webp-support-on-macos-is-it-indended-to-actually-work">WebP support on macOS — is it intended to actually work?</a></li>
  <li><a href="https://ourcodeworld.com/articles/read/1160/how-to-enable-webp-image-format-preview-on-the-macos-finder">How to enable WebP image format preview on the MacOS Finder</a></li>
</ul>

<h3 id="alternative-macos-image-viewers">Alternative macOS Image Viewers</h3>

<p>It may be easier for some just to use a web browser or an alternative free open source image viewers.</p>

<ul>
  <li><a href="https://interversehq.com/qview/">qView</a></li>
</ul>

<h2 id="viewing-webp-images-on-windows">Viewing WebP Images On Windows</h2>

<p>At this time it still seems best to use alternative image viewers on a Microsoft Windows operating
system. The default image viewer Windows Photos does not support WebP. Here are a few application
suggestions that provides WebP support and much more.</p>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip</p>
    <p>
        Software listed are free and open source. Do not use Microsoft Store to install.
    </p>
</div>

<ul>
  <li><a href="https://imageglass.org/">ImageGlass Kobe</a></li>
  <li><a href="https://nomacs.org/">Nomacs</a></li>
  <li><a href="https://photoqt.org/">PhotoQt</a></li>
</ul>

<p>This is post 10 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="windows" /><category term="GNOME" /><category term="android" /><category term="macos" /><summary type="html"><![CDATA[An overview of what WebP image file format is and how to open/view WebP image files on a variety of operating systems.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/logo-webp-collage.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/logo-webp-collage.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Element Desktop Error: Cannot Find Module en-us.json</title><link href="https://www.adamsdesk.com/posts/element-desktop-error-cannot-find-module/" rel="alternate" type="text/html" title="Element Desktop Error: Cannot Find Module en-us.json" /><published>2022-02-13T00:00:00-06:00</published><updated>2023-07-29T16:39:53-06:00</updated><id>https://www.adamsdesk.com/posts/element-desktop-error-cannot-find-module</id><content type="html" xml:base="https://www.adamsdesk.com/posts/element-desktop-error-cannot-find-module/"><![CDATA[<p>Over the past several weeks now I’ve been experiencing issues with the Element (Matrix client)
desktop application crashing. Searching online appears to show that I’m not the only one with the
issue. Looking into the problem myself, I’ve found three problems. One the application is looking
for “./i18n/strings/en-us.json” that doesn’t exist. Two, “/usr/lib/element/app.asar/webapp.asar”
is not a directory. Three, when the application is able to run, and I close it, I noticed in
my journal log of a coredump of Element’s electron process. For those that are not aware Element
desktop application is based upon Electron. See below for the console output. What I can confirm is
that when the application crashes by starting it, the crash is caused by
“/usr/lib/element/app.asar/webapp.asar” not being a directory. When the application is able to run
I still receive the error of not finding the locale “en-us.json” without noticeable end user
problems.</p>

<p>I realize this needs to be focused on one issue at a time however, this is what I discovered as
an end user that lead me to discovering more issues. So I felt it was necessary to break this down.
Since I’m not involved in the development of the software these issues maybe related for all I
know.</p>

<p>The issues one and three, I’ve been able to find references to the potential bugs I’m experiencing
listed below.</p>

<ul>
  <li><a href="https://github.com/vector-im/element-web/issues/19218">Element desktop does not have an en_US translation #19218</a></li>
  <li><a href="https://github.com/vector-im/element-web/issues/20926">Trace/breakpoint trap (core dumped) (occurs randomly) #20926</a></li>
</ul>

<p>As for the second issue, I’ve not yet found anyone talking about it online. I decided to decompress
the “app.asar” archive using the below command to see if “webapp.asar” was present. Unfortunately
I did not find it. So that was a dead end for me.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ asar extract /usr/lib/element/app.asar /var/tmp/element/
</code></pre></div></div>

<p>If anyone can provide information to help or direct me in the right direction, please
<a href="/contact/">contact me</a>.</p>

<h2 id="environment">Environment</h2>

<ul>
  <li>Arch Linux</li>
  <li>GNU bash v5.1.16</li>
  <li>Fish v3.3.1</li>
  <li>GNOME Shell v41.3</li>
</ul>

<h2 id="problem">Problem</h2>

<p>The application crashes when started.</p>

<p>I found out that I can turn on logging in Electron based applications, so I decided to open Element
desktop application in the terminal with the “–enable-logging” argument. The following is what is
outputted in the terminal when the application is going to crash.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>element-desktop <span class="nt">--enable-logging</span>
</code></pre></div></div>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">/home/adam/.config/Element exists: yes
/home/adam/.config/Riot exists: no
[9571:0213/142115.687747:WARNING:archive.cc(199)] Opening /usr/lib/element/app.asar/webapp.asar: FILE_ERROR_NOT_A_DIRECTORY
No update_base_url is defined: auto update is disabled
Fetching translation json for locale: en_EN
Changing application language to en-us
Fetching translation json for locale: en-us
Could not fetch translation json for locale: 'en-us' Error: Cannot find module './i18n/strings/en-us.json'
Require stack:
- /usr/lib/element/app.asar/lib/language-helper.js
- /usr/lib/element/app.asar/lib/tray.js
- /usr/lib/element/app.asar/lib/electron-main.js
- /usr/lib/electron15/resources/default_app.asar/main.js
-
    at Module._resolveFilename (node:internal/modules/cjs/loader:934:15)
    at Function.n._resolveFilename (node:electron/js2c/browser_init:249:1128)
    at Module._load (node:internal/modules/cjs/loader:779:27)
    at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
    at Module.require (node:internal/modules/cjs/loader:1006:19)
    at require (node:internal/modules/cjs/helpers:93:18)
    at AppLocalization.fetchTranslationJson (/usr/lib/element/app.asar/lib/language-helper.js:76:20)
    at /usr/lib/element/app.asar/lib/language-helper.js:89:39
</span><span class="gp">    at Array.forEach (&lt;anonymous&gt;</span><span class="o">)</span>
<span class="go">    at AppLocalization.setAppLocale (/usr/lib/element/app.asar/lib/language-helper.js:88:17) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/lib/element/app.asar/lib/language-helper.js',
    '/usr/lib/element/app.asar/lib/tray.js',
    '/usr/lib/element/app.asar/lib/electron-main.js',
    '/usr/lib/electron15/resources/default_app.asar/main.js',
    undefined
  ]
}
Resetting the UI components after locale change
Resetting the UI components after locale change
[9571:0213/142116.640188:INFO:CONSOLE(2)] "Initialised rageshake.", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
</span><span class="gp">[9571:0213/142116.640267:INFO:CONSOLE(2)] "To fix line numbers in Chrome: Meatball menu → Settings → Ignore list → Add /rageshake\.js$</span><span class="s2">", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
</span><span class="go">[9571:0213/142116.645427:INFO:CONSOLE(2)] "Using Electron platform", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142116.680927:INFO:CONSOLE(2)] "Configuring rageshake persistence...", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
Changing application language to en-us
Fetching translation json for locale: en-us
Could not fetch translation json for locale: 'en-us' Error: Cannot find module './i18n/strings/en-us.json'
Require stack:
- /usr/lib/element/app.asar/lib/language-helper.js
- /usr/lib/element/app.asar/lib/tray.js
- /usr/lib/element/app.asar/lib/electron-main.js
- /usr/lib/electron15/resources/default_app.asar/main.js
-
    at Module._resolveFilename (node:internal/modules/cjs/loader:934:15)
    at Function.n._resolveFilename (node:electron/js2c/browser_init:249:1128)
    at Module._load (node:internal/modules/cjs/loader:779:27)
    at Function.c._load (node:electron/js2c/asar_bundle:5:13331)
    at Module.require (node:internal/modules/cjs/loader:1006:19)
    at require (node:internal/modules/cjs/helpers:93:18)
    at AppLocalization.fetchTranslationJson (/usr/lib/element/app.asar/lib/language-helper.js:76:20)
    at /usr/lib/element/app.asar/lib/language-helper.js:89:39
</span><span class="gp">    at Array.forEach (&lt;anonymous&gt;</span><span class="o">)</span>
<span class="go">    at AppLocalization.setAppLocale (/usr/lib/element/app.asar/lib/language-helper.js:88:17) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/lib/element/app.asar/lib/language-helper.js',
    '/usr/lib/element/app.asar/lib/tray.js',
    '/usr/lib/element/app.asar/lib/electron-main.js',
    '/usr/lib/electron15/resources/default_app.asar/main.js',
    undefined
  ]
}
Resetting the UI components after locale change
[9571:0213/142116.722965:INFO:CONSOLE(2)] "Loading skin...", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
</span><span class="gp">[9571:0213/142116.734691:INFO:CONSOLE(61)] "%cElectron Security Warning (Insecure Content-Security-Policy) font-weight: bold;</span><span class="w"> </span>This renderer process has either no Content Security
<span class="go">    Policy set or a policy with "unsafe-eval" enabled. This exposes users of
    this app to unnecessary security risks.

For more information and help, consult
https://electronjs.org/docs/tutorial/security.
This warning will not show up
once the app is packaged.", source: node:electron/js2c/sandbox_bundle (61)
[9571:0213/142116.737377:INFO:CONSOLE(2)] "Using WebAssembly Olm", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.265848:INFO:CONSOLE(2)] "Skin loaded!", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.284049:INFO:CONSOLE(2)] "set language to en-us", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.308556:INFO:CONSOLE(2)] "Application is running in production mode", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.309131:INFO:CONSOLE(2)] "Vector starting at vector://vector/webapp/", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.309627:INFO:CONSOLE(2)] "Verifying homeserver configuration", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.310299:INFO:CONSOLE(2)] "Config uses a default_server_name - doing .well-known lookup", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142117.310336:INFO:CONSOLE(2)] "DEPRECATED CONFIG OPTION: In the future, default_server_name will not be accepted. Please use default_server_config instead.", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.220740:INFO:CONSOLE(2)] "Using homeserver config: [object Object]", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.220828:INFO:CONSOLE(2)] "Updating SdkConfig with validated discovery information", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.267369:INFO:CONSOLE(2)] "Got pickle key", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.274663:INFO:CONSOLE(2)] "Restoring session for @thewarden:matrix.org", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.275087:INFO:CONSOLE(2)] "setLoggedIn: mxid: @thewarden:matrix.org deviceId: CMSSTAYJBT guest: false hs: https://matrix-client.matrix.org/ softLogout: false  freshLogin: false", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.279227:INFO:CONSOLE(2)] "StorageManager: Checking storage consistency", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.279353:INFO:CONSOLE(2)] "StorageManager: Local storage supported? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.279424:INFO:CONSOLE(2)] "StorageManager: IndexedDB supported? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.279661:INFO:CONSOLE(2)] "StorageManager: Local storage contains data? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.279736:INFO:CONSOLE(2)] "StorageManager: Crypto initialised? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.282252:INFO:CONSOLE(2)] "StorageManager: Sync store using IndexedDB contains data? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.284518:INFO:CONSOLE(2)] "StorageManager: Crypto store using IndexedDB contains data? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.284594:INFO:CONSOLE(2)] "StorageManager: Storage consistency checks passed", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.301082:INFO:CONSOLE(2)] "Session persisted for @thewarden:matrix.org", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.301280:INFO:CONSOLE(2)] "Lifecycle: Starting MatrixClient", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.316497:INFO:CONSOLE(2)] "StorageManager: Persistent? true", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142118.316822:INFO:CONSOLE(2)] "Switching to room id !PLchWMYJrFZiIbdXGy:matrix.org at event undefined", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.206807:INFO:CONSOLE(2)] "EventIndex: Successfully initialized the event index", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.209438:INFO:CONSOLE(2)] "EventIndex: Loaded checkpoints ", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.210304:INFO:CONSOLE(2)] "IndexedDBStore.startup: connecting to backend", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.211252:INFO:CONSOLE(2)] "MatrixClientPeg: waiting for MatrixClient store to initialise", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.259344:INFO:CONSOLE(2)] "IndexedDB worker is ready", source: vector://vector/webapp/bundles/1cb4c4953062347d684c/vendors~init.js (2)
[9571:0213/142119.260238:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend.connect: connecting...", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
[9571:0213/142119.260778:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend.connect: awaiting connection...", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
[9571:0213/142119.261775:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend.connect: connected", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
[9571:0213/142119.262167:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend: loading account data...", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
[9571:0213/142119.262601:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend: loading sync data...", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
[9571:0213/142119.270535:INFO:CONSOLE(1)] "LocalIndexedDBStoreBackend: loaded account data", source: vector://vector/webapp/bdc4736dc6bebfc09f05.worker.js (1)
fish: Job 1, 'element-desktop --enable-logging' terminated by signal SIGTRAP (Trace or breakpoint trap)
</span></code></pre></div></div>

<h2 id="solution">Solution</h2>

<p>At this time I’ve not been able to find a permanent solution. Best one can do is start Element desktop again or again until it works.
Usually it takes two to three tries until the application appears to be working from my testing.</p>

<p>This is post 9 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="archlinux" /><category term="linux" /><summary type="html"><![CDATA[The journey of debugging an issue found in the Element application, could not fetch translation json for locale: 'en-us' Error: Cannot find module.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/element-cannot-find-module.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/element-cannot-find-module.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Enable Dark Mode In Calibre</title><link href="https://www.adamsdesk.com/posts/calibre-dark-theme/" rel="alternate" type="text/html" title="How To Enable Dark Mode In Calibre" /><published>2022-02-12T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/calibre-dark-theme</id><content type="html" xml:base="https://www.adamsdesk.com/posts/calibre-dark-theme/"><![CDATA[<p>Calibre is an amazing cross-platform open-source software for e-book management. With ease one can
organize content into virtual libraries, built-in e-book viewer/reader, download news/e-books
/magazines from the web, share, backup your library, sync to e-readers, edit books and many more
features to long to list here.</p>

<p>Since I’ve set a personal goal of reading at least one book a month or more, I’ve found myself
using Calibre quite often. By default, at least on Linux the Calibre interface is in a light or
shall I say gray theme/mode look. To me this is not enjoyable to my eyes, especially for long
periods of time. Calibre has a dark theme/mode, but it is not always enabled depending on ones
circumstances. Let me begin with some explanation and then how to enable the dark palette/
theme/mode in various operating systems.</p>

<p>The following applies to Calibre v5.36.</p>

<h2 id="linux">Linux</h2>

<p>By default, on a Linux operating system Calibre uses its own built-in Qt style/theme or shall I say
color palette. The reason for this is to avoid user issues due to incompatibilities between the
version of Qt Calibre is built upon, and the Qt version installed on the operating system. So due to
this even if the desktop environment is set to dark mode, Calibre will not change its appearance
automatically. However, this can be overridden by a configuration change for Calibre.</p>

<p>Using the terminal set the environment variable <code class="language-plaintext highlighter-rouge">CALIBRE_USE_DARK_PALETTE</code> to <code class="language-plaintext highlighter-rouge">1</code> based upon the
terminal environment used per user.</p>

<h3 id="environment">Environment</h3>

<ul>
  <li>Arch Linux</li>
</ul>

<h3 id="assumptions">Assumptions</h3>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>The “~” (tilde) represents the value of “$HOME” as in the current user’s home directory (e.g. /home/adam)</li>
</ul>

<h3 id="bash">BASH</h3>

<ul>
  <li>GNU bash v5.1.16</li>
</ul>

<p>Add the “export CALIBRE_USE_DARK_PALETTE=1” without double quotes to a new line within <code class="language-plaintext highlighter-rouge">.bashrc</code>.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.bashrc
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>export CALIBRE_USE_DARK_PALETTE=1
</code></pre></div></div>

<h3 id="fish-shell">Fish-Shell</h3>

<ul>
  <li>Fish version v3.3.1</li>
</ul>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">set</span> <span class="nt">-Ux</span> CALIBRE_USE_DARK_PALETTE 1
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-U    Set shell variable to be given a universal scope. Exists in all fish instances and preserved across restarts of the shell.
-x    Set shell variable to be exported to child processes (making it an environment variable).
</span></code></pre></div></div>

<div class="admonition info rounded">
    <p class="admonition-title">Info</p>
    <p>
        Universal variables are stored in the file "~/.config/fish/fish_variables" as of Fish v3.0. Prior versions in "~/.config/fish/fishd.MACHINE_ID".
    </p>
</div>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Do not edit "~/.config/fish/fish_variables" directly. Only Use fish scripts or by using fish interactively instead to avoid edits being overwritten.
    </p>
</div>

<h3 id="systemd-environmentd">Systemd environment.d</h3>

<p>I’ve found that depending on circumstances, setting the environment variable
<code class="language-plaintext highlighter-rouge">CALIBRE_USE_DARK_PALETTE</code> to <code class="language-plaintext highlighter-rouge">1</code> using BASH or Fish-Shell methods above does not work when directly
opening applications within the desktop environment. It works fine if the application is launched
via the terminal in the desktop environment. Below is a solution I’ve used that works on systems
using Systemd.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>nano ~/.config/environment.d/01-calibre-dark-mode.conf
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CALIBRE_USE_DARK_PALETTE=1
</code></pre></div></div>

<h2 id="apple-macos">Apple macOS</h2>

<p>Unfortunately I don’t have access to macOS to test and confirm the behaviour on this operating
system. According to the Calibre documentation that I could find, macOS does not honor
the Calibre configuration to force using dark theme/palette. Hopefully when setting the operating
system preference to use dark mode Calibre will automatically change its appearance. Can anyone
confirm this and <a href="/contact/">let me know</a>?</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        macOS v10.14 Mojave and greater is required for system preference of dark mode.
    </p>
</div>

<h2 id="microsoft-windows">Microsoft Windows</h2>

<p>Calibre will automatically adjust to using the dark theme/palette when setting the operating system
preferences to dark colors/theme. No further configuration is required. However, if for some reason
you don’t want to use dark colors system preference this can be set specificity for Calibre only to
use dark theme/palette per user.</p>

<ol>
  <li>Press the <kbd>Windows Key</kbd> + <kbd>Pause/break</kbd> key for “System settings”.</li>
  <li>On the left-hand side click on “Advanced system settings”.</li>
  <li>In the “System Properties” dialog click on the “Advanced” tab.</li>
  <li>Click on the button “Environment Variables…” under the “Advanced” tab.</li>
  <li>In the dialog “Environment Variables” click on the “New” button under “User variables”.</li>
  <li>Enter variable name as “CALIBRE_USE_DARK_PALETTE” (all capital letters) and variable value as “1” without double quotes.</li>
  <li>Click on the “OK” button in “Environment Variables”.</li>
  <li>Click on the “OK” button for “System Properties”.</li>
  <li>Close the “System Settings” window.</li>
</ol>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Windows 10 version 1607 (anniversary update) is required for system preference of dark colors/mode.
    </p>
</div>

<p>This is post 7 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[Set Calibre to use the dark mode with the operating system preference or directly with environment variable for Linux, macOS and Windows.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/calibre-dark-theme.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/calibre-dark-theme.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mozilla Is Working With Facebook?</title><link href="https://www.adamsdesk.com/posts/mozilla-working-with-facebook/" rel="alternate" type="text/html" title="Mozilla Is Working With Facebook?" /><published>2022-02-11T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/mozilla-working-with-facebook</id><content type="html" xml:base="https://www.adamsdesk.com/posts/mozilla-working-with-facebook/"><![CDATA[<p>Mozilla recently announced in a blog post titled “Privacy Preserving Attribution for Advertising”
how they have been working with Meta Platforms (Facebook). It seems for a lot of people this can be
quite concerning to hear these two companies coming together for any reason whatsoever. I personally
don’t find this concerning. Let me explain my opinion and perspective on the matter.</p>

<ul>
  <li><a href="https://blog.mozilla.org/en/mozilla/privacy-preserving-attribution-for-advertising/">Privacy Preserving Attribution for Advertising</a></li>
  <li><a href="https://blog.mozilla.org/en/mozilla/the-future-of-ads-and-privacy/">The future of ads and privacy</a></li>
  <li><a href="https://blog.mozilla.org/en/mozilla/building-a-more-privacy-preserving-ads-based-ecosystem/">Building a more privacy preserving ads-based ecosystem</a></li>
</ul>

<p>As some may have noticed Mozilla has been struggling to find a common ground to create revenue to
sustain itself. It only makes sense that Mozilla tries to fix this by leveraging some knowledge and
experience from another organization in the industry. Now I’m not blind to fact that Mozilla has to
me made some questionable decisions in the past that goes against their own values and goals.
However, no one or organization is perfect. Sometimes we need to work with those we oppose in order
to grow and resolve a problem. Meaning working with a company that may differ extremely in values
still can be beneficial. To me the most positive thing here is, seeing a company like Mozilla
continue to try. Growth comes from failure, so without trying how will Mozilla ever succeed?
As well remember that advertising is a massive industry that is not going away and can have value
to us the consumer when done properly. Mozilla is simply trying to find solutions of how to handle
advertising online in a safe privacy focused manner.</p>

<p>Now I’m sure some are wondering am I a fan of Meta. No, not at all and in all honestly I avoid them
as much as I possibly can. However, I’m not blind to see that there is good. Take a look at say
GraphQL or React. It may sound like I’m defending Mozilla and even Meta, but I’m not. I’m merely
trying to provide a different perspective for one to think about.</p>

<p>We will all have to wait and see what becomes of this team work and if it will amount to anything
with W3C along with the Private Advertising Technology Community Group (PATCG) proposal. Lets us
focus on hope and the possibility of positive change for the Internet community.</p>

<p>This is post 8 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[My opinion on Mozilla and Meta (Facebook) working together on a new proposal for advertising called Interoperable Private Attribution (IPA).]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/mozilla-and-meta.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/mozilla-and-meta.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Share Wi-Fi Using A QR Code</title><link href="https://www.adamsdesk.com/posts/share-wifi-using-a-qr-code/" rel="alternate" type="text/html" title="Share Wi-Fi Using A QR Code" /><published>2022-01-27T00:00:00-06:00</published><updated>2023-10-11T12:00:08-06:00</updated><id>https://www.adamsdesk.com/posts/share-wifi-using-a-qr-code</id><content type="html" xml:base="https://www.adamsdesk.com/posts/share-wifi-using-a-qr-code/"><![CDATA[<p>Sometime ago now, I decided that I had enough with the whole process of sharing one’s Wi-Fi SSID
(service set identifier, network name) and password manually. One always ends up getting something
communicated wrong or entered wrong when trying to connect to Wi-Fi. In the past, for a brief time
period, I used NFC tags to make connecting to Wi-Fi easier. However, nowadays using NFC tags to
connect to Wi-Fi are not well-supported, at least in my experience. Since I’ve been playing around
with QR codes (<a href="/posts/read-totp-secret-key-qr-code-image/">How To Read The TOTP Secret Key from a QR Code Image</a>)
I thought why not use this as a solution since it is well-supported on most mobile
devices. For those devices that cannot use QR codes to connect to Wi-Fi then the manual
solution will be available as a back-up.</p>

<h2 id="discovery">Discovery</h2>

<p>I found a good terminal based application for QR code encoding called “qrencode” and a
graphical application called “QtQR” which just so happens to use qrencode. I installed
the packages “<a href="https://archlinux.org/packages/extra/x86_64/qrencode/">extra/qrencode</a>” and
“<a href="https://archlinux.org/packages/community/any/qtqr/">community/qtqr</a>” on my Arch Linux
system, and began to play around with generating the QR codes that would connect to Wi-Fi.
After I was done encoding the two QR codes, one for 2.4g and one for 5g, I then created an image in
Inkscape that would have the QR codes, Wi-Fi signal strength, Wi-Fi SSID (network name) and
password. Then I printed it all out on to card stock (199 g/m<sup>2</sup> (100 lb.)), cut out along
the cut lines and glued two strips of magnets two the back of each QR code, so I can attach them on
to my fridge. I am happy to say they are working great and have simplified the process. Looking back
though for manual use I maybe should have added the authentication type (e.g. WPA/WPA2/WPA3) or
stated which line is the Wi-Fi SSID or password. However, I don’t think it will really become an
issue since it is pretty intuitive and very little information available to confuse. The hardest
part I found was figuring out the QR code input string format. I had to search for quite some time
on this and eventually found it for Android and iOS 11+. If anyone finds a better source, please
<a href="/contact/">let me know</a>.</p>

<p>Here is how I this can be accomplished using a Linux command-line or graphical application to generate the Wi-Fi QR codes.</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        Refer to <a href="https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11">ZXing Wiki: Barcode Contents &gt; Wi-Fi Network Config</a> for specifics on Wi-Fi QR code input string formatting.
    </p>
</div>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “#” (number sign) represents the CLI (command-line interface) prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “#” is to be entered at the CLI</li>
</ul>

<h2 id="install-software-arch-linux">Install Software: Arch Linux</h2>

<p>Command-line interface package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Syu</span> qrencode
</code></pre></div></div>

<p>Graphical user interface package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pacman <span class="nt">-Syu</span> qtqr
</code></pre></div></div>

<h2 id="install-software-debian">Install Software: Debian</h2>

<p>Command-line interface package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>apt <span class="nb">install </span>qrencode
</code></pre></div></div>

<p>Graphical user interface package.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>apt <span class="nb">install </span>qtqr
</code></pre></div></div>

<h2 id="generate-qr-code-command-line">Generate QR Code: Command-line</h2>

<p>In this example a QR Code will be generated using a hidden network SSID of “adamsdesk” using WPA/WP2/WP3 authentication
type. Password is enclosed in double quotes to avoid issues. The generated QR code will be outputted to a filename of
“wifi-5g.png”. The Wi-FI input or connection string in this case is broken down as follows,
‘WIFI:S:{SSID};T:{AUTH-TYPE};P:”{PASSWORD}”;H:{true/false/blank};’ where each placeholder <code class="language-plaintext highlighter-rouge">{SSID}</code>, <code class="language-plaintext highlighter-rouge">{AUTH-TYPE}</code>, <code class="language-plaintext highlighter-rouge">{PASSWORD}</code>,
<code class="language-plaintext highlighter-rouge">{true/false/blank})</code> are replaced with their applicable values.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>qrencode <span class="nt">-s</span> 6 <span class="nt">-l</span> H <span class="nt">-o</span> <span class="s2">"wifi-5g.png"</span> <span class="s1">'WIFI:S:adamsdesk;T:WPA;P:"p9XD`Cbca4@7_YCj";H:true;'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-s    Specify the size of the dot (pixel). (default=3)
-l    Specify error correction level from L (lowest) to H (highest). (default=L)
-o    Write image to FILENAME. If '-' is specified, the result will be output to standard output.
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">S     Network SSID
</span><span class="gp">T     Authentication type;</span><span class="w"> </span>can be WEP, WPA, WPA2-EAP, nopass
<span class="go">P     Password
</span><span class="gp">H     Optional, true if the network SSID is hidden;</span><span class="w"> </span>Can be <span class="nb">true</span>, <span class="nb">false </span>or blank
</code></pre></div></div>

<p>Here is an example of the output generated.</p>

<p><img src="/assets/img/posts/wifi-qrcode-example.webp" alt="A generated Wi-Fi QR Code Example." width="150" height="150" class="img-fluid" loading="lazy" /></p>

<p>A slight alteration to the command can output the QR Code to the command-line (standard output) by using “-o -“
and “-t utf8”.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>qrencode <span class="nt">-s</span> 6 <span class="nt">-l</span> H <span class="nt">-o</span> - <span class="nt">-t</span> utf8 <span class="s1">'WIFI:S:{SSID};T:{AUTH-TYPE};P:{PASSWORD};;'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">-o    Write image to FILENAME. If '-' is specified, the result will be output to standard output.
-t    Specify the type of the generated image. (default=PNG)
</span></code></pre></div></div>

<h2 id="generate-qr-code-graphical">Generate QR Code: Graphical</h2>

<p>The QtQR applications is simple yet powerful application that can allow a user to generate QR Codes without the use of
the command-line. Simply pick what type of QR Code you want to generate and then input the corresponding values then
click on “Save QR Code” button. Additionally, the application features the ability to decode from a file or webcam.</p>

<p>The screenshot below illustrates generating a QR Code to connect to a hidden WiFi network SSID of “adamsdesk” using
WPA/WP2/WP3 authentication type and corresponding password.</p>

<p><img src="/assets/img/posts/wifi-qrcode-qtqr-screenshot.webp" alt="Screenshot of the QtQR application with WiFi Network values entered and a QR Code generated." width="720" height="536" class="img-fluid" loading="lazy" /></p>

<h2 id="share-wi-fi-sign-example">Share Wi-Fi Sign Example</h2>

<p>This is an example of what I created within Inkscape to print onto card stock (199 g/m2 (100 lb.)) to put on my fridge
using magnets.</p>

<p><img src="/assets/img/posts/share-wifi-sign-example.webp" alt="Share Wi-Fi sign example" width="200" height="238" class="img-fluid" loading="lazy" /></p>

<p>This is post 6 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="commandline" /><summary type="html"><![CDATA[Easily share your Wi-Fi connection by following these step by step instructions on how to create your own a QR Code.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/share-wifi-qrcode.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/share-wifi-qrcode.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Upgrade Storage Capacity On A Raspberry Pi</title><link href="https://www.adamsdesk.com/posts/how-to-upgrade-storage-capacity-on-a-raspberry-pi/" rel="alternate" type="text/html" title="How To Upgrade Storage Capacity On A Raspberry Pi" /><published>2022-01-25T00:00:00-06:00</published><updated>2023-01-10T18:56:13-06:00</updated><id>https://www.adamsdesk.com/posts/how-to-upgrade-storage-capacity-on-a-raspberry-pi</id><content type="html" xml:base="https://www.adamsdesk.com/posts/how-to-upgrade-storage-capacity-on-a-raspberry-pi/"><![CDATA[<p>A Raspberry Pi system are a very useful low powered single-board computer (SBC) that can do just
about anything. Presently I’m using a Raspberry Pi 2 Model B with Pi-Hole software as a network
wide advertisement blocking service. Those interested in setting up your own may follow my
knowledge base article, <a href="https://kb.adamsdesk.com/operating_system/arch_linux_arm_install_rpi_pi_hole/">Arch Linux ARM Install Pi-Hole On A Raspberry Pi</a>.
Anyway I wanted to take my setup to next level by adding <a href="https://nlnetlabs.nl/projects/unbound/about/">Unbound</a>,
a recursive DNS resolver. So I began the process but quickly noticed that I have almost no free
storage space left on the system. After quite some time I was able to clear up some log files but
nothing substantial enough. The system has a max storage capacity of 8 GB, and it seems this is
not enough for my needs. I decided that I’ll replace the Kingston 8 GB microSDHC UHS-I card with a
SanDisk 32 GB microSDHC UHS-I card. However, this leaves me with a dilemma, I didn’t want to have to
reinstall and configure Arch Linux ARM and Pi-Hole all over again. So I thought why not just image
the old microSD card and write it to the new one. After that I should just be able to resize the
partition size to utilize the entirety of the 32 GB microSD card. This may seem like a lot of work,
but it really isn’t.</p>

<p>Here are the steps I took to get the job done successfully.</p>

<div class="admonition danger rounded">
    <p class="admonition-title">Danger</p>
    <p>
        The instructions outlined below are done at your own risk. Data loss may occur if not done carefully.
    </p>
</div>

<h2 id="environment">Environment</h2>

<ul>
  <li>Linux terminal</li>
  <li>Linux graphical desktop with GParted</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>Steps prefixed with a “#” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “#” is to be entered at the CLI</li>
  <li>The partition that will be resized is the last partition on the microSD card</li>
</ul>

<h2 id="instructions">Instructions</h2>

<ol>
  <li>Powered off the Raspberry Pi.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>systemctl poweroff
</code></pre></div>    </div>
  </li>
  <li>Removed the microSD card from the Raspberry Pi.</li>
  <li>Insert the microSD card from the Raspberry Pi into computer running Linux.</li>
  <li>Find microSD card device name.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>lsblk
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
 sdf      8:80   1   7.4G  0 disk
 ├─sdf1   8:81   1   100M  0 part /run/media/adam/0E9A-D8D0
 └─sdf2   8:82   1   7.3G  0 part /run/media/adam/f2577c9a-c3da-4f5f-aa38-c6a5dbcfbae1
</span></code></pre></div>    </div>
  </li>
  <li>Umount microSD card.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>umount /run/media/adam/0E9A-D8D0
<span class="gp"> $</span><span class="w"> </span>umount /run/media/adam/f2577c9a-c3da-4f5f-aa38-c6a5dbcfbae1
</code></pre></div>    </div>
  </li>
  <li>Create image of microSD card.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span><span class="nb">dd </span><span class="k">if</span><span class="o">=</span>/dev/sdf <span class="nv">of</span><span class="o">=</span>pi-hole-alarm-8gb-sd.img
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span><span class="nb">sync</span>
</code></pre></div>    </div>
  </li>
  <li>Remove the microSD card from the computer and set aside for safe keeping.</li>
  <li>Insert the 32 GB SD card into computer.</li>
  <li>Find microSD card device name.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>lsblk
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go"> NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
 sdf      8:80   1  29.7G  0 disk
 └─sdf1   8:81   1  29.7G  0 part /run/media/adam/3938-3834
</span></code></pre></div>    </div>
  </li>
  <li>Umount the 32 GB microSD card.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>umount /run/media/adam/3938-3834
</code></pre></div>    </div>
  </li>
  <li>Write the 8 GB image to the 32 GB microSD card.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>pi-hole-alarm-8gb-sd.img <span class="nv">of</span><span class="o">=</span>/dev/sdf <span class="nv">bs</span><span class="o">=</span>4MB
</code></pre></div>    </div>
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> #</span><span class="w"> </span><span class="nb">sync</span>
</code></pre></div>    </div>
  </li>
  <li>Remove the microSD card from the computer and then insert it again.</li>
  <li>
    <p>Using GParted application, select device “/dev/sdf” in the top right.</p>

    <p><img src="/assets/img/posts/gparted-select-device.webp" alt="Select device in GParted" class="img-fluid" width="795" height="125" loading="lazy" /></p>
  </li>
  <li>
    <p>Select the partition “/dev/sdf2”.</p>

    <p><img src="/assets/img/posts/gparted-select-partition.webp" alt="Select partition in GParted" class="img-fluid" width="795" height="299" loading="lazy" /></p>
  </li>
  <li>
    <p>Click on “Resize/move the selected partition”.</p>

    <p><img src="/assets/img/posts/gparted-resize-partition.webp" alt="Click on resize partition in GParted" class="img-fluid" width="795" height="299" loading="lazy" /></p>
  </li>
  <li>
    <p>Drag the right arrow all the way to the right and click on the “Resize/Move” button.</p>

    <p><img src="/assets/img/posts/gparted-resize-partition-before.webp" alt="Resize partition (before) in GParted" class="img-fluid" width="554" height="329" loading="lazy" />
 <img src="/assets/img/posts/gparted-resize-partition-after.webp" alt="Resize partition (after) in GParted" class="img-fluid" width="554" height="329" loading="lazy" /></p>
  </li>
  <li>
    <p>Apply changes by clicking on the green check mark icon.</p>

    <p><img src="/assets/img/posts/gparted-apply-changes.webp" alt="Apply changes in GParted" class="img-fluid" width="795" height="278" loading="lazy" /></p>

    <p>You will receive a warning message similar to the effect of “Editing partitions has the
 potential to cause LOSS of DATA. You are advised to backup your data before proceeding”.
 Click on the “Apply” button.</p>
  </li>
  <li>Close summary report.</li>
  <li>Remove microSD card and begin using on the Raspberry Pi.</li>
</ol>

<p>This is post 5 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="raspberrypi" /><category term="pihole" /><category term="archlinuxarm" /><summary type="html"><![CDATA[How to upgrade an 8 GB microSD card to a 32 GB microSD card without installing and configuring the operating system again.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/raspberry-pi-micro-sd-card.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/raspberry-pi-micro-sd-card.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">One Step Closer To Content Creation</title><link href="https://www.adamsdesk.com/posts/one-step-closer-to-content-creation/" rel="alternate" type="text/html" title="One Step Closer To Content Creation" /><published>2022-01-23T00:00:00-06:00</published><updated>2023-07-30T15:29:24-06:00</updated><id>https://www.adamsdesk.com/posts/one-step-closer-to-content-creation</id><content type="html" xml:base="https://www.adamsdesk.com/posts/one-step-closer-to-content-creation/"><![CDATA[<p>As some of you may know or not know that my goal is to create a full time business out of my
passion of technology. Though I have and will face challenges along the way it is my goal that I
can show my passion in technology by helping others to grow, discover and accomplish tasks in
unknown ways one never knew may have been possible. Saying this I’m excited that I’ve taken another
step forward in my mind by purchasing a video capture card, the Blackmagic Design Intensity Pro 4K
(PCI Express). The goal with this is new hardware is to capture video (record) via my DLSR camera
and the desktop at the same time. As well, it will allow for future growth capturing video from
endless other sources such as a mobile phone, gaming console, single board computers (e.g.
Raspberry Pi), etc.</p>

<p>Some of you maybe thinking but why not purchase the “ABC” product instead. Well honestly I went with
Intensity Pro 4K because it is supported in Linux which is my primary operating system. Though it
does help to have support for Microsoft Windows and Apple macOS. Sure there are others, however most
are limited with features, not universally supported on most operating systems and for not much more
I can have far more features and growth with this. In the end this is what I felt was the best based
on the knowledge I have now and what I could find for alternatives.</p>

<p>For further details take a look at the Intensity Pro 4K <a href="https://www.blackmagicdesign.com/products/intensitypro4k/techspecs/">technical specifications</a>.</p>

<p>Now I wait for this exciting new hardware!</p>

<p>This is post 4 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="linux" /><category term="hardware" /><summary type="html"><![CDATA[Taking one step forward towards content creation with the recent purchase of a PC video capturing expansion card.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/intensity-pro-4k-video-capture-card.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/intensity-pro-4k-video-capture-card.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Movie Review: The One I Love</title><link href="https://www.adamsdesk.com/posts/movie-review-the-one-i-love/" rel="alternate" type="text/html" title="Movie Review: The One I Love" /><published>2022-01-17T00:00:00-06:00</published><updated>2023-07-31T19:06:38-06:00</updated><id>https://www.adamsdesk.com/posts/movie-review-the-one-i-love</id><content type="html" xml:base="https://www.adamsdesk.com/posts/movie-review-the-one-i-love/"><![CDATA[<p>A few days ago I finally sat down to watch the movie <a href="https://www.themoviedb.org/movie/242090-the-one-i-love">The One I Love</a>
starting Elisabeth Moss, Mark Duplass and Ted Danson on Kanopy. The synopsis of the movie is as quoted…</p>

<blockquote>
  <p>On the brink of separation, Ethan and Sophie escape to a beautiful vacation house for a
weekend getaway in an attempt to save their marriage. What begins as a romantic and fun
retreat soon becomes surreal, when an unexpected discovery forces the two to examine
themselves, their relationship, and their future. – TMDB</p>
</blockquote>

<p>Now I do admit the synopsis is not entirely intriguing but, the movie trailer
(<a href="https://www.youtube.com/watch?v=jCOvhojlZzQ">YouTube</a>, <a href="https://vid.puffyan.us/watch?v=jCOvhojlZzQ">Invidious</a>)
had me hooked to watch it. I felt the movie would provide perspective I may have not
seen before or thought of on the topic of relationships and marriage. It seems lately I’ve
been on a journey of opening my eyes to other ways of living and how to approach various
challenges in life. I seem to be very caught up in wanting to learn more about perception of
one’s life’s relationships and experiences.</p>

<p>The movie has a unique approach I’ve not seen exactly before on depicting a married couples
relationship from each partner’s perceptions, expectations and desires.
Showing each partner Ethan and Sophie as they explore their relationship and figure out
how to save their marriage. I felt the movie had some under tone reference to the movie
The Stepford Wives (1975). I won’t say specificity as that would give away both movies for
those that may not have watched them yet.</p>

<p>Some have said that the movie is annoying because the scenes are too repetitive along with the
dialogue. I however disagree as I feel this was entirely on purpose and necessary. The entire
story being told is deliberately laid out to be a paradox. That is the nature of
relationships at times and the point or perspective the director I believe was trying to
get across to the viewer. I also believe the movie was intended to provoke the viewer to
think about relationships. This is a powerful thing that can provoke positive change and
cause people to start talking. If you want to learn more about relationships, marriage and
the complexity it can bring I recommend given this movie a watch.</p>

<p>This is post 3 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="review" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[My review of thoughts and opinions on the comedy, drama and romance movie The One I love released in the year 2014.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/movie-review-curtains-crowd.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/movie-review-curtains-crowd.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Inspiration from an Elder</title><link href="https://www.adamsdesk.com/posts/inspiration-from-an-elder/" rel="alternate" type="text/html" title="Inspiration from an Elder" /><published>2022-01-15T00:00:00-06:00</published><updated>2023-10-14T17:30:56-06:00</updated><id>https://www.adamsdesk.com/posts/inspiration-from-an-elder</id><content type="html" xml:base="https://www.adamsdesk.com/posts/inspiration-from-an-elder/"><![CDATA[<p>Today I sat down to watch the latest video released from Kara and Nate entitled “My 86 year old
grandpa is starting van life :)”. It was a wonderful video as always, but that is not why I’ve
chosen to share this with you today. As Kara and Nate told the story of Nate’s grandpa about
his van and his running I was in complete awe. This is so inspirational to show the world that
at 86 years old, Nate’s Grandpa is doing 2.4 km a day or 12 kms (7.45 miles) a week. That
is amazing. Then on top of that, Nate’s Grandpa wants to start van life and go to every state
park in Tennessee, USA. This is what living life is all about. Never stopping by choosing to not
allow anything to get in your way of living life to it’s fullest.</p>

<p>I highly recommend watching the two videos to get inspiration and to see this beautiful story
unfold.</p>

<p><a href="https://youtu.be/5_TN7_-bUdQ" title="Play video via YouTube">
<img src="/assets/img/posts/kara-and-nate-grandpa-starts-van-life.webp" width="1280" height="720" alt="video thumbnail with Nate and Nate's Grandpa" class="img-fluid" loading="lazy" />
</a></p>

<p><a href="https://youtu.be/5_TN7_-bUdQ" title="Play video via YouTube">YouTube</a></p>

<p>Well over a year later since the original video was posted, Nate decides to go on a trip with his Pop (Grandpa)
in the newly restored camper van. An amazing inspiration to see an 88-year-old this active with a sense of humour and
love for life.</p>

<p><a href="https://youtu.be/5YtZz-Y2WLw" title="Play video via YouTube">
<img src="/assets/img/posts/nate-van-life-grandpa-88-year-old.webp" width="1280" height="720" alt="video thumbnail with Nate and Nate's Grandpa next to a restored camper van." class="img-fluid" loading="lazy" />
</a></p>

<p><a href="https://youtu.be/5YtZz-Y2WLw" title="Play video via YouTube">YouTube</a></p>

<p>This is post 2 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="SelfImprovement" /><summary type="html"><![CDATA[A beautiful story told by Kara and Nate Buchanan that brings inspiration from an elder (Nate's Grandpa) the world should see.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/inspiration-text.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/inspiration-text.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What I’ve Learned from #100DaysToOffload Challenge</title><link href="https://www.adamsdesk.com/posts/100daystooffload-challenge/" rel="alternate" type="text/html" title="What I’ve Learned from #100DaysToOffload Challenge" /><published>2022-01-14T00:00:00-06:00</published><updated>2023-07-31T18:57:29-06:00</updated><id>https://www.adamsdesk.com/posts/100daystooffload-challenge</id><content type="html" xml:base="https://www.adamsdesk.com/posts/100daystooffload-challenge/"><![CDATA[<p>On January 12, 2021 I stated publicly that I was joining the 100 Days To Offload challenge in a
blog post entitled “<a href="/posts/join-me-in-100DaysToOffload/">Join Me in 100DaysToOffload</a>”.
Going into this challenge I just wanted to get blog posts published and reach the 100 blog posts.
I never expected much more than that to happen.</p>

<p>A year has past since and looking back now I’ve only was able to accomplish 47 posts out of 100
posts in the challenge. In all honesty I’m disappointed in myself for not completing the
challenge. If you simply think about it making one post a week would give you approximately 52
posts a year depending on the year of course. Therefore, reaching 100 posts should simply mean
doing about two posts a week. This should be easy to accomplish.</p>

<p>Though I am disappointed with myself I also have realized that it is not as simple as the
challenge sounds. You see one has to figure out a workflow that works for your desires and
needs. This may even mean that one doesn’t even know what those desires and needs are. Then
there is the whole decision of what tools and software do I use. What should I write about?
In the end I feel I didn’t do that bad of a job. It is still an accomplishment having 47
posts in a year.</p>

<p>With all of that said I’m not going away form this without learning and realizing a few things
as a result of participating in the challenge. I feel I’m not great at writing or expressing
myself but, it has come clear to me that I enjoy writing. I like to express myself
creatively using words. Furthermore, I’ve even started noticing that I have the desire to improve my
writing skills. If I do improve my writing ability this just helps in my overall
communications skills. Another bonus in my mind is it seems the challenge creates a positive
community that encourages each other to simply write. This allows for one’s thoughts and
creativity to flow. It helps me to better understand myself because it makes me focus on
what I actually think or break down what my thoughts are to get them in an organized manner
that is understandable for others to read. The biggest takeaway I’ve noticed is there is
value in all that we do even if one may feel someone else has done it before.</p>

<p>In the end of it all I challenge myself to beat the 47 posts I accomplished by taking on
the challenge again to reach the goal of 100 posts.</p>

<p>Thanks to <a href="https://kevq.uk/">Kev Quirk</a> for creating the #100DaysToOffload challenge.</p>

<p>This is post 1 of 100, and is round 2 of the <a href="https://100daystooffload.com">100 Days To Offload</a> challenge.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="SelfImprovement" /><summary type="html"><![CDATA[Reflecting on the experience and reviewing the results of participating in the writing challenge called 100 Days To Offload.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/notepad-writing.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/notepad-writing.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How to Solve Spotify Public Key Unknown Error</title><link href="https://www.adamsdesk.com/posts/solving-spotify-public-key-unknown-error/" rel="alternate" type="text/html" title="How to Solve Spotify Public Key Unknown Error" /><published>2021-12-09T00:00:00-06:00</published><updated>2023-07-30T14:00:16-06:00</updated><id>https://www.adamsdesk.com/posts/solving-spotify-public-key-unknown-error</id><content type="html" xml:base="https://www.adamsdesk.com/posts/solving-spotify-public-key-unknown-error/"><![CDATA[<p>Running Spotify on Linux can be a challenge, but it is possible and one such challenge is figuring out how
to obtain the public key in order to install the Spotify client. Each package that is installed
on a Linux system is verified using a public key to private key verification process. In this
particular situation the public key is not found or unknown on the configured key server and therefore
fails the verification process. To resolve this, the public key must be imported into the key database
first before installing the Spotify client. Let’s begin resolving this problem.</p>

<h2 id="environment">Environment</h2>

<p>Tested using the following…</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Fish v3.6.0</li>
  <li>GNU bash v5.1.16</li>
  <li>Pikaur v1.8</li>
  <li>Spotify v1.1.84.716</li>
</ul>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>Steps prefixed with a “#” (number sign) represents the CLI prompt with elevated user permissions (e.g. root)</li>
  <li>The text after the “$” or “#” is to be entered at the CLI</li>
  <li>Understanding how to use an AUR helper (e.g. Pikaur)</li>
</ul>

<h2 id="problem">Problem</h2>

<p>Installation or update of the Spotify client fails with the following error message.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">==&gt;</span><span class="w"> </span>Verifying <span class="nb">source </span>file signatures with gpg...
<span class="go">    spotify-1.1.84.716-6-Release ... FAILED (unknown public key 7A3A762FAFD4A51F)
</span><span class="gp">==&gt;</span><span class="w"> </span>ERROR: One or more PGP signatures could not be verified!
</code></pre></div></div>

<h2 id="solution">Solution</h2>

<p>Using curl the public key will be downloaded and then imported into the key database. Once this has completed
successfully you will now be able to install or update the Spotify client.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl <span class="nt">-sS</span> https://download.spotify.com/debian/pubkey_7A3A762FAFD4A51F.gpg | gpg <span class="nt">--import</span> -
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">#</span><span class="w"> </span>pikaur <span class="nt">-Sy</span> spotify
</code></pre></div></div>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="archlinux" /><category term="commandline" /><summary type="html"><![CDATA[A full explanation of what the Spotify public key unknown error message means along with a step-by-step guide on how to resolve the error message.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/spotify-gnupg-public-key-unknown.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/spotify-gnupg-public-key-unknown.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add Public IP Address Caching To Neofetch</title><link href="https://www.adamsdesk.com/posts/neofetch-ip-address-caching/" rel="alternate" type="text/html" title="Add Public IP Address Caching To Neofetch" /><published>2021-11-27T00:00:00-06:00</published><updated>2023-11-07T23:04:54-06:00</updated><id>https://www.adamsdesk.com/posts/neofetch-ip-address-caching</id><content type="html" xml:base="https://www.adamsdesk.com/posts/neofetch-ip-address-caching/"><![CDATA[<p>In my blog post <a href="/posts/add-weather-data-with-caching-to-neofetch/">Add Weather Data With Caching To Neofetch</a>, I
talked about how I added the ability to fetch weather data and cached the weather data to save on the
unnecessary use of bandwidth and to improve Neofetch’s load time performance. Let’s next apply the
caching ability to getting your public IP address. In most cases one’s public IP address doesn’t
change daily let alone weekly. So in most cases I would say it’s safe to say we can cache the
public IP address. However, the difference in this case compared to before is Neofetch already has the
ability to fetch the public IP address it just doesn’t have the ability to cache it. With that said
I will approach this by extending or indirectly calling the built-in function
called <a href="https://github.com/dylanaraps/neofetch/blob/master/neofetch#L3902">get_public_ip()</a> in order
to add the ability of caching.</p>

<h2 id="environment">Environment</h2>

<p>Tested with the following…</p>

<ul>
  <li>Arch Linux</li>
  <li>Fish v3.6.1</li>
  <li>GNU bash v5.1.16</li>
  <li>Neofetch v7.1.0</li>
</ul>

<h2 id="fetching-public-ip-address">Fetching Public IP Address</h2>

<p>In the default configuration you would enable fetching the public IP address as follows.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>info <span class="s2">"Public IP"</span> public_ip
</code></pre></div></div>

<p>This needs to be changed to the following.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>getPublicIP
</code></pre></div></div>

<h2 id="script">Script</h2>

<p>The following script adds the ability to fetch and cache the public IP address. The public IP address
will only be fetched if the set duration interval 604800 seconds (7 days) has passed.</p>

<p>The settings can be easily be set by alternating 2 variables.</p>

<dl>
  <dt>data_path</dt>
  <dd>The output public IP data directory and filename.</dd>
  <dd>Variable value should be enclosed in double quotes.</dd>
  <dt>duration</dt>
  <dd>Interval to fetch weather data.</dd>
  <dd>Represents a measurement in seconds (integer).</dd>
  <dd>Do not enclose the variable value in quotes.</dd>
</dl>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre>getPublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="nv">data_path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.config/neofetch/data-public-ip.txt"</span>
    <span class="nv">duration</span><span class="o">=</span>604800

    <span class="k">if</span> <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">public_ip_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> <span class="s1">'%Y'</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
        <span class="nv">current_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="s2">"</span>
        <span class="nv">date_diff</span><span class="o">=</span><span class="k">$((</span><span class="nv">$current_date</span> <span class="o">-</span> <span class="nv">$public_ip_date</span><span class="k">))</span>

        <span class="k">if</span> <span class="o">[</span> <span class="nv">$date_diff</span> <span class="nt">-ge</span> <span class="nv">$duration</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span>get_public_ip
            savePublicIP
        <span class="k">else
            </span>savePublicIP
        <span class="k">fi
    else
        </span>get_public_ip
        savePublicIP
    <span class="k">fi

    </span>showPublicIP
<span class="o">}</span>
savePublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="k">${#</span><span class="nv">public_ip</span><span class="k">}</span><span class="s2">"</span> <span class="nt">-gt</span> 0 <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$public_ip</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span>
    <span class="k">else
        </span><span class="nv">public_ip</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
    <span class="k">fi</span>
<span class="o">}</span>
showPublicIP<span class="o">()</span> <span class="o">{</span>
   prin <span class="s2">"Public IP"</span> <span class="s2">"</span><span class="nv">$public_ip</span><span class="s2">"</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></figure>

<h2 id="example-output">Example Output</h2>

<p><img src="/assets/img/posts/neofetch-ip-caching-screenshot.webp" width="1262" height="789" alt="Screenshot of neofetch illustrating IP address caching." class="img-fluid rounded" loading="lazy" /></p>

<h2 id="neofetch-config-file">Neofetch Config File</h2>

<p>Here the complete setup done within the Neofetch configuration file “~/.config/neofetch/config.conf”.</p>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
</pre></td><td class="code"><pre>print_info<span class="o">()</span> <span class="o">{</span>
    info title
    info underline
    info <span class="s2">"OS"</span> distro
    info <span class="s2">"Host"</span> model
    info <span class="s2">"Kernel"</span> kernel
    info <span class="s2">"Uptime"</span> <span class="nb">uptime
    </span>info <span class="s2">"Packages"</span> packages
    info <span class="s2">"Shell"</span> shell
    info <span class="s2">"Resolution"</span> resolution
    info <span class="s2">"DE"</span> de
    info <span class="s2">"WM"</span> wm
    info <span class="s2">"WM Theme"</span> wm_theme
    info <span class="s2">"Theme"</span> theme
    info <span class="s2">"Icons"</span> icons
    info <span class="s2">"Terminal"</span> term
    info <span class="s2">"Terminal Font"</span> term_font
    info <span class="s2">"CPU"</span> cpu
    info <span class="s2">"GPU"</span> gpu
    info <span class="s2">"Memory"</span> memory
    info <span class="s2">"GPU Driver"</span> gpu_driver  <span class="c"># Linux/macOS only</span>
    info <span class="s2">"CPU Usage"</span> cpu_usage
    info <span class="s2">"Disk"</span> disk
    info <span class="s2">"Local IP"</span> local_ip
    getPublicIP
    info <span class="s2">"Locale"</span> locale  <span class="c"># This only works on glibc systems.</span>
    info cols
<span class="o">}</span>
getPublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="nv">data_path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.config/neofetch/data-public-ip.txt"</span>
    <span class="nv">duration</span><span class="o">=</span>604800

    <span class="k">if</span> <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">public_ip_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> <span class="s1">'%Y'</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
        <span class="nv">current_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="s2">"</span>
        <span class="nv">date_diff</span><span class="o">=</span><span class="k">$((</span><span class="nv">$current_date</span> <span class="o">-</span> <span class="nv">$public_ip_date</span><span class="k">))</span>

        <span class="k">if</span> <span class="o">[</span> <span class="nv">$date_diff</span> <span class="nt">-ge</span> <span class="nv">$duration</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span>get_public_ip
            savePublicIP
        <span class="k">else
            </span>savePublicIP
        <span class="k">fi
    else
        </span>get_public_ip
        savePublicIP
    <span class="k">fi

    </span>showPublicIP
<span class="o">}</span>
savePublicIP<span class="o">()</span> <span class="o">{</span>
    <span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="k">${#</span><span class="nv">public_ip</span><span class="k">}</span><span class="s2">"</span> <span class="nt">-gt</span> 0 <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$public_ip</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span>
    <span class="k">else
        </span><span class="nv">public_ip</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
    <span class="k">fi</span>
<span class="o">}</span>
showPublicIP<span class="o">()</span> <span class="o">{</span>
   prin <span class="s2">"Public IP"</span> <span class="s2">"</span><span class="nv">$public_ip</span><span class="s2">"</span>
<span class="o">}</span>

<span class="nv">title_fqdn</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">kernel_shorthand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">distro_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">os_arch</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">uptime_shorthand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">memory_percent</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">memory_unit</span><span class="o">=</span><span class="s2">"gib"</span>
<span class="nv">package_managers</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">shell_path</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">shell_version</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">speed_type</span><span class="o">=</span><span class="s2">"bios_limit"</span>
<span class="nv">speed_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">cpu_brand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">cpu_speed</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">cpu_cores</span><span class="o">=</span><span class="s2">"logical"</span>
<span class="nv">cpu_temp</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">gpu_brand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gpu_type</span><span class="o">=</span><span class="s2">"all"</span>
<span class="nv">refresh_rate</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gtk_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">gtk2</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gtk3</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">public_ip_host</span><span class="o">=</span><span class="s2">"https://ident.me"</span>
<span class="nv">public_ip_timeout</span><span class="o">=</span>2
<span class="nv">de_version</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">disk_show</span><span class="o">=(</span><span class="s1">'/'</span> <span class="s1">'/boot'</span> <span class="s1">'/home'</span> <span class="s1">'/srv'</span> <span class="s1">'/mnt/data'</span><span class="o">)</span>
<span class="nv">disk_subtitle</span><span class="o">=</span><span class="s2">"mount"</span>
<span class="nv">disk_percent</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">music_player</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">song_format</span><span class="o">=</span><span class="s2">"%artist% - %album% - %title%"</span>
<span class="nv">song_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">mpc_args</span><span class="o">=()</span>
<span class="nv">colors</span><span class="o">=(</span>distro<span class="o">)</span>
<span class="nv">bold</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">underline_enabled</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">underline_char</span><span class="o">=</span><span class="s2">"-"</span>
<span class="nv">separator</span><span class="o">=</span><span class="s2">":"</span>
<span class="nv">block_range</span><span class="o">=(</span>0 15<span class="o">)</span>
<span class="nv">color_blocks</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">block_width</span><span class="o">=</span>3
<span class="nv">block_height</span><span class="o">=</span>1
<span class="nv">col_offset</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">bar_char_elapsed</span><span class="o">=</span><span class="s2">"-"</span>
<span class="nv">bar_char_total</span><span class="o">=</span><span class="s2">"="</span>
<span class="nv">bar_border</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">bar_length</span><span class="o">=</span>15
<span class="nv">bar_color_elapsed</span><span class="o">=</span><span class="s2">"distro"</span>
<span class="nv">bar_color_total</span><span class="o">=</span><span class="s2">"distro"</span>
<span class="nv">cpu_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">memory_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">battery_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">disk_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">image_backend</span><span class="o">=</span><span class="s2">"kitty"</span>
<span class="nv">image_source</span><span class="o">=</span><span class="s2">"ascii"</span>
<span class="nv">ascii_distro</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">ascii_colors</span><span class="o">=(</span>distro<span class="o">)</span>
<span class="nv">ascii_bold</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">image_loop</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">thumbnail_dir</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">XDG_CACHE_HOME</span><span class="k">:-${</span><span class="nv">HOME</span><span class="k">}</span><span class="p">/.cache</span><span class="k">}</span><span class="s2">/thumbnails/neofetch"</span>
<span class="nv">crop_mode</span><span class="o">=</span><span class="s2">"normal"</span>
<span class="nv">crop_offset</span><span class="o">=</span><span class="s2">"center"</span>
<span class="nv">image_size</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">gap</span><span class="o">=</span>3
<span class="nv">yoffset</span><span class="o">=</span>0
<span class="nv">xoffset</span><span class="o">=</span>0
<span class="nv">background_color</span><span class="o">=</span>
<span class="nv">stdout</span><span class="o">=</span><span class="s2">"off"</span>
</pre></td></tr></tbody></table></code></figure>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip for BASH</p>
    <p>
        Call Neofetch each time a terminal/console is started by adding the command "neofetch" without double quotes to "~/.bashrc".
    </p>
</div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip for FiSH</p>
    <p>
        Call Neofetch each time a terminal/console is started by adding the command "neofetch" without double quotes to "~/.config/fish/config.fish".
    </p>
</div>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="BASH" /><category term="linux" /><summary type="html"><![CDATA[How to conserving bandwidth and improving Neofetch's load time performance by caching the public IP address for a set duration of time.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/neofetch-ip-address-caching.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/neofetch-ip-address-caching.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Taking a Curated Look at Black Friday Sales</title><link href="https://www.adamsdesk.com/posts/black-friday-sales/" rel="alternate" type="text/html" title="Taking a Curated Look at Black Friday Sales" /><published>2021-11-26T00:00:00-06:00</published><updated>2023-11-24T11:17:26-06:00</updated><id>https://www.adamsdesk.com/posts/black-friday-sales</id><content type="html" xml:base="https://www.adamsdesk.com/posts/black-friday-sales/"><![CDATA[<p>I’m not one to really get excited about the sales going on for Black Friday or Cyber Monday because the trend seems to be
for several years now that most items that are on sale are mostly cheap quality products or the sale price is not much of
a savings to bother at local stores. However, that doesn’t mean I still don’t get exited to play with some new tech gadgets
now and again. Here are a few tech related gadgets, software or courses I’ve found of interest to me to play with at some
point in time.</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        In no way do I directly or indirectly benefit from the following products/services.
    </p>
</div>

<ul>
  <li>
    <p><a href="https://nfcring.com/">NFC Ring</a></p>

    <p><strong>Sale:</strong> 77% off | <strong>Discount Code:</strong> n/a | <strong>Expires:</strong> Unknown</p>

    <p>The NFC Ring allows for sharing information such as Wi-Fi, links to websites, links to photos, contacts or even turn on
  Wi-Fi. You choose what you want the NFC Ring to do.</p>
  </li>
  <li>
    <p><a href="https://www.wasdkeyboards.com">Wasd Keyboards</a></p>

    <p><strong>Sale:</strong> 30% off | <strong>Discount Code:</strong> n/a | <strong>Expires:</strong> 2023-11-24 Midnight</p>

    <p>I’ve used many old school mechanical keyboards and I didn’t realize how much I truly enjoyed having them until I choose to
  give it away. Now with modern day mechanical keyboards this just takes it to another level. Wasd is that company that has done
  just that. Ever since I’ve used a Wasd code keyboard I’ve never been able to truly enjoy typing on a keyboard since.
  Without a doubt I will buy one someday, and it won’t be soon enough. I love the attention to detail and features these
  keyboards have, one is not requiring any software to use it.</p>
  </li>
  <li>
    <p><a href="https://bvckup2.com/buy?code=BF-2023-PRO">Bvckup</a></p>

    <p><strong>Sale:</strong> 40% off | <strong>Discount Code:</strong> BF-2023-PRO | <strong>Expires:</strong> 2023-12-01</p>

    <p>Hands down this is one of the best backup software solutions I’ve used to date on a Windows system. We all generally
  don’t enjoy backing up our data, but I tell you this software will make backup so smooth and painless you will enjoy
  handling your backups. To me this is a huge selling point. I’ve followed the author Alexander Pankratov for some
  time, and he produces quality software no questions asked. Sale applies to Pro for Workstation licenses only with
  a max of 5 licenses. Click on “Review Order” to apply the discount and see the adjusted total.</p>
  </li>
  <li>
    <p><a href="https://logosbynick.com/black-friday/">Logos By Nick Academy</a></p>

    <p><strong>Sale:</strong> 50% off | <strong>Discount Code:</strong> BF23 | <strong>Expires:</strong> 2023-11-27 Midnight</p>

    <p>The Logos By Nick Academy provides self-paced learning and downloadable (MP4 @ 1080p) for offline viewing video courses
  covering topics around <a href="https://inkscape.org/">Inkscape</a>, <a href="https://www.gimp.org/">GIMP</a>, logo design, how to get hired
  on <a href="https://www.upwork.com/">Upwork</a>/<a href="https://www.freelancer.com/">Freelancer</a>,
  <a href="https://affinity.serif.com/en-us/designer/">Affinity Designer</a> and you can also get logo design templates.</p>
  </li>
  <li>
    <p><a href="https://ouraring.com/">Ōura Ring</a></p>

    <p><strong>Sale:</strong> $125 CAD off | <strong>Discount Code:</strong> n/a | <strong>Expires:</strong> 2023-11-27</p>

    <p>This intriguing ring provides heart rate monitor, 7 temperature sensors, guided sessions, sleep analysis and an auto adaptive
  detection of type of task being done at any giving time. On top of this the level of accuracy is unreal, providing 99.6%
  heart rate accuracy and 98% heart rate variability accuracy. Hopefully I’ll be able to get my finger on it (smile) some day, so I
  can provide a review for everyone.</p>
  </li>
  <li>
    <p><a href="https://www.santic.com/collections/black-friday-sale">Santic</a></p>

    <p><strong>Sale:</strong> Up to 60% off | <strong>Discount Code:</strong> n/a | <strong>Expires:</strong> Unknown</p>

    <p>Santic has been an up and coming brand for many years now in the market for cyclists. In my own experience this brand allows for
  more affordable options without cutting corners in the quality and comfort while you ride. Take a look at the great deals before
  the sale ends.</p>
  </li>
</ul>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><summary type="html"><![CDATA[A small hand-selected list of technology based websites and services that are participating in the Black Friday sale.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/barcode-box-black-friday-sale.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/barcode-box-black-friday-sale.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">My Curated Selection of 4K Desktop Wallpapers</title><link href="https://www.adamsdesk.com/posts/my-curated-selection-of-4k-desktop-wallpaper/" rel="alternate" type="text/html" title="My Curated Selection of 4K Desktop Wallpapers" /><published>2021-11-25T00:00:00-06:00</published><updated>2022-12-19T20:48:00-06:00</updated><id>https://www.adamsdesk.com/posts/my-curated-selection-of-4k-desktop-wallpaper</id><content type="html" xml:base="https://www.adamsdesk.com/posts/my-curated-selection-of-4k-desktop-wallpaper/"><![CDATA[<p>I can’t believe it has been almost a year since I last posted about my curated selection of 4K wallpapers. My
original intention was to post roughly every quarter. Looks like I didn’t quite achieve that, short by 2 posts
for 2021. I’ve gone with a new way to list the wallpapers so hopefully this was worth the wait.</p>

<p>I can’t thank the creators enough of these wallpapers but at least I can give credit where it’s due. Unfortunately
I’ve not been able to figure out who all the creators are. If by chance you know of the ones I’m missing please
<a href="/contact/">contact me</a>.</p>

<p>Without further ado, I hope you enjoy these as much as I do.</p>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/mxjspf/80s_vibe_4320x2430/" title="View source">
        <img src="/assets/img/posts/wallpaper-80s-vibe-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/mxjspf/80s_vibe_4320x2430/" title="View source">
            80's Vibe by Mr. Melville
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/nbroto/sunset/" title="View source">
        <img src="/assets/img/posts/wallpaper-sunset-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/nbroto/sunset/" title="View source">
            Sunset
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpaper/comments/oeh2fj/purple_night_3840x2160/" title="View source">
        <img src="/assets/img/posts/wallpaper-crazy-mountain-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpaper/comments/oeh2fj/purple_night_3840x2160/" title="View source">
            Crazy Mountain by Cde
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpaper/comments/oe6lki/nothin_to_see_here_3840x2160/" title="View source">
        <img src="/assets/img/posts/wallpaper-nothin-to-see-here-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpaper/comments/oe6lki/nothin_to_see_here_3840x2160/" title="View source">
            Nothin' to see here... by Aleksandar Pasaric
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/WidescreenWallpaper/comments/o8p598/aurora_%F0%92%8C%8B_5120_2143/" title="View source">
        <img src="/assets/img/posts/wallpaper-aurora-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/WidescreenWallpaper/comments/o8p598/aurora_%F0%92%8C%8B_5120_2143/" title="View source">
            Aurora
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/76rjv3" title="View source">
        <img src="/assets/img/posts/wallpaper-landscape-sunset-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/76rjv3" title="View source">
            Landscape Sunset
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://wallhaven.cc/w/lmle8q" title="View source">
        <img src="/assets/img/posts/wallpaper-archlinux-art-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://wallhaven.cc/w/lmle8q" title="View source">
            Arch Linux Art
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/iWallpaper/comments/p2vsmt/5760x3240/" title="View source">
        <img src="/assets/img/posts/wallpaper-neon-leaves-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/iWallpaper/comments/p2vsmt/5760x3240/" title="View source">
            Neon Leaves
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/os1ope/brooklyn_bridge_purple_tint_photo_by_speedskater/" title="View source">
        <img src="/assets/img/posts/wallpaper-brooklyn-bridge-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/os1ope/brooklyn_bridge_purple_tint_photo_by_speedskater/" title="View source">
            Brooklyn Bridge, Purple Tint by Speedskater
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/papmcy/warp_core_5120x2880_animated_version_in_comments/" title="View source">
        <img src="/assets/img/posts/wallpaper-warp-core-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/papmcy/warp_core_5120x2880_animated_version_in_comments/" title="View source">
            Warp Core by Big Visual Chill
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/pb45gb/3840_x_2160_a_beautiful_mountain_range/" title="View source">
        <img src="/assets/img/posts/wallpaper-colorful-mountains-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/pb45gb/3840_x_2160_a_beautiful_mountain_range/" title="View source">
            Colorful Mountains by rmRadev
        </a>
    </figcaption>
</figure>

<figure class="text-center">
    <a href="https://www.reddit.com/r/wallpapers/comments/pd6xkn/sunset_beyond_liyue_3840_x_2160/" title="View source">
        <img src="/assets/img/posts/wallpaper-sunset-beyond-liyue-tn.webp" width="640" height="360" class="figure-img img-fluid rounded" alt="View source" loading="lazy" />
    </a>
    <figcaption class="figure-caption">
        <a href="https://www.reddit.com/r/wallpapers/comments/pd6xkn/sunset_beyond_liyue_3840_x_2160/" title="View source">
            Sunset Beyond Liyue by Fredrik Persson
        </a>
    </figcaption>
</figure>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="wallpaper" /><category term="100DaysToOffload" /><category term="artwork" /><summary type="html"><![CDATA[Find joy in the exploration and utilization of these beautiful pieces of art we call desktop wallpapers.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/abstract-purple-bubbles.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/abstract-purple-bubbles.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Add Weather Data With Caching To Neofetch</title><link href="https://www.adamsdesk.com/posts/neofetch-weather-data-caching/" rel="alternate" type="text/html" title="Add Weather Data With Caching To Neofetch" /><published>2021-11-24T00:00:00-06:00</published><updated>2023-11-07T23:04:54-06:00</updated><id>https://www.adamsdesk.com/posts/neofetch-weather-data-caching</id><content type="html" xml:base="https://www.adamsdesk.com/posts/neofetch-weather-data-caching/"><![CDATA[<p>The popular and powerful command-line system information BASH script “<a href="https://github.com/chubin/wttr.in">Neofetch</a>”
seems to be everywhere yet for some reason I’ve never used it nor any other variants available today. So I
decided one day to play with Neofetch to see what I could do with it. For the most part I’ve kept with what
is built in, but I wanted to display weather data by limiting the impact of Neofetch’s load time and not wasting
unnecessary bandwidth. You see most weather data providers that I know of only update the forecast weather data
every hour. Therefore, I figured I could cache the weather data to avoid fetching weather data every time Neofetch
is run.</p>

<h2 id="environment">Environment</h2>

<p>Tested with the following…</p>

<ul>
  <li>Arch Linux</li>
  <li>curl v8.4.0</li>
  <li>Fish v3.6.1</li>
  <li>GNU bash v5.1.16</li>
  <li>Neofetch v7.1.0</li>
</ul>

<h2 id="fetching-weather-data">Fetching Weather Data</h2>

<p>I first began playing around with obtaining the weather data with <a href="https://en.wikipedia.org/wiki/CURL">cURL</a>
using the service <a href="https://github.com/chubin/wttr.in">wttr.in</a> and shortly figured out how to do a simple
one-line output as I desired.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>curl <span class="nt">-s</span> <span class="s2">"https://wttr.in/Example?format=%l:+%t+(%f)+%c+%C+%w+%h+%T"</span>
<span class="go">Example: +22°C (+25°C) ☁️ Smoke →7km/h 88% 02:19:37+0500
</span></code></pre></div></div>
<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>%l    Location name
%t    Temperature (actual)
%f    Temperature (feels like)
%c    Weather condition
%C    Weather condition textual name
%w    Wind
%h    Humidity
%T    Current time
</code></pre></div></div>

<h2 id="script">Script</h2>

<p>With fetching weather data figured out, I then moved on to learning how I would implement this into
Neofetch’s configuration file. The configuration file by default is located at “~/.config/neofetch/config.conf”.
Looking at the configuration file I soon noticed that this file is written in BASH and is imported into
Neofetch’s BASH script using the built-in command “.” (source). So after some testing I quickly came up with the
below BASH script code.</p>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre>getWeather<span class="o">()</span> <span class="o">{</span>
    <span class="nv">weather_params</span><span class="o">=</span><span class="s2">"Example?format=%l:+%t+(%f)+%c+%C+%w+%h+%T"</span>
    <span class="nv">data_path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.config/neofetch/data-weather.txt"</span>
    <span class="nv">duration</span><span class="o">=</span>3600

    <span class="k">if</span> <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">weather_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> <span class="s1">'%Y'</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
        <span class="nv">current_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="s2">"</span>
        <span class="nv">date_diff</span><span class="o">=</span><span class="k">$((</span><span class="nv">$current_date</span> <span class="o">-</span> <span class="nv">$weather_date</span><span class="k">))</span>

        <span class="k">if</span> <span class="o">[</span> <span class="nv">$date_diff</span> <span class="nt">-ge</span> <span class="nv">$duration</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span>getWeatherData
            setWeatherData
        <span class="k">else
            </span>setWeatherData
        <span class="k">fi
    else
        </span>getWeatherData
        setWeatherData
    <span class="k">fi

    </span>showWeatherData
<span class="o">}</span>
getWeatherData<span class="o">()</span> <span class="o">{</span>
    curl <span class="nt">-s</span> <span class="s2">"https://wttr.in/</span><span class="nv">$weather_params</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span>
<span class="o">}</span>
setWeatherData<span class="o">()</span> <span class="o">{</span>
    <span class="nv">weather_data</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
<span class="o">}</span>
showWeatherData<span class="o">()</span> <span class="o">{</span>
    prin <span class="s2">"Weather"</span> <span class="s2">"</span><span class="nv">$weather_data</span><span class="s2">"</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></figure>

<p>The settings are easily controlled by alternating 3 variables.</p>

<dl>
  <dt>weather_params</dt>
  <dd>wttr.in parameters.</dd>
  <dd>Variable value should be enclosed in double quotes.</dd>
  <dt>data_path</dt>
  <dd>The output weather data directory and filename.</dd>
  <dd>Variable value should be enclosed in double quotes.</dd>
  <dt>duration</dt>
  <dd>Interval to fetch weather data.</dd>
  <dd>Represents a measurement in seconds (integer).</dd>
  <dd>Do not enclose the variable value in quotes.</dd>
</dl>

<h2 id="example-output">Example Output</h2>

<p><img src="/assets/img/posts/cache-weather-data-neofetch-example.webp" width="1262" height="789" alt="A screenshot of Neofetch illustrating weather data." class="img-fluid rounded" /></p>

<h2 id="neofetch-config-file">Neofetch Config File</h2>

<p>Here the complete setup done within the Neofetch configuration file “~/.config/neofetch/config.conf”.</p>

<figure class="highlight"><code class="language-bash" data-lang="bash"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
</pre></td><td class="code"><pre>print_info<span class="o">()</span> <span class="o">{</span>
    info title
    info underline
    info <span class="s2">"OS"</span> distro
    info <span class="s2">"Host"</span> model
    info <span class="s2">"Kernel"</span> kernel
    info <span class="s2">"Uptime"</span> <span class="nb">uptime
    </span>info <span class="s2">"Packages"</span> packages
    info <span class="s2">"Shell"</span> shell
    info <span class="s2">"Resolution"</span> resolution
    info <span class="s2">"DE"</span> de
    info <span class="s2">"WM"</span> wm
    info <span class="s2">"WM Theme"</span> wm_theme
    info <span class="s2">"Theme"</span> theme
    info <span class="s2">"Icons"</span> icons
    info <span class="s2">"Terminal"</span> term
    info <span class="s2">"Terminal Font"</span> term_font
    info <span class="s2">"CPU"</span> cpu
    info <span class="s2">"GPU"</span> gpu
    info <span class="s2">"Memory"</span> memory
    info <span class="s2">"GPU Driver"</span> gpu_driver  <span class="c"># Linux/macOS only</span>
    info <span class="s2">"CPU Usage"</span> cpu_usage
    info <span class="s2">"Disk"</span> disk
    info <span class="s2">"Local IP"</span> local_ip
    info <span class="s2">"Public IP"</span> public_ip
    info <span class="s2">"Locale"</span> locale  <span class="c"># This only works on glibc systems.</span>
    getWeather
    info cols
<span class="o">}</span>
getWeather<span class="o">()</span> <span class="o">{</span>
    <span class="nv">weather_params</span><span class="o">=</span><span class="s2">"Example?format=%l:+%t+(%f)+%c+%C+%w+%h+%T"</span>
    <span class="nv">data_path</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.config/neofetch/data-weather.txt"</span>
    <span class="nv">duration</span><span class="o">=</span>3600

    <span class="k">if</span> <span class="o">[[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
        </span><span class="nv">weather_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-c</span> <span class="s1">'%Y'</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
        <span class="nv">current_date</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">date</span> +%s<span class="si">)</span><span class="s2">"</span>
        <span class="nv">date_diff</span><span class="o">=</span><span class="k">$((</span><span class="nv">$current_date</span> <span class="o">-</span> <span class="nv">$weather_date</span><span class="k">))</span>

        <span class="k">if</span> <span class="o">[</span> <span class="nv">$date_diff</span> <span class="nt">-ge</span> <span class="nv">$duration</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
            </span>getWeatherData
            setWeatherData
        <span class="k">else
            </span>setWeatherData
        <span class="k">fi
    else
        </span>getWeatherData
        setWeatherData
    <span class="k">fi

    </span>showWeatherData
<span class="o">}</span>
getWeatherData<span class="o">()</span> <span class="o">{</span>
    curl <span class="nt">-s</span> <span class="s2">"https://wttr.in/</span><span class="nv">$weather_params</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$data_path</span><span class="s2">"</span>
<span class="o">}</span>
setWeatherData<span class="o">()</span> <span class="o">{</span>
    <span class="nv">weather_data</span><span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">cat</span> <span class="nv">$data_path</span><span class="si">)</span><span class="s2">"</span>
<span class="o">}</span>
showWeatherData<span class="o">()</span> <span class="o">{</span>
    prin <span class="s2">"Weather"</span> <span class="s2">"</span><span class="nv">$weather_data</span><span class="s2">"</span>
<span class="o">}</span>

<span class="nv">title_fqdn</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">kernel_shorthand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">distro_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">os_arch</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">uptime_shorthand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">memory_percent</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">memory_unit</span><span class="o">=</span><span class="s2">"gib"</span>
<span class="nv">package_managers</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">shell_path</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">shell_version</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">speed_type</span><span class="o">=</span><span class="s2">"bios_limit"</span>
<span class="nv">speed_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">cpu_brand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">cpu_speed</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">cpu_cores</span><span class="o">=</span><span class="s2">"logical"</span>
<span class="nv">cpu_temp</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">gpu_brand</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gpu_type</span><span class="o">=</span><span class="s2">"all"</span>
<span class="nv">refresh_rate</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gtk_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">gtk2</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">gtk3</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">public_ip_host</span><span class="o">=</span><span class="s2">"https://ident.me"</span>
<span class="nv">public_ip_timeout</span><span class="o">=</span>2
<span class="nv">de_version</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">disk_show</span><span class="o">=(</span><span class="s1">'/'</span> <span class="s1">'/boot'</span> <span class="s1">'/home'</span> <span class="s1">'/srv'</span> <span class="s1">'/mnt/data'</span><span class="o">)</span>
<span class="nv">disk_subtitle</span><span class="o">=</span><span class="s2">"mount"</span>
<span class="nv">disk_percent</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">music_player</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">song_format</span><span class="o">=</span><span class="s2">"%artist% - %album% - %title%"</span>
<span class="nv">song_shorthand</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">mpc_args</span><span class="o">=()</span>
<span class="nv">colors</span><span class="o">=(</span>distro<span class="o">)</span>
<span class="nv">bold</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">underline_enabled</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">underline_char</span><span class="o">=</span><span class="s2">"-"</span>
<span class="nv">separator</span><span class="o">=</span><span class="s2">":"</span>
<span class="nv">block_range</span><span class="o">=(</span>0 15<span class="o">)</span>
<span class="nv">color_blocks</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">block_width</span><span class="o">=</span>3
<span class="nv">block_height</span><span class="o">=</span>1
<span class="nv">col_offset</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">bar_char_elapsed</span><span class="o">=</span><span class="s2">"-"</span>
<span class="nv">bar_char_total</span><span class="o">=</span><span class="s2">"="</span>
<span class="nv">bar_border</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">bar_length</span><span class="o">=</span>15
<span class="nv">bar_color_elapsed</span><span class="o">=</span><span class="s2">"distro"</span>
<span class="nv">bar_color_total</span><span class="o">=</span><span class="s2">"distro"</span>
<span class="nv">cpu_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">memory_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">battery_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">disk_display</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">image_backend</span><span class="o">=</span><span class="s2">"kitty"</span>
<span class="nv">image_source</span><span class="o">=</span><span class="s2">"ascii"</span>
<span class="nv">ascii_distro</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">ascii_colors</span><span class="o">=(</span>distro<span class="o">)</span>
<span class="nv">ascii_bold</span><span class="o">=</span><span class="s2">"on"</span>
<span class="nv">image_loop</span><span class="o">=</span><span class="s2">"off"</span>
<span class="nv">thumbnail_dir</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">XDG_CACHE_HOME</span><span class="k">:-${</span><span class="nv">HOME</span><span class="k">}</span><span class="p">/.cache</span><span class="k">}</span><span class="s2">/thumbnails/neofetch"</span>
<span class="nv">crop_mode</span><span class="o">=</span><span class="s2">"normal"</span>
<span class="nv">crop_offset</span><span class="o">=</span><span class="s2">"center"</span>
<span class="nv">image_size</span><span class="o">=</span><span class="s2">"auto"</span>
<span class="nv">gap</span><span class="o">=</span>3
<span class="nv">yoffset</span><span class="o">=</span>0
<span class="nv">xoffset</span><span class="o">=</span>0
<span class="nv">background_color</span><span class="o">=</span>
<span class="nv">stdout</span><span class="o">=</span><span class="s2">"off"</span>
</pre></td></tr></tbody></table></code></figure>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip for BASH</p>
    <p>
        Call Neofetch each time a terminal/console is started by adding the command "neofetch" without double quotes to "~/.bashrc".
    </p>
</div>

<div class="admonition tip rounded">
    <p class="admonition-title">Tip for FiSH</p>
    <p>
        Call Neofetch each time a terminal/console is started by adding the command "neofetch" without double quotes to "~/.config/fish/config.fish".
    </p>
</div>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="commandline" /><category term="BASH" /><summary type="html"><![CDATA[How to add weather data to Neofetch that is sourced from Wttr.in while conserving bandwidth and keeping Neofetch running as fast as possible.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/neofetch-weather-data-caching.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/neofetch-weather-data-caching.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How To Read The TOTP Secret Key from a QR Code Image</title><link href="https://www.adamsdesk.com/posts/read-totp-secret-key-qr-code-image/" rel="alternate" type="text/html" title="How To Read The TOTP Secret Key from a QR Code Image" /><published>2021-11-23T00:00:00-06:00</published><updated>2023-09-01T13:45:18-06:00</updated><id>https://www.adamsdesk.com/posts/read-totp-secret-key-qr-code-image</id><content type="html" xml:base="https://www.adamsdesk.com/posts/read-totp-secret-key-qr-code-image/"><![CDATA[<p>Many services today implement two-factor authentication (2FA) or multi-factor authentication (MFA) to
aid in better account security. The unfortunate part is for the end user trying to setup 2FA or MFA
on a specific service can be frustrating due how it was implemented. In particular I’ve come across
various services that try to make it easier to enable 2FA/MFA through the use of a quick response
(QR) code but don’t provide a means to display the time-based one-time password (TOTP) secret key.
The only way to get the TOTP secret key is by scanning the QR code itself which is not always
possible.</p>

<p>In the instructions below I will demonstration how obtain the TOTP secret key from a QR code
image with the use of a web browser and the Linux terminal.</p>

<h2 id="environment">Environment</h2>

<p>The following was used to test these instructions.</p>

<ul>
  <li>Arch Linux x86_64</li>
  <li>Pacman v6.0.1</li>
  <li>Mozilla Firefox v94.0.1</li>
  <li>ZBar v0.23.1</li>
</ul>

<h3 id="prerequisite">Prerequisite</h3>

<p>Before we can begin Zbar suite must be installed.</p>

<h4 id="arch-linux">Arch Linux</h4>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sudo </span>pacman <span class="nt">-Sy</span> zbar
</code></pre></div></div>

<h4 id="debian">Debian</h4>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">sudo </span>apt-get <span class="nb">install </span>zbar-tools
</code></pre></div></div>

<h2 id="instructions">Instructions</h2>

<div class="admonition warning rounded">
    <p class="admonition-title">Warning</p>
    <p>
        Never share a time-based one-time password (TOTP) secret key with anyone. The TOTP shown below is for demonstration purposely only.
    </p>
</div>

<ol>
  <li>Login to the desired service via the the web browser.</li>
  <li>Start the process to enable 2FA/MFA.</li>
  <li>Right click over top of the QR code image and click on “Save Image As…”.</li>
  <li>Save the QR code image as “qrcode.png” and click the “Save” button.</li>
  <li>Open the terminal.</li>
  <li>Read QR code using “zbarimg”.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>zbarimg ~/Downloads/qrcode.png
<span class="go">QR-Code:otpauth://totp/Etsy%3Amwypeh0x?image=https%3A%2F%2Fwww.etsy.com%2Fimages%2Ffavicon.ico&amp;issuer=Etsy&amp;secret=23456789ABCDEFGHJKLMNPQRSTUVWXYZ
scanned 1 barcode symbols from 1 images in 0.01 seconds

. EAN/UPC (EAN-13, EAN-8, EAN-2, EAN-5, UPC-A, UPC-E, ISBN-10, ISBN-13)
. DataBar, DataBar Expanded
. Code 128
. Code 93
. Code 39
. Codabar
. Interleaved 2 of 5
. QR code
. SQ code
        - is the barcode large enough in the image?
        - is the barcode mostly in focus?
        - is there sufficient contrast/illumination?
        - If the symbol is split in several barcodes, are they combined in one image?
        - Did you enable the barcode type?
some EAN/UPC codes are disabled by default. To enable all, use:
</span><span class="gp">$</span><span class="w"> </span>zbarimg <span class="nt">-S</span><span class="k">*</span>.enable &lt;files&gt;
<span class="go">Please also notice that some variants take precedence over others.
Due to that, if you want, for example, ISBN-10, you should do:
</span><span class="gp">$</span><span class="w"> </span>zbarimg <span class="nt">-Sisbn10</span>.enable &lt;files&gt;
</code></pre></div>    </div>
  </li>
  <li>From the “zbarimg” output above copy the TOTP secret key that is located after “secret=”.
In the example output you would copy the following value.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">23456789ABCDEFGHJKLMNPQRSTUVWXYZ
</span></code></pre></div>    </div>
  </li>
  <li>Paste the value into a desired password manager/authenticator application (e.g. KeePassXC).</li>
  <li>Delete “qrcode.png” to ensure no one can retrieve your TOTP secret key.
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ rm ~/Downloads/qrcode.png
</code></pre></div>    </div>
  </li>
</ol>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><summary type="html"><![CDATA[Demonstrating the process of reading the time-based one-time password secret key from a quick response code image.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/qr-code-mini-figures.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/qr-code-mini-figures.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">SQLite Quick Reference Commands</title><link href="https://www.adamsdesk.com/posts/sqlite-quick-reference-commands/" rel="alternate" type="text/html" title="SQLite Quick Reference Commands" /><published>2021-11-22T00:00:00-06:00</published><updated>2023-07-30T14:05:21-06:00</updated><id>https://www.adamsdesk.com/posts/sqlite-quick-reference-commands</id><content type="html" xml:base="https://www.adamsdesk.com/posts/sqlite-quick-reference-commands/"><![CDATA[<p>There are many relational database management systems (RDBMS) today but of late I’ve noticed I’ve had to use SQLite
and found that I couldn’t quickly lookup commands as I would like. So I created a SQLite quick reference commands
on my knowledge base called “<a href="https://kb.adamsdesk.com/application/sqlite_quick_reference/">SQLite Quick Reference Commands</a>”.
The article is missing a few commands, but the majority is listed.</p>

<p>If you happen to have suggestions or corrections feel free to <a href="/contact/">contact me</a>.</p>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="adamsdesk" /><category term="100DaysToOffload" /><category term="knowledgebase" /><category term="database" /><summary type="html"><![CDATA[See the difference yourself by using an easy to read SQLite Quick Reference Commands organized by task with command examples.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/encyclopedia-books.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/encyclopedia-books.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Set HiDPI In Element and SchildiChat On Linux</title><link href="https://www.adamsdesk.com/posts/setting-hidpi-scaling-factor-in-element-and-schildichat/" rel="alternate" type="text/html" title="Set HiDPI In Element and SchildiChat On Linux" /><published>2021-10-20T00:00:00-06:00</published><updated>2023-01-04T23:37:37-06:00</updated><id>https://www.adamsdesk.com/posts/setting-hidpi-scaling-factor-in-element-and-schildichat</id><content type="html" xml:base="https://www.adamsdesk.com/posts/setting-hidpi-scaling-factor-in-element-and-schildichat/"><![CDATA[<p>Using a high dots per inch (HiDPI) display monitor can be challenging when using Element or SchildiChat. However this can
be fixed by setting the desired scaling factor. The scaling factor is represented by a percentage in decial form. So a value
of 1.5 represents 150%. Setting this value in either Element or SchildiChat is done by adding the parameter <code class="language-plaintext highlighter-rouge">--force-device-scale-factor</code>
when lauching ethier application.</p>

<p>The following instructions show how to copy the system desktop entry file to the user’s home directory and then add the parameter
with the desired scaling factor value via the command line (termainl/console).</p>

<h2 id="assumptions">Assumptions</h2>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
  <li>A directory paths that include a “~” (tilde) expands automatically to the current user home directory (.e.g. /home/adamsdesk)</li>
</ul>

<h2 id="element">Element</h2>

<ol>
  <li>Copy the desktop entry file to the user’s home directory.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">cp</span> /usr/share/applications/io.element.Element.desktop ~/.local/share/applications/
</code></pre></div>    </div>
  </li>
  <li>Edit the copied desktop entry file.
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> $ nano .local/share/applications/io.element.Element.desktop
</code></pre></div>    </div>
    <div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code> [<span class="n">Desktop</span> <span class="n">Entry</span>]
 <span class="n">Name</span>=<span class="n">Element</span>
 <span class="n">Comment</span>=<span class="n">Feature</span>-<span class="n">rich</span> <span class="n">client</span> <span class="n">for</span> <span class="n">Matrix</span>
 <span class="n">Exec</span>=/<span class="n">usr</span>/<span class="n">bin</span>/<span class="n">element</span>-<span class="n">desktop</span> --<span class="n">force</span>-<span class="n">device</span>-<span class="n">scale</span>-<span class="n">factor</span>=<span class="m">1</span>.<span class="m">5</span> %<span class="n">u</span>
 <span class="n">Terminal</span>=<span class="n">false</span>
 <span class="n">Type</span>=<span class="n">Application</span>
 <span class="n">Icon</span>=<span class="n">io</span>.<span class="n">element</span>.<span class="n">Element</span>
 <span class="n">StartupWMClass</span>=<span class="n">Element</span>
 <span class="n">Categories</span>=<span class="n">Network</span>;<span class="n">InstantMessaging</span>;<span class="n">Chat</span>;<span class="n">IRCClient</span>
 <span class="n">MimeType</span>=<span class="n">x</span>-<span class="n">scheme</span>-<span class="n">handler</span>/<span class="n">element</span>;
</code></pre></div>    </div>
  </li>
  <li>Update database.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>update-desktop-database ~/.local/share/applications
</code></pre></div>    </div>
  </li>
</ol>

<h2 id="schildichat">SchildiChat</h2>

<ol>
  <li>Copy the desktop entry file to the user’s home directory.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span><span class="nb">cp</span> /usr/share/applications/schildichat-desktop.desktop ~/.local/share/applications/
</code></pre></div>    </div>
  </li>
  <li>Edit the copied desktop entry file.
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> $ nano .local/share/applications/schildichat-desktop.desktop
</code></pre></div>    </div>
    <div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code> [<span class="n">Desktop</span> <span class="n">Entry</span>]
 <span class="n">Name</span>=<span class="n">SchildiChat</span>
 <span class="n">Exec</span>=/<span class="n">opt</span>/<span class="n">SchildiChat</span>/<span class="n">schildichat</span>-<span class="n">desktop</span> --<span class="n">force</span>-<span class="n">device</span>-<span class="n">scale</span>-<span class="n">factor</span>=<span class="m">1</span>.<span class="m">5</span> %<span class="n">U</span>
 <span class="n">Terminal</span>=<span class="n">false</span>
 <span class="n">Type</span>=<span class="n">Application</span>
 <span class="n">Icon</span>=<span class="n">schildichat</span>-<span class="n">desktop</span>
 <span class="n">StartupWMClass</span>=<span class="n">schildichat</span>
 <span class="n">Comment</span>=<span class="n">A</span> <span class="n">Matrix</span> <span class="n">Client</span> <span class="n">based</span> <span class="n">on</span> <span class="n">Element</span> <span class="n">with</span> <span class="n">a</span> <span class="n">more</span> <span class="n">traditional</span> <span class="n">instant</span> <span class="n">messaging</span> <span class="n">experience</span>
 <span class="n">MimeType</span>=<span class="n">x</span>-<span class="n">scheme</span>-<span class="n">handler</span>/<span class="n">element</span>;
 <span class="n">Categories</span>=<span class="n">Network</span>;<span class="n">InstantMessaging</span>;<span class="n">Chat</span>;<span class="n">VideoConference</span>;
</code></pre></div>    </div>
  </li>
  <li>Update database.
    <div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp"> $</span><span class="w"> </span>update-desktop-database ~/.local/share/applications
</code></pre></div>    </div>
  </li>
</ol>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><summary type="html"><![CDATA[How to adjust Element or SchildiChat scaling factor for high dots per inch (HiDPI) displays running on Linux.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/matrix-element-schildichat-logos.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/matrix-element-schildichat-logos.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Learn to Read EDID / DisplayID Metadata Using Linux</title><link href="https://www.adamsdesk.com/posts/learn-to-read-edid-displayid-metadata-using-linux/" rel="alternate" type="text/html" title="Learn to Read EDID / DisplayID Metadata Using Linux" /><published>2021-10-19T00:00:00-06:00</published><updated>2023-01-04T22:38:39-06:00</updated><id>https://www.adamsdesk.com/posts/learn-to-read-edid-displayid-metadata-using-linux</id><content type="html" xml:base="https://www.adamsdesk.com/posts/learn-to-read-edid-displayid-metadata-using-linux/"><![CDATA[<p>Today I’m continuing my adventure in retrieving EDID / DisplayID metadata from display devices using my computer system
on Arch Linux. To get the full context on the subject matter please read my previous post
<a href="/posts/learn-to-read-edid-displayid-metadata-on-a-raspberry-pi/">Learn To Read EDID / DisplayID Metadata On A Raspberry Pi</a>.</p>

<h2 id="retrieving-edid--displayid-metadata">Retrieving EDID / DisplayID Metadata</h2>

<p>Let’s begin my attempt at reading EDID / DisplayID metadata.</p>

<div class="admonition note rounded">
    <p class="admonition-title">Note</p>
    <p>
        As far as I understand, these methods work with EDID, E-EDID or DisplayID VESA standards.
    </p>
</div>

<h3 id="environment">Environment</h3>

<ul>
  <li>Asus 28” TUF Gaming Monitor (VG289Q) x2 (display devices)</li>
  <li>ZOTAC GeForce GTX 970 4GB (video source)</li>
</ul>

<h3 id="assumptions">Assumptions</h3>

<ul>
  <li>Steps prefixed with a “$” (dollar sign) represents the CLI (command-line interface) prompt</li>
  <li>The text after the “$” is to be entered at the CLI</li>
</ul>

<h3 id="arch-linux">Arch Linux</h3>

<p>I first tried using the package “community/read-edid”, unfortunately this did not return EDID / DisplayID metadata.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>get-edid | parse-edid
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">This is read-edid version 3.0.2. Prepare for some fun.
Attempting to use i2c interface
Looks like no busses have an EDID. Sorry!
Attempting to use the classical VBE interface

    Performing real mode VBE call
    Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
    Function supported
    C all successful

    VBE version 300
    VBE string at 0x11100 "NVIDIA"

VBE/DDC service about to be called
    Report DDC capabilities

    Performing real mode VBE call
    Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
    Function supported
    Call successful

    Monitor and video card combination does not support DDC1 transfers
    Monitor and video card combination does not support DDC2 transfers
    0 seconds per 128 byte EDID block transfer
    Screen is not blanked during DDC transfer

Reading next EDID block

VBE/DDC service about to be called
    Read EDID

    Performing real mode VBE call
    Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
    Function supported
    Call failed

The EDID data should not be trusted as the VBE call failed
Error: output block unchanged
I'm sorry nothing was successful. Maybe try some other arguments
</span><span class="gp">if you played with them, or send an email to Matthew Kern &lt;pyrophobicman@gmail.com&gt;</span><span class="nb">.</span>
<span class="go">Partial Read... Try again
</span></code></pre></div></div>

<p>I then attempted to try using “aur/edid-decode” package and I was successfully able to retrieve EDID / DisplayID metadata.
The only problem I noticed is that only one display device metadata is being returned.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>xrandr <span class="nt">--prop</span> | edid-decode
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">edid-decode (hex): &lt;INTENTIONALLY ALTERED&gt;</span><span class="w">
</span><span class="go">
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

----------------

Block 0, Base EDID:
  EDID Structure Version &amp; Revision: 1.3
  Vendor &amp; Product Identification:
    Manufacturer: AUS
    Model: 10426
</span><span class="gp">    Serial Number: &lt;INTENTIONALLY REMOVED&gt;</span><span class="w">
</span><span class="go">    Made in: week 48 of 2019
  Basic Display Parameters &amp; Features:
    Digital display
    Maximum image size: 62 cm x 34 cm
    Gamma: 2.20
    DPMS levels: Off
    RGB color display
    First detailed timing is the preferred timing
  Color Characteristics:
    Red  : 0.6777, 0.3115
    Green: 0.2666, 0.6171
    Blue : 0.1464, 0.0605
    White: 0.3134, 0.3291
  Established Timings I &amp; II:
    DMT 0x04:   640x480    59.940 Hz   4:3    31.469 kHz   25.175 MHz
    DMT 0x08:   800x600    56.250 Hz   4:3    35.156 kHz   36.000 MHz
    DMT 0x09:   800x600    60.317 Hz   4:3    37.879 kHz   40.000 MHz
    DMT 0x10:  1024x768    60.004 Hz   4:3    48.363 kHz   65.000 MHz
  Standard Timings:
    DMT 0x20:  1280x960    60.000 Hz   4:3    60.000 kHz  108.000 MHz
    DMT 0x23:  1280x1024   60.020 Hz   5:4    63.981 kHz  108.000 MHz
    DMT 0x55:  1280x720    60.000 Hz  16:9    45.000 kHz   74.250 MHz
    DMT 0x1c:  1280x800    59.810 Hz  16:10   49.702 kHz   83.500 MHz
    DMT 0x2f:  1440x900    59.887 Hz  16:10   55.935 kHz  106.500 MHz
    DMT 0x3a:  1680x1050   59.954 Hz  16:10   65.290 kHz  146.250 MHz
    DMT 0x52:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz
  Detailed Timing Descriptors:
    DTD 1:  3840x2160   59.997 Hz  16:9   133.312 kHz  533.250 MHz (621 mm x 341 mm)
                 Hfront   48 Hsync  48 Hback  64 Hpol P
                 Vfront    3 Vsync   5 Vback  54 Vpol N
    DTD 2:  2560x1440   59.951 Hz  16:9    88.787 kHz  241.500 MHz (621 mm x 341 mm)
                 Hfront   48 Hsync  32 Hback  80 Hpol P
                 Vfront    3 Vsync   5 Vback  33 Vpol P
    Display Range Limits:
      Monitor ranges (GTF): 40-60 Hz V, 30-160 kHz H, max dotclock 600 MHz
    Display Product Name: 'ASUS VG289'
  Extension blocks: 1
Checksum: 0x33

----------------

Block 1, CTA-861 Extension Block:
  Revision: 3
  Underscans IT Video Formats by default
  Basic audio support
  Supports YCbCr 4:4:4
  Supports YCbCr 4:2:2
  Native detailed modes: 1
  Video Data Block:
    VIC   1:   640x480    59.940 Hz   4:3    31.469 kHz   25.175 MHz
    VIC   3:   720x480    59.940 Hz  16:9    31.469 kHz   27.000 MHz
    VIC   4:  1280x720    60.000 Hz  16:9    45.000 kHz   74.250 MHz
    VIC  18:   720x576    50.000 Hz  16:9    31.250 kHz   27.000 MHz
    VIC  19:  1280x720    50.000 Hz  16:9    37.500 kHz   74.250 MHz
    VIC   5:  1920x1080i  60.000 Hz  16:9    33.750 kHz   74.250 MHz
    VIC  20:  1920x1080i  50.000 Hz  16:9    28.125 kHz   74.250 MHz
    VIC  31:  1920x1080   50.000 Hz  16:9    56.250 kHz  148.500 MHz
    VIC  16:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz
    VIC   7:  1440x480i   59.940 Hz  16:9    15.734 kHz   27.000 MHz
    VIC   6:  1440x480i   59.940 Hz   4:3    15.734 kHz   27.000 MHz
    VIC   2:   720x480    59.940 Hz   4:3    31.469 kHz   27.000 MHz
    VIC  93:  3840x2160   24.000 Hz  16:9    54.000 kHz  297.000 MHz
    VIC  94:  3840x2160   25.000 Hz  16:9    56.250 kHz  297.000 MHz
    VIC  95:  3840x2160   30.000 Hz  16:9    67.500 kHz  297.000 MHz
    VIC  96:  3840x2160   50.000 Hz  16:9   112.500 kHz  594.000 MHz
    VIC  97:  3840x2160   60.000 Hz  16:9   135.000 kHz  594.000 MHz
    VIC  14:  1440x480    59.940 Hz   4:3    31.469 kHz   54.000 MHz
    VIC  15:  1440x480    59.940 Hz  16:9    31.469 kHz   54.000 MHz
    VIC  21:  1440x576i   50.000 Hz   4:3    15.625 kHz   27.000 MHz
    VIC  22:  1440x576i   50.000 Hz  16:9    15.625 kHz   27.000 MHz
    VIC  29:  1440x576    50.000 Hz   4:3    31.250 kHz   54.000 MHz
    VIC  30:  1440x576    50.000 Hz  16:9    31.250 kHz   54.000 MHz
    VIC  32:  1920x1080   24.000 Hz  16:9    27.000 kHz   74.250 MHz
    VIC  72:  1920x1080   24.000 Hz  64:27   27.000 kHz   74.250 MHz
  Audio Data Block:
    Linear PCM:
      Max channels: 2
      Supported sample rates (kHz): 48 44.1 32
      Supported sample sizes (bits): 24 20 16
  Speaker Allocation Data Block:
    FL/FR - Front Left/Right
  Video Capability Data Block:
    YCbCr quantization: Selectable (via AVI YQ)
    RGB quantization: Selectable (via AVI Q)
    PT scan behavior: Always Overscanned
    IT scan behavior: Always Overscanned
    CE scan behavior: Always Overscanned
  Vendor-Specific Data Block (HDMI), OUI 00-0C-03:
    Source physical address: 1.0.0.0
    DC_36bit
    DC_30bit
    DC_Y444
    Maximum TMDS clock: 300 MHz
    Extended HDMI video details:
      HDMI VICs:
        HDMI VIC 1:  3840x2160   30.000 Hz  16:9    67.500 kHz  297.000 MHz
        HDMI VIC 2:  3840x2160   25.000 Hz  16:9    56.250 kHz  297.000 MHz
        HDMI VIC 3:  3840x2160   24.000 Hz  16:9    54.000 kHz  297.000 MHz
  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
    Version: 1
    Maximum TMDS Character Rate: 600 MHz
    SCDC Present
    Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding
    Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding
  Vendor-Specific Data Block (AMD), OUI 00-00-1A:
    Version: 1.1
    Minimum Refresh Rate: 40 Hz
    Maximum Refresh Rate: 62 Hz
    Flags 1.x: 0xe6 (MCCS)
  Colorimetry Data Block:
    xvYCC601
    xvYCC709
    BT2020YCC
    BT2020RGB
  YCbCr 4:2:0 Capability Map Data Block:
    VIC  96:  3840x2160   50.000 Hz  16:9    56.250 kHz  297.000 MHz
    VIC  97:  3840x2160   60.000 Hz  16:9    67.500 kHz  297.000 MHz
  HDR Static Metadata Data Block:
    Electro optical transfer functions:
      Traditional gamma - SDR luminance range
      Traditional gamma - HDR luminance range
      SMPTE ST2084
    Supported static metadata descriptors:
      Static metadata type 1
    Desired content max luminance: 86 (322.098 cd/m^2)
    Desired content max frame-average luminance: 85 (315.196 cd/m^2)
    Desired content min luminance: 0 (0.000 cd/m^2)
  Detailed Timing Descriptors:
    DTD 3:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz (621 mm x 341 mm)
                 Hfront   88 Hsync  44 Hback 148 Hpol P
                 Vfront    4 Vsync   5 Vback  36 Vpol P
Checksum: 0x73
</span></code></pre></div></div>

<p>After some further searching I came across a nice little Python script <a href="https://gist.github.com/mvollrath/9aa0198264e6b4890914">get-edid.py</a>
by <a href="https://github.com/mvollrath">Matt Vollrath</a>. The script takes a parameter input to specify which display device is desired.</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>xrandr <span class="nt">--listmonitors</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Monitors: 2
 0: +*DP-0 3840/621x2160/341+3840+0  DP-0
 1: +HDMI-0 3840/621x2160/341+0+0  HDMI-0
</span></code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>python get-edid.py HDMI-0 | edid-decode
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">edid-decode (hex): &lt;INTENTIONALLY ALTERED&gt;</span><span class="w">
</span><span class="go">
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

----------------

Block 0, Base EDID:
  EDID Structure Version &amp; Revision: 1.3
  Vendor &amp; Product Identification:
    Manufacturer: AUS
    Model: 10426
</span><span class="gp">    Serial Number: &lt;INTENTIONALLY REMOVED&gt;</span><span class="w">
</span><span class="go">    Made in: week 48 of 2019
  Basic Display Parameters &amp; Features:
    Digital display
    Maximum image size: 62 cm x 34 cm
    Gamma: 2.20
    DPMS levels: Off
    RGB color display
    First detailed timing is the preferred timing
  Color Characteristics:
    Red  : 0.6777, 0.3115
    Green: 0.2666, 0.6171
    Blue : 0.1464, 0.0605
    White: 0.3134, 0.3291
  Established Timings I &amp; II:
    DMT 0x04:   640x480    59.940 Hz   4:3    31.469 kHz   25.175 MHz
    DMT 0x08:   800x600    56.250 Hz   4:3    35.156 kHz   36.000 MHz
    DMT 0x09:   800x600    60.317 Hz   4:3    37.879 kHz   40.000 MHz
    DMT 0x10:  1024x768    60.004 Hz   4:3    48.363 kHz   65.000 MHz
  Standard Timings:
    DMT 0x20:  1280x960    60.000 Hz   4:3    60.000 kHz  108.000 MHz
    DMT 0x23:  1280x1024   60.020 Hz   5:4    63.981 kHz  108.000 MHz
    DMT 0x55:  1280x720    60.000 Hz  16:9    45.000 kHz   74.250 MHz
    DMT 0x1c:  1280x800    59.810 Hz  16:10   49.702 kHz   83.500 MHz
    DMT 0x2f:  1440x900    59.887 Hz  16:10   55.935 kHz  106.500 MHz
    DMT 0x3a:  1680x1050   59.954 Hz  16:10   65.290 kHz  146.250 MHz
    DMT 0x52:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz
  Detailed Timing Descriptors:
    DTD 1:  3840x2160   59.997 Hz  16:9   133.312 kHz  533.250 MHz (621 mm x 341 mm)
                 Hfront   48 Hsync  48 Hback  64 Hpol P
                 Vfront    3 Vsync   5 Vback  54 Vpol N
    DTD 2:  2560x1440   59.951 Hz  16:9    88.787 kHz  241.500 MHz (621 mm x 341 mm)
                 Hfront   48 Hsync  32 Hback  80 Hpol P
                 Vfront    3 Vsync   5 Vback  33 Vpol P
    Display Range Limits:
      Monitor ranges (GTF): 40-60 Hz V, 30-160 kHz H, max dotclock 600 MHz
    Display Product Name: 'ASUS VG289'
  Extension blocks: 1
Checksum: 0x33

----------------

Block 1, CTA-861 Extension Block:
  Revision: 3
  Underscans IT Video Formats by default
  Basic audio support
  Supports YCbCr 4:4:4
  Supports YCbCr 4:2:2
  Native detailed modes: 1
  Video Data Block:
    VIC   1:   640x480    59.940 Hz   4:3    31.469 kHz   25.175 MHz
    VIC   3:   720x480    59.940 Hz  16:9    31.469 kHz   27.000 MHz
    VIC   4:  1280x720    60.000 Hz  16:9    45.000 kHz   74.250 MHz
    VIC  18:   720x576    50.000 Hz  16:9    31.250 kHz   27.000 MHz
    VIC  19:  1280x720    50.000 Hz  16:9    37.500 kHz   74.250 MHz
    VIC   5:  1920x1080i  60.000 Hz  16:9    33.750 kHz   74.250 MHz
    VIC  20:  1920x1080i  50.000 Hz  16:9    28.125 kHz   74.250 MHz
    VIC  31:  1920x1080   50.000 Hz  16:9    56.250 kHz  148.500 MHz
    VIC  16:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz
    VIC   7:  1440x480i   59.940 Hz  16:9    15.734 kHz   27.000 MHz
    VIC   6:  1440x480i   59.940 Hz   4:3    15.734 kHz   27.000 MHz
    VIC   2:   720x480    59.940 Hz   4:3    31.469 kHz   27.000 MHz
    VIC  93:  3840x2160   24.000 Hz  16:9    54.000 kHz  297.000 MHz
    VIC  94:  3840x2160   25.000 Hz  16:9    56.250 kHz  297.000 MHz
    VIC  95:  3840x2160   30.000 Hz  16:9    67.500 kHz  297.000 MHz
    VIC  96:  3840x2160   50.000 Hz  16:9   112.500 kHz  594.000 MHz
    VIC  97:  3840x2160   60.000 Hz  16:9   135.000 kHz  594.000 MHz
    VIC  14:  1440x480    59.940 Hz   4:3    31.469 kHz   54.000 MHz
    VIC  15:  1440x480    59.940 Hz  16:9    31.469 kHz   54.000 MHz
    VIC  21:  1440x576i   50.000 Hz   4:3    15.625 kHz   27.000 MHz
    VIC  22:  1440x576i   50.000 Hz  16:9    15.625 kHz   27.000 MHz
    VIC  29:  1440x576    50.000 Hz   4:3    31.250 kHz   54.000 MHz
    VIC  30:  1440x576    50.000 Hz  16:9    31.250 kHz   54.000 MHz
    VIC  32:  1920x1080   24.000 Hz  16:9    27.000 kHz   74.250 MHz
    VIC  72:  1920x1080   24.000 Hz  64:27   27.000 kHz   74.250 MHz
  Audio Data Block:
    Linear PCM:
      Max channels: 2
      Supported sample rates (kHz): 48 44.1 32
      Supported sample sizes (bits): 24 20 16
  Speaker Allocation Data Block:
    FL/FR - Front Left/Right
  Video Capability Data Block:
    YCbCr quantization: Selectable (via AVI YQ)
    RGB quantization: Selectable (via AVI Q)
    PT scan behavior: Always Overscanned
    IT scan behavior: Always Overscanned
    CE scan behavior: Always Overscanned
  Vendor-Specific Data Block (HDMI), OUI 00-0C-03:
    Source physical address: 1.0.0.0
    DC_36bit
    DC_30bit
    DC_Y444
    Maximum TMDS clock: 300 MHz
    Extended HDMI video details:
      HDMI VICs:
        HDMI VIC 1:  3840x2160   30.000 Hz  16:9    67.500 kHz  297.000 MHz
        HDMI VIC 2:  3840x2160   25.000 Hz  16:9    56.250 kHz  297.000 MHz
        HDMI VIC 3:  3840x2160   24.000 Hz  16:9    54.000 kHz  297.000 MHz
  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
    Version: 1
    Maximum TMDS Character Rate: 600 MHz
    SCDC Present
    Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding
    Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding
  Vendor-Specific Data Block (AMD), OUI 00-00-1A:
    Version: 1.1
    Minimum Refresh Rate: 40 Hz
    Maximum Refresh Rate: 62 Hz
    Flags 1.x: 0xe6 (MCCS)
  Colorimetry Data Block:
    xvYCC601
    xvYCC709
    BT2020YCC
    BT2020RGB
  YCbCr 4:2:0 Capability Map Data Block:
    VIC  96:  3840x2160   50.000 Hz  16:9    56.250 kHz  297.000 MHz
    VIC  97:  3840x2160   60.000 Hz  16:9    67.500 kHz  297.000 MHz
  HDR Static Metadata Data Block:
    Electro optical transfer functions:
      Traditional gamma - SDR luminance range
      Traditional gamma - HDR luminance range
      SMPTE ST2084
    Supported static metadata descriptors:
      Static metadata type 1
    Desired content max luminance: 86 (322.098 cd/m^2)
    Desired content max frame-average luminance: 85 (315.196 cd/m^2)
    Desired content min luminance: 0 (0.000 cd/m^2)
  Detailed Timing Descriptors:
    DTD 3:  1920x1080   60.000 Hz  16:9    67.500 kHz  148.500 MHz (621 mm x 341 mm)
                 Hfront   88 Hsync  44 Hback 148 Hpol P
                 Vfront    4 Vsync   5 Vback  36 Vpol P
Checksum: 0x73
</span></code></pre></div></div>

<h3 id="debian--ubuntu">Debian / Ubuntu</h3>

<p>The Debian and Ubuntu package system offers both programs as “edid-decode” and “read-edid”.
The steps to use either package are the same as shown in Arch Linux.</p>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="technology" /><category term="100DaysToOffload" /><category term="linux" /><category term="raspberrypi" /><summary type="html"><![CDATA[Join my journey as I continue to learn how to retrieve EDID/E-EDID/DisplayID metadata from display device (resolution, refresh rate, etc.) using linux.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/shelf-crt-monitors.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/shelf-crt-monitors.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Becoming Less Dependent On The Internet</title><link href="https://www.adamsdesk.com/posts/becoming-less-dependent-on-the-internet/" rel="alternate" type="text/html" title="Becoming Less Dependent On The Internet" /><published>2021-10-07T00:00:00-06:00</published><updated>2022-12-19T20:48:00-06:00</updated><id>https://www.adamsdesk.com/posts/becoming-less-dependent-on-the-internet</id><content type="html" xml:base="https://www.adamsdesk.com/posts/becoming-less-dependent-on-the-internet/"><![CDATA[<p>As years have passed by in the area of computing I’ve noticed that myself and I’m sure many others have become quite dependent upon having access to the Internet. This all comes of course with great benefits and negative benefits of
having and using the Internet. We can quickly lookup a business’ store hours, locate an address on various map
services, convert a time to another timezone, etc. In this process of using the Internet more we’ve made many tasks
more complicated without noticing and have become too dependent on the Internet when we can do it ourselves. We end
up using the Internet for various tasks that we truly do not need to use the Internet for. Another way to look at it
is we indirectly waste resources such as Internet bandwidth, storage, money, time, etc. I personally feel we should
be more independent and should think more on what we are doing in the moment. I find myself using online services
at times in a passive manner instead of a more engaged thoughtful manner. I’m not saying we shouldn’t use the
Internet, it has great value but let’s try to keep it simple and use what resources we have locally first.
In return I feel this will bring on a more meaningful way of life and also could learn something along the way.</p>

<p>One such example I thought about one day is I find myself doing frequently is converting time to another timezone.
My first thought is to go to <a href="https://www.timeanddate.com/">timeanddate.com</a> or <a href="https://time.is/">time.is</a> or even
just type it into a search engine to convert. Now of course these services are great and connivent but they are not
truly needed. I also find they end up indirectly making us think less about how to accomplish the task and end up
only focusing on the desired results.</p>

<p>In Linux you can easily get or convert a time to another timezone using the command line command
<code class="language-plaintext highlighter-rouge">date</code>.</p>

<h2 id="convert-time-to-local-time">Convert Time To Local Time</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">date</span> <span class="nt">-d</span> <span class="s1">'2021-10-07 18:00 PST'</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Fri Oct  8 01:00:00 AM UTC 2021
</span></code></pre></div></div>

<h2 id="get-time-in-a-specific-timezone">Get Time In A Specific Timezone</h2>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nv">TZ</span><span class="o">=</span><span class="s2">":America/New_York"</span> <span class="nb">date</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Thu Oct  7 04:27:33 PM EDT 2021
</span></code></pre></div></div>

<h2 id="list-available-timezones">List Available Timezones</h2>

<p>Timedatectl command</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>timedatectl list-timezones
</code></pre></div></div>

<p>File listings</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">ls</span> /usr/share/zoneinfo
</code></pre></div></div>

<h2 id="show-current-datetime-and-timezone">Show Current Datetime and Timezone</h2>

<p>Date command</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">date</span>
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Thu Oct  7 10:30:43 PM UTC 2021
</span></code></pre></div></div>

<p>Timedatectl command</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>timedatectl status
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">Local time: Thu 2021-10-08 04:36:34 UTC
        Universal time: Fri 2021-10-08 04:36:34 UTC
                RTC time: Fri 2021-10-08 04:36:34
                Time zone: UTC
System clock synchronized: yes
            NTP service: active
        RTC in local TZ: no
</span></code></pre></div></div>

<p>File listings</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span><span class="nb">ls</span> <span class="nt">-l</span> /etc/localtime
</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">lrwxrwxrwx 1 root root 36 Jun 14 14:46 /etc/localtime -&gt;</span><span class="w"> </span>../usr/share/zoneinfo/UTC
</code></pre></div></div>

<p>What ideas do you have that you can do without using the Internet? Feel free to share them by <a href="/contact/">contacting me</a>.</p>

<p>I’m publishing this as part of 100 Days To Offload. You can join in yourself by visiting <a href="https://100daystooffload.com">100DaysToOffload.com</a>.</p>]]></content><author><name>Adam Douglas</name></author><category term="opinion" /><category term="100DaysToOffload" /><category term="commandline" /><summary type="html"><![CDATA[My thoughts about becoming less dependent on the internet and how to convert time to another timezone using Linux.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.adamsdesk.com/assets/img/posts/fiber-optic-cable-network.webp" /><media:content medium="image" url="https://www.adamsdesk.com/assets/img/posts/fiber-optic-cable-network.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>