<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title></title>
    <link>https://nextpertise.net/</link>
    <description>Recent content on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 31 Oct 2025 09:24:31 -0400</lastBuildDate>
    
        <atom:link href="https://nextpertise.net/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Virtues</title>
      <link>https://nextpertise.net/virtues/</link>
      <pubDate>Fri, 31 Oct 2025 09:24:31 -0400</pubDate>
      
      <guid>https://nextpertise.net/virtues/</guid>
      <description>&lt;p&gt;The modern corporate state exhorts us and twists the idea of virtue.  We&amp;rsquo;re surrounded by companies that speak of values and ideals.&lt;/p&gt;
&lt;h2 id=&#34;what-is-virtue&#34;&gt;What is virtue?&lt;/h2&gt;
&lt;p&gt;Etymologically, &lt;em&gt;virtue&lt;/em&gt; comes from Latin, &amp;ldquo;virtus&amp;rdquo;, which is moral strength or excellence.  It&amp;rsquo;s root, in turn, is &amp;ldquo;vir&amp;rdquo; or man.  In the Roman sense, virtue describes the characteristics of manliness.  I&amp;rsquo;m going to skip the post-modern apology here and trust that the reader understands the differences that have come over the past two thousand years and simply leave virtue as traits that are deemed morally good.&lt;/p&gt;
&lt;p&gt;Values, in contrast, are what we invest in personally.  Being a Tarheel fan is a value to me.  Virtues may be a subset of values, but values are broader and individualistic and reflect what we believe is important.  Virtues are objective, where values are subjective and rooted in feelings.  This may explain why we see &amp;ldquo;values&amp;rdquo; discussed much more than virtues in modern society.&lt;/p&gt;
&lt;p&gt;Classically, the principal virtues are Prudence, Temperance, Wisdom, and Justice. Christians would add Faith, Hope, and Love to this list.&lt;/p&gt;
&lt;h2 id=&#34;eudaimonia&#34;&gt;Eudaimonia&lt;/h2&gt;
&lt;p&gt;Eudaimonia is a Greek word translating to the state of good spirit or (I prefer) &amp;ldquo;flourishing&amp;rdquo;. In the works of Aristotle, eudaimonia was the term for the highest human good.  Eudaimonia for a tree might be to provide shade, fruit, or places for birds to nest.  For a human being it likewise rests in this concept of philosophical integrity with one&amp;rsquo;s purpose.&lt;/p&gt;
&lt;p&gt;The concepts of Eudaimonia and virtues if one believes that human flourishing is represented in moral behavior.  The ancients also had the concept of Zeal - latin &amp;ldquo;zelus&amp;rdquo; and Greek &amp;ldquo;zēlos&amp;rdquo;, meaning ardor or emulation.  Zeal implies a  passionate pursuit or jealousy today, but originally it meant to take as a model.  Julius Caesar was said to have gazed at a statue of Alexander and felt this zeal - saying, &amp;ldquo;what have I done with my life in comparison?&amp;rdquo;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Strategy vs Tactics</title>
      <link>https://nextpertise.net/stratac/</link>
      <pubDate>Wed, 15 Oct 2025 20:30:47 -0400</pubDate>
      
      <guid>https://nextpertise.net/stratac/</guid>
      <description>&lt;p&gt;In my research on John Boyd, I came across a discussion of Strategy and Tactics that is worth revisiting as it applies to IT leadership.&lt;/p&gt;
&lt;h4 id=&#34;tactics-involve-our-plans-around-the-known-and-controlled-strategy-is-our-plans-around-the-unknown-and-uncontrolled&#34;&gt;Tactics involve our plans around the known and controlled, strategy is our plans around the unknown and uncontrolled.&lt;/h4&gt;
&lt;p&gt;Tactics adress things that we understand and control. For example, I know that my team has a certain number of vacation days left and that there are X-many working days remaining in the year.  I will develop a tactic around the use of vacation days.  This is a really good example, because we can imagine a variety of tactics that are all valid.  For instance, I can choose to deny vacation or to take a laise faire approach.  This tactic might not be popular or respect the people I work with, but at the same time we can imagine an extreme case that demands &amp;ldquo;all hands on deck&amp;rdquo; where this might be appropriate.  A more conciliatory tactic might be to proactively work to make sure that everyone has a chance to use their vacation days.&lt;/p&gt;
&lt;p&gt;Strategy is focused on things we don&amp;rsquo;t understand or don&amp;rsquo;t control.  A major software supplier will release an update and our IT team has to think through requirements to buy compute &lt;em&gt;today&lt;/em&gt;.  If that supplier isn&amp;rsquo;t publishing details, we may not know the appropriate hardware.  Our strategy might be estimate and then massively overbuild or to provide for an easy upgrade path.  Alternately, our strategy might be to wait for the official release and only purchase servers when the requirements are known.  At the same time the hardware saga is playing out, we might also be concerned about the upgrade strategy.  Enterprise software is typically customized to some extent and new releases have to have those customizations ported.  We also need to get data from the old system to the new system.  Again, we&amp;rsquo;re limited by what we don&amp;rsquo;t know but we might develop a strategy around enumerating and documenting customizations and backing up data.&lt;/p&gt;
&lt;h2 id=&#34;focus&#34;&gt;Focus&lt;/h2&gt;
&lt;p&gt;I find that these concepts help explain roles and the types of leeway we provide employees.&lt;/p&gt;
&lt;p&gt;An individual contributor is mostly going to focus on working through a tactical plan.  The Toyota Production System has a concept that the guy turning the wrench has a say in how a job is accomplished, and that ethos carries through to IT.  These folks need to understand the tactical problem, the approach, and understand how to innovate within that window.&lt;/p&gt;
&lt;p&gt;Managers recieve strategy and develop tactical plans.  Managers have a broader view of where the &amp;ldquo;known unkmown&amp;rdquo; is and help their team navigate in that structure.  They typically have experience in the environment and can set objectives, develop an approach to achieving that objective, and coach the team on techniques that might be helpful.&lt;/p&gt;
&lt;p&gt;Directors and VPs typically work at the level of strategy.  They might look at business objectives like a sales approach and targets.  Directors typically develop strategic concepts with VPs supplying the ultimate direction. &lt;em&gt;Grand Strategy&lt;/em&gt; deals with direction and alliances and is mostly reserved for the executive suite and Boards of Directors.&lt;/p&gt;
&lt;h2 id=&#34;the-role-of-risk&#34;&gt;The Role of Risk&lt;/h2&gt;
&lt;p&gt;Based on my understanding of Nassim Taleb, I characterize risk as &amp;ldquo;within normal&amp;rdquo; and outlier risk.  An example of normal risk is the risk of a given part being non-functional on delivery.  For example, if I order a thousand SFPs (fiber connectors) then I might expect a certain percentage to be bad and make allowances.  AI represents extraordinary risk, in the sense that the parameters and variations seen in the past twenty years might suddenly no longer apply.  In 2024, we experienced a series of heavy storms followed by a hurricane.  In short order, the foothills and mountains near my home received almost a meter of rain.  No one had that on their bingo card.&lt;/p&gt;
&lt;p&gt;Risk maps into a discussion of strategy and tactics.&lt;/p&gt;
&lt;p&gt;Grand Strategic risks are the most difficult to characterize and backstop.  Company leadership has to understand larger trends - such as how AI will impact our business - as well as the potential for complete disruption happening from an unexpected source &lt;em&gt;a la&lt;/em&gt; COVID.&lt;/p&gt;
&lt;p&gt;Strategic risks deal with unknowns, so a strategy has to feel out those unknowns and be prepared to quickly adapt.  Napoleon would divide forces on a broad scale to obfuscate objectives while providing support for each group.  His subordinates followed a &amp;ldquo;plan with branches&amp;rdquo; that contained general concepts on how to exploit situations that may occur.  The American Civil War generals Jackson and Sherman both used similar concepts to manuever into positions that threatened multiple objectives, which forced opposing groups into difficult decisions and allowed them to exploit opportunities.&lt;/p&gt;
&lt;p&gt;In a similar way, IT strategy should use OODA-based approaches to empower subordinates down to the individual contributor to adapt to resistance, re-orient, and quickly exploit opportunities by updating tactics.  In fact, one thing seen in the military examples is that speed and manuever are critical weapons and that speed is prohibitively difficult in heavily heirarchical organizations.  Speed is accomplished through trust, which takes time and purposeful investment to create.  Speed is executed through devolving decisions and crisp communication, things that I think are best build on Boyd&amp;rsquo;s OODA framework.  Distributing decision making doesn&amp;rsquo;t distribute accountability however, and leaders who expect results &lt;em&gt;have&lt;/em&gt; to invest heavily in relationships long before the bell rings.&lt;/p&gt;
&lt;p&gt;Tactical risk is the most practical risk.  What if FedEx doesn&amp;rsquo;t deliver the part in time?  What if this change results in an outage?  Tactical risk is handled by those closest to the action.  Common responses to tactical risks include spares, backups, and redundancy.  Just thinking about tactical risks however, it&amp;rsquo;s impossible to eliminate failure.  Simple math or a monte carlo run will demonstrate that even redundant components with low failure rates will - eventually - both fail at the same time.  Part of the tactical response then is to enumerate and communicate those risks and to develop contingencies to minimize downtime.&lt;/p&gt;
&lt;p&gt;Google, in their SRE book, has a rule-of-thumb that &amp;ldquo;adding a 9&amp;rdquo; (that is, going from 99.9% uptime to 99.99%) doubles costs.  I don&amp;rsquo;t know that is true, but it&amp;rsquo;s true enough.  It&amp;rsquo;s therefore important to understand when the cost of adding one more nine exceeds the business cost of extended outage.&lt;/p&gt;
&lt;h2 id=&#34;takeaways&#34;&gt;Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Tactics deal with knowns, Strategy with unknowns&lt;/li&gt;
&lt;li&gt;Tactics address risk through redundancy&lt;/li&gt;
&lt;li&gt;OODA techniques are a useful way to quickly address &amp;ldquo;facts on the ground&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Strategic risks can be addressed through a plan with branches.&lt;/li&gt;
&lt;li&gt;Recognize that speed and maneuever are a strategic asset (maybe the most important).&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Running GNS3 on Proxmox VE</title>
      <link>https://nextpertise.net/gns3_proxmox/</link>
      <pubDate>Wed, 08 Oct 2025 10:00:18 -0500</pubDate>
      
      <guid>https://nextpertise.net/gns3_proxmox/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m running GNS3 on Proxmox.  &lt;a href=&#34;https://nextpertise.net/posts/210421_gns3_attached_to_esxi/&#34;&gt;GNS3 on ESXi&lt;/a&gt; is fairly straight forward, but there are some tweaks needed to support Proxmox.&lt;/p&gt;
&lt;h2 id=&#34;disk-format&#34;&gt;Disk Format&lt;/h2&gt;
&lt;p&gt;Proxmox virtualization is Qemu-based and the &lt;a href=&#34;https://gns3.com/software/download-vm&#34;&gt;GNS3 VM&lt;/a&gt; is distributed for VirtualBox, VMWare Workstation, VMWare ESXi, and Hyper-V.  I&amp;rsquo;ve worked around that by running GNS3 in VMWare Workstation, but I&amp;rsquo;ve run into some issues with Workstation causing my machine to &amp;ldquo;freeze&amp;rdquo; so I got interested in moving the GNS3 VM to my virtualization host.  A little poking around found that other people have been successful with this and provided some ideas.&lt;/p&gt;
&lt;h2 id=&#34;how-to-run-gns3-vm-on-proxmox-ve&#34;&gt;How to run GNS3 VM on Proxmox VE&lt;/h2&gt;
&lt;p&gt;Nothing stands still, so before we get into instructions I&amp;rsquo;ll date this article.  This was originally written in January, 2023, and updated in October, 2025.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first step is to &lt;a href=&#34;https://gns3.com/software/download-vm&#34;&gt;download&lt;/a&gt; the VMware ESXi GNS3 VM.&lt;/li&gt;
&lt;li&gt;The downloaded file is a ZIP, which expands out to an OVA.  OVA is really just another ZIP, so expanding that out gives you two VMDK virtual disks, a manifest(MF) file and an OVF file.  The OVF provides information about the virtual hardware environment and the manifest has the hashes of all the files in the OVA.  We&amp;rsquo;re only interested in the two VMDK files (GNS3_VM-disk1.vmdk and GNS3_VM-disk2.vmdk).  You can expand these out using most file managers of via the command line.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    tar xvf GNS3_VM.ova
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Upload the VMDK files to Proxmox.  In the &lt;em&gt;root&lt;/em&gt; home directory, I created an &lt;em&gt;import&lt;/em&gt; subdirectory for the files.  This is very easy to do with Filezilla or from the command line.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    # sftp brent@server
    sftp&amp;gt; cd import
    sftp&amp;gt; put GNS3_VM-disk1.vmdk
    sftp&amp;gt; put GNS3_VM-disk2.vmdk
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;p&gt;Create a new Qemu VM in Proxmox by clicking the &amp;ldquo;Create VM&amp;rdquo; button in the upper right of the management page. &lt;img src=&#34;https://nextpertise.net/230121-createvm.png&#34; alt=&#34;Create VM&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can accept the defaults on the General tab.  Under OS, steup the VM without any media.
&lt;img src=&#34;https://nextpertise.net/230121-PVEnomedia.png#center&#34; alt=&#34;No Media&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accept defaults on the System tab and Disks tab.  I set my VM to use 4 processors (2 sockets, 2 cores each) and set the default memory to 16GB.  I didn&amp;rsquo;t see a lot of guidance on this, so that was a SWAG.  Note the ID (105 in my case).
&lt;img src=&#34;https://nextpertise.net/230121-GNS3VM.png#center&#34; alt=&#34;GNS3 VM&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After the VM is created, select the VM, go to the Hardware section, and select the disk.  Click Detach and then Remove from the menu bar.
&lt;img src=&#34;https://nextpertise.net/230121-PVErmove.png#center&#34; alt=&#34;Remove disk&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Import the VMDK disks into Proxmox.  SSH into the host and use the &lt;strong&gt;qm&lt;/strong&gt; command to convert the disk to QCOW2 format and import it for use.  Change the machine ID (105 is my GNS3 VM) and make sure the VMDK file name matches before running the command below.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    root@pve:~/import# qm importdisk 105 GNS3_VM-disk1.vmdk local-lvm -format qcow2
    importing disk &amp;#39;GNS3_VM-disk1.vmdk&amp;#39; to VM 105 ...
    Logical volume &amp;#34;vm-105-disk-0&amp;#34; created.
    transferred 0.0 B of 19.5 GiB (0.00%)
    transferred 200.0 MiB of 19.5 GiB (1.00%)
    transferred 400.0 MiB of 19.5 GiB (2.00%)
    ...
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;
&lt;p&gt;Attach the QCOW2 images to your VM using the Add button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the Proxmox admin page, select the VM, select options, and set the boot order.  Double-click the boot Order line and a window will appear to allow you to drag the disk into the correct order.  Disk1, the smaller of the two images, should be enabled and the boot drive.
&lt;img src=&#34;https://nextpertise.net/230121-PVEboot.png#center&#34; alt=&#34;Boot order&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also use another tweak: Go into Hardware and double-clicked the Network Device to put the device into a VLAN by setting the tag.
&lt;img src=&#34;https://nextpertise.net/230121-PVEnet.png#center&#34; alt=&#34;Networking&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the VM.  GNS3 started up in the correct VLAN and grabbed a DHCP address.  Opening a console, the boot screen of the VM shows the IP address assigned.  Accessing this address from a browser will provide the GNS3 web console.  You can also use this address in the GNS3 front-end to identify the back-end server.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Shell Setup</title>
      <link>https://nextpertise.net/shell/</link>
      <pubDate>Tue, 07 Oct 2025 10:43:06 -0400</pubDate>
      
      <guid>https://nextpertise.net/shell/</guid>
      <description>&lt;p&gt;A shell is a tool used to execute commands in an operating systems.  We most commonly think about shells as graphical (GUI) or command-line (text user interface or &amp;ldquo;TUI&amp;rdquo;), although I suppose you could imagine a spoken interface or mixed reality interface.  In the context of &amp;ldquo;Linux&amp;rdquo;, it&amp;rsquo;s used mostly to refer to the specific TUI environment in use.  Most Linux distributions ship with the Bourne shell (&amp;ldquo;sh&amp;rdquo;) and BASH (Bourne again Shell).  Here I&amp;rsquo;m describing my preferred setup for that environment.&lt;/p&gt;
&lt;h2 id=&#34;fish&#34;&gt;Fish&lt;/h2&gt;
&lt;p&gt;I prefer &lt;a href=&#34;https://fishshell.com/&#34;&gt;fish&lt;/a&gt; (friendly interactive shell), which does a better job of suggesting syntax.  The commands below show installation in a Debian distrobution.  &lt;strong&gt;chsh&lt;/strong&gt; is &amp;ldquo;change shell&amp;rdquo; and &lt;strong&gt;which&lt;/strong&gt; provides the full path to the executable.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sudo apt install fish
chsh -s $(which fish)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;starship&#34;&gt;Starship&lt;/h2&gt;
&lt;p&gt;I also enjoy a snazzier presentation of the command line, similar to the Powerline style.  For that I use &lt;a href=&#34;https://starship.rs/&#34;&gt;Starship&lt;/a&gt;.  Starship uses a font that has symbols built in to give a more graphical presentation, so you&amp;rsquo;ll need to download a &lt;a href=&#34;https://www.nerdfonts.com/font-downloads&#34;&gt;nerd font&lt;/a&gt;.  I&amp;rsquo;m currently using Overpass.&lt;/p&gt;
&lt;p&gt;Install Starship:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;curl -sS &lt;a href=&#34;https://starship.rs/install.sh&#34;&gt;https://starship.rs/install.sh&lt;/a&gt; | sh
and add a line to ~/.bashrc to start it with bash.  Why bother, since we switched to fish above?  Mostly a mental hangup, but there are times you get dropped back to a bash shell and I like it to be pretty.
eval &amp;ldquo;$(starship init bash)&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setup Starship for Fish by adding a line to ~/.config/fish/config.fish&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;starship init fish | source&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, the default Starship scheme is pretty pedestrian.  It can be customized to your hearts content, but a good set of examples are available and easily selectable.  I use the catppuccin-powerline preset.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;starship preset catppuccin-powerline -o ~/.config/starship.toml&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Proxmox</title>
      <link>https://nextpertise.net/proxmox/</link>
      <pubDate>Mon, 06 Oct 2025 21:24:58 -0400</pubDate>
      
      <guid>https://nextpertise.net/proxmox/</guid>
      <description>&lt;h2 id=&#34;proxmox-virtual-edition-pve&#34;&gt;Proxmox Virtual Edition (PVE)&lt;/h2&gt;
&lt;p&gt;PVE is a hypervisor that supports LXC containers and full virtual machines.  It&amp;rsquo;s comparable to VMWare ESXi.  The comparison fits across the board.  There&amp;rsquo;s a Proxmox DataCenter Manager that&amp;rsquo;s similar to VMWare Cloud Director (VCD), and it supports a similar set of features such as high availability failover.&lt;/p&gt;
&lt;p&gt;The current version is 9 (as of 10/25), but my experience has been poor when attempting to upgrade.  As a result I recommend v8 for the time being.  I also recommend running Proxmox Backup - the closest VMWare comparable might be Zerto.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using PVE for a several years and I&amp;rsquo;ve been pretty pleased with it.  I run a virtualization server at home for a few reasons.  VMs have been a way to break apps out into seperate environments, making self-hosting easier.  Second, I support virtual environments and wanted to use my home network to get hands-on time.&lt;/p&gt;
&lt;p&gt;Originally, I used a free version of VMWare but VMWare was purchased by Broadcom.  They halted the free version for a while and haven&amp;rsquo;t proven to be transparent in their approach to licensing, plus the server hardware I was using died, so it made sense to explore alternatives.  Proxmox VE had a lot of the capabilities, plus the Linux underpinnings were much more obvious (which supported another direction I was heading).  The PVE environment has been mostly good and I&amp;rsquo;ve never had an issue that I couldn&amp;rsquo;t recover from (similar to what you&amp;rsquo;d expect running ESXi).&lt;/p&gt;
&lt;h3 id=&#34;environment-seutp&#34;&gt;Environment seutp&lt;/h3&gt;
&lt;p&gt;Post-install&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switches server to &amp;ldquo;no-subscription&amp;rdquo;&lt;/li&gt;
&lt;li&gt;removes nag&lt;/li&gt;
&lt;li&gt;Disables HA&lt;/li&gt;
&lt;li&gt;prompts for reboots after updates&lt;/li&gt;
&lt;li&gt;Run &amp;ldquo;update&amp;rdquo; or create cron job
&lt;code&gt;bash -c &amp;quot;$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/misc/post-pve-install.sh)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;kernel clean&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keeps current and n-1 kernels&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;bash -c &amp;quot;$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/misc/kernel-clean.sh)&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;BassT23 Updater&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;updates host and all VMs and LXcs&lt;/li&gt;
&lt;li&gt;Detects OS and supports various package managers (apt, dnf, pacman, apk)&lt;/li&gt;
&lt;li&gt;Can be configured to take snapshot or backup before updating
&lt;code&gt;bash -c &amp;quot;$(curl -s https://raw.githubusercontent.com/BassT23/Proxmox/master/install.sh)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Host Backup&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;saves config files to speed reinstallation
&lt;code&gt;bash -c &amp;quot;$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/misc/host-backup.sh)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CPU Governor
Allows selection of CPU scaling governor.  In Enterprise settings, moving to &amp;ldquo;performance&amp;rdquo; will give more consistent results.  In homelabs, use powersave or schedutil (adjusts dynamically with demand).
&lt;code&gt;bash -c &amp;quot;$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/scaling-governor.sh)&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;helper-scripts&#34;&gt;Helper scripts&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;a href=&#34;https://community-scripts.github.io/ProxmoxVE/&#34;&gt;community&lt;/a&gt; that creates scripts to build VMs and LXCs to enable easy setup of popular applications.  The scripts cover popular applications including Pi-Hole, Homeassistant, and Homarr.  At last check, there were almost 400 supported applications!&lt;/p&gt;
&lt;p&gt;Use caution here because the scripts are presented as easy &amp;ldquo;pipe to bash&amp;rdquo; commands that should be run from PVE root.  The scripts can be downloaded and reviewed or just viewed on &lt;a href=&#34;https://github.com/community-scripts/ProxmoxVE&#34;&gt;Github&lt;/a&gt;.  Before running a foreign script on your server, it would be advisable to review the script!&lt;/p&gt;
&lt;h2 id=&#34;command-line-notes&#34;&gt;Command line notes&lt;/h2&gt;
&lt;p&gt;Here are some basic command line notes for working with PVE.
Version
&lt;code&gt;pveversion&lt;/code&gt;
Node Status
&lt;code&gt;pvesh get /nodes/&amp;lt;id&amp;gt;/status&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;cluster&#34;&gt;Cluster&lt;/h4&gt;
&lt;p&gt;Cluster Status
&lt;code&gt;pvecm status|nodes|quorum&lt;/code&gt;
&lt;code&gt;corosync-cmapctl&lt;/code&gt;
Join a cluster
&lt;code&gt;pvecm add|delnode &amp;lt;ip|hostname&amp;gt;&lt;/code&gt;
Change the quorum number
&lt;code&gt;pvecm expected &amp;lt;count&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;networking&#34;&gt;Networking&lt;/h4&gt;
&lt;p&gt;Network specifics are configured in /etc/network/interfaces.  Details about the environment can be seen from the command line.
What the IP?
&lt;code&gt;ip a&lt;/code&gt;
List bridges
&lt;code&gt;brctl show&lt;/code&gt;
List FW rules
&lt;code&gt;iptables -L -n&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;manage-vms&#34;&gt;Manage VMs&lt;/h4&gt;
&lt;p&gt;Managing VMs from the command line can be a good deal easier than using the gui.  I&amp;rsquo;ve found it&amp;rsquo;s convenient to have a default Ubuntu server ready and turned off.  This can then be cloned and configured.&lt;/p&gt;
&lt;p&gt;List VMs
&lt;code&gt;qm list&lt;/code&gt;
Interacting with VMs
&lt;code&gt;qm start|stop|shutdown|destroy &amp;lt;id&amp;gt;&lt;/code&gt;
Create a VM
&lt;code&gt;qm create &amp;lt;id&amp;gt; --name &amp;lt;name&amp;gt; --memory &amp;lt;size&amp;gt; --net0 &amp;lt;virtio|bridge=vmbrX&amp;gt; --cores &amp;lt;#&amp;gt; --sockets &amp;lt;#&amp;gt; --virtio0 local:&amp;lt;storage&amp;gt;:&amp;lt;size&amp;gt;&lt;/code&gt;
Clone a VM
&lt;code&gt;qm clone &amp;lt;source-id&amp;gt; &amp;lt;new-id&amp;gt; --name &amp;lt;name&amp;gt;&lt;/code&gt;
Interacting with Snapshots
&lt;code&gt;qm snapshot|rollback &amp;lt;id&amp;gt; &amp;lt;snapshot-name&amp;gt;&lt;/code&gt;
Interacting with Backup
&lt;code&gt;vzdump &amp;lt;id&amp;gt; --compress &amp;lt;type&amp;gt; --storage&amp;lt;id&amp;gt;&lt;/code&gt;
&lt;code&gt;vzrestore &amp;lt;file&amp;gt; &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;storage&#34;&gt;Storage&lt;/h4&gt;
&lt;p&gt;List storage
&lt;code&gt;pvesh get/storage&lt;/code&gt;
List Storage details
&lt;code&gt;pvesh get/storage/&amp;lt;id&amp;gt;&lt;/code&gt;
Create
&lt;code&gt;pvesh create /storage --storage &amp;lt;id&amp;gt; --type &amp;lt;type&amp;gt; --content &amp;lt;type&amp;gt; --path &amp;lt;path&amp;gt;&lt;/code&gt;
Delete
&lt;code&gt;pvesh delete /storage/&amp;lt;id&amp;gt;&lt;/code&gt;
Change datastore password - I used this once because I changed the root password for PBS.  That password was used to map a datastore into PVE, where it was no longer accessible.  This allowed the map settings to be updated.
&lt;code&gt;root@pve2:~# pvesm set backup --password&lt;/code&gt;
&lt;code&gt;Enter Password: *******&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;lost-password&#34;&gt;Lost password&lt;/h4&gt;
&lt;p&gt;Proxmox allows the administrator to attach to a VM using lxc-attach.  The session is logged in as root.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lxc-attach -n &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is extremely useful - for instance, it could be used to reset a lost administrator password using the &lt;strong&gt;passwd&lt;/strong&gt; command!&lt;/p&gt;
&lt;h2 id=&#34;proxmox-backup-server&#34;&gt;Proxmox Backup Server&lt;/h2&gt;
&lt;p&gt;PBS has saved my bacon several times.  It&amp;rsquo;s a &amp;ldquo;must&amp;rdquo; when running PVE because it&amp;rsquo;s an easy way to backup VMs.&lt;/p&gt;
&lt;p&gt;Follow a 3-2-1 strategy for backups - at least 3 copies, at least two media types, at least one offline.  The original data is the first copy and PBS is the second &lt;em&gt;as long as the PBS VM sits on a seperate server&lt;/em&gt;.  I recommend Backblaze as a third offsite copy.&lt;/p&gt;
&lt;p&gt;You should absolutely review the files that are being backed up to make sure that they include all of the correct files.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also a rule, call it &lt;em&gt;Brent&amp;rsquo;s Law of DR&lt;/em&gt;, that untested disaster recovery never works.  You should do a test restore periodically.  This might be restoring just a sample file, or restoring an entire VM.  Testing the restore process ensures both that the backup is &lt;em&gt;really&lt;/em&gt; working and that you remember the steps necessary to invoke a restore.&lt;/p&gt;
&lt;h3 id=&#34;pbs-setup&#34;&gt;PBS Setup&lt;/h3&gt;
&lt;p&gt;Setting up PBS is about as difficult as setting up PVE.  If you did the one, the other will not be a problem.  The documentation is good, but takes some time to read so here&amp;rsquo;s a quick walkthrough of the actions you&amp;rsquo;ll need to take.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install PBS on a new machine.  I&amp;rsquo;m using an old NUC with a 5TB drive.  &lt;a href=&#34;https://www.proxmox.com/en/downloads&#34;&gt;Download&lt;/a&gt; the image and throw it on &lt;a href=&#34;https://nextpertise.net/posts/210911_distrohoppingwventoy/&#34;&gt;Ventoy&lt;/a&gt;!  This is an easy and obvious setup, so I won&amp;rsquo;t walk you through clicking &amp;ldquo;next&amp;rdquo;.
&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;Danger!&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;Don&amp;rsquo;t install PBS on the PVE it&amp;rsquo;s backing up!  If your Virtual enviroment fails, you don&amp;rsquo;t want it to take backups with it!  If you don&amp;rsquo;t have a suitable old PC, consider a 1L PC based on the modern Celeron.&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;When the process is complete, you can administer PBS from https://BACKUPSERVER:8007.  Login as root and the password you chose during setup.&lt;/li&gt;
&lt;li&gt;Setup a Datastore on PBS.  &amp;ldquo;Add Datastore&amp;rdquo; is found under Datastore on the Proxmox menu.  This will make a local path available for backup use.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/240204_pbsdatastore.png#center&#34; alt=&#34;PBS Datastore Setup&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;p&gt;Setup Pruning to keep the latest backups.  This setup mostly comes down to the crossing point of your budget, paranoia, and available space.  You can specify the number of backups to keep over various timeframes, such as days, weeks, months, and years.  I backup weekly and want to keep a couple backups, but I also keep monthlys as well in case I realize later that I need a restore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the &amp;ldquo;fingerprint&amp;rdquo; using the big &amp;ldquo;show Fingerprint&amp;rdquo; button on the dashboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;pve-setup-to-use-pbs&#34;&gt;PVE Setup to use PBS&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/240204_pbssetup.png#floatright&#34; alt=&#34;PBS setup in PVE&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Back in the PVE environment, go to the server view and select DataCenter &amp;gt; Storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click Add and choose Proxmox Backup Server from the drop-down menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give the backup server an ID and enter in it&amp;rsquo;s IP address.  Use &lt;em&gt;root@pam&lt;/em&gt; as the username, the password you set on PBS and then supply the datastore setup in Step 3 above.  Here&amp;rsquo;s where you&amp;rsquo;ll need to paste in the fingerprint from PBS.  This is also the place where you can fiddle with retention and encryption if needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;setup-backups&#34;&gt;Setup Backups&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/240204_automated_pbs.png#floatsmallleft&#34; alt=&#34;PBS Job setup&#34;&gt;&lt;/p&gt;
&lt;p&gt;The simple way to backup a VM at this point is just to select a VM and choose &amp;ldquo;Backup&amp;rdquo;.  No one remembers to do backups though, so the key is to have them happen automatically.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Still under Datacenter, choose backup and &lt;strong&gt;Add&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To backup all VMs from all PVE instances weekly, use the following settings:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Node &lt;strong&gt;&amp;ndash;All &amp;ndash;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Storage &lt;strong&gt;pbs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Schedule &lt;strong&gt;sun 01:00&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Selection: &lt;strong&gt;Include selected VMs&lt;/strong&gt; or &lt;strong&gt;All&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Send email: &lt;strong&gt;Always&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Send email to:  &lt;em&gt;you@yourdomain.tld&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Mode: &lt;strong&gt;Stop&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, weekly backups should start flowing in.  PBS will deduplicate and make very efficient use of space, so even a 4TB backup drive has been fine for me.&lt;/p&gt;
&lt;h3 id=&#34;restore-a-file&#34;&gt;Restore a file&lt;/h3&gt;
&lt;p&gt;Restores are conducted from the PVE admin screen (http://your-pve-server:8006).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/240210_pbs_screen.png&#34; alt=&#34;PBS Restore Admin Screen&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Under the  Server View Datacenter heading, go to the target server and select the Proxmox Backup Server storage.  Mine is called &lt;em&gt;pbs&lt;/em&gt; in the screenshot.  Because it&amp;rsquo;s attached to the datacenter, that storage shows up under every server.  It&amp;rsquo;s the same thing, so for file recovery just pick a server to work through.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pick the backup that has the file  you&amp;rsquo;d like to restore.  Depending on the backup policy you specified, there will be several copies over a period of time.  If you&amp;rsquo;re restoring because you borked the config last week, for instance, you may need to go back two weeks to find a working copy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you&amp;rsquo;ve found your target, select File Restore.  I know, kind of obvious.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This opens a file viewer that lets you burrow into directories to find your file.  Once selected, choose the Download button to get the file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;restore-a-vm&#34;&gt;Restore a VM&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Under the  Server View Datacenter heading, go to the target server and select the Proxmox Backup Server storage.  Mine is called &lt;em&gt;pbs&lt;/em&gt; in the screenshot.  Because it&amp;rsquo;s attached to the datacenter, that storage shows up under every server and so I&amp;rsquo;m selecting the one under the server that I want to restore to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pick the backup you&amp;rsquo;d like to restore.  Again, there will probably be several copies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you&amp;rsquo;ve found your target, select Restore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you restore, you can select the target PVE instance, the storage on that PVE you want to use, and the VM ID.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can restore it to the existing server, using the existing VM ID, and overwrite the current copy.  You can also choose to restore it to a different ID so that there&amp;rsquo;s a second copy.  That could be useful if you&amp;rsquo;re trying to clone a setup.&lt;/p&gt;
&lt;h2 id=&#34;final-notes&#34;&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;The process of setting this up isn&amp;rsquo;t too confusing.  I find the Proxmox interface takes a little time to develop an intuitive feel, but it&amp;rsquo;s consistent and mades sense.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Distro run-down</title>
      <link>https://nextpertise.net/linux_distros/</link>
      <pubDate>Wed, 01 Oct 2025 20:01:46 -0400</pubDate>
      
      <guid>https://nextpertise.net/linux_distros/</guid>
      <description>&lt;h1 id=&#34;distro-run-down&#34;&gt;Distro run-down&lt;/h1&gt;
&lt;p&gt;This article summarizes my experiences and organizes my thoughts around Linux as of late 2025.  There are a &lt;em&gt;lot&lt;/em&gt; of Linux distributions and I haven&amp;rsquo;t tried to survey the field completely.  In the past I&amp;rsquo;ve tried a wider sample, but for the most part I&amp;rsquo;m currently interested in either Debian-based or immutable ,modern distributions that support tiling.  It&amp;rsquo;s also important that the distribution support my hardware (such as my multi-monitor setup and printer) and standard software.&lt;/p&gt;
&lt;h2 id=&#34;ubuntu-or-mint&#34;&gt;Ubuntu or Mint&lt;/h2&gt;
&lt;p&gt;Both Ubuntu and Mint are Debian-based, which is the environment I&amp;rsquo;m most familiar with.  They&amp;rsquo;re both pretty standard, reliable, and support all my hardware.  They are boring in a good way and thus the yardstick to compare anything else against.&lt;/p&gt;
&lt;p&gt;Why not run one of these choices all the time?  Mint uses Cinnamon as it&amp;rsquo;s desktop, and Cinnamon doesn&amp;rsquo;t (yet) run on Wayland and only supports the crudest tiling.  Wayland is the modern display environment and I want to make sure that I&amp;rsquo;m spending time learning the current technologies.  Tiling works really well with my workflow.  There are Ubuntu versions that support Gnome or KDE, both of which use Wayland and have tiling plugins.  My experience with those plugins is that they&amp;rsquo;re not bad.&lt;/p&gt;
&lt;p&gt;These are not immutable distributions, so they tend to accumulate cruft from past decisions and show age over time.  Both have become more opinionated about packaging and security, which creates situations where I have to work around the peculiarities of the environment (for instance, to load Python libraries).  The software I use is supported in native (DEB) packaging and works well.&lt;/p&gt;
&lt;h2 id=&#34;pop-os&#34;&gt;Pop-OS!&lt;/h2&gt;
&lt;p&gt;(Pop-OS!)[https://system76.com/pop/?srsltid=AfmBOoqbM-J1jVk7iEygYlQ5k4bHjmR0hJbYIQK43a5l4zblIEVkEH1c] 24.04 LTS utilizes an actively developed rust-based Wayland desktop called COSMIC.  COSMIC has a &lt;em&gt;lot&lt;/em&gt; of potential and recently moved from a seventh alpha to Beta.  I think the COSMIC version of tiling is the most developed and most thought out approach and works really well with my workstyle.  Pop is debian-based and supports the software and hardware I use well.&lt;/p&gt;
&lt;p&gt;COSMIC is still a work-in-progress.  The Cosmic store install Enpass via Flatpak by default, and that version doesn&amp;rsquo;t tie in to Firefox well.  If you&amp;rsquo;re using Enpass with Cosmic, install the app version from &lt;a href=&#34;https://enpass.io&#34;&gt;the website&lt;/a&gt;.  I use back-to-back desks and switch between them - it seems to only support one keyboard and mouse at a time.  The Cosmic Beta also has some rough spots and I had to reboot once where the desktop wouldn&amp;rsquo;t accept focus.  That seems to be rare and I&amp;rsquo;m hoping that the splinters are sanded down quickly.  Where Ubuntu tends to freeze a system with each release, Pop-OS has some rolling sensibilities that keep it aggressively updated in between official releases.&lt;/p&gt;
&lt;h2 id=&#34;bluefin-and-aurora&#34;&gt;Bluefin and Aurora&lt;/h2&gt;
&lt;p&gt;(Bluefin)[https://projectbluefin.io/] and (Aurora)[https://getaurora.dev/en] are immutable distros.  This flavor of immutability comes from booting an OCI image with only /home writable.  Software is installed in the user environment using Homebrew or Flatpak, and the operating system is upgraded semi-monolithically (changed bits are downloaded and overlaid on the existing image, but it&amp;rsquo;s functionally an all-in image replacement).&lt;/p&gt;
&lt;p&gt;I love the concept!  For purposes of functionality, the KDE (Aurora) and Gnome (Bluefin) versions are fungible.  I found the system to be rock-solid and I came to see the software installation process as practical.  For the most part, these images allow the user to focus on the work and not on the system.  They both check off boxes as modern, Wayland-based, and support tiling (as much as KDE and Gnome do).  I appreciate the isolation and organization provided by a reliance on Flatpak and an assumption of contianer usage.  If I was going to build a machine for Mom, I&amp;rsquo;d want it to be Chrome-OS like in terms of support and these images are the closest to that experience.&lt;/p&gt;
&lt;p&gt;That said, the cost is that it&amp;rsquo;s difficult to get a customer Brother printer driver installed.  Python is supported via devcontainer, which I found a little bespoke but functional.  There&amp;rsquo;s also a push to support AI in a very specific way - via Ramallama and podman desktop.  In both cases, these approaches worked but felt forced.  One of my primary goals is to use my home environment to learn things to apply at work.  Devcontainer wasn&amp;rsquo;t a big bump, but it was a special case that I don&amp;rsquo;t expect to use professionally.  In the case of AI, I bought a fancy graphics card specifically to play around with self-hosted models and most of the work there is being done in Ollama.  I spent a lot of time trying to understand how others used Ollama and translate that into the Bluefin approach.
I ended up taking one more stab at immutable in the form of &lt;a href=&#34;https://projectbluefin.io/&#34;&gt;Bluefin&lt;/a&gt;.  Bluefin is an opinionated  &amp;ldquo;spin&amp;rdquo; of Silverblue, still using Gnome.  It&amp;rsquo;s aimed more at the cloud-native developer crowd, but the operation of Bluefin is very much like Silverblue.&lt;/p&gt;
&lt;p&gt;Enpass as a Flatpak doesn&amp;rsquo;t seem to integrate with the Firefox plug-in.  While giving Bluefin a shot, I tried installing Enpass within ostree.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /etc/yum.repos.d/
sudo wget https://yum.enpass.io/enpass-yum.repo
sudo rpm-ostree  install enpass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That worked and fixed the Enpass problem!&lt;/p&gt;
&lt;h2 id=&#34;nix&#34;&gt;Nix&lt;/h2&gt;
&lt;p&gt;Nix offers a different vision of immutable computing.  &lt;a href=&#34;https://nixos.org/&#34;&gt;Nix&lt;/a&gt; has a great vision - you can specify the state of your computer  in one file, and basically compile that file into a finished computer.  This allows you to setup the OS and the installed applications.  I think there&amp;rsquo;s a lot of good ideas there, especially in terms of cloud computing and CI/CD delivery.&lt;/p&gt;
&lt;p&gt;That said, a serious dive into Nix-os reveals some real gaps in the current implementation.  The core &amp;ldquo;nix&amp;rdquo; language has been extended through flakes.  Don&amp;rsquo;t know what a flake is?  Good luck finding documentation.  If you have a programming background, you may make more headway on Nix.  I&amp;rsquo;ve found it to be slow going.&lt;/p&gt;
&lt;p&gt;Without using flakes, there&amp;rsquo;s not a good way to specify pulling in things like fonts from shared folders, dot (settings) files, and managing flatpaks.  I really buy into the vision of a fully specified environment, but Nix seems to be an incomplete implementation at this stage.&lt;/p&gt;
&lt;p&gt;Ultimately, I came to see Nix-OS as almost but not fully baked.  There are also periodic stories about personality issues within the community that leave me wondering if I can rely on the Nix eco-system.  As a side-note - I also seriously looked at &lt;a href=&#34;https://snowflakeos.org/&#34;&gt;Snowflake&lt;/a&gt;, which attempts to address some of the rough edges in Nix.  It&amp;rsquo;s still Alpha today, but has promise.  I&amp;rsquo;ll keep an eye on it.&lt;/p&gt;
&lt;h2 id=&#34;omarchy&#34;&gt;Omarchy&lt;/h2&gt;
&lt;p&gt;Just to get this out of the way . . . btw, I use Arch.  &lt;a href=&#34;https://omarchy.org/&#34;&gt;Omarchy&lt;/a&gt; is a very personallized distribution of Arch using Hyprland and built along the ideas of David Heinemeier Hansson (dhh).  Hyprland is a Wayland-based update of i3 - a keyboard-oriented tiling user interface.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m concerned that Arch is going to be a big learning cul-de-sac, but I&amp;rsquo;ve been able to do a tremendous amount without having to dig into Arch-specific issues.  Software installation is setup to &amp;ldquo;just work&amp;rdquo; via the Omarchy menu system and has been golden.  Most of the system configuration is done in dot files using NeoVim.  Text files don&amp;rsquo;t bother me.  I&amp;rsquo;m a &amp;ldquo;nano&amp;rdquo; guy, but I&amp;rsquo;ve been doing okay enough with NeoVim that I haven&amp;rsquo;t tried to change it.&lt;/p&gt;
&lt;p&gt;Omarchy defaults to Chrome, but I was able to install Firefox and switch it to be the default browser.  Other software works great - even Enpass which is becoming my litmus test.  Printing just worked.  Navigation requires a little commitment to learning the most-common keyboard commands, but they&amp;rsquo;re starting to commit to muscle memory (in fact, I&amp;rsquo;ve updated Pop to use the core set for consistency).&lt;/p&gt;
&lt;p&gt;Omarchy delivers on the concept of a workstation that&amp;rsquo;s built for work.  The jury is out about Hyprland - mostly because I&amp;rsquo;m trying to give Cosmic some space to develop.  I&amp;rsquo;ve warmed a little more to the interface everytime I use it and don&amp;rsquo;t have any specific tricks that I&amp;rsquo;ve needed to develop to adapt the system.&lt;/p&gt;
&lt;h2 id=&#34;non-linux-honorable-mentions&#34;&gt;Non-Linux Honorable Mentions&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.haiku-os.org/&#34;&gt;Haiku&lt;/a&gt; isn&amp;rsquo;t a Linux operating system at all, but an open-source descendant of BeOS.  It&amp;rsquo;s a single-user systems and software support is hit and miss, however there&amp;rsquo;s a dev version of Firefox (IceWeasel) available now.  More and more software is available via the web (self-hosted or in the cloud), so that gives a lot of room for Haiku to be used.  File sharing and network printeres aren&amp;rsquo;t things that I&amp;rsquo;ve figured out, and it doesn&amp;rsquo;t check some other boxes (tiling, wayland) and is hard to run on bare metal.  It&amp;rsquo;s a beautiful system worth keeping an eye on.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.redox-os.org/&#34;&gt;Redox&lt;/a&gt; comes from a set of developers that overlap with Pop-OS!  Where COSMIC rustifies the desktop, Redox is an attempt to create a ground-up operating system using Rust.  In fact, COSMIC is used as the DE on top of the base OS.  It&amp;rsquo;s an amazing vision with lots of promise, but the current system isn&amp;rsquo;t ready for daily driving.  Web support is meh and there&amp;rsquo;s not a lot of Redox software available.  Is this a successor to Linux or BSD?  There&amp;rsquo;s good bones, but not a lot of flesh to judge from at this point.&lt;/p&gt;
&lt;h2 id=&#34;ventoy&#34;&gt;Ventoy&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ventoy.net/static/img/screen/screen_bios2.png#floatsmallleft&#34; alt=&#34;Ventoy Menu&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ventoy is an open source project that allows you to copy your ISOs onto a single drive and presents a menu that let&amp;rsquo;s you choose which to boot.  Ventoy can even be used to boot a virtual disk and there&amp;rsquo;s a network version that prompts after PXE-boot.  Ventoy is easy to setup on USB.  Download from the site and there is an included executable called &lt;strong&gt;Ventoy2Disk&lt;/strong&gt; that will setup your drive.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Home Assistant Device Recovery</title>
      <link>https://nextpertise.net/240517_homeassistantrecovery/</link>
      <pubDate>Sat, 18 May 2024 15:09:11 -0400</pubDate>
      
      <guid>https://nextpertise.net/240517_homeassistantrecovery/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The problem&lt;/h2&gt;
&lt;p&gt;Spectrum was in my neighborhood, extending their cable network finally.  Bear in mind that Spectrum (Charter in those days) promised this &amp;ldquo;soon&amp;rdquo; when I first moved in.&lt;/p&gt;
&lt;p&gt;So, anyway, 24 years later they were installing conduit, nicked a power line, and shut down the neighborhood.  As much as I&amp;rsquo;m griping about others, this story is really about personal stupidity.  I setup a bunch of Shelly plugs to work with Home Assistant and didn&amp;rsquo;t lock down their IPs.&lt;/p&gt;
&lt;h2 id=&#34;is-this-really-a-problem&#34;&gt;Is this, really a problem?&lt;/h2&gt;
&lt;p&gt;Yes, it is.&lt;/p&gt;
&lt;p&gt;Devices are added to Home Assistant under settings &amp;gt; devices and then choosing the Add Device button. The Device settings records the MAC, but the IP isn&amp;rsquo;t shown anywhere in Home Assistant that I could find.  For completeness, yes, I googled it as well.  I guess I assumed that the discovery was via MAC, but after the Spectrum reboot my devices all got new addresses from DHCP and all my buttons were broken.&lt;/p&gt;
&lt;p&gt;One way to recover would be to rediscover all the devices and subsequently rebuild all my dashboards and integrations.  I&amp;rsquo;d prefer not to do that.  I didn&amp;rsquo;t label devices before, nor did I write down the original IPs, so that process sounds like work.  I had one device that I &lt;em&gt;did&lt;/em&gt; have an IP for so I tried to change the IP back and was able to verify that using the original IP will fix the integration.&lt;/p&gt;
&lt;h2 id=&#34;i-need-a-map&#34;&gt;I need a map&lt;/h2&gt;
&lt;p&gt;I was able to find my original IPs in the Home Assistant container config files.  From the container host, I used docker to access the host as shown below.  &lt;strong&gt;-i&lt;/strong&gt; is for interactive and &lt;strong&gt;-t&lt;/strong&gt; is for a terminal, with homeassistant being the container name (found via &amp;ldquo;docker ps&amp;rdquo;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker exec -i -t homeassitant bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the container, navigate to /config/.storage and view the &lt;em&gt;core.device_registry&lt;/em&gt; file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd .storage
cat core.device_registry
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The registry is formatted in JSON, but a little searching will turn up the obvious sections that map IPs to MACs (snippet below).&lt;/p&gt;
&lt;p&gt;&amp;ldquo;configuration_url&amp;rdquo;: &amp;ldquo;http://192.168.1.222&amp;rdquo;,
&amp;ldquo;connections&amp;rdquo;: [
[
&amp;ldquo;mac&amp;rdquo;,
&amp;ldquo;d4:d4:da:01:02:03&amp;rdquo;
]
]&lt;/p&gt;
&lt;h2 id=&#34;resetting-ips&#34;&gt;Resetting IPs&lt;/h2&gt;
&lt;p&gt;To fix the situation, I did what I should have done the first time.  I locked down the IPs.  One way would be to set a static IP, but I want to manage this in DHCP.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using PFSense for DHCP, so after logging into PFSense I navigated to &lt;em&gt;Services&amp;gt;DHCP Server&lt;/em&gt;.  At the bottom of the page, under &amp;ldquo;DHCP Static Mappings&amp;rdquo; I clicked the button and filled in the IP and MAC on the next page.  Saving the mapping is the obvious last step.
&lt;img src=&#34;https://nextpertise.net/240519_pfsensedhcp.png&#34; alt=&#34;PFSense DHCP&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/240519_shellypage.png#floatsmallright&#34; alt=&#34;Shelly Page&#34;&gt;
Setting a DHCP record doesn&amp;rsquo;t change the device. To get it to move to the new IP, you&amp;rsquo;ll need to restart it.  One way would be to unplug the device (probably the easy way).  Another way - my method - was to go to Status &amp;gt; DHCP Leases in PFSense and query the MAC to get it&amp;rsquo;s current IP.  Shelly devices have a web interface, so navigating to the device provides a reboot button under settings.  When the device reboots, the integration in Home Assistant will be working!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/20240519_pfsensedhcpstatus.png&#34; alt=&#34;PFSense DHCP Leases&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Turning off Evolution Alarm Notify</title>
      <link>https://nextpertise.net/240324_ean/</link>
      <pubDate>Sun, 24 Mar 2024 16:35:20 -0400</pubDate>
      
      <guid>https://nextpertise.net/240324_ean/</guid>
      <description>&lt;h1 id=&#34;ridding-yourself-of-annoying-calendar-pop-ups-on-linux&#34;&gt;Ridding Yourself of Annoying Calendar Pop-ups on Linux&lt;/h1&gt;
&lt;p&gt;Gnome will prompt for email accounts, and then tie in alerts from your calendar.  These come in as pop-up windows.  If you liked these in Outlook, you&amp;rsquo;ll be pleased with the Linux implementation.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t like these reminders in Outlook.  I feel that too many programs are competing for my attention and that pop-ups in general are a drain on my concentration.  I understand the thought and I understand that it&amp;rsquo;s useful for some, just not for me.&lt;/p&gt;
&lt;p&gt;These days, I have a couple of 4k displays and really like tiling desktops (I&amp;rsquo;m currently using Ubuntu Gnome with the Forge extension).  These pop-ups are doubly annoying in this context because they occupy a slice of screen and completely disrupt what I&amp;rsquo;m working with.&lt;/p&gt;
&lt;h2 id=&#34;what-doesnt-work&#34;&gt;What doesn&amp;rsquo;t work&lt;/h2&gt;
&lt;p&gt;Uninstalling Evolution doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;The next obvious solution would be to turn off the notifications.  In Gnome, opening the control panel shows a &lt;em&gt;notifications&lt;/em&gt; tab where you can turn OFF Evolution Alarm Notify.&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t work. The reminders keep popping up.  This is a &lt;a href=&#34;https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/295&#34;&gt;bug&lt;/a&gt; that goes back several years.&lt;/p&gt;
&lt;p&gt;Removing the calendar file used by Evolution Alarm Nofiy does not work.  In the past, EAN would simply re-create the file at next boot.  That bug seems to be fixed and I&amp;rsquo;ve verified that the calendar file is NOT recreated, however EAN is still popping up.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm ~/.local/share/evolution/calendar/system/calendar.ics 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;what-seems-to-work-april-24&#34;&gt;What seems to work (April &amp;lsquo;24)&lt;/h2&gt;
&lt;p&gt;Add the following line to /etc/xdg/autostart/org.gnome.Evolution-alarm-notify.desktop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NotShowIn=Gnome;&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Adding a user to Ubuntu</title>
      <link>https://nextpertise.net/240226_newuser/</link>
      <pubDate>Mon, 26 Feb 2024 20:56:43 -0500</pubDate>
      
      <guid>https://nextpertise.net/240226_newuser/</guid>
      <description>&lt;p&gt;I built an Ubuntu server for work and then had to add a group of co-workers.  I always need to lookup this up, so hopefully my notes will help you!&lt;/p&gt;
&lt;h2 id=&#34;adding-a-user&#34;&gt;Adding a user&lt;/h2&gt;
&lt;p&gt;Adding a user to Linux is simple enough.  The bash command is &lt;em&gt;useradd&lt;/em&gt;.  For a user bstewart, the commend is shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo useradd bstewart
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;set-password&#34;&gt;Set password&lt;/h2&gt;
&lt;p&gt;One the user is created, they have to be assigned an initial password.  This is done with the &lt;em&gt;passwd&lt;/em&gt; command, which will then prompt for the new password twice (to confirm).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo passwd bstewart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The passwd command can be used by the user later - without sudo - to change their initial password.&lt;/p&gt;
&lt;h2 id=&#34;create-a-home-directory&#34;&gt;Create a Home Directory&lt;/h2&gt;
&lt;p&gt;The last step to to instatiate a home directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkhomedir_helper bstewart
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Github setup</title>
      <link>https://nextpertise.net/240225_github_setup/</link>
      <pubDate>Sun, 25 Feb 2024 14:47:54 -0500</pubDate>
      
      <guid>https://nextpertise.net/240225_github_setup/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Githuboptions.png#floatsmallleft&#34; alt=&#34;Github screenshot&#34;&gt;
Recently I had to rebuild my desktop.  Backups were my friend, and recreating my rig and loading files went without a hitch.  My &lt;em&gt;git&lt;/em&gt; directory restored, but I needed to reconnect them to Github.  I decided to start with fresh pulls, so I renamed &lt;em&gt;git&lt;/em&gt; to &lt;em&gt;oldgit&lt;/em&gt; and pulled down my repos (including the one that&amp;rsquo;s used for this website).&lt;/p&gt;
&lt;p&gt;Once setup, Github is easy to use, but I always forget how to set it up and have to rediscover the process.  Hopefully, this quick step-by-step will help you avoid that difficulty (and will help me the next time I need to do it)!&lt;/p&gt;
&lt;h2 id=&#34;cloning-the-repo&#34;&gt;Cloning the repo&lt;/h2&gt;
&lt;p&gt;In this case, my repos already exist.  I started by cloning from github to have a clean current copy.  I&amp;rsquo;m using this website as an example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/brentstewart/nextpertise.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;setting&#34;&gt;Setting&lt;/h2&gt;
&lt;p&gt;Next I created a personal token.  I clicked my user icon (my smiling face) in the upper right hand corner of the &lt;a href=&#34;https:github.com&#34;&gt;Github&lt;/a&gt; site and chose &lt;em&gt;Settings&lt;/em&gt; (near the bottom).  In the settings menu, choose &lt;strong&gt;&amp;lt;Developer settings&amp;gt;&lt;/strong&gt; at the bottom.  This gets you to a menu that let&amp;rsquo;s you chose &lt;strong&gt;Personal access tokens&lt;/strong&gt;.  I use classic tokens - the &amp;ldquo;fine grained&amp;rdquo; option allows for permisssions and would be more appropriate if there was a team of people maintaining this site.&lt;/p&gt;
&lt;p&gt;At this point, it&amp;rsquo;s as simple as clicking &lt;strong&gt;Generate new token&lt;/strong&gt; and then copying the text string down for later use.
&lt;img src=&#34;https://nextpertise.net/Githubtoken.png#center&#34; alt=&#34;Github token setup&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;git-access-to-github&#34;&gt;Git Access to Github&lt;/h2&gt;
&lt;p&gt;You can test the new setup with an ssh to Github.  You should be prompted for your Github username and then a password.  Use the token from above for the password.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -T git@github.com
Hi brentstewart! You&#39;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Credentials can be saved (so you aren&amp;rsquo;t prompted with each interaction).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git config --global credential.helper store
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;Danger&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;&lt;em&gt;This cute command saves your creds to disk in plain text.  Be careful!&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once the token is setup, push and pull commands should work without forcing your to reauthenticate. A typical workflow of syncing to git might be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &amp;quot;Another commit&amp;quot;
git push&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Biz card</title>
      <link>https://nextpertise.net/231025_bizcard/</link>
      <pubDate>Wed, 25 Oct 2023 21:14:12 -0400</pubDate>
      
      <guid>https://nextpertise.net/231025_bizcard/</guid>
      <description>&lt;p&gt;One of the guys on Jupiter Broadcasting spoke about a curl-able business card and I thought, &amp;ldquo;Gotta try it&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;A little searching led me to an example - the card of &lt;a href=&#34;https://github.com/tallguyjenks/BusinessCard/blob/master/business_card&#34;&gt;Bryan Jenks&lt;/a&gt;.  I used Bryan&amp;rsquo;s work as a template.  Here&amp;rsquo;s what my finished version looks like.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/bizcard.png#floatleft&#34; alt=&#34;My curlable business card&#34;&gt;&lt;/p&gt;
&lt;p&gt;The basic concept is simple enough - put a slug of text on a web server and anyone can curl it.  Following Bryan&amp;rsquo;s example, I&amp;rsquo;m using console escape codes to provide color.  Here&amp;rsquo;s a few I find useful.&lt;/p&gt;




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table: Console escape codes&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Esc&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Effect&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Esc&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Color&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[0m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Plain text&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[30m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Black&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[1m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;bold&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[31m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Red&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[2m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;dim&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[32m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Green&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[4m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;underscore&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[33m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Gold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[5m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;blink&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[34m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Blue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[7m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;reverse&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[35m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Magenta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[36m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cyan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;[37m&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;White&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;You&amp;rsquo;ll notice from the screen shot that I was able to test this with Hugo&amp;rsquo;s built-in server.  I want to deploy this publicly though, so I went to &lt;strong&gt;bit.ly&lt;/strong&gt; and took the long URL &lt;em&gt;&lt;a href=&#34;http://nextpertise.net/business&#34;&gt;http://nextpertise.net/business&lt;/a&gt;_card.text&lt;/em&gt; and shortened it to &lt;em&gt;bit.ly/brentbizcard&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The hardest part of this short project was getting the spacing to work out.  There&amp;rsquo;s no magic, just testing, adjusting, and retesting.  Not the most useful project, but it has a certain geek-cred.  To access the card, just use curl.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sL http://bit.ly/brentbizcard&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>JiraReport</title>
      <link>https://nextpertise.net/231021_jirareport/</link>
      <pubDate>Sat, 21 Oct 2023 11:47:23 -0400</pubDate>
      
      <guid>https://nextpertise.net/231021_jirareport/</guid>
      <description>&lt;p&gt;I recently had a lot of fun building a quick program to pull data from Jira Cloud and produce Word reports.  I&amp;rsquo;ve shared &lt;a href=&#34;https://github.com/brentstewart/jirareport&#34;&gt;jirareport&lt;/a&gt; at Github if you are curious.  If you use Jira, this may be of interest (although most folks who use Jira are well beyond my meager abilities).&lt;/p&gt;
&lt;p&gt;Even if you don&amp;rsquo;t use Jira, this was an interesting experience.  It was a fairly simple re-introduction to Python, something that I&amp;rsquo;ve tried to get started in on-and-off over the years.  Seeing it work though was a huge feeling of empowerment and encourgagement, something I hope you are able to experience (whatever cloud resource you need to use).&lt;/p&gt;
&lt;h2 id=&#34;using-my-tools&#34;&gt;Using my tools&lt;/h2&gt;
&lt;p&gt;My project contains two Python 3 programs - &lt;strong&gt;jirareport&lt;/strong&gt; and &lt;strong&gt;lsFields&lt;/strong&gt;. To run these programs, you&amp;rsquo;ll need the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jira Cloud URL (like &lt;a href=&#34;https://yourcompany.atlassian.com&#34;&gt;https://yourcompany.atlassian.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Your Jira username (like &lt;a href=&#34;mailto:me@mycompany.com&#34;&gt;me@mycompany.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Your Jira API Key.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don&amp;rsquo;t have an API key already&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In Jira, click your picture in the upper right and choose manage account&lt;/li&gt;
&lt;li&gt;In the profile page, choose the Security tab on the top.&lt;/li&gt;
&lt;li&gt;Under Security, go to Create and manage API tokens&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;lsfields&#34;&gt;lsFields&lt;/h3&gt;
&lt;p&gt;This program will take the above input and produce a list of fields and field IDs used in your instance of Jira Cloud. In our instance, we&amp;rsquo;ve added fields and the ID shows as customfield_00000. I&amp;rsquo;m positive that you&amp;rsquo;ll want to change the fields I print in the report, since some of mine are custom. Use this tool to list the fields in your instance and replace the fields that I use.&lt;/p&gt;
&lt;h3 id=&#34;jirareport&#34;&gt;JiraReport&lt;/h3&gt;
&lt;p&gt;This is the one that does the work. JiraReport will take the above inputs plus a JQL query to produce a report. I use the Filters page in Jira Cloud to produce and test my queries as needed, then just paste JQL into the report. Finally, it will ask for an output filename. If you press enter, it will just use jira_report.docx.&lt;/p&gt;
&lt;p&gt;The report includes story keys that are hyperlinks back to the story in Jira Cloud. The Assignee field also displays the persons name and is a hyperlink to their email address.&lt;/p&gt;
&lt;h2 id=&#34;developing&#34;&gt;Developing&lt;/h2&gt;
&lt;p&gt;This is my first really useful program in a few years, since I wrote a program to parse SSH logs a while back.  There are a few things I wanted to note about the experience that may be helpful for you.&lt;/p&gt;
&lt;p&gt;First, ChatGPT was mostly useful.  General web searches came up with a lot of different snippets, but just asking ChatGPT to write the program gave me most of the bones.  I asked ChatGPT for a program to access Jira, for instance, then I asked it for a program to output Word files.  I relied on my hackery to stitch the pieces together.  As I encountered issues, I&amp;rsquo;d ask ChatGPT something like, &amp;ldquo;The above is great, but how would I do it in &lt;em&gt;yellow&lt;/em&gt;?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This is probably significant for this point in time (2023).  A few years ago, places like Stack Overflow were reliably the best places to work through coding issues.  Stack Overflow has become, over time, a less forgivning environment and some questions result in contradictory solutions.&lt;/p&gt;
&lt;p&gt;Vendor documentation used to be filled with examples as well, but I didn&amp;rsquo;t find what I needed from Jira.  I used the open-source Python-docx library and it&amp;rsquo;s great, but I really struggled with understanding how to apply what I found in their documentation.  I don&amp;rsquo;t want that to sound like complaining - I am grateful for the volunteers at Python-docx and the great tool that their providing to the community.  As a beginner, I just found it hard to get started.  I found ChatGPT to be a useful way to bridge the gap in both cases.&lt;/p&gt;
&lt;p&gt;Second, ChatGPT has it&amp;rsquo;s limits.  At certain points, ChatGPT gave me code that just didn&amp;rsquo;t work and I was off to Lemmy or Reddit.  I found that ChatGPT was a pretty good place to start, but you need to be prepared to drop it if you realize it&amp;rsquo;s giving you junk.&lt;/p&gt;
&lt;p&gt;The Python-docx library is a huge gift.  There are some places where I had to spend some time expirimenting to get it to do what I wanted, so be prepared to do some tinkering.  I&amp;rsquo;ve got some good examples in the code that you may want to look at for other projects.  For example, the process of building links took some time to put together, especially when those links are part of a paragraph.&lt;/p&gt;
&lt;p&gt;Finally, my users don&amp;rsquo;t always fill out all fields and the program would fail if the linking information wasn&amp;rsquo;t present which led to the try/except bracketing.  That was a really good lesson in graceful error handling.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>NVidia 5.35 Update</title>
      <link>https://nextpertise.net/230819_nvidia535/</link>
      <pubDate>Thu, 19 Oct 2023 08:32:41 -0400</pubDate>
      
      <guid>https://nextpertise.net/230819_nvidia535/</guid>
      <description>&lt;h1 id=&#34;two-months-ago-i-warned-of-issues-with-the-535-driver&#34;&gt;Two months ago, I warned of issues with the 5.35 driver&lt;/h1&gt;
&lt;p&gt;Since the initial post, I tried 5.35 after a rev and found that it worked well.  Until today.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I used &lt;em&gt;nvidia-smi&lt;/em&gt; this time and was able to see that - although dpkg showed the files installed, the driver wasn&amp;rsquo;t loaded.  I found some instructions from Michael Murphy on [Lemmy.world] that helped to resolve this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt purge ~nnvidia
sudo apt install nvidia-driver-535
sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;keep-this-handy&#34;&gt;Keep this handy&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s definitely something funky about 5.35.  I haven&amp;rsquo;t had this problem before and this machine has been stable for a couple years now.  It&amp;rsquo;s probably a good idea to keep this idea in mind when you install the latest drivers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Technical Debt</title>
      <link>https://nextpertise.net/231002_technicaldebt/</link>
      <pubDate>Mon, 02 Oct 2023 09:59:14 -0400</pubDate>
      
      <guid>https://nextpertise.net/231002_technicaldebt/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m going to wander into some concepts from my day job.  Give me a little room and I&amp;rsquo;ll relate how this insight is relevant to everyone and what I&amp;rsquo;ve learned.  By the time I start to make that turn, though, I&amp;rsquo;m guessing you&amp;rsquo;ll be well ahead of me.&lt;/p&gt;
&lt;h2 id=&#34;technical-debt&#34;&gt;Technical Debt&lt;/h2&gt;
&lt;p&gt;Technical debt is a concept that commonly discussed in IT.  It&amp;rsquo;s generally understood to be the cost of delayed license and hardware upgrades.  For instance, if you&amp;rsquo;re still running Window 10 then at some point you&amp;rsquo;ll need to migrate to Windows 11.  There will be a cost to that upgrade.  Running Windows 10 today means that cost is something you&amp;rsquo;ll have to bear in the future.&lt;/p&gt;
&lt;p&gt;At budget time, IT folks talk about this version of technical debt (future costs of delayed licenses or hardware replacmeents).  Doing some of these needed upgrades is referred to as &amp;ldquo;paying down technical debt&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;gene-kims-revised-definition&#34;&gt;Gene Kim&amp;rsquo;s revised definition&lt;/h2&gt;
&lt;p&gt;Gene Kim, who&amp;rsquo;s written several thoughtful books on IT management including &lt;a href=&#34;https://www.amazon.com/The-Phoenix-Project-audiobook/dp/B00VATFAMI/ref=sr_1_4?crid=3G15KXSXD13CK&amp;amp;keywords=gene+kim&amp;amp;qid=1697910897&amp;amp;sprefix=gene+kim%2Caps%2C189&amp;amp;sr=8-4&#34;&gt;&lt;em&gt;The Phoenix Project&lt;/em&gt;&lt;/a&gt;, wrote about technical debt in a slightly different way.  He wrote that technical debt is the total future costs you are committed to based on current decisions.  The two are similar at a surface level, but Kim&amp;rsquo;s idea gets to a deeper truth.&lt;/p&gt;
&lt;p&gt;I know that several of you thought about ways to avoid that Windows 10 debt.  If you thought about Linux, I approve.  But there&amp;rsquo;s still costs.  There are costs involved with learning something new (in time and perhaps money), there are opportunity costs with not being able to conveniently use Windows stuff.&lt;/p&gt;
&lt;p&gt;Kim&amp;rsquo;s definition gets at this &lt;em&gt;total&lt;/em&gt; costs - actual outlay to vendors, commitments of time, and associated costs.  It also speaks to the ongoing costs of not upgrading - maybe security risks or incompatibilities - as well as the normal costs of operation.  Normal costs of operation for Windows include things like &amp;ldquo;blue screens of death&amp;rdquo;, ongoing privacy impingement, and troubleshooting.&lt;/p&gt;
&lt;p&gt;The typical definition - future license and hardware costs - assumes that technical debt is something to be avoided and that larger technical debt is a sign of underinvestment.  Kim&amp;rsquo;s definition - future total costs of today&amp;rsquo;s commitments - speaks to a larger truth that every decision, good or bad, carries some consequences and that larger technical debt is actually just a deeper understanding of those commitments.&lt;/p&gt;
&lt;p&gt;Both definitions have a place in IT discussions.  Kim&amp;rsquo;s is not limited to budget time, though, and speaks to a larger self-awareness.&lt;/p&gt;
&lt;h2 id=&#34;likewise&#34;&gt;Likewise&lt;/h2&gt;
&lt;p&gt;And here&amp;rsquo;s the turn you saw coming.  Technical debt is something we all have to face and think about.&lt;/p&gt;
&lt;p&gt;Imagine you purchase the car of your dreams.  This purchase makes you unbelievably happy!  Still, you have incurred technical debt (and not just the monthly payment kind).  Purchasing a car means that you need to budget for gas.  It means that at some point you&amp;rsquo;ll need to make repairs on the car, or have someone do that upkeep for you.  It means you&amp;rsquo;ll need time on Saturday&amp;rsquo;s to wash the darn thing!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re taught that debt is bad and I&amp;rsquo;m not going to disagree.  This philosophical kind of debt is basically a consequence of living.  It&amp;rsquo;s not so much about avoiding it, which is impossible, as managing it.&lt;/p&gt;
&lt;h2 id=&#34;managing-technical-debt&#34;&gt;Managing Technical Debt&lt;/h2&gt;
&lt;p&gt;So, how does one manage it?  This section gets into my opinion, so be warned.&lt;/p&gt;
&lt;p&gt;The most important outcome of this discussion is just being aware and thinking through the logical consequences of our decisions.  Your decisions today might mean that you&amp;rsquo;ll need to know a new language, need to learn a new skill, or need to spend money in the future.  Being aware of those commitments, listing them out and thinking about them, gives us the chance to deal with them proactively.  Generally, I&amp;rsquo;ve found that anticipating issues and dealing with them early is cheaper than waiting for &amp;ldquo;Boom!&amp;rdquo; and scrambling.&lt;/p&gt;
&lt;p&gt;For example, if you purchased a car you&amp;rsquo;re going to have to repair something at some point.  If you want to do that yourself, you&amp;rsquo;re going to need tools and know-how.  Today might be a good time to visit Autozone or to register for a community college class.&lt;/p&gt;
&lt;p&gt;Technical debt is a part of life and largely beyond our control.  However, we can typically choose the type of repayment.  In the car example, we can balance monetary costs, time commitments, and other costs.  One might purchase a used car to save money, and choose to do as many repairs as possible at home.  A different person might find that their time at work allows them to earn more money than they&amp;rsquo;d spend on repairs, and might choose to start saving.  Spending money for durability is another example of this same concept.&lt;/p&gt;
&lt;p&gt;All this discussion of debt does require one last thought.  The point of living is to &lt;em&gt;live&lt;/em&gt;!  Don&amp;rsquo;t let this discussion keep you from doing the things the add value to your life and your family.  Things that have value, some of which can be frivilous, give life meaning.  Just choose those things wisely and understand the natural consequences of your decisions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Building a Home Web Dashboard</title>
      <link>https://nextpertise.net/230930_dashboards/</link>
      <pubDate>Sat, 30 Sep 2023 11:29:45 -0400</pubDate>
      
      <guid>https://nextpertise.net/230930_dashboards/</guid>
      <description>&lt;h1 id=&#34;home-dashboards&#34;&gt;Home Dashboards&lt;/h1&gt;
&lt;p&gt;Home web dashboards serve as a &amp;ldquo;starting point&amp;rdquo; for web sessions.  Especially as a certain portion of applications now reside online, a home dashboard is a customized menu of the things that you need presented in the way you want.  Dashboards could be as simple as a collection of links, or include things like network and server statistics or embedded frames.&lt;/p&gt;
&lt;p&gt;Hosting your own dashboard also reduces internet traffic, limits the public data footprint (particularly if you are using it to access local resources), and creates resiliancy (in the sense that local services are still easily accessible if the Internet connection is down).&lt;/p&gt;
&lt;p&gt;I have had a hand-coded homepage running on Apache for a long time.  I recently tried out some options in Docker and wanted to share the experience.&lt;/p&gt;
&lt;h3 id=&#34;setting-homepage&#34;&gt;Setting homepage&lt;/h3&gt;
&lt;p&gt;Before we get into the actual options, we&amp;rsquo;ll need a brief aside on how to actually have a default page.  Browsers used to have a &amp;ldquo;homepage&amp;rdquo; setting that showed a certain site whenever a new window opened.  Over time, browsers have wanted to &amp;ldquo;feature&amp;rdquo; their own content and brand and have made it harder to set a starting point.  Browsers change frequently, so these instructions are current as of late 2023.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;Chrome&lt;/strong&gt; - Google has rolled out a new &lt;a href=&#34;https://www.theregister.com/2023/09/07/google_privacy_sandbox/&#34;&gt;&amp;ldquo;Privacy Sandbox&amp;rdquo;&lt;/a&gt; that makes it easier for them to target ads and harder for you to avoid profiling.  The best option is to &lt;a href=&#34;https://www.mozilla.org/en-US/firefox/all/&#34;&gt;use another browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Meanwhile, when it comes to refuting the concepts of privacy and private ownership, &lt;strong&gt;Edge&lt;/strong&gt; says, &amp;ldquo;Hold my beer&amp;rdquo;.  Again, the best option is to avoid the problem.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230930_firefoxhomepage.png#floatleft&#34; alt=&#34;Mozilla settings&#34;&gt;
Mozilla is a little bit of a journey sometimes, but I&amp;rsquo;ve settled on Firefox as a browser that performs well and respects privacy.  To set a homepage, go to &lt;em&gt;settings &amp;gt; home&lt;/em&gt; and there&amp;rsquo;s a place to set the homepage.  Even Firefox wants to land you on a page they control though - this setting only works for new windows and clicking the &amp;ldquo;home&amp;rdquo; button.  Under &amp;ldquo;New Tabs&amp;rdquo; the only options are &lt;em&gt;blank page&lt;/em&gt; and &lt;em&gt;Firefox Home (Default)&lt;/em&gt;.  In the good old days, you could pick your own default!  To fix this I use the &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/new-tab-override/&#34;&gt;&lt;em&gt;New Tab Override&lt;/em&gt;&lt;/a&gt; extension.&lt;/p&gt;
&lt;div class=&#34;admonition note&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;tip&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;See this &lt;a href=&#34;https://nextpertise.net/posts/230226_home/&#34;&gt;old post&lt;/a&gt; to see why my homepage is set to &lt;a href=&#34;https://www.home.arpa&#34;&gt;www.home.arpa&lt;/a&gt;&amp;hellip;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;byo&#34;&gt;BYO&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230930_handcodedhomepage.png#floatright&#34; alt=&#34;Hand coded&#34;&gt;
The first option is to Build Your Own.  This is the option I&amp;rsquo;ve traditionally used.  Running an Apache server is pretty easy, and I use my home environment as a training area so this forces me to understand the basics of Apache and HTML.  Since I&amp;rsquo;m a router guy, I don&amp;rsquo;t get up to Layer 7 unless forced, so it&amp;rsquo;s a good way to force myself to be more technically rounded.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using VS Code to write basic HTML and CSS (with flexboxes to space things out).  I might delve into that setup in a seperate article.  This has the advantage of being a teaching tool and being reasonably easy to maintain.  It doesn&amp;rsquo;t include any dynamic elements and it&amp;rsquo;s not the smoothest presentation.&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;be careful!&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;The easiest way to create icons for links is to refer to the host site&amp;rsquo;s image.  For instance, you can right click on &amp;ldquo;Nextpertise&amp;rdquo; above and choose &lt;em&gt;get image link&lt;/em&gt; and then refer to the image &lt;a href=&#34;https://nextpertise.net/nextpertise_rays.png&#34;&gt;https://nextpertise.net/nextpertise_rays.png&lt;/a&gt;.  If you do this, the site owner and others will see you pulling the image.  For instance, the sites your linking to may show up in your companies logging if you open your homepage while on VPN.&lt;/div&gt;
&lt;/div&gt;
&lt;img src=&#34;https://nextpertise.net/230930_homepage.png#floatleft&#34; alt=&#34;Homepage&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;homepage&#34;&gt;Homepage&lt;/h2&gt;
&lt;p&gt;Homepage is a slick home dashboard that is available on Github.  The dashboard features integrations and dynamic widgets for a lot of different services, like pi-hole and proxmox, and it can pull in information from different providers. I installed it via docker using a &lt;em&gt;docker-compose.yml&lt;/em&gt; file that looks lie this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;quot;3.3&amp;quot;
services:
  homepage:
    image: ghcr.io/benphelps/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - /home/brent/homepage:/app/config # Make sure your local config directory exists
      - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods
    restart: always
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Homepage is easy to install.  In the example, you can see that I&amp;rsquo;ve started to customize it and I was able to quickly approximate my old bespoke page.  Homepage is configured by editing some YAML files, so it&amp;rsquo;s fairly easy to setup.  It&amp;rsquo;s tedious, but not as bad as typing raw HTML.  The container includes the web server, so this is really easy to fire up and use.&lt;/p&gt;
&lt;p&gt;I liked Homepage.  It&amp;rsquo;s performant, includes some dynamic status elements that I find valuable and would be hard to recreate by hand, and the documentation is reasonably good.  Integrating webpage icons has been a little of a challenge, but setting up the pi-hole integration (for instance) was very straightforward.  Moreover, it&amp;rsquo;s pretty.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230930_dashy.png#floatright&#34; alt=&#34;Dashy&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;dashy&#34;&gt;Dashy&lt;/h2&gt;
&lt;p&gt;Dashy is another home dashboard, published on Github, that can be easily stood up via Docker.  I found Dashy to be the prettiest option.  Once the container is setup, Dashy is fully ready to go.&lt;/p&gt;
&lt;p&gt;Customization is done via the UI to edit JSON.  I&amp;rsquo;m not a big fan of editing JSON, but I can navigate it.  However, I also found that Dashy sometimes honored my edits and sometimes lost them.&lt;/p&gt;
&lt;p&gt;Dashy has a wide variety of really cool ways of grabbing a home page icon, but most of them will go out and grab the file from the website each time the page loads (remember the earlier tip!).  I ended up referencing the icon files from my exisitng web server to solve the problem.  Re-typing the same content when it was lost got tiresome though, and I ultimately left my time with Dashy feeling a little frustrated.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the docker command to deploy dashy.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run -p 8080:80 lissy93/dashy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;home-assistant&#34;&gt;Home Assistant&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll add a fourth option, although I think it&amp;rsquo;s only going to be best in certain situations.  Consider using Home Assistant to build your home dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230930_homeassistant.jpeg#floatright&#34; alt=&#34;Home Assistant&#34;&gt;&lt;/p&gt;
&lt;p&gt;Home Assistant is awesome and you &lt;em&gt;should&lt;/em&gt; run it in your home.  It&amp;rsquo;s a great way to consolidate a lot of IP-attached devices.  You can build a dashboard to control them, you can build automations (such as having lights come on at sundown), and you can pull many devices together to create &amp;ldquo;scenes&amp;rdquo;.  A scene might be just area lighting to create ambiance for an intimate dinner, for instance, and then anther scene could be &lt;em&gt;all&lt;/em&gt; the lights on for cleaning up.&lt;/p&gt;
&lt;p&gt;You can use Home Assistant&amp;rsquo;s dashboard to embed web links.  I was able to use the Markdown card to add a group of links and include images.  There&amp;rsquo;s also a card to embed a webpage into your dashboard, and integrations for things like monitoring a pi-hole or proxmox server.&lt;/p&gt;
&lt;p&gt;Setting up Home Assistant using docker looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker run -d   --name homeassistant   --privileged   --restart=unless-stopped   -e TZ=EST   -v /PATH_TO_YOUR_CONFIG:/config   --network=host   ghcr.io/home-assistant/home-assistant:stable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Home Assistant is fairly easy to setup and would allow integration with IoT controls.  I found that the card system eats up a lot of screen real estate and it would be hard to have a lot of links, but this is a nice middle ground between something like homepage and building your own.&lt;/p&gt;
&lt;p&gt;Obviously HA can be uber-customized.  The screenshot on the right is from their example page and there are a lot of ideas on here that I don&amp;rsquo;t know how to recreate.  You can really make this dashboard sing, so take a look at their example pages.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;My first conclussion is that these were all pretty easy to setup and test.  So I&amp;rsquo;d suggest you give them a try and see what you think.  As for me, I really like where Dashy is going but found it frustrating in it&amp;rsquo;s current state.  Using Home Assistant as a start page was tough because it didn&amp;rsquo;t give me a lot of control over layout and didn&amp;rsquo;t support a lot of density, but I could see how this could be the right option.  Homepage seems good, but I think for now I&amp;rsquo;ll continue to hand code it to get that experience.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Markdown to DOCX</title>
      <link>https://nextpertise.net/230922_markdown_to_docx/</link>
      <pubDate>Fri, 22 Sep 2023 08:17:00 -0400</pubDate>
      
      <guid>https://nextpertise.net/230922_markdown_to_docx/</guid>
      <description>&lt;h1 id=&#34;exporting-markdown&#34;&gt;Exporting Markdown&lt;/h1&gt;
&lt;p&gt;Most of my writing is in markdown in two applications - Visual Studio Code (where I write blog posts amoung other things) and Obsidian.  Although initially reluctant, I&amp;rsquo;ve grown to appreciate the portability and easy reuse that markdown allows.  The problem is that the rest of the world doesn&amp;rsquo;t always appreciate what is obvious to me.  As an example, the folks at work prefer their documents in Office formats.&lt;/p&gt;
&lt;h2 id=&#34;office-to-obsidian&#34;&gt;Office to Obsidian&lt;/h2&gt;
&lt;p&gt;One of the things I love about markdown is that it&amp;rsquo;s an easy format to migrate to and from, perhaps because it&amp;rsquo;s a simple format.  I wrote about an automated process to take Word documents, convert them to markdown, and incorporate them into your Obsidian vault in &lt;a href=&#34;https://nextpertise.net/posts/230509_word2obsidian/&#34;&gt;Word to Obsidian with a DIY CI&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;obsidian-to-word&#34;&gt;Obsidian to Word&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/ObsPandoc.png#floatleft&#34; alt=&#34;Pandoc Plugin&#34;&gt;
The techniques I used in the above article &lt;em&gt;could&lt;/em&gt; be used for any type of file format changes, but exporting from Obsidian isn&amp;rsquo;t always to DOCX and isn&amp;rsquo;t always aimed at a particular directory.  In fact, if you are using O365 then it may need to be uploaded to an arbitrary place on OneDrive/Sharepoint in a seperate step.  Instead, I&amp;rsquo;ve found the best method to be the &lt;a href=&#34;https://github.com/OliverBalfour/obsidian-pandoc&#34;&gt;Pandoc Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Obsidian, go to &lt;em&gt;options&lt;/em&gt; (the cog in the lower right), then to _Community Plugins&amp;quot; and search for Pandoc.  This presents an &amp;ldquo;install&amp;rdquo; button, which adds the plugin to your vault and it can then be enabled.  Don&amp;rsquo;t forget to enable it!  I do that sometimes and then wonder why it&amp;rsquo;s not working.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found that the plugin exposes Pandoc options pretty well and that default settings work well (I&amp;rsquo;ve mostly used it to export to DOCX and PDF).  There are options to supply default formating to the document, but they&amp;rsquo;re not necessary.&lt;/p&gt;
&lt;h2 id=&#34;hugo-markdown-to-word&#34;&gt;Hugo Markdown to Word&lt;/h2&gt;
&lt;p&gt;Other sources of markdown files, such as those from Hugo or Github, can be converted using Pandoc on the commandline.  The issue here is that Hugo files typically include embedded images, and the images are specified based on where the image ends up after compilation.  When you run &lt;em&gt;hugo&lt;/em&gt; it takes the markdown directories and produces a set of html files in a new structure.  On this blog, my images are refrenced at the &amp;ldquo;root&amp;rdquo; pre-compilation, for instance &amp;ldquo;/image.png&amp;rdquo;, alongside the written content.  In the on-disk structure (and you can see this in the github) my writing is under &amp;ldquo;/post/file.md&amp;rdquo; and the images are under &amp;ldquo;/static/image.png&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;When Pandoc runs against the raw Hugo markdown, it just references the path and produces compilation errors.  I also use CSS to style images, which modifies the URL (for instance &amp;ldquo;/image.png#floatright&amp;rdquo;).  The CSS markings are also lost on Pandoc and will cause errors. There are three ways to deal with this.  The first is to manually edit the markdown to remove the image or correct the path.  Options two and three involve a pre-processor, a piece of lua code that Pandoc runs mid-conversion.  Option two is to use a lua pre-processor to remove all images.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brent@hyper &amp;gt; cat filterimagesinpandoc.lua 
function Image () return {} end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Option three is to use a lua pre-processor to correct the path and remove the styling.  No code demonstrated here because I use option 2 and the code would depend on your directory structure.&lt;/p&gt;
&lt;p&gt;The final trick to converting markdown - Hugo, Obsidian, or any other - is to understand that Pandoc expects markdown to begin with a YAML header.  That header can be as simple as an authors name.  The YAML ends with a line of three dashses.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;author: Brent
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pandoc will fail if it doesn&amp;rsquo;t see that YAML header.  Most Hugo files and most Obsidian files are going to include that header, so you should be okay.  Pandoc also gets confused if it sees three dashes on a line later in the file.  I used that to generate a seperator line in Obsidian and caused Pandoc to blow up.  Make sure that there is at least a primitive YAML header AND that there&amp;rsquo;s only one line of three dashes.&lt;/p&gt;
&lt;p&gt;Converting ends up looking like this.  This command specifies the source (markdown.doc), the output file and format (Word.docx) and the filter.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pandoc ~/Folder/markdown.md -o Word.docx --lua-filter filterimagesinpandoc.lua
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So rock on with Markdown and convert to Word as you need to live with the normies.  Hope this helps!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gnome Activities Workspace Name Extension</title>
      <link>https://nextpertise.net/230917_activities_workspace_name/</link>
      <pubDate>Sun, 17 Sep 2023 14:34:35 -0400</pubDate>
      
      <guid>https://nextpertise.net/230917_activities_workspace_name/</guid>
      <description>&lt;h1 id=&#34;cool-extension&#34;&gt;Cool Extension&lt;/h1&gt;
&lt;p&gt;The &lt;strong&gt;Activities Workspace Name&lt;/strong&gt; allows you to change the &amp;ldquo;Activities&amp;rdquo; label in the top left of a Gnome desktop to reflect a name for each workspace.  I find it really useful.&lt;/p&gt;
&lt;p&gt;My current setup is to use workspaces to seperate the different types of activities, so I have one for work, one for writing, one for development, and one for learning.  I have a 4K display, run Pop! tiling or use that tiling extension in Gnome, and use the to left corner to flip desktops. Maybe I&amp;rsquo;m a little too obsessive, but I&amp;rsquo;ve wanted a way to label those spaces to make them easy to identify.&lt;/p&gt;
&lt;p&gt;I found this extension, available on the &lt;a href=&#34;https://extensions.gnome.org/extension/5311/activities-workspace-name&#34;&gt;Gnome extension site&lt;/a&gt; and at &lt;a href=&#34;https://github.com/ahmafi/gnome-activities-workspace-nam&#34;&gt;Github&lt;/a&gt;, and it does a great job of filling this gap.  Below is a sample with the Workspace label applied (I zoomed in):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/WorkspaceLabel.png#floatsmallright&#34; alt=&#34;Sample&#34;&gt;&lt;/p&gt;
&lt;p&gt;The easy way to add the extension is to go to the &lt;a href=&#34;https://extensions.gnome.org&#34;&gt;gnome extension site&lt;/a&gt; and enable it.  There are two ways to set workspace names: long clicking on the label or via command line.  Long clicking I eventually got to work, sometimes.  Sometimes a long click is results in showing all the workspaces, but this may be an artifact of runnign on Pop!.  Option #2, which is easy and always works for me, is to set it via the command line.  Here&amp;rsquo;s the command I use to name my four workspaces.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gsettings set org.gnome.desktop.wm.preferences workspace-names &amp;quot;[&#39;Work&#39;, &#39;Writing&#39;, &#39;Dev&#39;,&#39;Learning&#39;]&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;a-lament&#34;&gt;A lament&lt;/h1&gt;
&lt;p&gt;Extensions on Gnome have recently been in better shape.  There was a long time where I found them to be a problem.  My understanding is that Gnome changed pieces of the environment between versions which tended to break extensions.  It seems like the last year or so has been a good period, even with a couple versions of Gnome revving.  However, word is that Gnome 45 will break every extension.  Will this one be updated, or any of the other extensions I&amp;rsquo;ve built my workflow around?&lt;/p&gt;
&lt;p&gt;I ran Cinnamon for a long time and really liked it.  It was very stable, easy, and attractive.  I spent a little time bouncing around between KDE and Gnome (and really liked KDE better), then discovered tiling in i3 and started trying to incorporate that into a richer DE.  Pop! came out about that time and settled the issue and has been a dream for years.  Pop! is creating their own DE for the next version, Gnome is back to breaking things, and KDE is undergoing a major version shift (to 6) in February 2024, so I may be in for another of those periods of flitting between desktops.  The winner, for me, will be the one that enables the workflow I&amp;rsquo;ve become used to - easy and automated tiling and easy access to multiple desktops.&lt;/p&gt;
&lt;p&gt;None of that discussion takes anythig away from the Workspace Name extension, which has been a good fit and stable addition to my desktop.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Terminal Weather</title>
      <link>https://nextpertise.net/230910_terminal_weather/</link>
      <pubDate>Sun, 10 Sep 2023 19:45:03 -0400</pubDate>
      
      <guid>https://nextpertise.net/230910_terminal_weather/</guid>
      <description>&lt;p&gt;I found a fun addition to my command line - wttr.in.  I live in Hickory, NC, and the following curl command will return the weather to the command line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl &#39;https://wttr.in/Hickory%20NC&#39;?0?A?u
Weather report: Hickory NC

  _`/&amp;quot;&amp;quot;.-.     Thunderstorm in vicinity, light rain
    ,\_(   ).   68 °F          
    /(___(__)  ↓ 2 mph        
      ⚡‘‘⚡‘‘  9 mi           
      ‘ ‘ ‘ ‘   0.0 in  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seeing a three day forcast is even easier.
curl &amp;lsquo;&lt;a href=&#34;https://wttr.in/Hickory%20NC&#39;&#34;&gt;https://wttr.in/Hickory%20NC&#39;&lt;/a&gt;
Weather report: Hickory NC&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  _`/&amp;quot;&amp;quot;.-.     Thunderstorm in vicinity, light rain
    ,\_(   ).   68 °F          
    /(___(__)  ↓ 2 mph        
      ⚡‘‘⚡‘‘  9 mi           
      ‘ ‘ ‘ ‘   0.0 in         
                                                      ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  Sun 10 Sep ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│               Fog            │               Overcast       │    \  /       Partly cloudy  │     \   /     Clear          │
│  _ - _ - _ -  68 °F          │      .--.     71 °F          │  _ /&amp;quot;&amp;quot;.-.     +77(80) °F     │      .-.      +73(77) °F     │
│   _ - _ - _   ↓ 3-4 mph      │   .-(    ).   ↙ 3-4 mph      │    \_(   ).   ← 1-2 mph      │   ― (   ) ―   ↓ 1-4 mph      │
│  _ - _ - _ -  6 mi           │  (___.__)__)  6 mi           │    /(___(__)  6 mi           │      `-’      6 mi           │
│               0.0 in | 0%    │               0.0 in | 0%    │               0.0 in | 0%    │     /   \     0.0 in | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                      ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  Mon 11 Sep ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│    \  /       Partly cloudy  │     \   /     Sunny          │    \  /       Partly cloudy  │  _`/&amp;quot;&amp;quot;.-.     Patchy rain po…│
│  _ /&amp;quot;&amp;quot;.-.     68 °F          │      .-.      +82(84) °F     │  _ /&amp;quot;&amp;quot;.-.     +77(80) °F     │   ,\_(   ).   71 °F          │
│    \_(   ).   ↘ 2-3 mph      │   ― (   ) ―   ↑ 3-4 mph      │    \_(   ).   ↓ 3-6 mph      │    /(___(__)  ↘ 3-7 mph      │
│    /(___(__)  6 mi           │      `-’      6 mi           │    /(___(__)  6 mi           │      ‘ ‘ ‘ ‘  6 mi           │
│               0.0 in | 0%    │     /   \     0.0 in | 0%    │               0.0 in | 0%    │     ‘ ‘ ‘ ‘   0.0 in | 82%   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                      ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  Tue 12 Sep ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│     \   /     Sunny          │     \   /     Sunny          │  _`/&amp;quot;&amp;quot;.-.     Patchy rain po…│  _`/&amp;quot;&amp;quot;.-.     Patchy rain po…│
│      .-.      71 °F          │      .-.      +84(86) °F     │   ,\_(   ).   68 °F          │   ,\_(   ).   68 °F          │
│   ― (   ) ―   → 2-3 mph      │   ― (   ) ―   ↗ 4-5 mph      │    /(___(__)  ↘ 4-9 mph      │    /(___(__)  ↘ 6-13 mph     │
│      `-’      6 mi           │      `-’      6 mi           │      ‘ ‘ ‘ ‘  5 mi           │      ‘ ‘ ‘ ‘  5 mi           │
│     /   \     0.0 in | 0%    │     /   \     0.0 in | 0%    │     ‘ ‘ ‘ ‘   0.0 in | 60%   │     ‘ ‘ ‘ ‘   0.0 in | 73%   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
Location: Hickory, Catawba County, North Carolina, United States [35.7333312,-81.3442915]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also go to this web page to see the forcast as a graphic file: &lt;a href=&#34;https://wttr.in/hickory+nc.png&#34;&gt;https://wttr.in/hickory+nc.png&lt;/a&gt;
&lt;img src=&#34;https://nextpertise.net/hickory+nc.png&#34; alt=&#34;Hickory Weather&#34;&gt;&lt;/p&gt;
&lt;p&gt;All well and good, but that&amp;rsquo;s a complicated command to remember.  I know, that&amp;rsquo;s what the up-arrow and &lt;em&gt;history&lt;/em&gt; are for, but still there needs to be an easier way.  I created two aliases to let me easily see the current and three day forcast.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias weather=&amp;quot;curl &#39;https://wttr.in/Hickory%20NC&#39;?m&amp;quot;
alias forcast=&amp;quot;curl &#39;https://wttr.in/Hickory%20NC&#39;?0?A?u?m&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;alias&lt;/strong&gt; will remain in place for that session.  If you use BASH and want to make that permanently available, add the alias command into .bashrc.  You can also add one of those alias at the end of ,bashrc to have it automatically display your current conditionsa and forcast every time you start a session - I&amp;rsquo;ve found &lt;em&gt;forecast&lt;/em&gt; works pretty well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Python on Pop</title>
      <link>https://nextpertise.net/230909_python_on_pop/</link>
      <pubDate>Sat, 09 Sep 2023 21:58:42 -0400</pubDate>
      
      <guid>https://nextpertise.net/230909_python_on_pop/</guid>
      <description>&lt;p&gt;In the course of building out a small program the other day, I realized that my version of Python was lagging behind.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -V
Python 3.8.17
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;my-setup&#34;&gt;My setup&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;m running Pop! OS 22.04, the latest version of Pop! for a while.  Pop! currently uses Gnome with add-ins to customize the interface and deliver the tiled experience that Pop! is known for.  Extensions have been a bugaboo for Gome for a long time (although recently - 2023 - they&amp;rsquo;ve gotten better, but I understand Gnome 45 breaks them &lt;em&gt;all&lt;/em&gt; again).  Word trickled out that System 76 had difficulties in working with the Gnome team as well.  In 2022, System 76 decided to pursue their own Rust-based desktop environment as a replacement for Gnome.  In order to free up resources, they decided to maintain 22.04 and to not build interim releases.&lt;/p&gt;
&lt;p&gt;Despite the fact that I&amp;rsquo;ve been running the same release for a couple years, Pop! continues to be my favorite experience.  System 76 has pushed updates out and I&amp;rsquo;ve commented several times that the kernel is fresh and the components are kept current so Pop! still feels like a good place.  I&amp;rsquo;ve historically been a hopper and staying on one distro for a prolonged period of time is a change.  That said, finding out Python was several versions behind was a moment.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m very interested in Nix, as an aside.  I&amp;rsquo;ve got Nix installed on a laptop and loaded the System 76 tiling extension.  Nix has a lot going for it, but I&amp;rsquo;m still try to learn flakes and Home Manager and don&amp;rsquo;t feel ready to put this on my main device.  The laptop is a place I can &amp;ldquo;burn and rebuild&amp;rdquo;.  Still, if I start hopping again, it will be to go to Nix.&lt;/p&gt;
&lt;h1 id=&#34;updating-python-on-pop-os-2204&#34;&gt;Updating Python on Pop! OS 22.04&lt;/h1&gt;
&lt;p&gt;I used &lt;strong&gt;python -V&lt;/strong&gt; or &lt;strong&gt;python &amp;ndash;version&lt;/strong&gt; to determine my current version.  To move to the latest Python, 3.10, I added the PPA for Python.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you can check this by looking at the installed packages.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt list | grep python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, both 3.8 and 3.10 were installed on my system.  I used &lt;strong&gt;sudo update-alternatives &amp;ndash;config python3&lt;/strong&gt; to select the version that I wanted to use by default.  Running the command will show you a list of python installs and allow you to select one.    Using &lt;strong&gt;update-alternatives&lt;/strong&gt; instead of deleting Python 3.8 maintains the old version for any dependencies. When I used it, I found I had a copy of &lt;em&gt;miniconda&lt;/em&gt; that I no longer needed and I ended up uninstalling it.&lt;/p&gt;
&lt;p&gt;I also like to be able to type &lt;strong&gt;python3&lt;/strong&gt; or just &lt;strong&gt;python&lt;/strong&gt;.  To set that up, I added an alias as well.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias python /usr/bin/python3.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So now I&amp;rsquo;m up to date!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You may also need to update PIP.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3.10 -m  pip install --upgrade pip&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Ahrefs update</title>
      <link>https://nextpertise.net/230904_ahrefs_update/</link>
      <pubDate>Mon, 04 Sep 2023 08:43:45 -0400</pubDate>
      
      <guid>https://nextpertise.net/230904_ahrefs_update/</guid>
      <description>&lt;p&gt;I wrote about &lt;a href=&#34;https://nextpertise.net/posts/230731_ahrefs&#34;&gt;Ahrefs&lt;/a&gt; a month ago.  Ahrefs is a site inspector that provides feedback on errors on a website.  I contine to use it and be pleased with it.&lt;/p&gt;
&lt;h2 id=&#34;ahrefs-after-a-month&#34;&gt;Ahrefs after a month&lt;/h2&gt;
&lt;p&gt;As this site has grown, I&amp;rsquo;ve encountered a number of issues.  In the original post, I mentioned that I changed the folder structure at one time and even after a self-audit to clean things up still found references using the old structure.  I&amp;rsquo;ve been continuing to work through the problems that Ahrefs found and try to clean up a few each week.  I haven&amp;rsquo;t posted as much because of this change of focus, but I hope that you can see an improvement in website quality.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/gardentools.jpeg#floatright&#34; alt=&#34;Garden Tools&#34;&gt;
Ahrefs has also revealed problems of old age.  When I mention a product or a project and include an image, I have generally done that by referencing the image on the source page.  I think the reason I did that was philosophical, it&amp;rsquo;s not like I have space issues working with &lt;a href=&#34;https://nextpertise.net/posts/200817_jamstack/&#34;&gt;Render&lt;/a&gt;.  That said, some of those sources have disappeared.  Others have updated their sites and used new images with new names.  It&amp;rsquo;s not just images - URLs are being updated as well.  The result is broken references from my older pages.  It feels like this aspect of  maintaining a site is like gardening, and in that analogy I&amp;rsquo;m finding Ahrefs to be the right tools to maintain the garden because Ahrefs runs down all the links and lets me know of any that don&amp;rsquo;t complete successfully.&lt;/p&gt;
&lt;p&gt;Ahrefs is also telling me that I lack &lt;a href=&#34;https://css-tricks.com/essential-meta-tags-social-media/&#34;&gt;social media tags&lt;/a&gt;.  My personal view is that Facebook is more of a security risk than a socialization tool.  About the only social media I use is LinkedIn.  That said, I&amp;rsquo;d like for folks to be able to find what I write and I&amp;rsquo;d like it to present cleanly in those platforms.  Ahrefs pointed out my backwardsness and provided directions about how to add these tags (as shown below, using Hugo variables to customize the output for each page).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;Nextpertise - {{.Params.Title}}&amp;lt;/title&amp;gt;
    &amp;lt;meta name=&amp;quot;{{.Params.Description}}&amp;quot;&amp;gt;
    &amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;{{.Params.Focus_Keyword}},linux, VPN, Virtual Machine, cybersecurity, Virtualization, self-hosting&amp;quot;&amp;gt;
    &amp;lt;meta name=&amp;quot;twitter:card&amp;quot; content=&amp;quot;{{.Params.description}}&amp;quot;&amp;gt;
    &amp;lt;meta property=&amp;quot;og:title&amp;quot; content=&amp;quot;{{.Title}}&amp;quot; &amp;gt;
    &amp;lt;meta property=&amp;quot;og:url&amp;quot; content=&amp;quot;{{.Permalink}}&amp;quot; &amp;gt;
    &amp;lt;meta property=&amp;quot;og:description&amp;quot; content=&amp;quot;{{.Params.summary}}&amp;quot; &amp;gt;
    &amp;lt;meta property=&amp;quot;og:image&amp;quot; content=&amp;quot;https://nextpertise.net/non-technical.png&amp;quot; &amp;gt;
    &amp;lt;link rel=&amp;quot;apple-touch-icon&amp;quot; href=&amp;quot;https://nextpertise.net/non-technical.png&amp;quot; &amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://nextpertise.net/style.css&amp;quot; &amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;My original conclusion - that Ahrefs offered a valuable resource to web developers - continues to hold.  Using their feedback has helped me to understand some new wrinkles in the way pages are constructed.  Ahrefs has definitely helped me handle the technical debt on the site and keep it up to date with current practices.  After a month, I rely on it more and as I become a more sophisticated blogger and understand more, the tool continues to be accessible and valuable.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI-Pocolypse Now</title>
      <link>https://nextpertise.net/230805_ai-pocolypse_now/</link>
      <pubDate>Sat, 05 Aug 2023 15:58:38 -0400</pubDate>
      
      <guid>https://nextpertise.net/230805_ai-pocolypse_now/</guid>
      <description>&lt;p&gt;My friends know that I am an avid reader and that I love Science Fiction.  I&amp;rsquo;ve read that Science Fiction only became possible when people could see technology changing in their lifetime, and although we had slow changes for a long time it wasn&amp;rsquo;t until the last half of the 19th Century that we got &lt;em&gt;Frankenstein&lt;/em&gt;.  Even in Mary Shelley&amp;rsquo;s time, though, the pace of change was slow compared to now.&lt;/p&gt;
&lt;p&gt;What a fascinating time to live!  I was born five days after Neil Armstrong set foot on the moon.  Communication - including the Internet - has completely revolutionized the way we relate to others and ourselves several times in my life (fax machines, cell phones, SMS, e-mail, social media).  Cancer used to be a get-your-affairs-in-order conversation.  It&amp;rsquo;s still not good, but the progress from when my uncle Paul died in the 70s until now is &lt;em&gt;astounding&lt;/em&gt;.  Logistics has changed the world - strawberries from South America in the dead of winter?  Having seen all these things, it can feel like my life has been science fiction.&lt;/p&gt;
&lt;p&gt;Which brings us to the AI-pocolypse, my campy-and-probably-not-original name for the fear that our technological creations will supplant us.  Funny aside, but that&amp;rsquo;s what Frankenstein was about as well.  Science Fiction has a way of predicting the future - it&amp;rsquo;s like a dream half remembered that reveals something about yourself.&lt;/p&gt;
&lt;h2 id=&#34;the-first-four-signs&#34;&gt;The first four signs&lt;/h2&gt;
&lt;p&gt;Consider the genre.  What are the classical elements of machines gone mad and taking over?  My offhand list would be access to an incredible amount of knowledge, insight into people - even into &amp;ldquo;private&amp;rdquo; and personal thoughts, a capability to plan and act, an opportunity that carbon-able people create because we want something from the machines, and evil intent.&lt;/p&gt;
&lt;p&gt;So, check, check, check, check, and . . . not necessary?  I&amp;rsquo;m going to argue that the AI-pocolypse is already upon us.&lt;/p&gt;
&lt;p&gt;In Science Fiction, the first thing the &amp;ldquo;robots&amp;rdquo; need to take  over is all the knowledge.  Wow, the web really made this easy and fun to do.  Computers have all our writing, all the papers, all the facts we know.  Advances like Machine Learning and even ChatGPT demonstrates that there are ways to use all that knowledge to start to draw inferences and power new advances.&lt;/p&gt;
&lt;p&gt;The second thing the computers need is insight into our personal thoughts so that they can draw inferences, anticipate behavior, manipulate us or out-think us.  Too late.  This has been a reality for about a decade. Computers have been used to learn our patterns and manipulate us so that we are a necessary step in their food cycle.  Manipulate Brent into clicking on an ad, ad generates revenue, the profit from which buys electricty to feed the machine.  Each of us, like docile cattle, seeks out the supercomputer and aims it squarely at our brains.  Examples include Facebook, Cambridge Analytica (also Facebook), Google, Twitter, Reddit, and pretty much the whole Internet.  Like the old adage goes, if they&amp;rsquo;re not charging you then you are the product.&lt;/p&gt;
&lt;p&gt;If you are starting to feel uncomfortable, think about the ability of computers to plan and act.  Things like chatbots show an ability to plan at an abstract level.  Yes, I know that these are language models that are drawing on human sources and generating a response that is statistically likely to meet your expectations, but if you ask them something like &amp;ldquo;how do I change the oil in my car?&amp;rdquo; they will give you a series of steps.  Even more to my point, consider Space-X Falcon rockets and their ability to understand thrust and wind and land on their tailfans.  Or the Boston Dynamics robot dogs, that can be given tasks like patrolling a perimeter or inspecting a dangerous site.  Computers are now routinely interacting with the physical world (see &amp;ldquo;Internet of Things&amp;rdquo;) and taking actions, actions that are necessary and consistent to acheive an outcome.&lt;/p&gt;
&lt;p&gt;Three for three.  Number four on my list was opportunity.  In the classic plot, the AI rises to power through lazy humans.  Examples include Skynet (built to protect lazy humans), AUTO (from Wall-E, built to serve lazy consumers), and HAL (built to keep a secret because it couldn&amp;rsquo;t be trusted to other humans).  So, take a deep breath and look around and ask yourself if there are opportunities.  Would one side in a war pause if an AI could help win it?   The answer is no.  Are we too lazy to drive to a store to shop now?  The answer is yes.  How much do you depend on Google Maps?&lt;/p&gt;
&lt;h2 id=&#34;evil-intent&#34;&gt;Evil Intent&lt;/h2&gt;
&lt;p&gt;One of my daughter asked me a while back if I believed people were basically good or bad.  Neither, I replied, I believe that they are basically selfish.  When one of the boys asked if he was selfish, I told him that I was.  An ability to put others needs above our own is an aspirational point for religion.  The Recognition that others perspectives are valid is a high point of philosphy (Kant&amp;rsquo;s Categorical Imperative).  So let&amp;rsquo;s start with the idea that selfish is easy.&lt;/p&gt;
&lt;p&gt;Evil is complicated.  Selfish is taking the last cookie.  Evil is intentionally starving someone, or even taking actions designed to inflict pain for personal enjoyment.  Evil does exist, no question.  Thankfully, in my experience, evil is rare and an exception.&lt;/p&gt;
&lt;p&gt;For the purpose of thinking about the AI-pocolypse, whatever that is, I&amp;rsquo;m going to argue that evil is unnecessary.  I have two reasons for saying this: first, evil is complicated and selfish is simple and programmers like simple.  Second, a person can die of starvation because someone else is hoarding food.  The hoarder may see themselves as good, after all they are protecting their family, not enjoying the suffering of others.  But dead is dead.&lt;/p&gt;
&lt;p&gt;Selfishness isn&amp;rsquo;t even a bad thing.  Acting selfishly impels us to preserve ourselves.  Any being that doesn&amp;rsquo;t see their existence as having value would be suicidal.  Can computers be selfish?  We can argue, but computers can certainly carry out a set of selfish actions designed to maximize gain accrued to their owner.  For example, there are high-frequency trading platforms that algorithmically pursue profit.&lt;/p&gt;
&lt;p&gt;What if the computers can outsource selfishness?  What if that part doesn&amp;rsquo;t need to be a part of their program.  An algorithm, whatever level of sentience you claim for it, still works through instructions that we give it.  If the people that are building it and directing it are selfish, does the AI need to have that as a feature?&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s an algorithm or a Billionaire, does it matter?&lt;/p&gt;
&lt;h2 id=&#34;and&#34;&gt;And?&lt;/h2&gt;
&lt;p&gt;If we agree, what do we do about it?  I&amp;rsquo;m not sure, so I&amp;rsquo;ll talk about what I intend to do.&lt;/p&gt;
&lt;p&gt;The first step is to recognize the situation.  The environment is created by tecnology and empowered by our laziness.  I&amp;rsquo;m not going to become some new kind of Amish, trying to trap the 1980s in amber, nor do I believe that anyone would go along with me if I proposed it.  The part that is under my control is my laziness.&lt;/p&gt;
&lt;p&gt;So action #1 is to become digitally self-soverign, at least to the extent that I can.  That means understanding the technology and not oursourcing my data to the &amp;ldquo;cloud&amp;rdquo; (cloud is just a fancy word for a Billionaire&amp;rsquo;s computer).&lt;/p&gt;
&lt;p&gt;Action #2 is to hide and lie.  Computers are able to assemble a lot of seemingly random things and use them to identify a person.  Companies may ask for random pieces of data, like a hometown or birthday, and then pair that with the mountain of data that exists on the Internet to target me.  So I intend to encrypt my data at rest and in transit, to obfuscate my tracks, and to use random data when interacting with non-official records collection.  Good examples of these ideas are to use private VPN, to trade affinity cards with others to confuse the analysis (these are the bar code cards that stores give you), and to use a password manager to store your made-up details for each company you deal with (changing things like birthday, location, and even favorite color).&lt;/p&gt;
&lt;p&gt;Action #3 is to study moral philoophy and my religion, and to encourage those around me to do the same.  Right and wrong can&amp;rsquo;t simply be words we use to justify selfish decisions.  My experience is that the vast majority of folks are not evil but are very selfish.  Selfishness is our natural &amp;ldquo;resting state&amp;rdquo;.  Overcoming this selfishness requires continuous effort.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve personally benefitted from a number of approaches to overcoming selfishness.  First is marriage and parenthood.  Making space in your life for others, making them more important than yourself, and listening to the feedback they give you is a huge gift when it comes to recognizing your own weakness and trying to be a better person.  Second, I&amp;rsquo;ve found friends who I agree with sometimes and friends from whom  I can learn.  I have friends from other faith-traditions, from other political persuasions, and who just enjoy different things.  Again, choosing to care for other people and finding people who care about you helps me recognize that I have the capacity to be wrong or to choose what is expeditious over what is good.  Reading is also a great way to grow yourself.  I publish a list of &lt;a href=&#34;https://www.stewart.tc/reading/&#34;&gt;books I&amp;rsquo;ve read&lt;/a&gt; if you are interested.  It&amp;rsquo;s important to understand that reading is not a solitary activity - it only gets incorporated, at least for me, when you share it with people you respect, think about it together, and make it your own.&lt;/p&gt;
&lt;p&gt;I feel like I&amp;rsquo;ve lately benefitted a lot from reading about Stoicism  and so I try to care for truth and I choose to be thankful and find joy. I wish nothing less than that for each of you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ahrefs</title>
      <link>https://nextpertise.net/230731_ahrefs/</link>
      <pubDate>Mon, 31 Jul 2023 21:28:53 -0400</pubDate>
      
      <guid>https://nextpertise.net/230731_ahrefs/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing in this space for about three years.  I use Hugo and VSCode and write in markdown, so my workflow is less technical but there are still some aspects of maintaining a web page.  My source files, for instance, were fairly easy to organize in the first year but over time have sprawled.  Changes to my Hugo template have broken some older internal URLs as well.  Even when I recognize the possibility of an issue, it&amp;rsquo;s hard to track down every instance that broke.&lt;/p&gt;
&lt;p&gt;One simple example is that I originally put my entries into the root folder and later moved them to &lt;em&gt;/posts&lt;/em&gt;.  The issue is that all my older files referenced each other withoot that directory.  I&amp;rsquo;ve corrected this when I see it, but I&amp;rsquo;m sure that readers have stumbled onto these inadvertant issues.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mea culpa&lt;/em&gt;, but I have a day job and it&amp;rsquo;s hard to keep up sometimes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/ahrefs.png#floatright&#34; alt=&#34;Ahrefs logo&#34;&gt;
A few months ago I found &lt;a href=&#34;https://app.ahrefs.com/&#34;&gt;Ahrefs&lt;/a&gt;.  Ahrefs is a website that has a gazillion tools that are useful in improving website quality.  There are a few of these sites and most include a &amp;ldquo;try before you buy&amp;rdquo;, but Ahrefs actually has a free tier that provides valuable feedback.&lt;/p&gt;
&lt;h2 id=&#34;website-quality&#34;&gt;Website Quality&lt;/h2&gt;
&lt;p&gt;Ahrefs scans this site every Sunday and sends me a report.  It has taken a little time to understand how to use the data they provide - remember, this isn&amp;rsquo;t really what I do.  That said, anyone who is interested in maintaining a blog is already putting in a certain amount of work to figure things out and Ahrefs is accessible with little effort.&lt;/p&gt;
&lt;p&gt;There are a ton of QA metrics, including all kinds of different types of returned errors.  One of the errors is &amp;ldquo;image file size too large&amp;rdquo;.  It clearly points to the source image and the page where it is used.  I was able to load that image into Gimp, change the JPEG quality and scale, and resave to resolve the issue.
&lt;img src=&#34;https://nextpertise.net/230731_healthscore.png#floatleft&#34; alt=&#34;Health Score&#34;&gt;
Broken links are another area where I&amp;rsquo;ve been able to drive improvement.  Hugo makes it easy to apply a template to markdown and generate a site, but errors in the template get propogated across a lot of places (and I&amp;rsquo;m sure are annoying to read).  I&amp;rsquo;ve used Ahrefs to quickly point at the offenders and resolve.&lt;/p&gt;
&lt;p&gt;If you are developing in Hugo, theres a &amp;ldquo;compiling&amp;rdquo; step to get from raw markdown to a website.  It&amp;rsquo;s not always clear where some of the errors come from, so I&amp;rsquo;ve found that I need to run &lt;strong&gt;hugo server -D&lt;/strong&gt; to generate a live copy of the page for debugging.  Sometimes my error is in the page, but I&amp;rsquo;ve found several instances where the issue was in the interaction of the page with my templates.  None fo the issue have been hard to resolve, they just take some thought.&lt;/p&gt;
&lt;p&gt;I particularly like that Ahrefs summarizes all the issues into a &amp;ldquo;Health Score&amp;rdquo;.  This makes it easy to see how you are doing at-a-glance.  You can see from my score, I have some improvements to make.  That said, Ahrefs also makes it easy to browse the issues and prioritize your time.  I have 237 issues with &amp;ldquo;Multiple meta description tags&amp;rdquo;.  Clearly that&amp;rsquo;s a tag thats being duplicated at the default template and in a partial.  That said, it doesn&amp;rsquo;t impact the user experience and so I&amp;rsquo;ve been prioritizing the more mundane link issues.&lt;/p&gt;
&lt;h2 id=&#34;seo&#34;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Ahrefs has a number of tools around search engine optimization.  I&amp;rsquo;m sure that this would be fantastically interesting if I were building an ecommerce site, but even at an amatuer level it&amp;rsquo;s cool to see what other sites link back to me.  There are also tools around what keywords will bring people to the site, what my most popular pages are, and what topics are most popular.&lt;/p&gt;
&lt;p&gt;The SEO side includes errors around mistakes I&amp;rsquo;ve made that inhibit indexing.  Right now I&amp;rsquo;m missing &amp;ldquo;Social Graph Tags&amp;rdquo; that are used by LinkedIn and Facebook - who knew?  But the error includes a brief explanation, a link to details, and a &amp;ldquo;How to Fix&amp;rdquo; link with good instructions.  Of course, Hugo is not HTML, so there&amp;rsquo;s some level of translation.&lt;/p&gt;
&lt;h2 id=&#34;paid-accounts&#34;&gt;Paid Accounts&lt;/h2&gt;
&lt;p&gt;Serious webmasters will want to conssider a paid account.  The paid account includes a lot more SEO tools and analysis.  Accounts start at $83/mo (paid annually), so they&amp;rsquo;re not for the faint of heart, but I&amp;rsquo;m really impressed by the quality of what I see.  I appreciate that Ahrefs makes valuable information available for hobbiest and recommend it as a good way to start understanding more about how HTML, the web, and the world work.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Remote access - The Hard Way</title>
      <link>https://nextpertise.net/230706_remoteaccessthw/</link>
      <pubDate>Thu, 06 Jul 2023 17:00:43 -0400</pubDate>
      
      <guid>https://nextpertise.net/230706_remoteaccessthw/</guid>
      <description>&lt;p&gt;A little bit of fun today.  There are many cases where we need to access different computers but can&amp;rsquo;t setup something like RDP.  I had the idea to try this via video capture, so here&amp;rsquo;s my experience.&lt;/p&gt;
&lt;h2 id=&#34;remote-access-via-video-capture&#34;&gt;Remote access via video capture&lt;/h2&gt;
&lt;p&gt;I ordered the Extenuating Threads &lt;a href=&#34;https://www.amazon.com/dp/B0C2HG93TG&#34;&gt;HDMI Capture Dongle&lt;/a&gt; from Amazon for $14.  There are several options available - I went with Extenuating Threads because it was cheap and I wouldn&amp;rsquo;t be out much if it didn&amp;rsquo;t work.  I needed to capture 4k at least 30Hz and this model promises 4k at 60Hz.&lt;/p&gt;
&lt;p&gt;The Dongle arrived and presented itself as a video source (like a camera) once plugged in.  In fact, I could use the second computer video and route it into any application, including Teams.  Identifying the dongle is pretty easy - I just flipped through all the available video sources in OBS or Cheese.  You can also do this from the command line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-install v4l-utils  #install Video for Linux tools
v4l2-ctl --list devices
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My output looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USB Video: USB Video (usb-0000:00:14.0-1):
    /dev/video0
    /dev/video1hu
    /dev/media0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;issues&#34;&gt;Issues&lt;/h2&gt;
&lt;p&gt;I tested this with a number of video players, including OBS, MPV, mplayer and VLC.  All three worked, but only OBS provided a decent frame rate and audio.  OBS seems like a lot to load, just to see a remote server.  My son suggested &lt;em&gt;Ccdheese&lt;/em&gt; and I was skeptical, but that was actually far and away the most responsive.  I used a Bluetooth mouse and keyboard to control the host and &lt;em&gt;Cheese&lt;/em&gt; presented the display at realtime speeds but didn&amp;rsquo;t capture audio.  I didn&amp;rsquo;t have any issues or artifacts with the display, even at 4k.  I ended up dialing the resolution down to 1920x1080 so that it fit into a quarter of my 4k display and this worked perfectly.&lt;/p&gt;
&lt;p&gt;I made this a little less temporary by replacing the seperate mouse and keyboard with a USB switch that let me toggle my controls back and forth between my main machine and the captured device.&lt;/p&gt;
&lt;p&gt;So my cheap $14 USB dongle works to allow me to access a machine here in my office.  I can treat the dongle as a video source and access it using most programs.  Speed was good, but only Cheese and OBS allowed interactive speed.  All told, a cute little experiment!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Save to Kindle with a DIY CI</title>
      <link>https://nextpertise.net/230514_save2kindle/</link>
      <pubDate>Tue, 09 May 2023 21:20:24 -0400</pubDate>
      
      <guid>https://nextpertise.net/230514_save2kindle/</guid>
      <description>&lt;p&gt;My &lt;a href=&#34;https://nextpertise.net/posts/230509_word2obsidian/&#34;&gt;previous post&lt;/a&gt; dealt with building an easy way to convert Word files to Markdown and automatically incorporate them in Obsidian.  That was accomplished by copying the DOCX file into a directory and having automation to perform the actions to get the file into the right place with the right format.  I was pleased with the way that worked out and thought about other places where I&amp;rsquo;d like to use a similar approach.&lt;/p&gt;
&lt;h1 id=&#34;print-to-tablet&#34;&gt;Print to Tablet&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve always wanted a way to &amp;ldquo;print to tablet&amp;rdquo;.  I&amp;rsquo;ve had IPads and Galaxy Tabs and enjoy the form factor - tablets are an easy way to read.  But there&amp;rsquo;s never been a great way to move something I create on my desktop over to the tablet.  I&amp;rsquo;ve resorted to saving it to PDF, emailing it to myself, and then opening it on the tablet.  But wait!  Because of the way tabllet break up storage, it&amp;rsquo;s usually confusing to understand where the file is stored and which programs should be used.  Bah!&lt;/p&gt;
&lt;p&gt;This really galls me because sometimes I&amp;rsquo;ll print out a document and think, &amp;ldquo;This would save a lot of paper if I could just print it to my tablet&amp;rdquo;.  The thought of saving printing costs, saving a fraction  of a tree, and having the file in a convenient form would really be nice.&lt;/p&gt;
&lt;h2 id=&#34;ingredients&#34;&gt;Ingredients&lt;/h2&gt;
&lt;p&gt;How did I get this to work?  In my mind, the basic building blocks would be &lt;strong&gt;inotifywait&lt;/strong&gt; (discussed in the previous post), kindle&amp;rsquo;s email import function and ssmtp (discussed in &lt;a href=&#34;https://nextpertise.net/posts/230313_command_line_email/&#34;&gt;Command Line Email&lt;/a&gt;).  Expiriments with ssmtp determined that it&amp;rsquo;s hard to use with attachments, but researching that led me to &lt;strong&gt;mpack&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This project will use &lt;strong&gt;inotifywait&lt;/strong&gt; to monitor a directory.  When a file is put in that directory it will be copied out to the kindle app on my tablet.  There&amp;rsquo;s a little longer discussion of inotifywait in the previous post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230514_Amazon_Devices.png#floatsmallleft&#34; alt=&#34;Amazon Devices&#34;&gt;&lt;/p&gt;
&lt;p&gt;Amazon provides an email associated with every Kindle, physical or app, that can be used to import files.  Sending an email to that address will copy the attached file into the Kindle&amp;rsquo;s local library (and convert it if needed).  You can find this email address two ways - either login to Amazon and navigate to &amp;ldquo;Accounts &amp;amp; List&amp;rdquo; and choose &amp;ldquo;Devices&amp;rdquo;.  From here you can select either a Fire Tablet or a Kindle app and see it&amp;rsquo;s assigned email address.  It will look like _&lt;a href=&#34;mailto:name_ABCD@kindle.com&#34;&gt;name_ABCD@kindle.com&lt;/a&gt;.  You can also go into the kindle app and find it under &amp;ldquo;More&amp;rdquo;, then &amp;ldquo;Settings&amp;rdquo; and it will be shown as &lt;strong&gt;Send to Kindle Email Address&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Amazon calls this function the &amp;ldquo;Kindle Personal Document Service&amp;rdquo; and claim that it can convert several types of files.  I tested PDF, DOCX, and EPUB and didn&amp;rsquo;t have any issues.




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table of supported import formats&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DOC&lt;/td&gt;
&lt;td&gt;DOCX&lt;/td&gt;
&lt;td&gt;RTF&lt;/td&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTM&lt;/td&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;ZIP&lt;/td&gt;
&lt;td&gt;x-zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOBI&lt;/td&gt;
&lt;td&gt;EPUB&lt;/td&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GIF&lt;/td&gt;
&lt;td&gt;BMP&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;The last piece is &lt;strong&gt;mpack&lt;/strong&gt;.  I used &lt;strong&gt;ssmtp&lt;/strong&gt; in my previous project and found some ideas on how to attach a file using ssmtp, but never got that to work.  In the process of researching that issue I found &lt;strong&gt;mpack&lt;/strong&gt;, which uses ssmtp (at least the settings and a library) to send an email with attachment.  Install mpack on Ubuntu using &lt;strong&gt;sudo apt install mpack&lt;/strong&gt;.  Once it&amp;rsquo;s installed, here&amp;rsquo;s a usage example to help you test.  The part being echo&amp;rsquo;d in is the body of the email - unnecessary when sending to kindle.  Email subject is set with &amp;ldquo;-s&amp;rdquo;.  Attachment is defined with &amp;ldquo;-a&amp;rdquo;, and then followed by the email address this should go to.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;Sent from your linux desktop&amp;quot; | mpack -s &amp;quot;Subject Line&amp;quot; -a &amp;quot;File.TXT&amp;quot; destination_email@ddress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If there are issues, I suggest going back to the ssmtp setup and making sure that part is working.&lt;/p&gt;
&lt;h2 id=&#34;mixing-it-all-together&#34;&gt;Mixing it all together.&lt;/h2&gt;
&lt;p&gt;I defined a directory &lt;em&gt;send2kindle&lt;/em&gt;.  Anything copied in will be sent to my kindle email address and imported into that kindle library.  I created a batch file (watch_send2kindle.sh) and made it executable.  That script is shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
TARGET=~/send2kindle/

inotifywait -m -e create -e moved_to --format &amp;quot;%f&amp;quot; $TARGET | while read FILENAME
do
  echo Detected $FILENAME
  echo &amp;quot;Sent from your linux desktop&amp;quot; \
  | mpack -s &amp;quot;$FILENAME&amp;quot; -a &amp;quot;send2kindle/$FILENAME&amp;quot; user_ABCD@kindle.com
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This follows the logic used in the previous post.  Note that the backslash (&amp;quot; \ &amp;ldquo;) shows line continuation, so the echo and pipe are one line.  I did it that way to make it easier to read here.  I&amp;rsquo;ve setup &lt;strong&gt;innotify&lt;/strong&gt; to trigger on something being copied in.  The previous discussion has a few more details on that command if you are interested.  Note that I leave the files in the directory, so you may need to occassionally clean up and delete them.  I could have added a &lt;strong&gt;rm&lt;/strong&gt; command, but I decided that it might be useful to have a copy.  Once they&amp;rsquo;re copied in, they won&amp;rsquo;t trigger the workflow again.&lt;/p&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;p&gt;With everything in place, all that&amp;rsquo;s left is testing.  Run the script and then copy a file into that directory.  It should pop into the Kindle library of your choice in less than a minute.&lt;/p&gt;
&lt;p&gt;Just like I did in the previous discussion, I recommend settting up the watcher script to start itself after reboot.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;crontab -e  # gets us into edit mode
# add below entry
@reboot /home/brent/watch-send2kindle.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;in-closing&#34;&gt;In closing&lt;/h2&gt;
&lt;p&gt;This really extends some of the recent things I&amp;rsquo;ve been doing in a very useful way.  For instance, I can Print from any file and choose &amp;ldquo;PDF&amp;rdquo; as the printer.  When prompted for a filename, directing that to ~/send2kindle/newfile.pdf will send it to my tablet.  It&amp;rsquo;s not very complex to get setup and working and it &amp;ldquo;scratches an itch&amp;rdquo; I had.  Hope it is useful to you as well!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Word to Obsidian with a DIY CI</title>
      <link>https://nextpertise.net/230509_word2obsidian/</link>
      <pubDate>Tue, 09 May 2023 21:20:24 -0400</pubDate>
      
      <guid>https://nextpertise.net/230509_word2obsidian/</guid>
      <description>&lt;p&gt;I use Obsidian as a note taking journal, but I get a lot of documents in other formats that I&amp;rsquo;d like to include in that journal.  One example is Word docs, such as my weekly reports.  I&amp;rsquo;ve copied some PDFs into my Obsidian vault, but for some reason I hit on the idea of converting DOCX to Markdown.&lt;/p&gt;
&lt;h2 id=&#34;what-didnt-work&#34;&gt;What Didn&amp;rsquo;t Work&lt;/h2&gt;
&lt;p&gt;Just to save you time, I&amp;rsquo;ll mention a few ideas that I tried and discarded on the way.  There is a plugin to save files from Word in Markdown called &lt;a href=&#34;https://www.writage.com/&#34;&gt;Writage&lt;/a&gt;.  It&amp;rsquo;s $29, but a trial version is available.  I&amp;rsquo;m obstinately opposed to closed source and I&amp;rsquo;m feeling less and less comfortable about downloading and installing EXEs and MSIs from random websites, so I haven&amp;rsquo;t tried it.&lt;/p&gt;
&lt;p&gt;I also found an old github repo that purported to address this issue.  That project has pivoted to HTML and deprecated the markdown code.&lt;/p&gt;
&lt;h2 id=&#34;the-beginning-of-an-idea&#34;&gt;The beginning of an idea&lt;/h2&gt;
&lt;p&gt;Looking for a FOSS solution lead me back to Pandoc.  Long, &lt;em&gt;long&lt;/em&gt; time readers may recall one of my early &lt;a href=&#34;https://nextpertise.net/posts/200919_pandoc_improved/&#34;&gt;experiments&lt;/a&gt; with Pandoc.  &lt;a href=&#34;https://pandoc.org/&#34;&gt;Pandoc&lt;/a&gt; is a file converter and will handle conversions between things like DOC, EPUB, PDF, and HTML.  I setup a continuous integration (CI) pipeline using Github actions so that I uploaded some markdown files and they were automatically assembled and formatted as chapters into a PDF book.  That was a cool project, and perfect for maintaining SOPs, but a cloud solution seems like a lot of steps to get this into my Obsidian vault.&lt;/p&gt;
&lt;p&gt;I took a moment to confirm that pandoc will do the conversion I wanted.  After a little back and forth, here&amp;rsquo;s the command I came up with.  I&amp;rsquo;ve tested this with business memos and it worked fine.  I haven&amp;rsquo;t tried it with complex tables or graphs.  -f and -t are the from and to formats, -o is the output and the first file in quotes is the input.  The wrap command prevents pandoc from setting line length to 72 and adding a line return in every line.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pandoc -wrap=none -f docx -t markdown &amp;quot;test.doc&amp;quot; -o &amp;quot;test.md&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;automating-markdown-conversion-and-ingestion&#34;&gt;Automating markdown conversion and ingestion&lt;/h2&gt;
&lt;p&gt;Pandoc gets the conversion, but I really don&amp;rsquo;t want to have to remember that command and then move files around.  I want something that is a DIY pipeline to go from DOCX to Markdown.  Here&amp;rsquo;s how I did it - explanation to follow.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
TARGET=~/doc2obs/
PROCESSED=~/Downloads

inotifywait -m -e create -e moved_to --format &amp;quot;%f&amp;quot; $TARGET | while read FILENAME
do
  echo Detected $FILENAME
  pandoc -wrap=none -f docx -t markdown &amp;quot;/home/brent/doc2obs/$FILENAME&amp;quot; -o &amp;quot;/home/brent/doc2obs/$FILENAME.md&amp;quot;
  echo converted to Markdown
  rm &amp;quot;/home/brent/doc2obs/$FILENAME&amp;quot;
  echo removed doc file
  mv &amp;quot;/home/brent/doc2obs/$FILENAME.md&amp;quot; &amp;quot;/home/brent/2nd Brain/Notes/$(date +%y%m%d)_$FILENAME.md&amp;quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I created a directory (doc2obs) and created a watcher shell script.  It waits for a DOCX file to be copied into &lt;em&gt;doc2obs&lt;/em&gt;.  When that occurs, it converts the file into markdown, deletes the DOCX, and renames and moves the markdown file.  Of course, the script needs to be executable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x watch-doc2obs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&amp;rsquo;s take that script step by step and explain a little more.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TARGET=~/doc2obs/
inotifywait -m -e create -e moved_to --format &amp;quot;%f&amp;quot; $TARGET | while read FILENAME
do
  ...
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This batch of done defines the directory to be monitored.  If your Linux of choice doesn&amp;rsquo;t have &lt;strong&gt;inotify&lt;/strong&gt;, it can be loaded using yum or apt as inotify-tools.  -m tells it to monitor, -e defines the events to be monitored.  You can notify on a variety of events.&lt;/p&gt;




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table of inotify events&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;access&lt;/td&gt;
&lt;td&gt;create&lt;/td&gt;
&lt;td&gt;move_self&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;attrib&lt;/td&gt;
&lt;td&gt;delete&lt;/td&gt;
&lt;td&gt;moved_to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;close_write&lt;/td&gt;
&lt;td&gt;delete_self&lt;/td&gt;
&lt;td&gt;moved_from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;close_nowrite&lt;/td&gt;
&lt;td&gt;modify&lt;/td&gt;
&lt;td&gt;open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;close&lt;/td&gt;
&lt;td&gt;move&lt;/td&gt;
&lt;td&gt;unmount&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The &lt;strong&gt;echo&lt;/strong&gt; commands are present for debugging.  Note that the &lt;strong&gt;mv&lt;/strong&gt; moves the markdown file into my Obsidian vault and names it.  My daily notes all start with a date prefix like 230510 (two digits for year, month, and date), so the date command embedded in the move automatically prefixes the markdown file with the current date in the correct format.&lt;/p&gt;
&lt;h2 id=&#34;automating-the-script&#34;&gt;Automating the script&lt;/h2&gt;
&lt;p&gt;So the script is ready.  I can run it and it will monitor the &lt;em&gt;doc2obs&lt;/em&gt; directory until I stop it or reboot.  The next step is to make this into something that just runs automatically, so I don&amp;rsquo;t have to open a shell and worry about restarting it.&lt;/p&gt;
&lt;p&gt;Here I&amp;rsquo;ll refer back to the process I used in &lt;a href=&#34;https://nextpertise.net/posts/230313_blog2obsidian/&#34;&gt;Automatically adding Hugo articles to Obsidian&lt;/a&gt;, which is to use &lt;strong&gt;cron&lt;/strong&gt;.  That script ran periodically and this one runs continuously, so we&amp;rsquo;ll modify the approach to ask &lt;strong&gt;cron&lt;/strong&gt; to run it once at startup.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;crontab -e  # gets us into edit mode
# add below entry
@reboot /home/brent/watch-doc2obs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;things-to-fix&#34;&gt;Things to fix&lt;/h2&gt;
&lt;p&gt;This does what I need it to do, but I have a few ideas about how it could be improved.  I&amp;rsquo;m not sure if I&amp;rsquo;ll ever get to them, but they&amp;rsquo;re worth noting.&lt;/p&gt;
&lt;p&gt;I build daily notes from a template.  The template is essentially some buttons, backlinks, tags, and such.  I may try to add those elements into the markdown output.  Right now my thought is just to append the tags at the end, which would be easy.&lt;/p&gt;
&lt;p&gt;I could build a set of these CI actions.  Sometimes I get business documents and want to read them later on my tablet, so another idea is to setup a directory that converts to PDF or EPUB and emails it to my kindle email address.  This one I really think I&amp;rsquo;ll do, and will probably blog about.&lt;/p&gt;
&lt;p&gt;This version of the script generates an error when the markdown is created because it&amp;rsquo;s created in the directory I&amp;rsquo;m monitoring.  I could maybe just create it straight into my vault, but I&amp;rsquo;d need to handle the date prepending.  That&amp;rsquo;s not a big issue, but it&amp;rsquo;s a bigger issue than just ignoring an error that doesn&amp;rsquo;t really do anything.&lt;/p&gt;
&lt;h2 id=&#34;toodles&#34;&gt;Toodles&lt;/h2&gt;
&lt;p&gt;So that&amp;rsquo;s it.  This is a cool project for Obsidian obsessives (hand raised) because it makes it easy to ingest all the &lt;em&gt;other&lt;/em&gt; documents in our lives.  But the part I&amp;rsquo;m most excited about is that in a clumsy and hacky way, this is a really easy home delivery pipeline that could be adopted for &lt;em&gt;anything&lt;/em&gt; that you want to automate.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I&#39;m cooler than you</title>
      <link>https://nextpertise.net/230427_im_cooler_than_you/</link>
      <pubDate>Thu, 27 Apr 2023 17:38:24 -0400</pubDate>
      
      <guid>https://nextpertise.net/230427_im_cooler_than_you/</guid>
      <description>&lt;p&gt;Hah!  I don&amp;rsquo;t really believe that thing about being cooler, but have you ever done a project and just felt &lt;em&gt;so&lt;/em&gt; pleased with yourself?  I turned my Samsung Galaxy Tab S6 Lite into a Linux tablet/laptop and I&amp;rsquo;m feeling pretty happy.  The actual process isn&amp;rsquo;t that involved, so a little of my self-congratulation is probably undeserved, but the result is stinking cool!&lt;/p&gt;
&lt;h2 id=&#34;what-is-a-linux-device&#34;&gt;What is a Linux device?&lt;/h2&gt;
&lt;p&gt;Before we get into the work, we need to take a philosophical detour.  I wanted a Linux tablet, but what exactly does that mean?  Android is based on Linux, so isn&amp;rsquo;t Android &amp;ldquo;Linux&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;In my opinion, a &amp;ldquo;Linux desktop&amp;rdquo; involves two components.  The first is a shell (in my case Bash) that support the expected set of tools, like &lt;strong&gt;git&lt;/strong&gt; and &lt;strong&gt;hugo&lt;/strong&gt;.  I was able to create that environment by installing Termux.  A graphical x-environment is suppored with Termux, but you have to use VNC to access it and it seems like trying to use fingers to control an Xfce desktop would be frustrating.  And for what?  Certainly there is some coup to be counted, but I see a desktop as a way to run applications.  I see the Android shell like an alternative DE with it&amp;rsquo;s own app environment.  As long as Android apps can access the files in the Termux environment, then why not use the native graphical environment?&lt;/p&gt;
&lt;p&gt;Office is available for Android, as is Google Docs.  I can use &lt;strong&gt;Markor&lt;/strong&gt; for markdown files, and of course there is a native Firefox.  I can&amp;rsquo;t find a native version of &lt;strong&gt;VS Code&lt;/strong&gt;, so we&amp;rsquo;ll have to think about that.  Otherwise, a traditional desktop really doesn&amp;rsquo;t move things forward on this tablet.&lt;/p&gt;
&lt;h2 id=&#34;installing-the-bash-environment&#34;&gt;Installing the Bash Environment&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230427_Termux.png#floatsmallright&#34; alt=&#34;Termux&#34;&gt;&lt;/p&gt;
&lt;p&gt;Prior to this effort, I had already installed &lt;a href=&#34;https://f-droid.org&#34;&gt;F-Droid&lt;/a&gt; as an alternative to the Play Store that focuses on FOSS (Free Open Source Software).  Pulling Termux from F-Droid instead of the Play Store is supposed to provide an updated version according to their docs.  I downloaded two apps: &lt;strong&gt;Termux&lt;/strong&gt; and &lt;strong&gt;Termux:Styling&lt;/strong&gt;.  Termux provides a debian-based Bash environment.  Apt is supported for updates, although the Termux project suggests using &lt;strong&gt;pkg&lt;/strong&gt; for installs.  &lt;strong&gt;Pkg&lt;/strong&gt; automatically runs &amp;ldquo;apt update&amp;rdquo; and finds the right mirror, but is basically a wrapper for apt.&lt;/p&gt;
&lt;p&gt;Termux creates a home directory at &lt;em&gt;/data/data/com.termux/files/home&lt;/em&gt;.  I was able to install the command line tools I expect, such as &lt;strong&gt;git&lt;/strong&gt;, &lt;strong&gt;hugo&lt;/strong&gt;, &lt;strong&gt;openssh&lt;/strong&gt; and &lt;strong&gt;python&lt;/strong&gt;.  Android apps are able to read and write into the home directory.  Running a Linux shell via Termux doesn&amp;rsquo;t have any impact on speed (and you wouldn&amp;rsquo;t expect it to).  I found a great article at &lt;a href=&#34;https://www.learntermux.tech/2022/06/termux-lsd-install-file-folder-icons-in.html&#34;&gt;Learn Termux&lt;/a&gt; that even walked through installing nerd fonts!&lt;/p&gt;
&lt;p&gt;I was able to use &lt;strong&gt;git&lt;/strong&gt; to pull down a copy of this website from Github.  I could then use &lt;strong&gt;hugo server -D&lt;/strong&gt; to run the dev environment.  Going out to the local Firefox allowed me to connect to http://127.0.0.1:1313 and see the dev page!  I typically use VS Code to write for this site, but at this point I could use &lt;strong&gt;nano&lt;/strong&gt; on bash to edit markdown files or use the Android-native Markor editor.&lt;/p&gt;
&lt;h2 id=&#34;visual-studio-code&#34;&gt;Visual Studio Code&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230427_Code_on_Droid.png#floatsmallright&#34; alt=&#34;VS Code running on Android&#34;&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no version of Visual Studio Code for Android.  &lt;a href=&#34;https://github.com/coder/code-server&#34;&gt;Code-server&lt;/a&gt; is an open-source version of VS Code that runs in a web page, and given my success with hugo I immediately thought of it as an alternative.  There are a &lt;em&gt;lot&lt;/em&gt; of instructions online for how to do this, some of them quite complicated, but I ultimately got it to work in a fairly straight-forward way.  In the end, what worked was:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pkg install tur-repo
pkg install code-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With code-server installed, you need to edit ~/.config/code-server/config.yaml and set the password.  You can do this using &lt;em&gt;nano&lt;/em&gt; or from an Android text editor.&lt;/p&gt;
&lt;p&gt;Start the application using the &lt;strong&gt;code-server&lt;/strong&gt; command.  Once it was up and running, I was able to access the environment at http://127.0.0.1:8080.  One last note - I didn&amp;rsquo;t know the path to my home directory and &lt;strong&gt;code-server&lt;/strong&gt; didn&amp;rsquo;t know what to do with &amp;ldquo;~&amp;rdquo;.  Clicking the &amp;ldquo;files&amp;rdquo; icon (right under the hamburger menu) doesn&amp;rsquo;t have an interactive way to browse until you get into your home directory.  So here it is again: &lt;em&gt;/data/data/com.termux/files/home&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;final-notes&#34;&gt;Final notes&lt;/h2&gt;
&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; this setup.  It&amp;rsquo;s a lot of fun to use the device and it&amp;rsquo;s easy to travel with it.  Although the pictures show an on-screen keyboard - which works pretty well if you are comfortable two-finger typing - my slim bluetooth keyboard packs up easily and works great in this environment.  I&amp;rsquo;m running &lt;a href=&#34;https://nextpertise.net/posts/221004_tailscale/&#34;&gt;TailScale&lt;/a&gt; in Android to access my home and Termux can access the VPN addresses without an issue.  In fact, the first screenshot where I am sshing into my desktop was taken remotely.  On the whole, this setup takes advantage of Android for the part it does well but still exposes the power of a Linux shell and I&amp;rsquo;m really pleased with it.  It wasn&amp;rsquo;t that complicated to setup, but I&amp;rsquo;m really happy with the result.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Anonymous Browsing</title>
      <link>https://nextpertise.net/230405_anonymous/</link>
      <pubDate>Wed, 05 Apr 2023 22:04:50 -0400</pubDate>
      
      <guid>https://nextpertise.net/230405_anonymous/</guid>
      <description>&lt;p&gt;What is the best way to be truly anonymous online?  Most of the time our concern is about being commercially tracked and having our browsing habits shared (I understand this doesn&amp;rsquo;t creep everyone out as much as it does me).  My kids think I&amp;rsquo;m paranoid.  Just for fun, take a look at &lt;a href=&#34;https://amiunique.org&#34;&gt;Am I Unique&lt;/a&gt; and browse through all the different data points that are shared by your browser and can be used to cross-reference and track you.  Even paranoid people have enemies.
&lt;img src=&#34;https://nextpertise.net/230407_amiunique.png#floatleft&#34; alt=&#34;Am I unique?&#34;&gt;&lt;/p&gt;
&lt;p&gt;My personal summary from &lt;strong&gt;Am I Unique?&lt;/strong&gt; is shown to the left.  Just like Mom said, I&amp;rsquo;m one in a million.&lt;/p&gt;
&lt;p&gt;Sometimes our need for anonymity goes beyond shielding our selves from spam.  When the stakes are higher, revealing an identity could impact a job or put lives in danger.  Many people depend on this type of anonymity to circumvent hostile governments or to leak important stories to reporters.&lt;/p&gt;
&lt;h2 id=&#34;recipe-for-anonymity&#34;&gt;Recipe for Anonymity&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a quick description of how you might approach trying to safeguard your identity.  This will guide you through installing Tails.  Tails is a standalone operating system that allows browsing through TOR.  The machine is clean, so nothing leaks to identify you, the OS is scrubbed every time you boot, the browser is locked down, and TOR passes your traffic through a series of other computers (&amp;ldquo;nodes&amp;rdquo;) to obscure your source address.&lt;/p&gt;
&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;Danger&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;&lt;p&gt;This kind of concern means that the authorities are either unconcerned or hostile to your situation.  I am praying for you!&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t trust my advice!  I have a reasonable level of expertise, but I don&amp;rsquo;t do this for a living.  My advice is a good starting point, but technology is constantly changing and this may be old when you read it.&lt;/p&gt;
&lt;p&gt;I believe Tails by itself is sufficient against non-Nation-State actors.  Especially if you have that level of concern, maintain a sense of paranoia and protect yourself in multiple layers.  For instance, use this post as a starting point but load the USB stick from a computer in a random location that can&amp;rsquo;t be associated to you.  In all cases, continue to research best practice!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tails can be installed via USB.  If you are in serious danger, this is the best way.  You can then take the USB to any computer, boot up from the USB, and further obscure your source.
&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;Danger&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;Tails doesn&amp;rsquo;t protect against stupidity.  Don&amp;rsquo;t login anywhere or take other actions that may identify you while using Tails.  Also, remember that browser crumbs are only one way that someone could be identified.  Cameras, visitor logs, and phone GPS are examples of other ways you could be tied to a location at a specific time.&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id=&#34;setting-up-tails&#34;&gt;Setting up Tails&lt;/h3&gt;
&lt;p&gt;In this exercise, I&amp;rsquo;m going to walk through installing Tails in a VM on Linux, which may be sufficient for run-of-the-mill situations.&lt;/p&gt;
&lt;p&gt;First, install KVM.  The commands below apply for debian-derived systems like Ubuntu, Mint, or Pop!_OS.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install qemu-kvm libvirt-daemon-system
sudo adduser $USER libvirt
sudo apt install virt-manager
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, download the &lt;a href=&#34;https://tails.boum.org/install/dvd/index.en.html&#34;&gt;Tails ISO&lt;/a&gt; or an &lt;a href=&#34;https://tails.boum.org/install/download/&#34;&gt;IMG file&lt;/a&gt; which is easier to write to USB.  I&amp;rsquo;d use &lt;a href=&#34;https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwio88TRvZr-AhVXIUQIHej7AqwQFnoECCAQAQ&amp;amp;url=https%3A%2F%2Fwww.balena.io%2Fetcher&amp;amp;usg=AOvVaw0UNPm_qcksmQ1aL8D-5gLD&#34;&gt;Etcher&lt;/a&gt; to write to disk, but if you haven&amp;rsquo;t done that part before the Tails website has installation &lt;a href=&#34;https://tails.boum.org/install/index.en.html&#34;&gt;instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to install on a VM, run the Virtual Machine Manager and create a new machine.  The device I setup had the following settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generic Linux 2020&lt;/li&gt;
&lt;li&gt;2 vCPU, 8 GB RAM (I think you just need 4)&lt;/li&gt;
&lt;li&gt;Boot options - boot from SATA CDROM&lt;/li&gt;
&lt;li&gt;SATA CDROM - mapped to the Tails ISO in my download directory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start the VM.  The VM window will &amp;ldquo;capture&amp;rdquo; your mouse and keyboard - to break out and back to your host machine press the right Win and Ctrl keys.  It will boot to a welcome.  You may want to set some additional parameters (these will only apply until the next boot).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230407_tailsadditionalsettings.png#floatsmallright&#34; alt=&#34;Additional Settings&#34;&gt;&lt;/p&gt;
&lt;p&gt;Under Additional settings, choose the plus and set an Administrative password.  This only applies to the session.  The &amp;ldquo;Unsafe Browser&amp;rdquo; option allows you to sign into a captive portal.  Again, that&amp;rsquo;s another way to identify you so I would just pick another place to connect and turn that off.&lt;/p&gt;
&lt;p&gt;Choose &amp;ldquo;start Tails&amp;rdquo; to move into a Gnome desktop.  It will prompt you to start Tor first thing.  You can tell it to connect automatically or &amp;ldquo;Hide to my local network that I&amp;rsquo;m connecting to Tor&amp;rdquo;.  The latter choice requires identifying and connecting to a Tor bridge manually.  You&amp;rsquo;ll be prompted to email &lt;a href=&#34;mailto:bridges@torproject.org&#34;&gt;bridges@torproject.org&lt;/a&gt; and they&amp;rsquo;ll help you find a discrete way to connect.&lt;/p&gt;
&lt;h3 id=&#34;specifying-tor-exit-node&#34;&gt;Specifying Tor Exit Node&lt;/h3&gt;
&lt;p&gt;One problem that you may encounter is that the site you are trying to contact blocks connections from other countries.  Since Tor will give you a random exit node, there&amp;rsquo;s a good chance your traffic will appear to be coming from somewhere else on the globe.  My first test put me in Germany, for instance.&lt;/p&gt;
&lt;p&gt;If you want to force Tor to exit your traffic in a particular country, open a terminal in Tails and edit the tor configuration file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/tor/torrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add these lines to the end of the config file to force traffic to exit in the US.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ExitNodes {us}
StrictNodes 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ve included a table of exit codes at the end of this document to help you find the appropriate country.&lt;/p&gt;
&lt;h3 id=&#34;browserling&#34;&gt;Browserling&lt;/h3&gt;
&lt;p&gt;For an extra level of obscurity, use &lt;a href=&#34;https://www.browserling.com/&#34;&gt;Browserling&lt;/a&gt;.  Browserling is a site that will give you a web browser in a Windows VM to test your website.  You can also use this to create another level of difficulty to tracing the connection back.  Use Tor to connect to browserling, which will spin up a temporary VM (it will take a minute).  It&amp;rsquo;s meant for testing web pages and will only be available to you for a couple minutes, so you might want to prep what you want to send in a text editor and then copy and paste it over.&lt;/p&gt;
&lt;h2 id=&#34;final-note&#34;&gt;Final Note&lt;/h2&gt;
&lt;p&gt;I hope you don&amp;rsquo;t need this, but if you do I wish you the best.  Hopefully this will give you some ideas where to look and how to protect yourself!&lt;/p&gt;
&lt;h2 id=&#34;for-reference----tor-country-codes&#34;&gt;For Reference -  Tor country codes&lt;/h2&gt;




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table of Tor Country Codes&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Country&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Code&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Country&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ascension Island&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ac}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Afghanistan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Af}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Aland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ax}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Albania&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Al}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Algeria&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Dz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Andorra&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ad}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Angola&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ao}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Anguilla&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ai}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Antarctica&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Aq}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Antigua And Barbuda&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ag}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Argentina Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ar}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Armenia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Am}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Aruba&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Aw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Australia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Au}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Austria&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{At}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Azerbaijan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Az}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Bahamas&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bs}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Bahrain&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Bangladesh&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bd}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Barbados&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bb}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Belarus&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{By}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Belgium&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Be}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Belize&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Benin&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bj}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Bermuda&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bm}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Bhutan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bt}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Bolivia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bo}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Bosnia And Herzegovina&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ba}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Botswana&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Bouvet Island&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bv}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Brazil&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Br}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;British Indian Ocean Terr&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Io}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;British Virgin Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Vg}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Brunei Darussalam&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bn}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Bulgaria&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bg}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Burkina Faso&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bf}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Burundi&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Bi}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Cambodia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cameroon&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cm}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Canada&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ca}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cape Verde&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cv}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Cayman Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ky}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Central African Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cf}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Chad&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Td}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Chile&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cl}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;People&amp;rsquo;s Republic Of China&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cn}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Christmas Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cx}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Cocos Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Colombia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Co}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Comoras&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Km}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Congo&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cg}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Congo (Democratic Republic)&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cd}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cook Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ck}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Costa Rica&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cote D Ivoire&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ci}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Croatia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Hr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Cuba&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cu}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Cyprus&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cy}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Czech Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Cz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Denmark&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Dk}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Djibouti&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Dj}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Dominica&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Dm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Dominican Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Do}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;East Timor&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tp}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ecuador&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ec}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Egypt&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Eg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;El Salvador&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sv}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Equatorial Guinea&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gq}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Estonia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ee}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Ethiopia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Et}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Falkland Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Faroe Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fo}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Fiji&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fj}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Finland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fi}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;France&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fr}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;France Metropolitan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fx}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;French Guiana&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gf}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;French Polynesia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pf}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;French Southern Territories&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tf}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Gabon&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ga}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Gambia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gm}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Georgia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ge}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Germany&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{De}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Ghana&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Gibralter&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gi}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Greece&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Greenland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gl}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Grenada&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gd}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Guadeloupe&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gp}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Guam&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gu}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Guatemala&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gt}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Guinea&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gn}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Guinea-Bissau&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Guyana&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gy}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Haiti&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ht}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Heard-Mcdonald Island&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Hm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Honduras&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Hn}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Hong Kong&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Hk}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Hungary&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Hu}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Iceland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Is}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;India&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{In}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Indonesia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Id}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Iran, Islamic Republic Of&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ir}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Iraq&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Iq}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ireland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ie}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Isle Of Man&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Im}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Israel&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Il}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Italy&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{It}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Jamaica&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Jm}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Japan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Jp}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Jordan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Jo}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Kazakhstan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kz}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Kenya&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ke}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Kiribati&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ki}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Korea, Dem. Peoples Rep Of&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kp}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Korea, Republic Of&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Kuwait&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Kyrgyzstan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Lao People&amp;rsquo;s Dem. Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{La}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Latvia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lv}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Lebanon&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lb}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Lesotho&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ls}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Liberia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lr}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Libyan Arab Jamahiriya&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ly}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Liechtenstein&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Li}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Lithuania&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lt}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Luxembourg&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lu}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Macao&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mo}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Macedonia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Madagascar&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Malawi&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Malaysia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{My}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Maldives&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mv}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Mali&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ml}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Malta&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mt}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Marshall Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Martinique&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mq}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Mauritania&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Mauritius&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mu}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Mayotte&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Yt}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Mexico&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mx}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Micronesia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Fm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Moldava Republic Of&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Md}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Monaco&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Mongolia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mn}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Montenegro&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Me}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Montserrat&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ms}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Morocco&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ma}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Mozambique&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Myanmar&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Namibia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Na}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Nauru&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Nepal&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Np}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Netherlands Antilles&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{An}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Netherlands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nl}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;New Caledonia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;New Zealand&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Nicaragua&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ni}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Niger&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ne}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Nigeria&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ng}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Niue&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nu}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Norfolk Island&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Nf}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Northern Mariana Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Mp}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Norway&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{No}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Oman&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Om}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Pakistan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pk}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Palau&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pw}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Palestine&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ps}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Panama&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pa}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Papua New Guinea&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Paraguay&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Py}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Peru&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pe}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Poland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pl}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Portugal&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pt}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Puerto Rico&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pr}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Qatar&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Qa}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Reunion&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Re}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Romania&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ro}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Russian Federation&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ru}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Rwanda&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Rw}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Samoa&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ws}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;San Marino&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Sao Tome/Principe&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{St}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Saudi Arabia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sa}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Scotland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Uk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Senegal&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sn}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Serbia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Rs}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Seychelles&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Sierra Leone&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sl}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Singapore&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Slovakia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Slovenia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Si}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Solomon Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sb}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Somalia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{So}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Somoa,Gilbert,Ellice Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{As}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;South Africa&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Za}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;South Georgia, South Sandwich Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gs}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Spain&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Es}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Sri Lanka&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;St. Helena&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;St. Kitts And Nevis&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Kn}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;St. Lucia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Lc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;St. Pierre And Miquelon&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Pm}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;St. Vincent - The Grenadines&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Vc}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Sudan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sd}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Suriname&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sr}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Svalbard And Jan Mayen&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sj}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Swaziland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sz}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Sweden&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Se}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Switzerland&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ch}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Syrian Arab Republic&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Sy}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Taiwan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tw}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Tajikistan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tj}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Tanzania&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tz}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Thailand&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Th}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Togo&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tg}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Tokelau&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Tonga&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{To}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Trinidad And Tobago&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tt}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Tunisia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tn}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Turkey&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tr}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Turkmenistan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Turks And Calcos Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tc}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Tuvalu&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Tv}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Uganda&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ug}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Ukraine&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ua}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;United Arab Emirates&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ae}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;United Kingdom&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Gb}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;United Kingdom&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Uk}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;United States&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Us}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;United States Minor Outl.Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Um}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Uruguay&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Uy}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Uzbekistan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Uz}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Vanuatu&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Vu}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Vatican City State&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Va}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Venezuela&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ve}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Viet Nam&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Vn}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;US Virgin Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Vi}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Wallis And Futuna Islands&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Wf}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Western Sahara&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Eh}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Yemen&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Ye}&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Zambia&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Zm}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Zimbabwe&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{Zw}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

</description>
    </item>
    
    <item>
      <title>Trayscale</title>
      <link>https://nextpertise.net/230318_trayscale/</link>
      <pubDate>Sat, 18 Mar 2023 15:46:32 -0400</pubDate>
      
      <guid>https://nextpertise.net/230318_trayscale/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve covered a few items in recent months around my home network, including using &lt;a href=&#34;https://nextpertise.net/posts/221004_tailscale&#34;&gt;Tailscale&lt;/a&gt; as a VPN overlay and setting up a home &lt;a href=&#34;https://nextpertise.net/posts/230226_home&#34;&gt;DNS&lt;/a&gt; server.  This entry is an update on living with those elements.&lt;/p&gt;
&lt;p&gt;As a point of comparison, I&amp;rsquo;ve used Zerotier in the recent past and really liked it.  With Zerotier, I had a dedicated Ubuntu server VM to route the local network onto the Zerotier VPN.  That worked beautifully.  Tailscale has been a little uneven, but it&amp;rsquo;s becoming more comfortable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230318_tailscaledns.png#floatsmallright&#34; alt=&#34;Tailscale DNS picture&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;getting-dns-straightened-out&#34;&gt;Getting DNS straightened out&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve had issues accessing home devices by name.  I really can&amp;rsquo;t believe I missed the setting, but logging into the tailscale admin portal showed that I didn&amp;rsquo;t have a DNS setting.  Going to the DNS tab and poiting the Global nameserver setting to my local pi-hole fixed this issue nicely and now I&amp;rsquo;m able to ping into the home.arpa domain I use in the house.
&lt;img src=&#34;https://user-images.githubusercontent.com/326750/188052311-2267af08-82a1-422f-b6ad-bc2cd4de0ac5.png#floatsmallleft&#34; alt=&#34;Trayscale&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;trayscale&#34;&gt;Trayscale&lt;/h2&gt;
&lt;p&gt;Tailscale is typically invoked from the command line.  The command to turn on my desktop at home and to have it bridge the tailscale network into the home network looks like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tailscale up --advertise-routes=192.168.0.0/24 --advertise-exit-node --accept-routes=true 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trayscale is an unofficial graphical client for Tailscale available from Flathub.  It is still described as &amp;ldquo;alpha&amp;rdquo;, but aims to provide an easy way to invoke the VPN, change settings, and find other device on the tailnet.  It can be installed from the command line using the following command.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flatpak install flathub dev.deedles.Trayscale
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ve tested it on Pop! and Nix-OS.  In my experience it&amp;rsquo;s reliable and much easier than the command line.  Plus, understanding the local node and getting a list of devices is well presented.  I like that it&amp;rsquo;s available through Flathub, because that will make it easy to ensure that it&amp;rsquo;s kept up to date.  Given the description, I assume that it&amp;rsquo;s still at a stage where it&amp;rsquo;s undergoing rapid change and that&amp;rsquo;s born out by the release list shown on Github.  As of 3/18/22, Flathub gives me v0.8.1 which was released two days ago.  Github shows a v0.8.2 released today.&lt;/p&gt;
&lt;p&gt;Cute little utility, and it makes it easier to support your tailscale network, so check it out!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automaticly adding Hugo articles to Obsidian</title>
      <link>https://nextpertise.net/230313_blog2obsidian/</link>
      <pubDate>Mon, 13 Mar 2023 18:08:17 -0400</pubDate>
      
      <guid>https://nextpertise.net/230313_blog2obsidian/</guid>
      <description>&lt;h2 id=&#34;incorporating-blog-articles-in-obsidian&#34;&gt;Incorporating blog articles in Obsidian&lt;/h2&gt;
&lt;p&gt;Most of my writing occurs in two places, but I&amp;rsquo;d like to consolidate it into my &amp;ldquo;second brain&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;My blog articles are written in Visual Studio Code, in markdown so that they can be compiled via &lt;a href=&#34;https://nextpertise.net/posts/210102_hugoafter6&#34;&gt;hugo&lt;/a&gt;.  I&amp;rsquo;ve discussed in this blog that Obsidian - also in Markdown -  is setup as my &amp;ldquo;second brain&amp;rdquo;.  My blog posts represent an important part of that &amp;ldquo;second brain&amp;rdquo;, so I&amp;rsquo;d like to make sure they&amp;rsquo;re included in my vault.  Since both are markdown, this should be fairly simple.  This should just require that I copy my hugo content directory into my obsidian directory.  To test this, I made a quick script.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp ~/git/nextpertise/content/posts/*.md ~/2nd\ Brain/Nextpertise/
echo &amp;quot;blog2obs.sh ran&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also made this file executable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x blog2obs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This works as expected.  The markdown files are copied from my hugo git directory into my Obsidian vault under the &amp;ldquo;Nextpertise&amp;rdquo; folder.  Obsidian actually updates dynamically as soon as the files are present.  There are some issues - my website has a directory for graphics that I&amp;rsquo;m not copying over, for instance, and the internal linking and tagging I expect in Obsidian wouldn&amp;rsquo;t be present in these files.  External links in the posts seem to work as expected though.  All I need to do is remember to run this occassionally . . .&lt;/p&gt;
&lt;h2 id=&#34;automatically&#34;&gt;Automatically&lt;/h2&gt;
&lt;p&gt;So the next step was to have this run as a &lt;em&gt;cron&lt;/em&gt; job.  On Linux, use &lt;strong&gt;crontab -e&lt;/strong&gt; to setup the job.  Below is the way I have this setup and working.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MAILTO=MYEMAILADDRESS
0 0 * * * /home/brent/blog2obs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230314_Linux_Email.jpg#floatright&#34; alt=&#34;It works!&#34;&gt;
The five variables before the job are minute, hour, day, month, and day of the week.  So my entry is to run at 00 minutes and 0 hour (midnight) every day.  Cron defaults to outputting to system mail, but I use the MAILTO entry and SSMTP to redirect this to a public email address.  For more information on how to set this up see my &lt;a href=&#34;https://nextpertise.net/posts/230313_command_line_email/&#34;&gt;last post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The received email is on the right, and now it&amp;rsquo;s clear why the &lt;em&gt;echo&lt;/em&gt; command is in the batch file.  The echo provides some text - without that text there&amp;rsquo;s no output from the script and nothing to email.&lt;/p&gt;
&lt;p&gt;There are some possible improvements that might make this worth revisiting in the future.  The simple script doesn&amp;rsquo;t indicate if there was an error copying the files.  I could also imagine inserting links and tags that are used in my Obsidian vault as a header to the imported files.  However, this is a straight-forward process and it&amp;rsquo;s meeting my immediate need.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sending Email through Google from the Command Line</title>
      <link>https://nextpertise.net/230313_command_line_email/</link>
      <pubDate>Sun, 12 Mar 2023 18:22:33 -0400</pubDate>
      
      <guid>https://nextpertise.net/230313_command_line_email/</guid>
      <description>&lt;p&gt;In the course of another project, I recently worked out how to send email through Gmail from the Linux shell.  This is both a really cool and powerful tool as well as something I could see incorporating into a lot of future work.  Since it had such utility, I wanted to document the process for myself and share that with you.&lt;/p&gt;
&lt;p&gt;Some Linux operations, such as cron, will send output to the local mail spooler.  Files sent this way end up in /var/mail/$USER or /var/spool/mail/$USER.  Sendmail can be configured as well so that the output goes to a public email address, however running Sendmail involves a more complication and overhead.  For instance, mail coming from an SMTP server has to be trusted by the receiver and a lot of places (O365, Gmail, etc) don&amp;rsquo;t trust random SMTP servers that pop up - for good reason.&lt;/p&gt;
&lt;p&gt;SSMTP is a program that takes this &amp;ldquo;local mail&amp;rdquo; and sends it to an external SMTP system.  It can be configured to work with any SMTP server, but I use Google Mail and so that&amp;rsquo;s the example I&amp;rsquo;ll walk through.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;SSMTP doesn&amp;rsquo;t have a facility to handle two factor authentication, so before you begin you&amp;rsquo;ll need to generate an app-password at Google.  Log into your Google account, use the menu icon (3x3 squares) to choose &amp;ldquo;account&amp;rdquo;, and 2-step Verification.  App Password setup is at the bottom of the 2FA screen.  To create a new app password, specify the app (I used &amp;ldquo;Linux&amp;rdquo;) and device and choose generate.  You have to copy the password shown - it will never be displayed for you again!  If you forget it, you&amp;rsquo;ll need to follow this procedure to delete the forgotten app password and create a new one.&lt;/p&gt;
&lt;p&gt;On Ubuntu, install ssmtp using apt (no PPA needed):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install ssmtp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit the SSMTP configuration file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/ssmtp/ssmtp.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My configuration file is shown below and is verified working.  You&amp;rsquo;ll need to change the email address to your gmail address and change the AuthPass line based on the app password you generated earlier.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AuthUser=YOU@YOURCOMPANY.COM
AuthPass=YOURAPPPASSWORD
FromLineOverride=YES
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
FROM:YOU@YOURCOMPANY.COM
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;p&gt;Once this is complete, an easy way to test is to pipe something to ssmtp as shown below.  In the first example, I&amp;rsquo;m just sending some text.  The trailing email address will be used as the &amp;ldquo;to&amp;rdquo; address.  Leaving off the from address (-au option) will result in a bcc: to test@yourmachine, which will be bounced by Google and give you a successful message (the &amp;ldquo;to&amp;rdquo; line) and a bounce message (from the bcc).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;Hello E-mail!&amp;quot; | ssmtp -au YOU@YOURCOMPANY.COM -s &amp;quot;Test&amp;quot; YOU@YOURCOMPANY.COM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you understand how this works, you can redirect or pipe any output this way.  Here&amp;rsquo;s another simple example that sends a directory output to email.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls | ssmtp -au YOU@YOURCOMPANY.COM -s &amp;quot;Test&amp;quot; YOU@YOURCOMPANY.COM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ll consider as I add devices and services into my home network and lab.  One of the immeadeate ideas that pops up is that I&amp;rsquo;d like my backup job to let me know it completed successfully.  It&amp;rsquo;s a good basic tool to have in the admin tool bag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Obsidian Ava ChatGPT Plugin</title>
      <link>https://nextpertise.net/230310_ava/</link>
      <pubDate>Fri, 10 Mar 2023 22:11:53 -0500</pubDate>
      
      <guid>https://nextpertise.net/230310_ava/</guid>
      <description>&lt;p&gt;ChatGPT is all the rage  these days.  It can carry on a chat conversation and compose text.  Folks are using it to help write business letters, to help write documents, and to explore the state of modern Artificial Intelligence.  Because ChatGPT has ingested a lot of background data, it&amp;rsquo;s able to write coherently on a number of topics and sometimes can make insightful inferences.  Contrarily, because it doesn&amp;rsquo;t really &amp;ldquo;know&amp;rdquo; so much as form statistical relationships, it sometimes speaks authoritatively against the facts.&lt;/p&gt;
&lt;h2 id=&#34;installing-the-ava-plugin&#34;&gt;Installing the Ava Plugin&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230310_ava.png#center&#34; alt=&#34;Ava Installed&#34;&gt;
The &lt;a href=&#34;https://github.com/louis030195/obsidian-ava&#34;&gt;Obsidian Ava&lt;/a&gt; plugin pulls ChatGPT into Obsidian.  To install the plugin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Obsidian  open settings by clicking on the gear icon at the bottom of the left-hand toolbar.&lt;/li&gt;
&lt;li&gt;Click on &amp;ldquo;Third-Party Plugins&amp;rdquo; and select &amp;ldquo;Community Plugins.&amp;rdquo; Search for &amp;ldquo;Obsidian Ava&amp;rdquo; in the search bar, and once you find it, click on &amp;ldquo;Install&amp;rdquo; to install the plugin.  You&amp;rsquo;ll need to enable the plugin while you are there.&lt;/li&gt;
&lt;li&gt;Then open your command palette by pressing &amp;ldquo;Ctrl/Cmd + P&amp;rdquo; and type &amp;ldquo;Ava&amp;rdquo; to launch the chatbot. Follow the instructions to link to the chatbot, and you&amp;rsquo;re good to go!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;what-can-it-do&#34;&gt;What can it do?&lt;/h3&gt;
&lt;p&gt;Once installed, the plugin can compose text, create links, or generate an image based on text you provide.&lt;/p&gt;
&lt;p&gt;There are options for Ava to take a prompt and write a paragraph, to rewrite something you&amp;rsquo;ve written, or to finish writing something you&amp;rsquo;ve started.  I&amp;rsquo;ve been expirimenting with this capability and found it to be potentially helpful.  I often have trouble finding a way to start writing, but found that I could take the ChatGPT-generated paragraph, edit and rework it, and this made getting started on a topic easier.&lt;/p&gt;
&lt;p&gt;I said &amp;ldquo;potentially&amp;rdquo; for two reasons.  First, the generated text commonly begins with a boiler-plate cavaet like &amp;ldquo;As an AI language model, I am unable to determine subjective motives or reasons, but . . .&amp;rdquo;  Second, in most cases I found that ChatGPT generated structurally correct sentences, but that they lacked content, direction, and few concepts that weren&amp;rsquo;t already in my prompt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230310_ava_tags.png#floatsmallright&#34; alt=&#34;Tagging&#34;&gt;
Ava can analyze a file and your vault and suggest linking to other files.  The whole &amp;ldquo;Second brain&amp;rdquo; concept is built off of these connections, so this is could be a powerful tool.  Ava installs a link icon that will suggest similar notes.  It will rank them using a &amp;ldquo;similarity percentage&amp;rdquo;.  I&amp;rsquo;m not sure what &amp;ldquo;86% similar&amp;rdquo; means, but I found that it did a reasonable job of surfacing other content that includes the same words.&lt;/p&gt;
&lt;p&gt;In the same vein, Ava can analyze a file and suggest tags.  I&amp;rsquo;m a sparse user of tags, so I can&amp;rsquo;t testify to the utility here.  The image to the right shows the tags suggested for this file, so you can see that these generally make sense.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/If_ChatGPT_was_a_human_girl_named_Ava.jpg#floatsmallleft&#34; alt=&#34;Ava&#34;&gt;
Ava can also generate images based on text.  Select a block of text, open the command prompt, and choose &amp;ldquo;Ava:Generate Image&amp;rdquo; and the image will be placed below the selected text.  As an example, I typed &amp;ldquo;If ChatGPT was a human girl named Ava&amp;rdquo; and it created the image to the left.  I&amp;rsquo;ve been playing with this and have yet to generate a really compelling picture, but it&amp;rsquo;s intriguing.  This may be a way around writers block by engaging a different part of the brain and I&amp;rsquo;ll continue to fiddle with it.&lt;/p&gt;
&lt;h2 id=&#34;final-notes&#34;&gt;Final notes&lt;/h2&gt;
&lt;p&gt;The cute thing these days is to have ChatGPT write an article on it&amp;rsquo;s on.  Bonus points to have it write an article about itself for you.  In my opinion, Ava doesn&amp;rsquo;t represent the day when a Chatbot can produce text at the level of a common human writer.  I tried different prompts as I was writing this piece and Ava failed to produce output that ended up in the final piece.&lt;/p&gt;
&lt;p&gt;That said, I found that Ava was useful as a tool to spur my writing.  Generating the prompt text backed me into outlining the article.  The returned copy provided a starting point, even if none of it was incorporated in the final product.  Ava made useful suggestions about tags and links within my Obsidian vault.  Finally, playing with the image generation was fun and I could see how it could be used as a way to creatively engage with your writing.&lt;/p&gt;
&lt;p&gt;I understand there are other integrations and I&amp;rsquo;ll try them out as I have time.  I intend to leave this plugin enabled and continue to investigate the best way to use it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Command Line Browser Carbonyl</title>
      <link>https://nextpertise.net/230305_carbonyl/</link>
      <pubDate>Sun, 05 Mar 2023 21:54:31 -0500</pubDate>
      
      <guid>https://nextpertise.net/230305_carbonyl/</guid>
      <description>&lt;p&gt;Not sure where to classify this discovery - Carbonyl is a shell-based brower that is available for Linux, Mac, and Windows.  Carbonyl is built on a Chromium engine and does not support plugins at this point or tie into an existing Chrome installation.&lt;/p&gt;
&lt;p&gt;Carbonyl is fast and it produces a low-res but usable web page.  It is surprisingly responsive - there&amp;rsquo;s a demo of someone playing Doom using it and I watched some Youtube using it.  That&amp;rsquo;s a little hard to visualize, so you may just have to try it.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s Carbonyl producing a portion of this site: &lt;img src=&#34;https://nextpertise.net/230305_Carbonyl.png&#34; alt=&#34;Carbonyl&#34;&gt;&lt;/p&gt;
&lt;p&gt;Carbonyl is easy to install - just go to the Github assets and grab the version for your OS.  Here&amp;rsquo;s the &lt;a href=&#34;https://github.com/fathyb/carbonyl/releases/tag/v0.0.3&#34;&gt;current version&lt;/a&gt; as of early March 2023.  It extracts to a single file and it can be executed from the command line similar to this example.&lt;/p&gt;
&lt;p&gt;./carbonyl &lt;a href=&#34;https://www.nextpertise.net&#34;&gt;https://www.nextpertise.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Use Control-C to exit the browser experience.  In the meantime, the mouse can be used to click through links and it interacts exactly like Chrome would.&lt;/p&gt;
&lt;h3 id=&#34;why&#34;&gt;Why?&lt;/h3&gt;
&lt;p&gt;So, who cares?  Certainly, the Carbonyl experience doesn&amp;rsquo;t match a full browser in terms of resolution or functionality.  I think there are two use cases that are worth considering.  The first is as a demonstration - if a full browser can be supported from the command line, what else is possible?  Are there modalities where web content could be used on the command line?  One possibility that occurs to me is &lt;em&gt;man&lt;/em&gt; pages.  Imagine if the result of typing &amp;ldquo;man ls&amp;rdquo; was a set of linked hypertext, formatted to present cleanly in the shell!&lt;/p&gt;
&lt;p&gt;Carbonyl conceivably has some current advantages as well.  It&amp;rsquo;s a single stand-alone binary, so shouldn&amp;rsquo;t be subject to dependencies or system limitations.  It&amp;rsquo;s small and easily downloaded, installed, and executed.&lt;/p&gt;
&lt;p&gt;Carbonyl doesn&amp;rsquo;t render exactly like a regular browser - I am currently using it to check the rendering of my page and you can&amp;rsquo;t trust the layout and CSS seems to be mostly hit but some miss.  I&amp;rsquo;m unclear if a seperate Chrome binary is good or bad from a security standpoint.  Is it a new attack surface or is it a sand-box to play in?  My gut is to stick it in a container to isolate it from the system.&lt;/p&gt;
&lt;p&gt;As a curiousity, it&amp;rsquo;s interesting.  I can see where there are certain jobs where this could be the right tool.  I&amp;rsquo;m most bullish on how this could be coupled with pages designed for text-rendering to improve the command line experience.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Home Names</title>
      <link>https://nextpertise.net/230226_home/</link>
      <pubDate>Sun, 26 Feb 2023 14:56:13 -0500</pubDate>
      
      <guid>https://nextpertise.net/230226_home/</guid>
      <description>&lt;h2 id=&#34;if-you-have-a-private-name-server-at-home-use-homearpa&#34;&gt;If you have a private name server at home, use &amp;ldquo;home.arpa&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve used IPs for most of my home networking for a while.  At one point (years ago) I ran a Windows DNS server, but I&amp;rsquo;ve banished Windows and Linux DNS is extra work.  Plus, systemd makes DNS on Linux painful.&lt;/p&gt;
&lt;p&gt;A couple of things have changed recently.  First, I&amp;rsquo;ve played with some server applications such as NextCloud that expect to be in a named environment.  Second, Pi-Hole has made running a home DNS server much, much, easier.&lt;/p&gt;
&lt;p&gt;That raises the question -&lt;/p&gt;
&lt;h2 id=&#34;what-namespace-should-be-used-for-my-personal-devices&#34;&gt;what namespace should be used for my personal devices?&lt;/h2&gt;
&lt;p&gt;The easy part is what you should NOT do.  Don&amp;rsquo;t invent or re-use a name that is potentially valid on the public Internet.  Calling my home network &amp;ldquo;stewart.com&amp;rdquo; will prevent accessing the real public .com address from my local network.  Automated processes that use the namespace might accidentally send traffic to &amp;ldquo;real&amp;rdquo; stewart.com if my local DNS goes down or if I travel with a home laptop.  Further, any blacklists that impact the &amp;ldquo;real&amp;rdquo; domain might be applied to my traffic.&lt;/p&gt;
&lt;p&gt;About ten years ago, it was common to see examples that used &amp;ldquo;.local&amp;rdquo; for private domains.  Microsoft recommended it for a while as well.  The big issue here was that Bonjour/Rendezvous/Multicast DNS use that namespace and could cause a conflict.&lt;/p&gt;
&lt;p&gt;I own two domains - nextpertise.net and &lt;a href=&#34;https://www.stewart.tc&#34;&gt;stewart.tc&lt;/a&gt;.  A second option would be to use one of my domains internally.  When at home, my local server would resolve &amp;ldquo;local&amp;rdquo; names and outside my network the resolution goes to a public DNS with a different set of names.  This gets a little problematic with overlapping names.  For instance, if my public website changes IP then I have to manually update my internal DNS.  Also, it can be confusing trying to figure out what is responding when names overlap.  Still, this is manageable and does work.&lt;/p&gt;
&lt;p&gt;A version of this would be to use a subdomain like &lt;em&gt;local.stewart.tc&lt;/em&gt;.  My home web server would be &lt;a href=&#34;https://www.local.stewart.tc&#34;&gt;www.local.stewart.tc&lt;/a&gt; and the name spaces would be distinct.  When outside the network, that subdomain just doesn&amp;rsquo;t resolve.  This isn&amp;rsquo;t confusing.  If you have a domain, this isn&amp;rsquo;t a bad option.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t have a public domain, there are some reserved namespaces taht won&amp;rsquo;t be used on the public internet that could be considered.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RFC 2606 reserves .test for testing by the IETF.  I could use &lt;em&gt;stewart.test&lt;/em&gt; without worrying it would be used anywhere else.&lt;/li&gt;
&lt;li&gt;RFC 6762 suggests .intranet, .internal, .private, .corp, .home, and .lan&lt;/li&gt;
&lt;li&gt;RFC 8375 reserves .home.arpa for exactly this use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The RFC 6762 names tend to get used in businesses, so could conflict with your work VPN.  RFC 8375 calls out that there are conflicting uses of &amp;ldquo;.home&amp;rdquo; and so updates that to .home.arpa.  The .arpa top level domain is reserved for technical uses and there isn&amp;rsquo;t a way a register a conflicting domain. .home.arpa is reserved for private use, so it&amp;rsquo;s a slightly better choice than the 6762 names.&lt;/p&gt;
&lt;p&gt;I chose to use the .home.arpa space when setting up the house in pi-hole and experienced no issues.  As I mentioned earlier, subdomains using a domain I own would have worked as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Goodhardt&#39;s Law</title>
      <link>https://nextpertise.net/230127_goodhardt/</link>
      <pubDate>Thu, 26 Jan 2023 17:48:13 -0500</pubDate>
      
      <guid>https://nextpertise.net/230127_goodhardt/</guid>
      <description>&lt;p&gt;Goodhard&amp;rsquo;t law is a good example of why we say management is an art.  Many of you won&amp;rsquo;t be familiar with this, but you should.  The law says . . .&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When a measure becomes a target, it ceases to be a good measure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Goodhardt&amp;rsquo;s law speaks to the tendency of people to optimize around a measurement.  A &amp;ldquo;measure&amp;rdquo; is anything that you track, such as what percentage of folks worked from home today.  A target is a goal attached to that measurement, such as 50%.  Post that as a graph on the wall, and people will spontaneously start working from the office.&lt;/p&gt;
&lt;p&gt;Goodhardt&amp;rsquo;s law has two applications when manageing people.  The first is manipulative: by measuring desired behavior, we end up game-ifying it and create a positive feedback loop.  I use manipulative in a non-judgemental sense - there are times when we want to encourage virtuous behavior.  Examples here might include drivers wearing seatbelts, or days without an accident.&lt;/p&gt;
&lt;p&gt;Of course, Goodhardt&amp;rsquo;s law can be mis-used in this way as well.  There are many examples of businesspeople operating in unwise ways to meet this kind of metric.  For instance, a bank might track loan originations which might discourage scrutiny of borrowers.  This behavior is commonly called &amp;ldquo;gaming the system&amp;rdquo; because it rewards people for outcomes that may not add value.&lt;/p&gt;
&lt;p&gt;The Volkswagen emissions scandal is an example of this behavior.  The measurement - tailpipe pollution - was made a target and VW ended up optimizing their cars for the test rig and not for real-world driving.  Anotehr example is the sub-prime mortgage crisis (see: 2008).&lt;/p&gt;
&lt;p&gt;The second use of Goodhardt&amp;rsquo;s law is not seeking to change behavior.  If you want to know about a behavior without influencing behavior, don&amp;rsquo;t make it a target.  Using the bank example, the bank might track originations and use that data to identify successful practices that can be retaught.&lt;/p&gt;
&lt;p&gt;Goodhardt&amp;rsquo;s law can be used for good, for evil, or for insight.  It plays off the social dynamics of defining success.  Think about the cashiers and waiters that ask for a &amp;ldquo;5&amp;rdquo; on a feedback form - what exactly is that data telling their managers?  In IT, many organizations use Key Performance Indicators (KPIs) to optimize performance.  Goodhardt&amp;rsquo;s law advises caution and thought before rolling out that kind of program.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IMHO</title>
      <link>https://nextpertise.net/230122_announcing/</link>
      <pubDate>Sun, 22 Jan 2023 13:27:41 -0500</pubDate>
      
      <guid>https://nextpertise.net/230122_announcing/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve created a seperate site - &lt;a href=&#34;https://www.stewart.tc&#34;&gt;Stewart.tc&lt;/a&gt; - to house my book reviews, discoveries, and thoughts on non-Internet subjects.&lt;/p&gt;
&lt;p&gt;I titled this &amp;ldquo;IMHO&amp;rdquo; or &amp;ldquo;in my humble opinion&amp;rdquo;, but I&amp;rsquo;ve always tried to avoid opinions in this space on non-technical topics.  Even the &amp;ldquo;non-technical&amp;rdquo; tag is about Internet topics for presentation to non-techies.&lt;/p&gt;
&lt;p&gt;I started writing because I enjoy sharing what I&amp;rsquo;ve learned and because I enjoy writing and wanted to develop the skill by making it more of a discipline.  Writing helps to organize thoughts and get them out of your head.  The idea that I can pursue IT ideas that fascinate me and share those findings with others has been great, and along the way I&amp;rsquo;ve discovered that I refer back to my own writing fairly often to remember how to do &lt;em&gt;that thing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;ve grown and my circumstances have evolved, I&amp;rsquo;ve had less time to pursue IT ideas but more time to think on other topics.  I tried to include some of that here, for instance in the book reviews, but in the end felt that it was best persued in a seperate forum.  So, if you have enjoyed my book notes or are interested in my thoughts on deconstructionism, I invite you to check out the new site.  I moved the book reviews over to that site, but there&amp;rsquo;s not much else there so far so you may want to check back in a few weeks.&lt;/p&gt;
&lt;p&gt;This site will continue, probably at about the same pace, and I hope that it will continue to occassionally offer something of use to you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Slingshot</title>
      <link>https://nextpertise.net/230115_slingshot/</link>
      <pubDate>Sun, 15 Jan 2023 15:03:12 -0500</pubDate>
      
      <guid>https://nextpertise.net/230115_slingshot/</guid>
      <description>&lt;p&gt;Thirty five years ago (!) I took my Amiga 1000 to college.  There used to be a copy of WordPerfect for &lt;em&gt;everything&lt;/em&gt; and that was what I did a lot of my term papers on.  I would print postscript files to a 3.5&amp;quot; disk, then take them to the library and print using &lt;strong&gt;copy termpaper.ps &amp;gt; lpt1:&lt;/strong&gt; to the LaserWriter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230115_Slingshot.png#floatsmallleft&#34; alt=&#34;Slingshot&#34;&gt;&lt;/p&gt;
&lt;p&gt;But then, like now, computers were used for more than just work.  There were a lot of cool Amiga games including Arctic Fox (a tank game), an &amp;ldquo;x and o&amp;rdquo; football game that we wore the controllers out on, and others.  But I also remember a really simple &amp;ldquo;Star Trek&amp;rdquo; game that we had a lot of fun with.&lt;/p&gt;
&lt;p&gt;In retrospect, I&amp;rsquo;m guessing this game was early FOSS and it certainly wasn&amp;rsquo;t licensed, but this was also that period where the last TV show was 20 years old and there had only been a few mediocre movies to keep the flame flickering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230115_Slingshot2.png#floatright&#34; alt=&#34;Slingshot wide-angle&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the game, two ships were positioned on opposite sides of the 2D playing field - rudimentary Enterprise and Bird of Prey shapes.  In between were a set of planets of various sizes and densities that were shown as basic circles.  The opposing ship took turns shooting at each other by specifying an angle and a speed for their shot.  Once the shot was away, the gravity of the various planets pulled it into sweeping arcs.&lt;/p&gt;
&lt;p&gt;This game had more in common with &lt;em&gt;Pong&lt;/em&gt; than modern space warfare simulators, but it was fun to sit around with my friends and give each other grief.  We&amp;rsquo;d imitate Star Trek characters and belittle each other&amp;rsquo;s shots.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve looked for that game over the years and finally found an updated version.  I recently re-installed NixOS on my laptop and was looking through Flathub when I saw &lt;strong&gt;Slingshot&lt;/strong&gt; by Ryan Kavanagh.  Slingshot can be installed from Flathub.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flatpak install flathub com.github.ryanakca.slingshot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/230115_Slingshot3.png#floatleft&#34; alt=&#34;Slingshot mid-game&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the old Amiga game, players would type in an angle (0-360) and power (1-10).  In this version, a bar is shown emerging from the active ship.  Up and down arrows are used to control power (shown by the length of the bar) and left and right arrows are used to turn the ship.  You can see in the screenshot that the graphics look great but no longer mimic any particular sci-fi franchise.&lt;/p&gt;
&lt;p&gt;If a shot leaves the screen, there&amp;rsquo;s a zoom-out (shown below).  Shots can orbit until they leave the wider area or timeout.&lt;/p&gt;
&lt;p&gt;The gameplay is intuitive and very much in keeping with my memory of the &amp;ldquo;classic&amp;rdquo; version.  There&amp;rsquo;s something about the simplicity that I enjoy, and the turn-based play makes it more social.  I played it with my son and had a ball, and anything that gives dads fifteen minutes with their teenager is awesome.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nextcloud File Discovery</title>
      <link>https://nextpertise.net/230102_nextcloud_file_discovery/</link>
      <pubDate>Mon, 02 Jan 2023 14:47:26 -0500</pubDate>
      
      <guid>https://nextpertise.net/230102_nextcloud_file_discovery/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve heard good things about Nextcloud for a long time and finally decided to take the plunge.  I have a home file server that is accessed via sshfs and nfs, but it&amp;rsquo;s a little problematic to get to from Windows or mobile.  Nextcloud extends the file sharing through a web and dav interface to make it accessible from anywhere.  Nextcloud offers a lot of functionality, but my initial focus is just on straight-forward file-sharing.&lt;/p&gt;
&lt;h2 id=&#34;the-issue&#34;&gt;The Issue&lt;/h2&gt;
&lt;p&gt;Setting up Nextcloud went okay, but it defaults to sharing directories at &lt;em&gt;/var/www/nextcloud/data&lt;/em&gt;.  I spent some time trying to change Nextcloud to access the directories that already had my files but didn&amp;rsquo;t see a good way.  Option two would be to move the files and my first attempt was to access Nextcloud on my desktop PC and drag files from the NFS share.  That was  s l o w.&lt;/p&gt;
&lt;p&gt;Rethinking my file movement, I accessed the server command line and moved the files.  Replace &lt;em&gt;Source&lt;/em&gt; and &lt;em&gt;user&lt;/em&gt; with the appropriate values.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mv /Source/ /var/www/nextcloud/data/user/files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This moves the files (as shown by ls) but doesn&amp;rsquo;t show the files in Nextcloud.&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The solution&lt;/h2&gt;
&lt;p&gt;There are two steps to finish this process.  First, change ownership of the files to www-data so that Nextcloud can access.  This command may take a moment to complete.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown -R www-data:www-data /var/www/nextcloud/data/brent/files/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once everything is in place, use Nextcloud&amp;rsquo;s built-in &lt;strong&gt;occ&lt;/strong&gt; tool  tool to re-index user files.  Depending on the size of your file share, this may take more than a moment.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo -u www-data php /var/www/nextcloud/occ files:scan --all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open Nextcloud and go to files - if already open, refresh.  Your files will now be visible.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>FancyWM</title>
      <link>https://nextpertise.net/221226_fancywm/</link>
      <pubDate>Mon, 26 Dec 2022 12:00:26 -0500</pubDate>
      
      <guid>https://nextpertise.net/221226_fancywm/</guid>
      <description>&lt;p&gt;Pop! OS has spoiled me.  I used to try to slide windows left and right across multiple monitors to get them to all fit.  My current workflow on Pop! is to enable tiling on my 4K display and then use multiple desktops if I need to divide my work areas.  I&amp;rsquo;ve recently been using Windows more and set out to recreate that workflow.  I won&amp;rsquo;t claim an exhaustive search, but here is the way I&amp;rsquo;ve currently setup my Windows PC.&lt;/p&gt;
&lt;h2 id=&#34;multiple-desktops&#34;&gt;Multiple Desktops&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/221228_taskbutton.PNG#floatright&#34; alt=&#34;Task View&#34;&gt;
This is the easy part, as Windows 10 and later support multiple desktops.  Click the &amp;ldquo;task view&amp;rdquo; button on your task bar and open windows will all be displayed.  At the top of the screen is a list of desktops and a &amp;ldquo;New Desktop&amp;rdquo; button.  The image here shows the button you are looking for.
&lt;img src=&#34;http://cdn.mos.cms.futurecdn.net/3Td8JZ3j55BWV7BdKboDSR-970-80.jpg#floatsmallleft&#34; alt=&#34;Task View&#34;&gt;
If you don&amp;rsquo;t see task view, right click on the task bar and select &amp;ldquo;show task view&amp;rdquo;.  You can also use the TAB+WIN combination to jump to the task view.&lt;/p&gt;
&lt;p&gt;In the Task View exploded screen, you can click and drag any open window to any desktop (similar to Gnome).  This makes creating a workspace a snap. I wasn&amp;rsquo;t able to screenshot task view, so the picture is from &lt;a href=&#34;https://www.windowscentral.com/&#34;&gt;Windows Central&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;tiling-with-fancywm&#34;&gt;Tiling with FancyWM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/221228_FullScreen.PNG#floatsmallright&#34; alt=&#34;Striping with FancyWM&#34;&gt;
&lt;a href=&#34;https://github.com/FancyWM/fancywm&#34;&gt;FancyWM&lt;/a&gt; is a dynamically tiling window manager for Windows 10/11.  It&amp;rsquo;s not as automated and intuitive as Pop!, but it provides a serviceable level of tiling.&lt;/p&gt;
&lt;p&gt;When running, FancyWM responds to the Shift+WIN key combination, with an additional key to tell it what kind of action to take.  It supports vertical (Shift+WIN, &amp;ldquo;v&amp;rdquo;) or horizontal stacks (Shift+WIN, &amp;ldquo;h&amp;rdquo;).  Once a stack is created around one window, other windows can be dragged into it (similar to COSMIC).  FancyWM also supports floating (non-tiled, Shift+WIN, &amp;ldquo;f&amp;rdquo;) windows and stacked (Shift+WIN,&amp;ldquo;s&amp;rdquo;).  You can create rules so that particular applications always run in &amp;ldquo;floating&amp;rdquo; mode as well.
&lt;img src=&#34;https://nextpertise.net/221228_Tiled.PNG#floatsmallleft&#34; alt=&#34;Tiling with FancyWM&#34;&gt;
There are two screenshots shown.  In the first, I opened a series of new windows on an empty desktop.  FancyWM automatically stripped them vertically, adjusting as new windows are added.  I then selected the first window and created a vertical stack using Shift+WIN &amp;ldquo;v&amp;rdquo;.  I was then able to drag other windows under the first to form a stack.  Each window caused the stack to divide vertically..  You can see a stack of two and a stack of three in the second picture.&lt;/p&gt;
&lt;p&gt;FancyWM supports multiple displays and multiple desktops.  I found this to be a little glitchy as windows moved displays, but it corrected itself over time.  FancyWM is licensed, but will run without a license and &amp;ldquo;nag&amp;rdquo;.  It&amp;rsquo;s available from the Windows Store.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Self-Hosted Obsidian</title>
      <link>https://nextpertise.net/221210_self-hosted_obsidian/</link>
      <pubDate>Sat, 10 Dec 2022 17:17:04 -0500</pubDate>
      
      <guid>https://nextpertise.net/221210_self-hosted_obsidian/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently written about using Obsidian - an &lt;a href=&#34;https://nextpertise.net/posts/220829_obsidian_intro&#34;&gt;intro&lt;/a&gt;, a discussion of &lt;a href=&#34;https://nextpertise.net/posts/220831_using_obsidian&#34;&gt;tasks&lt;/a&gt; and add-ins, and a discussion of &lt;a href=&#34;https://nextpertise.net/posts/221002_dataview&#34;&gt;dataview&lt;/a&gt;.  The number of add-ins and the ideas that are being implemented using Obsidian has exploded, and hopefully I&amp;rsquo;ve provided enough to get you started and help you discover how it could work for you.&lt;/p&gt;
&lt;p&gt;Justin Pot at PC Magazine published a &lt;a href=&#34;https://www.pcmag.com/reviews/obsidian&#34;&gt;review&lt;/a&gt; in November.  It&amp;rsquo;s a good review and on the whole very positive.  One deficiency that he points out, though, is the fact that Obsidian is installed locally and there&amp;rsquo;s no facility for accessing it on multiple computers. Justin goes on to suggest that one could use a seperate service to sync files between computers.  I&amp;rsquo;d argue that this is consistent with the &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy&#34;&gt;Unix philosophy&lt;/a&gt; of &amp;ldquo;making each program do one thing well&amp;rdquo;.  If you need two functions (notes, file replication) then use two programs.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m aware of six ways that Obsidian could be kept up to date between computers, and I&amp;rsquo;ve tested several.  If you are interested in using Obsidian and being able to access notes from your PC on your phone is a requirement, here are my experiences and opinions.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll note that I&amp;rsquo;m syncing to my phone.  Obsidian runs - plug-ins, themes and all - identically on the phone.  I don&amp;rsquo;t enjoy the swishy keyboard interface, but I use my daily notes for to-dos and bullet points.  I find the using Obsidian on mobile invaluable for checking things off or adding quick notes as I move around.  I also have added some key PDFs to my vault for reference and the Obsidian interface is an easy way to access that information.&lt;/p&gt;
&lt;h2 id=&#34;the-ones-i-didnt-try&#34;&gt;The ones I didn&amp;rsquo;t try&lt;/h2&gt;
&lt;p&gt;Several solutions may be good, but I haven&amp;rsquo;t personally tried them.  &lt;a href=&#34;https://obsidian.md/pricing&#34;&gt;Obsidian Sync&lt;/a&gt; is made by the developers to fund the project and I&amp;rsquo;ve looked at this closely.  Obsidian Sync also supports version history, something you don&amp;rsquo;t get using other methods.  That said, it&amp;rsquo;s $8 per month which strikes me as steep.  I just came through a period of unemployment and feel like there&amp;rsquo;s something sinister about the way we&amp;rsquo;re being pushed into more and more subscriptions.  The same link includes an option to donate to the project one-time, and I&amp;rsquo;m electing to support the devs that way.&lt;/p&gt;
&lt;p&gt;Obsidian could also be sync&amp;rsquo;d through a cloud file system, such as Apple Cloud, Google or Box.  The PC Mag article references using &lt;a href=&#34;https://www.resilio.com/platforms/desktop/&#34;&gt;Resilio Sync&lt;/a&gt;, which is a new one for me. There are comments on Reddit from folks who use various cloud services (Apple seems popular).  My issue here is that Obsidian has some of my most personal information.  I&amp;rsquo;m not entirely comfortable putting that in cloud storage.  Many cloud providers have some level of free storage, probably enough for an Obsidian vault.  If you need to pay, it&amp;rsquo;s typically around $5-10 and could be used for a variety of things, so this technique could be free and in the worst case is on-par with Obsidian Sync.&lt;/p&gt;
&lt;div class=&#34;admonition danger&#34;&gt;
    &lt;div class=&#34;title&#34;&gt;Danger!&lt;/div&gt;
    &lt;div class=&#34;content&#34;&gt;Backup your Obsidian vault before experimenting with sync options.&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;shared-drive&#34;&gt;Shared Drive&lt;/h2&gt;
&lt;p&gt;The first idea is the easiest and most obvious: use a shared drive.  I put my Obsidian vault on a server and published that folder using NFS, then mounted it on my PC.  I used SSHFS to map to it from a Linux laptop and from Windows.  Read more about using SSHFS and NFS &lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3&#34;&gt;here&lt;/a&gt;.  No problems.  All three devices were able to co-edit within the same vault - I even noticed open files being updated dynamically.  This method is free, but requires access to the devices (local LAN) and doesn&amp;rsquo;t work for mobile devices.&lt;/p&gt;
&lt;p&gt;The private network can be extended using VPN to get this to work remotely.  In fact, I used &lt;a href=&#34;https://nextpertise.net/posts/201027_zerotierrouter&#34;&gt;Zerotier&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/221004_tailscale&#34;&gt;Tailscale&lt;/a&gt; to test this and things worked perfectly for laptops.  There might be sync issues if someone was editing on both sides, but as long as it&amp;rsquo;s being used as a personal vault, this shouldn&amp;rsquo;t be an issue.  IOS and Android both support various VPN mechanisms, but Obsidian on those platforms expects a device-local vault.
&lt;img src=&#34;https://nextpertise.net/221210_Syncthing.png#floatright&#34; alt=&#34;Syncthing&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;syncthing&#34;&gt;Syncthing&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://syncthing.net/&#34;&gt;Syncthing&lt;/a&gt; is a tool that many people use to keep files sync&amp;rsquo;d between computers.  It&amp;rsquo;s free, and is supported on just about every OS short of Haiku (nope, I checked).  Once Syncthing is downloaded to a device, it needs to have a  relationship approved on a remote device.  The devices agree on local directories that are to be sync&amp;rsquo;d, then syncthing runs periodically to update files.&lt;/p&gt;
&lt;p&gt;Like a shared drive, it&amp;rsquo;s free and devices need to be local to each other.  As shown in the picture to the right, I setup my desktop, tablet and phone to keep an Obsidian vault in sync.  When I first setup Syncthing, there was an instance where it deleted a file.  I wasn&amp;rsquo;t able to replicate that behavior later so it may have been something I did, but it left me with a bad taste.  Syncthing doesn&amp;rsquo;t overwrite - it creates duplicate marked copies.  This results in having a proliferation of these dups that have to be cleaned up.  I had as many as four devices syncing and that may have added to the replication issues.&lt;/p&gt;
&lt;p&gt;So my experience of Syncthing was that it worked, but required local software and had some rough edges.
&lt;img src=&#34;https://nextpertise.net/posts/221211_Obsidian_webdav.png#floatright&#34; alt=&#34;WebDav&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;remotely-save-plug-in&#34;&gt;Remotely Save Plug-in&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/remotely-save/remotely-save&#34;&gt;Remotely Save&lt;/a&gt; plug-in is the option that I&amp;rsquo;ve personally settled on.  Remotely Save allows syncing using S3-compatible storage, Dropbox, OneDrive, or WebDav.  I already have a local WebDav server running on Apache (see &lt;a href=&#34;https://nextpertise.net/posts/210906_apachedav&#34;&gt;Using WebDAV on Apache&lt;/a&gt;).  This required minimal self-hosted infrastructure, supported PC and mobile operating systems, and was free.  I&amp;rsquo;ve had no issues with it working or losing data.&lt;/p&gt;
&lt;p&gt;The screenshot to the right shows the setup of Remotely Save.  The first selection is for the storage type and Webdav is chosen.  Next I specified the server address.  I use other applications that will just take the IP address of the server and Remotely Save required the protocol prefix &amp;ldquo;http://&amp;rdquo;.  This brings up the one problem I had - there&amp;rsquo;s very little in the way of error messages or debugging output if you have a problem.  If failed when I used a raw IP, but didn&amp;rsquo;t provide clues as how to remedy the issue and it took a bit of trial and error.&lt;/p&gt;
&lt;p&gt;I have this setup of several devices.  On each, I have them setup to run at startup and then periodically afterward.  I don&amp;rsquo;t tend to have Obsidian open in multiple places, so this is sufficient to prevent replication bifurcations.&lt;/p&gt;
&lt;h2 id=&#34;git-plug-in&#34;&gt;Git Plug-in&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/denolehov/obsidian-git&#34;&gt;Git Plug-in&lt;/a&gt; has a lot of potential.  I tested with Github and couldn&amp;rsquo;t get it to work with cert-based authentication (as is required by Github).  That was okay, because I&amp;rsquo;m not really interested in copying my vault to public cloud.  I also tested this with local Gitlab.  That worked very similarly to the Remotely Save plugin, with the added bonus of having a history.  If you are comfortable setting up a local Git server and using Git, this is a little more complicated than WebDav but a good option.&lt;/p&gt;
&lt;h2 id=&#34;round-up&#34;&gt;Round-up&lt;/h2&gt;
&lt;p&gt;For my usage, Obsidian is superior to other options such as Evernote or OneNote.  It&amp;rsquo;s plug-in architecture have also made it an exciting platform for experimentation. There are constantly new ideas about what can be done using this as a base.  The PC Mag review was right to call out multi-device usage as a shortcoming, but I&amp;rsquo;ve found this can be addressed in a variety of ways.  I&amp;rsquo;ve been using local WebDAV (using the Remotely Save plugin) for about a month and Tailscale to allow remote syncing and I&amp;rsquo;ve been very pleased.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blameless Post Mortems</title>
      <link>https://nextpertise.net/221117_postmortems/</link>
      <pubDate>Thu, 17 Nov 2022 16:00:14 -0500</pubDate>
      
      <guid>https://nextpertise.net/221117_postmortems/</guid>
      <description>&lt;p&gt;If you support IT infrastructure, the goal is to minimize issues (particularly issues with big impacts).  Some issues can be anticipated and pre-mitigated.  Considerable success can be achieved but &lt;em&gt;perfect&lt;/em&gt; is not for this life.  As a leader, I want to ensure that we learn and improve from every issue.  One way to do that is through a &lt;em&gt;post-mortem&lt;/em&gt; process.&lt;/p&gt;
&lt;p&gt;I had a mish-mash of approaches that I used from reading Atul Gwande.  If you haven&amp;rsquo;t read his books, I am amazed at how the stories of the history of surgical improvements can be applied to IT and highly recommend them (a good one to start with is &lt;em&gt;The Checklist Manifesto&lt;/em&gt;).  I was inspired to strengthen and standardize the use of post-mortems from a presentation given by Data Dog at an AWS conference.  This article describes my experiences.  I&amp;rsquo;ve also linked to an excellent article from Data Dog.&lt;/p&gt;
&lt;h2 id=&#34;history-of-post-mortems&#34;&gt;History of Post-Mortems&lt;/h2&gt;
&lt;p&gt;The concept of a Morbidity and Mortality conference originated with Ernest Codman, who worked at Massachusetts General in the early 1900s.  It should be noted that the idea of reviewing the mistakes of peers was not initially well received.  Their use over time has helped to instill best-practices, avoid repeating errors, and driven increasing success in patient care.&lt;/p&gt;
&lt;p&gt;These conferences are held regularly at most hospitals.  At the meeting, selected cases are presented by the responsible doctor.  They lay out the details of the case, approach used, and progression of symptoms.   M&amp;amp;M is particularly good at building accountability and drawing out errors in process and communication.  This process is so integral and well respected as a part of medicene that the presentations and discussion are not legally &amp;ldquo;discoverable&amp;rdquo; in most states to allow doctors to freely discuss these cases.&lt;/p&gt;
&lt;p&gt;The National Transportation Safety Board (NTSB) and Federal Aviation Administration (FAA) use a similar approach when investigating a airplane crash.  Information and timeliens are assembled, involved parties interviewed, and the conclusions are fed back to the community.  This has led to a drop in annual fatalities from 6.15 (1965) to 2.11 (2010) per 100,000 flight hours.&lt;/p&gt;
&lt;h2 id=&#34;using-post-mortems-in-an-it-setting&#34;&gt;Using Post-Mortems in an IT setting&lt;/h2&gt;
&lt;p&gt;In my experience, blameless post-mortems should be incorporated into weekly meetings (although events with large impacts usually require a seperate discussion).  I ask the ticket lead to present the case.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Blameless&amp;rdquo; is a big part of success - I have found that, while no one enjoys being second guessed, most folks want to do good work and that they embrace the accountability, support, and forgiveness of their teammates.  They want to improve and not repeat a bad experience.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important to recognize carelessness and sloppy work with consequences.  This is a critical part of leadership - &lt;strong&gt;it&amp;rsquo;s not what you say, it&amp;rsquo;s what you tolerate&lt;/strong&gt;.  When that&amp;rsquo;s the case, folks may need to be assigned a mentor, work on less challenging projects, or even be reassigned.&lt;/p&gt;
&lt;p&gt;Generally however, these discussions will find some flaky piece of tech that - when mixed with process confusion and communication issues - leads to fiasco.  When that&amp;rsquo;s the case, the team owns identifying the technical workaround and suggesting process improvements and leadership owns ensuring that those suggestions are carried out and adhered to.  Done well, this process builds ownership and accountability to each other within a team.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found that teams can process a limited number of these, so I select interesting cases for review.  Certainly every SEV1 needs to be reviewed - I typically do that in a dedicated meeting and it leads to a full Reason for Outage (RFO) document.&lt;/p&gt;
&lt;h3 id=&#34;weekly-reviews&#34;&gt;Weekly Reviews&lt;/h3&gt;
&lt;p&gt;I tried to review everything at first, but that got impractical and frankly repetitive.  These days, I try to pick three cases that might lead to interesting discussions in weekly meetings.  The idea here is to catch issues before they have a big impact.  I forewarn the implicated people so that they can prepare, and I ask them to consider four lines of questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What happened?&lt;/li&gt;
&lt;li&gt;Response&lt;/li&gt;
&lt;li&gt;Resolution&lt;/li&gt;
&lt;li&gt;Deltas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve found that I can do this &amp;ldquo;short version&amp;rdquo; with each event taking about 5 minutes.  I document the answers to those four questions in my meeting notes so that we can refer back to them later, if needed.&lt;/p&gt;
&lt;h3 id=&#34;rfos&#34;&gt;RFOs&lt;/h3&gt;
&lt;p&gt;For RFOs, I usually ask the lead person to write up a report using the bullets above as sections, although we can combine events and response on a timeline.  The report usually settles everyone down and helps establish that the response is under control.  This report needs to be more formal and the areas are probed much deeper.  To help with that, here&amp;rsquo;s an expanded interogative version of those four areas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What happened?  How did we learn of the issue(and should that be automated)?  Did we get the right metrics?  A timeline is useful, and email and IM are helpful resources to get times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How did we respond?  Did it go well?  What was the impact?  How did we communicate?  Communication in the event and after the event is usually the difference between it being classified as a fiasco or learning experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What resolved the situation?  Did we follow the appropriate processes?  If yes, were they effective?  If no, why not?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What needs to change going forward?  Note that this might be directly related to the issue or just something that was noticed in the process (like labeling to make response faster).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;review&#34;&gt;Review&lt;/h2&gt;
&lt;p&gt;This process, to be successful, requires a commitment to follow-up on the findings and drive them to conclusion.  The conclusion of some may be that risk has to be communicated and accepted (for instance, where capital isn&amp;rsquo;t available to purchase new equipment).  Many conclusions, as previously mentioned, will be around tecnique, process, and communication and they are absolutely addressable.  I typically put all the reports into a shared directory or repository and review them as a team periodically.  I also add specific  follow-ups as tickets (and note the ticket number in the RFO), so that the team has integrity about following through.&lt;/p&gt;
&lt;h2 id=&#34;its-about-team-improvement&#34;&gt;It&amp;rsquo;s about team improvement&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the punch line: it&amp;rsquo;s about growing the capability of the people you work with.  For this to work (for me at least), it has to come from a place of good will.  That is frankly difficult when things go pear-shaped.  Leadership has to believe in the team, support the team, and want to see that team succeed.  There is certainly a time to deal with underperforming members, but this is not that time.  Focus on the problem, then focus on never having that problem again, then focus on the confidence and preparedness of the team so that they are ready for whatever comes next.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wisdom in 17 sayings</title>
      <link>https://nextpertise.net/221115_leadership/</link>
      <pubDate>Tue, 15 Nov 2022 14:41:10 -0500</pubDate>
      
      <guid>https://nextpertise.net/221115_leadership/</guid>
      <description>&lt;p&gt;I grab onto quotes.  Some I hold onto long enough to consider and they pop up in conversation at odd times.  Others seem to bubble up consistently.  To me, these favorite quotes are the compass that I use to retain my sense of direction in difficult times and circumstances.&lt;/p&gt;
&lt;p&gt;Folks who have worked with me over the years will have heard versions of these sayings (and probably some that I am forgetting right now).  Some may complain for hearing them too much.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m preparing for a new job and thinking about how I want to approach new responsibilities.  I&amp;rsquo;ve never tried to compile a list but it&amp;rsquo;s a good time for reviewing these touchstones.  I wanted to share that list with you.&lt;/p&gt;
&lt;p&gt;So here are sixteen sayings pertinent to leadership, collected over about that many years of leading.  I&amp;rsquo;ve tried to organize these into themes.  I&amp;rsquo;ve researched attribution and exact quote where possible.&lt;/p&gt;
&lt;h1 id=&#34;general&#34;&gt;General&lt;/h1&gt;
&lt;p&gt;These sayings can be employed in a variety of circumstances.&lt;/p&gt;
&lt;p&gt;I heard this first while teaching computer networking at Camp Lejeune.  I was told it was an &amp;ldquo;old Marine Corps saying&amp;rdquo;, which I suppose is like the Klingons talking about Shakespeare &amp;ldquo;in the original Klingon&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you don&amp;rsquo;t know where you&amp;rsquo;re going, any road will get you there.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lewis Carroll&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had a wonderful boss in the early &amp;rsquo;teens.  He coached me on promotions and, as best I remember, here&amp;rsquo;s his advice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to be promoted, take responsiblity.  Being responsible attracts opportunities, and eventually someone in management will say &amp;ldquo;get that guy a hat&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;John Phelan&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think I first heard this last one from &lt;strong&gt;12 Rules for Life&lt;/strong&gt; by Jordan Peterson.  The metaphor, about self-discipline and being in control of yourself and your emotions, struck a chord.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you get hurt, say, by an arrow, that is pain. . .  However, there is a second arrow, which is your reaction to the arrow, the getting angry, the planning revenge, this is beyond pain, this is suffering.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buddhist saying&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;on-preparation&#34;&gt;On Preparation&lt;/h1&gt;
&lt;p&gt;Ideally, we&amp;rsquo;d anticipate possible issues and make plans to mitigate.  These quotes deal with the issues and rewards of being ready.&lt;/p&gt;
&lt;p&gt;These start with some cynical reminders.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bad security looks just like good security until seriously attacked.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bruce Schneier&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;and one of my favorites in the same vein.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Everyone has a plan until they get hit.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mike Tyson&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two of my former CIOs gave me solid advice about preparation that I&amp;rsquo;ve carried forward in my career.  Mike said the first when talking about the constraints of budgeting, but it&amp;rsquo;s a good reminder to not over-commit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can only fit 5 lbs of sugar into a 5 lb bag.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mike Cross&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kap intimidated me in those days and I regret not getting to know him better.  He had a very clear vision about the way the world works, illustrated below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Play the cards you&amp;rsquo;ve got in your hand, not the ones you want.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kap Kim&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I saved the best for last.  I use this to encourage preparation and to commend it&amp;rsquo;s results.  I saw Gregg Easterbrook attribute this to Bear Bryant in a Tuesday Morning Quaterback article, but it turns out the original quote is from Neyland.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gentlemen, touchdowns follow blocking as sure night follows day.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General Robert Neyland&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I recall, Easterbrook added the aside that &amp;ldquo;it&amp;rsquo;s a lot of fun to run a hundred yards when everyone in front of you is on their back.&amp;rdquo;&lt;/p&gt;
&lt;h1 id=&#34;on-troubleshooting&#34;&gt;On Troubleshooting&lt;/h1&gt;
&lt;p&gt;Troubleshooting requires deep understanding.  It is often denigrated, but I&amp;rsquo;ve always found it to require tremendous imagination and to reward patience and persistence.  I&amp;rsquo;ve had many opportunities to mentor troubleshooting over the years and here are some of my favorite aphorisms.&lt;/p&gt;
&lt;p&gt;This first was one of Dad&amp;rsquo;s favorites.  As it has become well known, it&amp;rsquo;s grown a little trite but still makes a great point for technologists.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you only have a hammer, you tend to see every problem as a nail.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Abraham Maslow&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Many times the way forward is not clear.  Here I took an example from being a parent.  This has always been solid advice because there&amp;rsquo;s always some technical cruft that can be cleared up and the act of cleaning either reveals the issue or puts the person in the right headspace.  Although Peterson has a similar saying, mine preceeded his.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My kids would ask me if I&amp;rsquo;ve seen their favorite toy.  I&amp;rsquo;d say, &amp;ldquo;No, but I bet if you clean your room you&amp;rsquo;ll find it&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Brent Stewart&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;No one likes change, but sometimes troubleshooting presents opportunities to move forward.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You never let a serious crisis go to waste.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rohm Emmanuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;on-people&#34;&gt;On people&lt;/h1&gt;
&lt;p&gt;Many of these, such as the &amp;ldquo;second arrow&amp;rdquo; also address dealing with other people.  These are the two best quotes I have specifically on the topic of the trials of co-workers.&lt;/p&gt;
&lt;p&gt;My father could be pithy and a little cynical, but he understood something about people.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you went to the mall and gave out $20 bills at the door, someone would compain that you didn&amp;rsquo;t have change or were at the wrong door.  You cannot make everyone happy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bill Stewart&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve carried around this quote since I was a kid.  I think I picked it up from reading Robert Heinlein.  It, or something like it, has been said in various forms for a long time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Never attribute to malice what can be adequately explained by stupidity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hanlon&amp;rsquo;s razor, perhaps a restatement from Winston Churchill&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Extreme Ownership&lt;/strong&gt; as a book is like a Mel Brooks movie - everyone remembers just the bits that hit it out of the park.  Still, there&amp;rsquo;s an undeniable relevation about leadership in this quote and I repeat it when mentoring young managers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s not what you preach, it&amp;rsquo;s what you tolerate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jocko Willink&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;on-gratitude&#34;&gt;On Gratitude&lt;/h1&gt;
&lt;p&gt;I finish with the subject that has most influenced my &amp;ldquo;mature&amp;rdquo; years.  I&amp;rsquo;ve worked to become a grateful person and to recognize that I&amp;rsquo;m blessed in myriad ways.  To list just three: I have a wonderful wife and amazing children, I have friends around the world who want nothing but good for me, and I have the opportunity to do meaningful work.  Focusing on those gifts has brought a peace and happiness to my life.&lt;/p&gt;
&lt;p&gt;When I was younger, I thought that Stoicism was depressing.  I&amp;rsquo;ve come to realize that it provides perfect perspective for a grateful life.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nothing is more honorable than a grateful heart.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seneca&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;and also&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He is a wise man who does not grieve for the things which he has not, but rejoices for those which he has.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Epictetus&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;I sincerely hope that - if you take nothing else - these thoughts on gratitude will resonate and be useful.  As a Christian, I&amp;rsquo;ll end with the most meaningful quote to me, taken from the end of the Sermon on the Mount.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Therefore do not worry about tomorrow, for tomorrow will worry about itself. Each day has enough trouble of its own.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mark 6:34&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Updated Ubuntu Upgrading</title>
      <link>https://nextpertise.net/221114_topgrade/</link>
      <pubDate>Mon, 14 Nov 2022 17:27:51 -0500</pubDate>
      
      <guid>https://nextpertise.net/221114_topgrade/</guid>
      <description>&lt;h2 id=&#34;os-hopping-update&#34;&gt;OS Hopping update&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve confessed in this blog to being a distro hopper.  I love to see what is possible and to explore alternatives!  I haven&amp;rsquo;t provided an update on where that journey has taken me, so let&amp;rsquo;s start there.&lt;/p&gt;
&lt;p&gt;I have a desktop, where the majority of work is done, and a laptop for traveling and returning emails from the couch.&lt;/p&gt;
&lt;p&gt;The desktop is running Pop! OS and I&amp;rsquo;ve considered changing that many times (most recently to Nix OS) but just haven&amp;rsquo;t.  I&amp;rsquo;ve found Pop! really fits my workflow.  In particular, I think the Pop! implementation of tiling is the experience that suits me best.  I&amp;rsquo;m not crazy about the full-frontal keyboard experience of i3, and tiling in Gnome and KDE is &amp;ldquo;meh&amp;rdquo; in comparison.  I also like that Pop! builds on Ubuntu, the environment with which I&amp;rsquo;m most familiar.&lt;/p&gt;
&lt;p&gt;Tiling on a big 4K display is just the obvious way to go, but it doesn&amp;rsquo;t work as well on a smaller screen.  My laptop has been where I&amp;rsquo;ve done my current distro hopping.  It ran Nix-OS KDE for a long time and that was a mostly great experience.  The big miss there was software - I had issues getting my Brother printer driver to load and I wanted to update to KDE 5.26 and it isn&amp;rsquo;t available yet.  I&amp;rsquo;ll circle back to Nix at a later point because it sold me on the vision of reproducibility.  I briefly tried stock Ubuntu and got frustrated with Gnome extensions and . . . well, Gnome.  It&amp;rsquo;s currently running Kubuntu.  I&amp;rsquo;ve added &lt;em&gt;backports&lt;/em&gt; and upgrade KDE to 5.26 as well.&lt;/p&gt;
&lt;p&gt;All this sets the context that I&amp;rsquo;ve settled into Ubuntu family systems and developed some comfort there.  The package system is a core part of what differentiates distros and I&amp;rsquo;m pretty comfortable with &lt;em&gt;apt&lt;/em&gt;.   Recently, two new programs have emerged to provide a better experience - &lt;em&gt;nala&lt;/em&gt; and &lt;em&gt;topgrade&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;apt&#34;&gt;Apt&lt;/h2&gt;
&lt;p&gt;Package updates on an Ubuntu-derived system (Ubuntu, Kubuntu, Mint, Pop! and others) is done through &lt;em&gt;apt&lt;/em&gt;.  Apt is pretty good, but isn&amp;rsquo;t optimized for speed and really only covers packages distributed as debs.  Also, new package formats have emerged that build the application and all it&amp;rsquo;s dependencies together (like flatpak, snap) and these aren&amp;rsquo;t updated by apt.&lt;/p&gt;
&lt;p&gt;To address part of this, I made a simple update script that includes flatpak and snap.  I just run &amp;ldquo;updateall.sh&amp;rdquo;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade -y
sudo snap refresh -y
flatpak update -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;nala&#34;&gt;Nala&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/volian/nala/-/wikis/Installation&#34;&gt;Nala&lt;/a&gt; is an apt replacement that has been generating some buzz recently.  It is able to pick the fastest mirrors, utilize multiple mirrors, and download in parrallel.  Installing nala via PPA is shown below.  You&amp;rsquo;ll need to run &lt;em&gt;nala fetch&lt;/em&gt; to have it evaluate the latency to mirrors and pick the fastest.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;deb [arch=amd64,arm64,armhf] http://deb.volian.org/volian/ scar main&amp;quot; | sudo tee /etc/apt/sources.list.d/volian-archive-scar-unstable.list
wget -qO - https://deb.volian.org/volian/scar.key | sudo tee /etc/apt/trusted.gpg.d/volian-archive-scar-unstable.gpg &amp;gt; /dev/null
sudo apt update
sudo apt install nala

nala fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once nala is installed, it&amp;rsquo;s used very similarly to apt.  A system upgrade is &lt;em&gt;nala update&lt;/em&gt; and &lt;em&gt;nala upgrade&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In my testing, nala is slightly faster than apt and a little more visually appealing.  It didn&amp;rsquo;t seem to result in a qualitatively better experience though and didn&amp;rsquo;t address other packaging formats.  It&amp;rsquo;s probably worth moving from apt to nala, but you&amp;rsquo;re still going to need an &lt;em&gt;updateall.sh&lt;/em&gt; script!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/topgrade.png#floatsmallright&#34; alt=&#34;Topgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;topgrade&#34;&gt;Topgrade&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/topgrade-rs/topgrade&#34;&gt;Topgrade&lt;/a&gt; is a rust application that detects the invoking OS and then steps through various appropriate update routines.  On my system, it not only recognized that Pop! is a deriviate of Debian but also caught that I had installed Nala and used it instead of apt!  I&amp;rsquo;m not a Rust programmer, but looking through the &lt;em&gt;linux.rs&lt;/em&gt; file gives a sense of the logic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://github.com/topgrade-rs/topgrade/raw/master/doc/screenshot.gif&#34; alt=&#34;Topgrade running&#34;&gt;&lt;/p&gt;
&lt;p&gt;Topgrade uses every update mechanism it finds on your system.  On my PC, it used Nala, Brew, conda, pip, flatpak, snap, and fwupd.  It updated containers and Gnome shell extensions as well.  Wow!&lt;/p&gt;
&lt;p&gt;Installing Topgrade on Ubuntu is done through cargo.  Conducting an upgrade simply involves running &lt;em&gt;topgrade&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo install topgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I haven&amp;rsquo;t had any issues running this against Pop! OS.&lt;/p&gt;
&lt;h2 id=&#34;do-both&#34;&gt;Do Both!&lt;/h2&gt;
&lt;p&gt;I started this article with an eye toward examing Nala against Topgrade (which I was already using).  My conclusion is that the combination is the best of both worlds.  Topgrade will incorporate Nala if installed.  Through Nala, it gains some speed over apt.  Topgrade also provides the upgrade mechanism for a variety of other sources.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Obsidian Dataview (Part 3)</title>
      <link>https://nextpertise.net/221002_dataview/</link>
      <pubDate>Tue, 01 Nov 2022 09:38:21 -0400</pubDate>
      
      <guid>https://nextpertise.net/221002_dataview/</guid>
      <description>&lt;p&gt;This article is the third I&amp;rsquo;ve written on Obsidian.  &lt;a href=&#34;https://nextpertise.net/posts/220829_obsidian_intro&#34;&gt;Part 1&lt;/a&gt; describes the basics and &lt;a href=&#34;https://nextpertise.net/posts/220831_using_obsidian/&#34;&gt;Part 2&lt;/a&gt; covers tasks, this article will describe using Dataview.&lt;/p&gt;
&lt;p&gt;Core Obsidian is &amp;ldquo;just&amp;rdquo; a markdown editor with some Wiki functionality and a pretty good understanding of tasks.  The magic comes through add-ons.  The process of adding plugins is described in the second article where I discussed &amp;ldquo;Checklist&amp;rdquo;, which pulled all your open tasks together on one list in a sidebar.  The Dataview plugin is also a way to collect information across notes, but much more powerful.&lt;/p&gt;
&lt;p&gt;Once the Dataview plugin is added, you can add a dataview query into any document.  Fields can be created in any document either as YAML front matter or within the document using double-colons.
&lt;img src=&#34;https://nextpertise.net/221101_Opty.png#floatright&#34; alt=&#34;Example job&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/obsidian.png&#34; alt=&#34;Obsidian&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;lets-build-out-an-example&#34;&gt;Let&amp;rsquo;s build out an example!&lt;/h3&gt;
&lt;p&gt;At the time of this writing, I&amp;rsquo;m looking for a new job.  I&amp;rsquo;ve gone into Obsidian and created an &amp;ldquo;Opportunities&amp;rdquo; folder.  Each document in that folder is based on a standard template that I fill out.  I update the document as I learn more and I make &amp;ldquo;active=False&amp;rdquo; if it&amp;rsquo;s not a good fit.  I should note that each document starts with these standard fields, but I add all kinds of unstructured data underneath.  I have a diary of notes from calls and follow-up tasks that starts after the fields.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;## Untitled

active::True
Title::
Pay::
Link::

contact:: 
initialContact::
lastContact::

Onsite::
Location::

group:: #opportunity
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Outside the folder, I have a &amp;ldquo;master view&amp;rdquo; document where I track the entire job search.  This gives me a dynamic dashboard of the opportunities I am targeting.  The first table on this dashboard document is a summary of the various opportunities.  The first field in the table is the filename and it links back to the underlying details document.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE:   Obsidian denotes sections of code by encapsulating with three tics (`).  Noting the language after the top tics will highlight based on the language.  When the Dataview plugin is present, mark the code &amp;ldquo;dataview&amp;rdquo; and it will be interpretted and replaced with the query results.  I&amp;rsquo;ve added a space in the bottom three tics to prevent Hugo from interpretting (and then hiding) the tics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;```dataview
table title,stage, pay, onsite from &amp;#34;Projects/Opportunities&amp;#34; 
where active SORT file.name asc
` ``
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/221101_dashboard.png#floatright&#34; alt=&#34;Dashboard&#34;&gt;
I have a similar set of documents for the people I&amp;rsquo;ve met to track their contact information.  This query pulls in contact information from documents in the People folder that have the tag #jobhunt.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;```dataview
table mobile,email, Last_contact 
from &amp;#34;People&amp;#34; and #jobhunt 
` ``
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Another table in the dashboard file is a list of open tasks.  Remember that Obsidian allows you to create a task using square brackets anywhere in a document.  In my employment search, many people have volunteered to help but are not necessarily associated with a particular job.  This means that I may have a follow-up reminder associated with a contact or with a job.  Here&amp;rsquo;s the query that pulls all those to-dos together.  It&amp;rsquo;s worth noting that I can check off a task either in the source document or in the dataview list and it will update the other.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;```dataview
TASK from &amp;#34;projects/opportunities&amp;#34; 
or (&amp;#34;People&amp;#34; and #jobhunt) 
WHERE !completed 
GROUP BY file.name SORT file.ctime asc
` ``
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The second screenshot shows that I also have a dataview list of people on this &amp;ldquo;dashboard&amp;rdquo; page.  Dataview is enormously powerful and really turns building a personal database into a load of fun.&lt;/p&gt;
&lt;p&gt;Dataview provides a pretty good exposure to NoSQL.  I have a lot of SQL experience and struggled with the concepts of &amp;ldquo;NoSQL&amp;rdquo;.  Dataview uses it&amp;rsquo;s own query language (called DSL), but it&amp;rsquo;s easy to pick up and starts to give you a vision of what&amp;rsquo;s possible in NoSQL.  A simple example here - if you built a SQL database and started populating it, it could be problematic to add a field later.  With Dataview, I could just start adding a field for &amp;ldquo;PTO&amp;rdquo; and the query would just ignore pages that didn&amp;rsquo;t have that field.  Although Dataview can handle schema changes adroitly, it doesn&amp;rsquo;t have any concepts of data relationships, so it&amp;rsquo;s going to be fit for flat data.&lt;/p&gt;
&lt;p&gt;Those of you with sharp eyes may notice that I have buttons on my dashboard (for instance, &amp;ldquo;New Opportunity&amp;rdquo;).  I may describe setting that up in a future post, but just to not leave the question hanging I&amp;rsquo;ll mention those are created using the &amp;ldquo;Buttons&amp;rdquo; and &amp;ldquo;Quick Add&amp;rdquo; plugins.  You may also notice that my folders have icons - that&amp;rsquo;s done using the &amp;ldquo;Icon Folder&amp;rdquo; plugin.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Basic Packer</title>
      <link>https://nextpertise.net/221019_packer/</link>
      <pubDate>Wed, 19 Oct 2022 17:26:07 -0400</pubDate>
      
      <guid>https://nextpertise.net/221019_packer/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://hashicorp.com&#34;&gt;Hashicorp&lt;/a&gt; makes some &lt;em&gt;cool&lt;/em&gt; tools for playing in the cloud or a virtualized environment, especially if you want to build out an Infrastructure as Code approach and make infrastructure updates a CI process. &lt;a href=&#34;https://packer.io&#34;&gt;Packer&lt;/a&gt; is a tool that let&amp;rsquo;s you define a server - OS, cores, storage, packages, and all - in a script that can be built on demand.  You can even define your  environment, like LAMP, in the packer script and load your application files.&lt;/p&gt;
&lt;p&gt;A very practical use of Packer would be to use it to build a custom AWS AMI for your company.  You want every EC2 instance to look like this image, so it might include security settings or agents, centralized logging setup, connections to centralized authentication, and other common resources.  I would probably load any required data files when the EC2 instance is instantiated, maybe through Cloud Formation.&lt;/p&gt;
&lt;p&gt;Packer scripts are written in HCL (Hashi Corp Language?  Dunno.), which ends up looking like YAML.&lt;/p&gt;
&lt;p&gt;I built a Packer repo that builds a simple Ubuntu server for VMWare Workstation.  It should be simple enough to customize this, including having it output an AWS AMI (Amazon Machine Image). It is tested and works with Pop! 22.04 with a 5.19 kernel and VMWare Workstation 16.2.4.&lt;/p&gt;
&lt;p&gt;The packer file (&lt;em&gt;custom.pkr.hcl&lt;/em&gt; in my example) can be broken into three parts.  The first section defines the virtual machine, including the installation media and the CD image with customization steps.  It looks like this:&lt;/p&gt;
&lt;p&gt;source &amp;ldquo;vmware-iso&amp;rdquo; &amp;ldquo;jammy-development&amp;rdquo; {
iso_urls         =[
&amp;ldquo;file:/media/brent/Ventoy/ubuntu-22.04.1-live-server-amd64.iso&amp;rdquo;,
&amp;ldquo;https://releases.ubuntu.com/22.04.1/ubuntu-22.04.1-live-server-amd64.iso&amp;rdquo;]
iso_checksum     = &amp;ldquo;sha256:10f19c5b2b8d6db711582e0e27f5116296c34fe4b313ba45f9b201a5007056cb&amp;rdquo;
iso_target_path  = &amp;ldquo;/media/brent/Ventoy&amp;rdquo;
version          = &amp;ldquo;16&amp;rdquo;
memory           = 4096
cd_files = [
&amp;ldquo;./http/meta-data&amp;rdquo;,
&amp;ldquo;./http/user-data&amp;rdquo;]
cd_label = &amp;ldquo;cidata&amp;rdquo;
cpus = 1
cores = 2
disk_type_id = 0
network = &amp;ldquo;nat&amp;rdquo;
network_adapter_type = &amp;ldquo;vmxnet3&amp;rdquo;
vm_name          = &amp;ldquo;Ubuntu2204-dev&amp;rdquo;
ssh_username     = &amp;ldquo;vmadmin&amp;rdquo;
ssh_password     = &amp;ldquo;Password&amp;rdquo;
shutdown_command = &amp;ldquo;sudo shutdown -P now&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Ubuntu can be booted into an autoinstall script (&amp;ldquo;user-data&amp;rdquo; in this example).  Typically the way this is done is by placing a file (user_data in this case) into the http folder. Packer makes that folder available through a local Apache installation. However, I could not get the VM to &amp;ldquo;see&amp;rdquo; the website and draw down the file. I tried several iterations of network configuration to no avail.  One other approach I took was to take the auto-install files and place them in an ISO image, then attaching the image to the VM. To do this, I installed the cloud utilities from Ubuntu. I used cloud-localds to put the two data files into a small ISO.&lt;/p&gt;
&lt;p&gt;sudo apt install cloud-image-utils
cloud-localds ./seed.iso user-data meta-data&lt;/p&gt;
&lt;p&gt;Later I discovered that this can be done in the packer specification:&lt;/p&gt;
&lt;p&gt;cd_files = [
&amp;ldquo;./http/meta-data&amp;rdquo;,
&amp;ldquo;./http/user-data&amp;rdquo;]
cd_label = &amp;ldquo;cidata&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The second part of the packer file describes how to interact with the server as it boots.  You can actually specify &lt;!-- raw HTML omitted --&gt; and &lt;!-- raw HTML omitted --&gt; and walk through an entire installation wizard.  With Ubuntu, I found that to be fragile.  As I made changes to the network to try to get it to see the local webserver, the installation prompts changed and broke the sequence.  Instead of walking through the wizard, this script boots into the custom setup and tells it to load the autoinstall script from the CD-image.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;boot_wait = &amp;quot;5s&amp;quot;
boot_command = [
  &amp;quot;c&amp;lt;wait&amp;gt;&amp;quot;,
  &amp;quot;linux /casper/vmlinuz ds=nocloud-net s=/cidata&amp;quot;,
  &amp;quot;&amp;lt;enter&amp;gt;&amp;quot;,
  &amp;quot;initrd /casper/initrd&amp;quot;,
  &amp;quot;&amp;lt;enter&amp;gt;&amp;quot;,
  &amp;quot;boot&amp;lt;enter&amp;gt;&amp;lt;wait60&amp;gt;&amp;quot;,
  &amp;quot;yes&amp;lt;wait120&amp;gt;&amp;quot;
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}
boot_wait = &amp;ldquo;5s&amp;rdquo;
boot_command = [
&amp;ldquo;c&lt;!-- raw HTML omitted --&gt;&amp;rdquo;,
&amp;ldquo;linux /casper/vmlinuz ds=nocloud-net s=/cidata&amp;rdquo;,
&amp;ldquo;&lt;!-- raw HTML omitted --&gt;&amp;rdquo;,
&amp;ldquo;initrd /casper/initrd&amp;rdquo;,
&amp;ldquo;&lt;!-- raw HTML omitted --&gt;&amp;rdquo;,
&amp;ldquo;boot&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&amp;rdquo;,
&amp;ldquo;yes&lt;!-- raw HTML omitted --&gt;&amp;rdquo;
]
}&lt;/p&gt;
&lt;p&gt;The third piece is the autoinstall script (user-data).  This describes some of the setup attributes, like keyboard, and the initial set of packages to be loaded.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;autoinstall:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;version: 1
apt:
geoip: true
disable_components: []
preserve_sources_list: false
primary:
- arches: [amd64, i386]
uri: &lt;a href=&#34;http://us.archive.ubuntu.com/ubuntu&#34;&gt;http://us.archive.ubuntu.com/ubuntu&lt;/a&gt;
- arches: [default]
uri: &lt;a href=&#34;http://ports.ubuntu.com/ubuntu-ports&#34;&gt;http://ports.ubuntu.com/ubuntu-ports&lt;/a&gt;
early-commands:
- sudo systemctl stop ssh
locale: en_US
keyboard:
layout: us
identity:
hostname: jammy-daily
username: vmadmin
password: $6$Da/Bin6we2OOJCVD$HM00JdEP47D.cVfSYzwf71khVHPD8NqbYLGw/iXPswndEqI2TNsMELWRCt0tA2.mVMPjFZlPI0B/xOBO9OhF01
ssh:
install-server: true
allow-pw: true
packages:
- openssh-server
- open-vm-tools
- cloud-init
- whois
- zsh
- wget
- tasksel
user-data:
disable_root: false
timezone: UTC
late-commands:
- sed -i -e &amp;rsquo;s/^#?PasswordAuthentication.*/PasswordAuthentication yes/g&amp;rsquo; /target/etc/ssh/sshd_config
- echo &amp;lsquo;vmadmin ALL=(ALL) NOPASSWD:ALL&amp;rsquo; &amp;gt; /target/etc/sudoers.d/vmadmin
- curtin in-target &amp;ndash;target=/target &amp;ndash; chmod 440 /etc/sudoers.d/vmadmin
- &amp;ldquo;lvresize -v -l +100%FREE /dev/mapper/ubuntu&amp;ndash;vg-ubuntu&amp;ndash;lv&amp;rdquo;
- &amp;ldquo;resize2fs -p /dev/mapper/ubuntu&amp;ndash;vg-ubuntu&amp;ndash;lv&amp;rdquo;&lt;/p&gt;
&lt;p&gt;My repo is linked and you can grab the original files there and build on them.  Packer is free and open-source and works with a variety of local and cloud backends, including VMWare, VirtualBox, HyperV, KVM, and AWS.  This is an easy way to produce repoducable server environments and treat your servers like &amp;ldquo;cattle not cats&amp;rdquo;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tailscale</title>
      <link>https://nextpertise.net/221004_tailscale/</link>
      <pubDate>Tue, 04 Oct 2022 14:48:18 -0400</pubDate>
      
      <guid>https://nextpertise.net/221004_tailscale/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m interested in TailScale.  I&amp;rsquo;ve been hearing good things about it from my friend, Jared, and TailScale has a fair set of proponents on my favorite podcasts.  A couple years ago, I setup ZeroTier and built a dedicated Linux device to attach to the ZeroTier network and route into my local LAN.  I wrote a well-received set of articles about that experience (&lt;a href=&#34;https://nextpertise.net/posts/201027_zerotier/&#34;&gt;Zerotier Basic Configuration&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/201027_zerotierrouter/&#34;&gt;ZeroTier Router&lt;/a&gt;).  ZeroTier continues to work well, but I haven&amp;rsquo;t been traveling as much and have left the VM off lately.  This investigation doesn&amp;rsquo;t come from any frustration with Zerotier or urgent need, just from an interest in trying something new.&lt;/p&gt;
&lt;h2 id=&#34;challenges&#34;&gt;Challenges&lt;/h2&gt;
&lt;p&gt;Both ZeroTier and TailScale are &amp;ldquo;overlay networks&amp;rdquo;.  I have a Meraki stack at home with two Internet connections (WISP and Starlink).  Meraki has horrible VPN support and I&amp;rsquo;m not over-enthused about cutting holes in my firewall.  Plus, anything that requires an ISP failover would kill VPN, so these overlay-style connections fit my needs closely.&lt;/p&gt;
&lt;p&gt;Both solutions use NAT traversal techniques and some of the same encryption suite.  Tailscale is an implementation of Wireguard (which is all the rage in Linux circles), but Zerotier predates wireguard and is a custom solution.  I&amp;rsquo;m not aware of any active security issues with either.  Obviously though, you&amp;rsquo;re only as secure as who you trust.&lt;/p&gt;
&lt;p&gt;Both ZeroTier and Tailscale operate in a &amp;ldquo;freemium&amp;rdquo; model, where the rendezvous server allows 20 connections.  Larger networks require a subscription, but both have self-hosted rendezvous servers as an option (presumably you&amp;rsquo;d set these up on something like EC2). I solved this with ZeroTier by configuring an Ubuntu server as a router from the ZT network into my home network.&lt;/p&gt;
&lt;h2 id=&#34;experience-with-tailscale&#34;&gt;Experience with TailScale&lt;/h2&gt;
&lt;p&gt;The Tailscale experience starts with signing up on the &lt;a href=&#34;https://tailscale.com&#34;&gt;website&lt;/a&gt;.  Instructions are provided for all the supported operating systems - Windows, Mac, Linux, iOS and Android.  Mobile operating systems send you to the respective App Stores to pick up a client.  My Pop! desktop is Ubuntu-based, so I was able to add a PPA and install from there.  TailScale doesn&amp;rsquo;t have a Linux GUI client, it is invoked through the command line as shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tailscale up 
tailscale ip -4  #shows private TS IP, can also be seen using &amp;quot;ip a&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once clients are instantiated, the VPN network is maintained at the &lt;a href=&#34;https://tailscale.com&#34;&gt;tailscale website&lt;/a&gt;.  My machines were given addresses in the 100.64/10 range, but not in the same /24, which is a little different than Zerotier.  Clients &lt;em&gt;should&lt;/em&gt; be able to communicate after they are registered and visible on the dashboard.  Tailscale functions as expected - I was able to access internal TailScale-attached resources without having to provision access on the firewall and speeds were comporable to ZeroTier.&lt;/p&gt;
&lt;p&gt;With Zerotier, I had to build a router to access non-attached devices.  TailScale allows any device to be an &amp;ldquo;exit node&amp;rdquo; and to route traffic into the local network.  Here I ran into some minor issues.  Tailscale documentation is pretty good, but there are still some mental hurdles to getting this to work correctly.&lt;/p&gt;
&lt;p&gt;First, the node has to be setup as an exit node.  To enable this, I re-enabled the tailscale client with the advertise flag.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tailscale down
sudo tailscale up --advertise-exit-node 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The node will now show in the dashboard as an available exit, but it won&amp;rsquo;t have any routes.  It turns out the node has to explicitly advertise local routes.  In ZT, this is controlled through the dashboard.  To enable this, I re-enabled the tailscale client with the routes.  For the record, I&amp;rsquo;m not sure that you have to take the service down everytime you make the change.  That might just be years of conditioning coming out on my part.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tailscale down
sudo tailscale up --advertise-routes=192.168.0.0/22 --advertise-exit-node --accept-routes=true  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By way of reference, I have four VLANs locally.  I could use seperate tailscale endpoints to attach into each of them, but I want to advertise them all as a block and thus have the /22 above.&lt;/p&gt;
&lt;p&gt;At this point, routing onto the local network from Tailscale will still not work.  There are two issues left to deal with, one obvious and one bug.  Let&amp;rsquo;s deal with the bug first.  When I review the Linux routing table, it does not show the tailscale network.  After beseeching the Great Google, I found references to a known bug in Ubuntu that doesn&amp;rsquo;t add these routes.  Since the computer doesn&amp;rsquo;t have a route in the tailscale network, it can&amp;rsquo;t pass traffic back.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;route
Kernel IP routing table
Destination     Gateway         Genmask http://192.168.26.53/ worked, but not to other devices in the same VLAN or to other VLANs.

sudo route add -net 100.64.0.0/10 dev tailscale0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The remaining issue is that local devices have my firewall as their default gateway.  When they receive traffic from a tailscale-connected IP, they reply using their default route back to the firewall.  The firewall then uses it&amp;rsquo;s default route to pass the traffic to the public Internet!  To fix this, I went into firewall (for those of you with Meraki, it&amp;rsquo;s on the dashboard under &lt;em&gt;Security &amp;amp; SD-WAN &amp;gt; Addressing &amp;amp; VLAN&lt;/em&gt;) and added a static route.  The route should target 10.64.0.0/10 and the next hop should be the IP of the tailscale exit node.  With this in place, everything works!&lt;/p&gt;
&lt;h2 id=&#34;nix-setup&#34;&gt;Nix setup&lt;/h2&gt;
&lt;p&gt;Setup in Nix involves two steps and also varied slightly for me from the docs.  First, add tailscale to &lt;em&gt;configuration.nix&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;environment.systemPackages = with pkgs; [
. . .
pkgs.tailscale
]
services.tailscale.enable=true;&lt;/p&gt;
&lt;h1 id=&#34;exit-the-text-editor&#34;&gt;exit the text editor&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;sudo nixos-rebuild switch&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once tailscale is installed, run &lt;strong&gt;sudo tailscale up&lt;/strong&gt; as before.  This will provide a URL for authentication.  Finally, go into the tailscale dashboard and authorize the new machine (click the ellipsis to the right of the machine and choose authorize).  Nix runs on my travel laptop, so I didn&amp;rsquo;t try to advertise it as an exit node.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/221005_Tailscale.png#floatright&#34; alt=&#34;Dashboard&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;tailscale-dashboard&#34;&gt;Tailscale Dashboard&lt;/h2&gt;
&lt;p&gt;My impression of the Tailscale dashboard is mixed.  There&amp;rsquo;s a download link, and a place to add users.  Free accounts cannot have multiple users, so the main user would have to setup the client on each device (like my wifes&amp;rsquo; or kids&amp;rsquo; computers).&lt;/p&gt;
&lt;p&gt;The documentation is pretty good, but I ran into several questions where it gave insufficient answers and I needed to just experiment to get things working.  The &lt;strong&gt;Machines&lt;/strong&gt; tab shows devices that are currently connected.  This also allows you to set tags and enable routing (assuming that the client is also configured to support routing).  The &lt;strong&gt;Services&lt;/strong&gt; tab collects a list of services so that you are aware of what you are sharing into the TailScale network.  This has the potential to be very useful, but you cannot &amp;ldquo;click to block&amp;rdquo; on this screen and it only shows services from the Tailscale-connected machine.  No services were shown from elsewhere on the connected network.  This could lead someone to a misunderstanding about their risk profile.&lt;/p&gt;
&lt;p&gt;Other dashboard tabs allow you to setup access-lists and control DNS.  &lt;strong&gt;Access control&lt;/strong&gt; is configured through a JSON document.  The controls available are pretty good - they allow you to block access by user or group (both rendered useless on the free account), by host IP, or by service port.  The JSON ACL can be managed through Github using Github actions which is very exciting, but you&amp;rsquo;d have to make sure that repo is marked private.  The &lt;strong&gt;DNS&lt;/strong&gt; tab allows you to point Tailscale clients to an internal resolver or to use &amp;ldquo;MagicDNS&amp;rdquo;.  MagicDNS, as near as I can tell, is basically a shared &lt;em&gt;hosts&lt;/em&gt; file, but it&amp;rsquo;s nice for folks who don&amp;rsquo;t have a private name server.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;What does this all boil down to?  I&amp;rsquo;m attracted to Tailscale because it uses wireguard and because it doesn&amp;rsquo;t require a dedicated router-vm.  Zerotier seems to have better access controls.  In both cases, the free-tier accounts offer analogous features (20 devices, 1 user).  Setup complexity is different, but equal.  If one or the other is working for you already,  I don&amp;rsquo;t think a change is necessary.  I&amp;rsquo;ve decided to keep Tailscale in place for at least a little while and I&amp;rsquo;m very interested in investigating the self-hosted option and seeing what additional capabilities that would provide.  Tailscale also offers a $5/month package of five users that would support a family and less work than spinning up an EC2 instance.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Linking and Embedding in Obsidian Notes (Part 3)</title>
      <link>https://nextpertise.net/220901_obsidian3/</link>
      <pubDate>Thu, 01 Sep 2022 06:24:59 -0400</pubDate>
      
      <guid>https://nextpertise.net/220901_obsidian3/</guid>
      <description>&lt;p&gt;Obsidian has been a great way to organize my work and my personal activities.  This is the third article I&amp;rsquo;ve written in this series.  &lt;a href=&#34;https://nextpertise.net/posts/220829_obsidian_intro&#34;&gt;Part 1&lt;/a&gt; was an introduction and &lt;a href=&#34;https://nextpertise.net/posts/220831_using_obsidian&#34;&gt;Part 2&lt;/a&gt; focused on &lt;em&gt;tasks&lt;/em&gt; and used that as an introduction to plugins and tags.&lt;/p&gt;
&lt;p&gt;This entry will focus on linking and embedding.  At this point we&amp;rsquo;re focusing on using Obsidian to take notes as we go.  After this, the series will turn to more advanced and non-obvious uses.&lt;/p&gt;
&lt;h2 id=&#34;links&#34;&gt;Links&lt;/h2&gt;
&lt;p&gt;Links are central to the way Obsidian works.  I described Obsidian as part note-taking and part personal knowledge-base wiki.  Being able to quickly link articles furthers both of those aspects.  Embedding links allows quick reference to existing material so that it doesn&amp;rsquo;t need to be repeated.  The links also start to create a navigational structure that allows quickly finding referenced information.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve created a sample daily entry below that demonstrates three basic types of linking that everyone needs to be able to do.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220904_Links.png&#34; alt=&#34;Links in Obsidian&#34;&gt;&lt;/p&gt;
&lt;p&gt;The simplest is a straightforward link to another note in the same vault.  I&amp;rsquo;ve demonstrated that below with the two notes to call Bob and Alice.  Notice that two formats are supported - the double square brackets used by twiki and the markdown style used for Alice.  Twiki-style is very easy to use - just type two opening square brackets and Obsidian will drop-down a selection list of notes to link.  You can start typing a name if you need to narrow down the list.  Selecting a note and pressing enter will automatically close the brackets.&lt;/p&gt;
&lt;p&gt;One neat wrinkle on this style link is that it can reference a point within the document.  Add a hash and then a header within the target document to the link and it will point to that location in the document.  You can see this demonstrated below in the tasks section with a link that goes to the task section of the project.&lt;/p&gt;
&lt;p&gt;Markdown links use a single set of square brackets for the link text and paranthesis for the link.  In the case of Alice (below), the link is referencing a document in this vault and just needs the &amp;ldquo;Obsidian path&amp;rdquo;.  Note the line below Alice . . . the same format is used for an external link.  A markdown link is required for external references.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#  Sunday, Sep 04, 2022

## Tasks
- [ ] Update [[Take over the World Project#Tasks]]

## Notes
Call [[Bob]]
Call [Alice](People/Alice)
tutorial on [MongoDB](https://www.tutorialspoint.com/mongodb/index.htm)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;links-provide-structure&#34;&gt;Links provide structure&lt;/h2&gt;
&lt;p&gt;Other search engines provided an index of web pages, but Google realized the power of links for ranking results.  If a lot of &lt;em&gt;other&lt;/em&gt; websites refenced a page, then it might be interesting.  The same logic is true in Obsidian and there are two tools to help you use this information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backlinks&lt;/strong&gt; refer to other Obsidian notes that have links back to the note currently being viewed.  This helps to create two-way traffic bewteen notes.  I&amp;rsquo;ve also found it helpful to track down related notes.  Backlinks are compiled automatically by Obsidian and shown in the &amp;ldquo;action&amp;rdquo; pane to the right by clicking the left-most tab.  This is pictured below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220904_Backlinks.png&#34; alt=&#34;Backlinks&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220904_Graphview.png#floatright&#34; alt=&#34;Graph View&#34;&gt;
&lt;strong&gt;Graph view&lt;/strong&gt; is another way that Obsidian tries to help surface relationships between notes.  Graph view shows you all the notes in the vault, with linking lines to show where links exist.  The graph view on the right is from my personal vault.  I turned off the note names in this view, both to consolidate the view and to protect my privacy.  Even without labels, two &amp;ldquo;hub&amp;rdquo; nodes are apparent.&lt;/p&gt;
&lt;p&gt;Graph view is pretty, but I don&amp;rsquo;t personally find it necessary.  Backlinks, on the other hand, I use fairly frequency to remember the name of the other file.&lt;/p&gt;
&lt;h2 id=&#34;embeds&#34;&gt;Embeds&lt;/h2&gt;
&lt;p&gt;Embedding is a term I&amp;rsquo;m using to describe including non-Markdown objects in an Obsidian note.  We&amp;rsquo;ll talk here about including code, math, pictures, and other files in a note.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220904_Obsidian_Blockquote.png#floatleft&#34; alt=&#34;Blockquotes&#34;&gt;
&lt;strong&gt;Block quotes&lt;/strong&gt; are used to pull something out of the body of the text.  These are useful for highlighting an interesting author&amp;rsquo;s quote or creating a sidebar.  Block quotes are created by preceeding lines with a greater-than sign.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220904_Obsidian_callout.png#floatsmallright&#34; alt=&#34;Callout&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Callout boxes&lt;/strong&gt; are a cool way to focus attention on a part of the page.  These extend the use of quote blocks with commonly used headings and colors to draw attention to a point.  Think about a cookbook that needed to say, &amp;ldquo;Danger - don&amp;rsquo;t put metal in the microwave!&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Callout boxes are built like block quotes with a header. The header is constructed from square-brackets with an exclamation mark.  The box includes everything until an empty line return, so it can be long.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;## Callout
&amp;gt; [!Danger]
&amp;gt; Here&amp;#39;s a danger callout
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Obsidian supports twelve types of callouts and will automatically apply a simbol and colored header appropriately.  Those types are listed below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;note&lt;/li&gt;
&lt;li&gt;abstract, summary, tldr&lt;/li&gt;
&lt;li&gt;info, todo&lt;/li&gt;
&lt;li&gt;tip, hint, important&lt;/li&gt;
&lt;li&gt;success, check, done&lt;/li&gt;
&lt;li&gt;question, help, faq&lt;/li&gt;
&lt;li&gt;warning, caution, attention&lt;/li&gt;
&lt;li&gt;failure, fail, missing&lt;/li&gt;
&lt;li&gt;danger, error&lt;/li&gt;
&lt;li&gt;bug&lt;/li&gt;
&lt;li&gt;example&lt;/li&gt;
&lt;li&gt;quote, cite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obsidian also supports &lt;strong&gt;code snippets&lt;/strong&gt;.  Programming should be enclosed in three tic-marks as shown below.  The language should be identified after the first set of tics - Obsidian will automatically color the text similar to an IDE.  Obsidian supports close to a hundred languages, including HTML, CSS, and Python.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  ```python
	print(&amp;#34;Hello World&amp;#34;)
  ```  #tics to open and close
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally, Obsidian supports &lt;strong&gt;Latex&lt;/strong&gt; code in-line or blocked out.  $Latex$ included in-line should be brackted by dollar signs ($).  If the equation needs to be blocked out and centered it should use double-dollar signss.  The code for this paragraph is shown below the equation.
$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Obsidian supports &lt;span style=&#34;font-weight:bold&#34;&gt;__Latex__&lt;/span&gt; code in-line or blocked out.  $Latex$ included 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;in-line should be brackted by dollar signs ($).  If the equation needs to be 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;blocked out and centered it should use double-dollar signs.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pictures-and-other-files&#34;&gt;Pictures and other files&lt;/h2&gt;
&lt;p&gt;Pictures and other files can be embedded in an Obsidian note.  Pictures are automatically displayed as part of the note.  There are two ways to do this.  The first is to use the markdown link format.  This does not copy the image into your vault, which is both good and bad.  Linking to an external image keeps your vault smaller and cleaner, but if that object changes or is deleted then it will be gone from your notes as well.  When I use this approach, I select a picture on a web page and right-click to choose &amp;ldquo;copy link&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;A second option is to copy the file into the vault and use the twiki-style link.  This increases the size and clutter in the vault.  This tecnique allows specifying size with a | bar and a width.  It also protects your notes from random changes on the Internet.  When copying, right-click and choose &amp;ldquo;copy file&amp;rdquo;.  Move into Obsidian and paste where you want it.  The file will default to the root of the vault, but I usually store images in an &amp;ldquo;Archive&amp;rdquo; folder.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;![&lt;span style=&#34;color:#f92672&#34;&gt;Obsidian&lt;/span&gt;](&lt;span style=&#34;color:#a6e22e&#34;&gt;https://obsidian.md/images/crafting.svg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;![[Pasted image 20220904161541.png|200]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the code above, I&amp;rsquo;ve limited the width of the obsidian image to 200 pixels.  I can&amp;rsquo;t control the size of the linked image.&lt;/p&gt;
&lt;h2 id=&#34;wrap-up&#34;&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;I hope this has been a useful run-through of some of the Obsidian formatting.  I&amp;rsquo;m working on further posts to get useful plugins.  Dataview is a special treat - it really blew my mind - so look for that post soon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Obsidian Tasks (Part 2)</title>
      <link>https://nextpertise.net/220831_using_obsidian/</link>
      <pubDate>Wed, 31 Aug 2022 06:24:59 -0400</pubDate>
      
      <guid>https://nextpertise.net/220831_using_obsidian/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://nextpertise.net/posts/220829_obsidian_intro&#34;&gt;Part 1&lt;/a&gt;, I introduced you to Obsidian.  Obsidian is a markdown-based note taking application that is supported on most desktop and phone operating systems.  That article describes the basic interface and usage of Obsidian.  If you are not familiar with Obsidian, it&amp;rsquo;s a good place to start.&lt;/p&gt;
&lt;p&gt;Part 2 will focus more on tasks within notes.  We&amp;rsquo;ll use tasks to also introduce plugins and tags.   Future articles will discuss links, embeds, tags and some of the other plugins that add functionality, such as Dataview.&lt;/p&gt;
&lt;h2 id=&#34;tasks&#34;&gt;Tasks&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220831_Obsidian_Tasks.png#floatright&#34; alt=&#34;Obsidian Tasks&#34;&gt;
In the last article, we discussed the basics of creating a note using Obsidian.  One of the first ways that Obsidian starts to differentiate itself from other text-based note systems is the way it incorporates tasks.  Creating a task simply involves starting a line with space seperated dash and square brackets (&lt;em&gt;the spaces are required&lt;/em&gt;).  In the snippet below I&amp;rsquo;ve demonstrated how this might look.  Obsidian recognizes the pattern as a checkbox and presents it as a graphical box as shown in the screen capture to the right.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;## Task List #todo
- [ ] Write article
- [ ] Post article
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;checklist-plugin&#34;&gt;Checklist Plugin&lt;/h2&gt;
&lt;p&gt;Notice that I&amp;rsquo;ve tagged this list with &lt;em&gt;#todo&lt;/em&gt;.  That is necessitated by a plugin I use - &lt;strong&gt;Checklist&lt;/strong&gt;.  This also presents a chance to introduce the usage of plugins and tags.  The tag will be used by the plugin to generate a consolidated list of open to-dos across all documents.&lt;/p&gt;
&lt;p&gt;To configure plugins, select the gear button (bottom left).  Plugins are grouped as &amp;ldquo;Core&amp;rdquo; - the ones included with the application and supported by the developer - and &amp;ldquo;community&amp;rdquo; - those that are created by third parties and made available to other Obsidian users.  Checklist is a community plugin, so step one is to go to the Community Plugins page in options and Turn Off restricted mode.  This will allow you to browse and install community plugins.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220831_Obsidian_Plugins.png#floatsmallright&#34; alt=&#34;Configuring Plugins&#34;&gt;&lt;/p&gt;
&lt;p&gt;Browsing plugins gives you a &lt;em&gt;huge&lt;/em&gt; list.  There are 637 plugins listed in August of 2022!  There&amp;rsquo;s relatively little danger in just scrolling through the list and trying some.  For this discussion, let&amp;rsquo;s stick to &lt;strong&gt;Checklist&lt;/strong&gt; to understand how to install and configure a plugin.  You can find a specific plugin by scrolling or by typing the name or a keyword into search. Once you find it, click the install button and then the enable button.  Typing &amp;ldquo;Checklist&amp;rdquo; gives a single possibility.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using plugins requires that they be downloaded (installed) and then enabled.  If you forget to enable, just go back into options.  Scroll down to the bottom where Community Plugins are listed and they can be enabled from there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220831_Obsidian_Checklist.png#floatleft&#34; alt=&#34;Configuring Plugins&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/220831_Obsidian_Tasklist.png#floatleft&#34; alt=&#34;Configuring Plugins&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/220831_Obsidian_Tags.png#floatleft&#34; alt=&#34;Working with tags&#34;&gt;&lt;/p&gt;
&lt;p&gt;Once the Checklist plugin is installed, you&amp;rsquo;ll be able to configure it under options.  Select the gear icon (lower left) to get into options and scroll down to the bottom.  You&amp;rsquo;ll find a header called &amp;ldquo;community plugins&amp;rdquo; and the Checklist plugin should be under that.  Notice that my screen shows several plugins, while you may only have Checklist to this point.&lt;/p&gt;
&lt;h2 id=&#34;tags-to-build-our-checklist&#34;&gt;Tags to build our Checklist&lt;/h2&gt;
&lt;p&gt;Check four settings while here.  First, multiple tags can be specified to pull in tasks.  You might have #honeydo and #worktasks for instance.  In this case, a generic #todo tag is specified.  Some other settings to check (to get this to work the way one might intuitively expect) are Show Completed - OFF, Group By - Tags, and Auto-Refresh ON.&lt;/p&gt;
&lt;p&gt;Once the plugin is configured, create a couple notes with tasks.  Remember to tag the tasks using a tag you defined in the Checklist seutp.  In the example screenshot, I took our sample list above and named the note &amp;ldquo;Sample 1&amp;rdquo;.  I created a second list and named it &amp;ldquo;Sample 2&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The vault pane shows that I&amp;rsquo;m editing &amp;ldquo;Sample 2&amp;rdquo;.  You can see the new note defined in the editing pane.  Because the checklist plugin is installed, the &amp;ldquo;action&amp;rdquo; pane on the right should now have a &amp;ldquo;check&amp;rdquo; tab (I&amp;rsquo;ve circled it in the example). Selecting this tab will show a consolidated list of incomplete tasks.  Marking an item complete in the pane will remove it from the list and mark it complete in the original document.  Similarly, you can complete tasks in the document and the update will carry over to the checklist sidebar.&lt;/p&gt;
&lt;p&gt;Tags are used by Obsidian to group things - in this case checklist.  They can also be used to group notes.  To see where we have tags defined, click the hashmark tab in the right &amp;ldquo;action&amp;rdquo; pane.  My example vault, built to demonstrate these concepts, has three tags in use: #todo, #evil, and #work.
Choosing &lt;em&gt;todo&lt;/em&gt; changes the left pane to show us which notes contain that tag and allow us to quickly jump to related entries.&lt;/p&gt;
&lt;h2 id=&#34;scratching-the-surface&#34;&gt;Scratching the surface&lt;/h2&gt;
&lt;p&gt;At this point, we have &lt;a href=&#34;https://nextpertise.net/posts/220829_obsidian_intro&#34;&gt;introduced&lt;/a&gt; Obsidian as a &lt;a href=&#34;https://nextpertise.net/posts/210424_hugo_markdown_cheatsheet&#34;&gt;markdown&lt;/a&gt;-based note taking tool. Obsidian has great tools to help manage tasks, and we&amp;rsquo;ve demonstrated the basics of using tasks.  Finally, we&amp;rsquo;ve started to cover the concepts of plugins and tags.&lt;/p&gt;
&lt;p&gt;There is a lot more to discuss!  Once I started using Obsidian, my use cases grew and the way I built notes started to fundamentally change.  I&amp;rsquo;m very excited by the possibilities.  I&amp;rsquo;m equally excited to share the journey.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Obsidian Introduction (Part 1)</title>
      <link>https://nextpertise.net/220829_obsidian_intro/</link>
      <pubDate>Mon, 29 Aug 2022 17:24:59 -0400</pubDate>
      
      <guid>https://nextpertise.net/220829_obsidian_intro/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve kept notes using a lot of different tools over the years.  I&amp;rsquo;ve used Outlook, Simple Note, Visual Studio Code, and even just Notepad.  At the start of the pandemic, I switched back to writing on paper.  I like paper because the mechanical act of writing helps keep me present in a meeting, it engages my brain, and it&amp;rsquo;s not distracting to the other folks in the meeting.  On the other hand, writing notes on my computer makes them easier to read (I have bad handwriting), easier to transport and easier to refer back to.&lt;/p&gt;
&lt;p&gt;The balance has tilted toward the computer again.  In the past, my notes were passive and most of the value was the way that writing helped me remember.  I&amp;rsquo;ve recently started using Obsidian, which allows you to create a group of markdown documents (Simple Note or Code) and link them together (like a personal wiki).  It also has the ability to query fields across notes, and add dynamic linking that really helps surface the information you neeed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220830_Obsidian.png#floatright&#34; alt=&#34;Obsidian&#34;&gt;
Past systems I&amp;rsquo;ve used created lockin (Outlook) or involved making someone else the custodian of my private file.  Obsidian uses a local database that is simply a collection of directories and markdown text files - easy to migrate data in and out.  The project has a syncing service that helps support the developers.  You can also make a one-time &lt;a href=&#34;https://obsidian.md/pricing&#34;&gt;contribution&lt;/a&gt; if you find value in the program.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m blown away at what I can do with Obsidian and I&amp;rsquo;d like to share a part of that journey with you.  Obsidian is a blank slate and can adapt to any style you want to work in.  I&amp;rsquo;ll be writing a series of articles to help you get concepts, demonstrate usage ideas, and share how I have my personal vault setup.&lt;/p&gt;
&lt;p&gt;The application is available for Linux, Mac, Windows, IOS, and Android from &lt;a href=&#34;https://obsidian.md&#34;&gt;their site&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;obsidian-interface&#34;&gt;Obsidian Interface&lt;/h2&gt;
&lt;p&gt;Obsidian is a markdown editor that organizes notes into folders, collectively called &lt;em&gt;vaults&lt;/em&gt;.  Those object map direclty to markdown files in directories.  The application is divided into three panes normally (you can open more) - the vault, the note editor, and (what I&amp;rsquo;ll call) an action pane.  The vault (on the left) shows the file structure, similar to the way VSCode works.  The editor is in the middle, and the action pane presents additional features (many times from add-ins).
&lt;img src=&#34;https://nextpertise.net/220830_Obsidian_Bar.png#floatleft&#34; alt=&#34;Obsidian Bar&#34;&gt;&lt;/p&gt;
&lt;p&gt;The icon bar on the left (as shown in my screen shot and close up) includes several buttons.  In order, the first hides the vault pane.  Next is a table editor, present because I&amp;rsquo;ve added the Advanced Table Editor plugin.  Third is a button that will let you jump to a note by title, then a graph view that shows the linking relationships between notes.&lt;/p&gt;
&lt;p&gt;The fifth icon will create a new note for today.  This is really useful if you routinely keep a file open for whatever happens in your day.  I extend this by specifying a template for my daily notes and specifying the directory they should all be kept in.  Next is a button to apply a template to a note, then a button to open the command palette.  &lt;img src=&#34;https://nextpertise.net/220830_Obsidian_LowBar.png#floatright&#34; alt=&#34;Lower bar&#34;&gt;  The command palette allows you to enter a command instead of working through the GUI - I rarely use this, but it&amp;rsquo;s useful in providing instructions.  Finally, the last icon is to publish this to an Obsidian hosted page.  I typically disable that option.&lt;/p&gt;
&lt;p&gt;There are another three icons at the bottom of the bar - switching vaults, help, and settings.&lt;/p&gt;
&lt;h2 id=&#34;first-note&#34;&gt;First note&lt;/h2&gt;
&lt;p&gt;Writing a note is easy - just click the &amp;ldquo;new note&amp;rdquo; button and start typing.  Markdown is pretty sparse - you can&amp;rsquo;t specify things like fonts or headers.  This can be a plus - it allows you to focus on the content.  Refer to my previous &lt;a href=&#34;https://nextpertise.net/posts/210424_hugo_markdown_cheatsheet&#34;&gt;Markdown Cheatsheet&lt;/a&gt; for a review of markdown syntax.&lt;/p&gt;
&lt;p&gt;Using the &amp;ldquo;new note&amp;rdquo; will put your file in the root of the vault.  Because I sort my notes into folders, I prefer to right-click the folder and choose new note so that it is created in the folder.&lt;/p&gt;
&lt;p&gt;A third way to create a new note is wiki-style.  Just use double-square brackets to reference another file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[new file]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clicking on the link will create the file and open it for editing.&lt;/p&gt;
&lt;h2 id=&#34;the-end-of-the-beginning&#34;&gt;The end of the beginning&lt;/h2&gt;
&lt;p&gt;At this point you should have installed the app and completed your first file.  If this is the first time you have used Obsidian, you may be saying, &amp;ldquo;so what&amp;rdquo;?  Have patience.  The next post will get into some more advanced Obsidian usage ideas and later posts will cover dataview (!) and my organizing strategy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Palemoon for legacy Flash support</title>
      <link>https://nextpertise.net/220819_palemoon/</link>
      <pubDate>Fri, 19 Aug 2022 09:07:14 -0400</pubDate>
      
      <guid>https://nextpertise.net/220819_palemoon/</guid>
      <description>&lt;p&gt;Flash was a technology to extend the functionality of websites past what was possible with HTML at the time.  It allowed for highly interactive experiences and was used for streaming, video games, and for &amp;ldquo;application like&amp;rdquo; experiences inside the browser.  Flash was implemented on the client-side via a browser &amp;ldquo;plug-in&amp;rdquo; and was notorious for security issues.  In my experience, a big part of the problem with Flash was the update process.  The plug-in was updated seperately from the Operating System and browser, leading to many cases to persistence of older versions.  Furthermore, the installer would commonly not clean up old versions, leaving an attack surface.&lt;/p&gt;
&lt;p&gt;Why do we care?  For the most part we don&amp;rsquo;t.  Flash was deprecated in 2020 and is no longer supported by the major browsers.  The functionality of Flash has been ably replaced by HTML5.  However, there was a range of IT products created in the mid-teens that used a Flash console for administrative access.  Cisco used Flash in equipment like ASA firewalls, SOHO switches, and UCS servers.  Much of that equipment is ageing out, but some of it is still in good shape and capable of delivering value.  One example is my home server, which is an old Cisco UCS M3.&lt;/p&gt;
&lt;h2 id=&#34;accessing-a-flash-console&#34;&gt;Accessing a Flash Console&lt;/h2&gt;
&lt;p&gt;ProxMox recently crashed - I&amp;rsquo;ll write about that seperately - but I suspected a disk issue.  The best way to access the information I needed was through the CIMC (Cisco Integrated Management Console), an out-of-band server management interface other vendors refer to as Integrated Lights Out access (ILO) or DRAC (Cell Remote Access Controller).&lt;br&gt;
I hadn&amp;rsquo;t accessed the CIMC in a long time.  Rebooting the server displays the assigned IP and let&amp;rsquo;s you setup the interface.  I had assigned an IP and identified it as in a VLAN on a trunk port.  However, pinging the IP was unsuccessful.  I used the Meraki &amp;ldquo;clients&amp;rdquo; display to identify the switch port used and setup a continuous ping from my workstation.  I tried a variety of configurations on the CIMC and switch, but ultimately what worked was to set the port as access (turn off 802.1q) and let the speed and duplex auto-negotiate.  I originally had this set for trunk, then tried trunk and identified the VLAN as the &amp;ldquo;native&amp;rdquo; VLAN which should have removed the .1Q shim from the header.  I &lt;em&gt;suspect&lt;/em&gt; that the UCS wanted to run fast ethernet and had some compatibility issue with .1Q as spoken by the Meraki.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 1 - set the port to auto/auto, define the VLAN and set the mode to access&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the CIMC port responding, I could browse to it using it&amp;rsquo;s IP address.  The next problem is that the site presents a security warning.  Although the CIMC uses TLS 1.2 (which is still supported), it uses 128b keys (which are not).  Mozilla &lt;a href=&#34;https://wiki.mozilla.org/Security/Features/Certs_Disallow_Weak_Keys&#34;&gt;phased out&lt;/a&gt; key sizes smaller than 2048b at the end of 2013.  Even getting around this issue still leaves us with the Flash problem.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://linux.palemoon.org/download/mainline/&#34;&gt;Palemoon&lt;/a&gt; is a browser forked from Firefox years ago and developed in the years since.  It maintains compatibility with the older XUL-based plugins.  It is distributed as a tar-ball, so I just extracted it to my &lt;em&gt;apps&lt;/em&gt; directory and ran the palemoon executable.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 2 - Download Palemoon, extract and run&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The flash plugin was abandoned at version 34.0.0.137 and can be obtained from &lt;a href=&#34;https://github.com/darktohka/clean-flash-builds/releases/tag/v1.7&#34;&gt;Github&lt;/a&gt;.  Again, it can be installed directly from github using the following command.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; mkdir -p ~/.mozilla/plugins &amp;amp;&amp;amp; wget -q https://github.com/darktohka/clean-flash-builds/releases/download/v1.7/flash_player_patched_npapi_linux.$( (( $(getconf LONG_BIT) == 32 )) &amp;amp;&amp;amp; echo &amp;quot;i386&amp;quot; || echo &amp;quot;x86_64&amp;quot;).tar.gz -O - | tar -zxf - -C ~/.mozilla/plugins libflashplayer.so
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After installation, Palemoon is able to access the Flash-based admin console for the UCS server.  The installation did not impact my current (104) version of Firefox.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 3 - Install Flash from Github&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;this-is-a-bad-idea&#34;&gt;This is a bad idea&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Palemoon&lt;/em&gt; is an interesting browser and - to my knowledge - hasn&amp;rsquo;t had security concerns associated with it specifically.  However, Flash was deprecated for a reason and this article walks through installing unpatched and unsupported legacy software into a browser.  I would limit Palemoon to internal trusted addresses as long as the Flash plug-in is present and active. This can be addressed to some extent by limiting when Flash is allowed to run, as shown below, but I would still be very cautious.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220818_palemoon_always_activate.png&#34; alt=&#34;Limiting Palemoon/Flash exposure&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding Math Formulas to a Hugo-based site</title>
      <link>https://nextpertise.net/220817_formulas/</link>
      <pubDate>Wed, 17 Aug 2022 10:40:54 -0400</pubDate>
      
      <guid>https://nextpertise.net/220817_formulas/</guid>
      <description>&lt;p&gt;An upcoming article features some basic math, but rendering it in markdown is unaesthetic.  What you get is &lt;em&gt;E=mc^2&lt;/em&gt; when what you want is $ E=mc^2$.  My search led me to &lt;a href=&#34;https://katex.org/&#34;&gt;KaTeX&lt;/a&gt; which is a JavaScript library that let&amp;rsquo;s you put $\LaTeX$ code into an HTML document.  LaTeX was created to typeset scientific papers, so it is built for displaying things like matrices and integrals.  I don&amp;rsquo;t plan to publish math that intense, but LaTeX can help clearly display even a simple division equation and improve the readability of the post.  The best source of information I found was &lt;a href=&#34;https://mertbakir.gitlab.io/hugo/math-typesetting-in-hugo/&#34;&gt;Mert Bakir&amp;rsquo;s blog&lt;/a&gt; and my usage is based on his work.&lt;/p&gt;
&lt;p&gt;There are three steps to incorporating KaTeX with Hugo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a partial template.  I added this to my theme by creating a file at &lt;em&gt;themes/next/layouts/partials/katex.html&lt;/em&gt;, but it could also be added to the site at &lt;em&gt;layouts/partials/&lt;/em&gt; (note that the name &lt;em&gt;next&lt;/em&gt; is my theme name, so your&amp;rsquo;s will differ).  Pull the code from the &lt;a href=&#34;https://katex.org/docs/browser.html&#34;&gt;KaTeX site&lt;/a&gt; by copying everything within the &lt;!-- raw HTML omitted --&gt; tags.  You&amp;rsquo;ll notice there&amp;rsquo;s also a script in the code below - add that to the file as well.  Here is the file that is current in August, 2022, for this site.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css&amp;#34; integrity=&amp;#34;sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;

  &amp;lt;!-- The loading of KaTeX is deferred to speed up page rendering --&amp;gt;
  &amp;lt; script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js&amp;#34; integrity=&amp;#34;sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;!-- To automatically render math in text elements, include the auto-render extension: --&amp;gt;
  &amp;lt;script defer src=&amp;#34;https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js&amp;#34; integrity=&amp;#34;sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR&amp;#34; crossorigin=&amp;#34;anonymous&amp;#34;
    onload=&amp;#34;renderMathInElement(document.body);&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;script&amp;gt;
      document.addEventListener(&amp;#34;DOMContentLoaded&amp;#34;, function() {
          renderMathInElement(document.body, {
              delimiters: [
                  {left: &amp;#34;$$&amp;#34;, right: &amp;#34;$$&amp;#34;, display: true},
                  {left: &amp;#34;$&amp;#34;, right: &amp;#34;$&amp;#34;, display: false}
              ]
          });
      });
  &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Include the partial file in all the pages where you want to use LaTeX.  Again, I chose to include this in my theme as part of the &lt;em&gt;/theme/next/layouts/partials/header.html&lt;/em&gt; file.  It can be included anywhere as long as Hugo builds the code outside the &lt;!-- raw HTML omitted --&gt; tags.  This Hugo function looks for the presence of a parameter named &lt;em&gt;math&lt;/em&gt; which is set to True.  This keeps from loading KaTeX on pages where it is unnecessary.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  {{ if .Params.math }}{{ partial &amp;#34;katex.html&amp;#34; . }}{{ end }}
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Finally, edit the default archetype file (themes/next/archetypes/default.md).  Changing the markdown engine is not required, but issues with KaTeX have been reported using the default Goldmark (I didn&amp;rsquo;t encounter any issues with either in my testing).  I have the math parameter present but set to false, which will not load KaTeX javascript (similar to what would happen if I omitted the parameter).  I am including the parameter as a reminder to my future self.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  
  math: false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Use KaTeX in markdown by using two dollar signs ($$) as before and after delimiters for a standalone centered equation or single dollar signs for in-line equations.
You can find a good LaTeX resource at the &lt;a href=&#34;https://www.overleaf.com/learn/latex/Mathematical_expressions&#34;&gt;Overleaf&lt;/a&gt; site.&lt;/p&gt;
&lt;p&gt;The last problem I had was finding some good examples!  So, here are a few equations to give you a feel for what is possible.&lt;/p&gt;
&lt;p&gt;$\LaTeX$&lt;/p&gt;
&lt;p&gt;Bracket the equation with two dollar signs to center ($$) - x = {-b \pm \sqrt{b^2-4ac} \over 2a}&lt;/p&gt;
&lt;p&gt;$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}$$&lt;/p&gt;
&lt;p&gt;Use one dollar sign on each side to include in line.  For instance, acceleration a={\deltav}{t} renders $a= {\Delta v \over t}$&lt;/p&gt;
&lt;p&gt;Finally, just to show the range of LaTeX, is Schrodinger&amp;rsquo;s Equation - i \hbar \frac{\partial}{\partial t}\Psi(\mathbf{r},t) = \hat H \Psi(\mathbf{r},t).
$$i \hbar \frac{\partial}{\partial t}\Psi(\mathbf{r},t) = \hat H \Psi(\mathbf{r},t)$$&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Length of a bit</title>
      <link>https://nextpertise.net/220815_lengthofabit/</link>
      <pubDate>Mon, 15 Aug 2022 12:59:02 -0400</pubDate>
      
      <guid>https://nextpertise.net/220815_lengthofabit/</guid>
      <description>&lt;p&gt;In the category of unexpected questions:&lt;/p&gt;
&lt;p&gt;Over a glass of good whisky, a semi-technical friend of mine said, &amp;ldquo;Ok - I&amp;rsquo;ve been wondering about this, it&amp;rsquo;s appropos of nothing, but
have no idea how to figure it out: How long (in length) is a bit?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;After thinking about it, I said it depends on a few factors, the most important of which is the frequency of the signal and the media that carries the signal.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;What does the media have to do with it, I thought electromagnetic signals traveled at the speed of light.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I affirmed that they do - in a perfect vacuum. Wanna just go with that?  &amp;ldquo;Sure, let&amp;rsquo;s start there.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Since he was asking about the length of a single bit, we need a unit of distance; meters (m) works well here I think. We&amp;rsquo;ll start with a frequency of 1MHz.&lt;/p&gt;
&lt;p&gt;The basic formula is $ length = \frac{speed}{frequency} $ so &amp;hellip;&lt;/p&gt;
&lt;p&gt;$$ length = \frac{300,000,000 m/s}{1,000,000 b/s} = 300 m/b$$&lt;/p&gt;
&lt;p&gt;&amp;ldquo;That&amp;rsquo;s a lot longer than I thought it would be&amp;rdquo; he said.&lt;/p&gt;
&lt;p&gt;You want it shorter?  Increase the frequency of the signal. How about 1GHz?  It&amp;rsquo;s just under a foot.
$$ length = \frac{300,000,000 m/s}{1,000,000,000 b/s} = 0.3 m/b$$&lt;/p&gt;
&lt;p&gt;He said he got that, but what about the carrying medium?&lt;/p&gt;
&lt;p&gt;&amp;ldquo;OK, light (and electromagnetic fields) travels about 300,000,000 m/sec in a vacuum. What about in a wire or fiber optic cable? I&amp;rsquo;d bet light travels slower there.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Yup, you&amp;rsquo;re right.  There is a velocity factor that is applicable to any conductor that carries a signal. That factor is sometimes expressed as a percentage of the speed of light in a vacuum.  For example, in air the Velocity Factor (VF) is about 99%. In the typical coaxial cable used in cable TV it&amp;rsquo;s about 77%.
For good ol&amp;rsquo; twisted pair (Cat 6) the VF is 65%. The VF depends on the materials and the construction of the transmission line.  Calculated by electrical
engineers, the VF depends on the line&amp;rsquo;s tendency to impede the progress of the signal at various frequencies. That&amp;rsquo;s why each type of transmission line has a characteristic impedance which is related to the VF.&lt;/p&gt;
&lt;p&gt;So, in space, a 1GHz &amp;ldquo;bit&amp;rdquo; is about a foot long.  In a Cat 6 twisted pair cable it would be&lt;/p&gt;
&lt;p&gt;$$ length = \frac{300,000,000 m/s \times 0.65}{1,000,000,000/s} = 0.195 m/b$$&lt;/p&gt;
&lt;p&gt;So as the signal goes through a higher impedance cable, the bits get shorter.&lt;/p&gt;
&lt;p&gt;There are, of course, other factors to consider when engineering signal transmission systems in the real world.  Very high- and low signaling rates need their own special considerations.  One of the big advances in recent years is the ability to build smaller and more efficient integrated circuit (IC) chips that allow for faster and faster signal processing at lower power consumption. This is why we have supercomputers that can use so-called 5G frequencies and protocols - and also fit in your pocket.  Sometimes we can even use them to make phone calls.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/lengthofbit.png&#34; alt=&#34;Length of a bit&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting to know Nix</title>
      <link>https://nextpertise.net/220610-nix/</link>
      <pubDate>Sat, 06 Aug 2022 17:17:55 -0400</pubDate>
      
      <guid>https://nextpertise.net/220610-nix/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a distro hopper.  I&amp;rsquo;ve described some of the tools that support my dubious lifestyle in previous articles such as &lt;a href=&#34;https://nextpertise.net/posts/210911_distrohoppingwventoy/&#34;&gt;Distro Hopping in Style&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/210207_installscript/&#34;&gt;Linux Install Script&lt;/a&gt;.  That said, Pop! OS has been a very comfortable home for a year and a half.  &lt;a href=&#34;https://pop.system76.com/&#34;&gt;Pop! OS&lt;/a&gt; has pushed the envelope on fresh updates, it has been very stable, and my workflow on a 4K display meshes very well with their version of intelligent auto-tiling.&lt;/p&gt;
&lt;p&gt;Ah, but there are always new ideas in the world and I&amp;rsquo;ve become very interested in immutable operating systems.  Immutability just means that something doesn&amp;rsquo;t change over time and in the case of an OS, it means that that the OS and installed applications are isolated from each other and don&amp;rsquo;t share libraries.  Immutable systems are atomic - changes can be rolled back without collatoral damage.  These systems should be more reliable, since they eliminate some of the major issues in maintaining a linux system.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve played a little with Fedora Silverblue which uses OSTree, Flatpak, and Podman to create this seperation.  In my limited time with Silverblue, it felt interesting but not ready (and I think Fedora would say the same thing at this point).&lt;/p&gt;
&lt;h2 id=&#34;nix--nix-os&#34;&gt;Nix / Nix-OS&lt;/h2&gt;
&lt;p&gt;I really took the plunge with NixOS.  NixOS is built around the Nix package management system, which installs applications into a directory structure called the Nix store.  Nix is declarative, meaning that your configuration file can specify (most of) your system.  A by product of the declarative and atomic nature of Nix, is that I can share my configuration with you and you can apply it against a machine you own and build an identical environment.  This is a critical point to the value of Nix - the development environment can be guaranteed to be identical to the production environment.&lt;/p&gt;
&lt;p&gt;Nix is a declarative language for system state.  Nix is also a package manager that can be used on existing Linux or Mac machines.  NixOS is an operating system built and maintained by the Nix package manager using the Nix language.  NixOS (&lt;a href=&#34;https://nixos.org/&#34;&gt;https://nixos.org/&lt;/a&gt;) can be downloaded and installed as either a Gnome or KDE version (but it&amp;rsquo;s easy to switch between desktop environments).&lt;/p&gt;
&lt;p&gt;When installation is finished you can edit the default configuration (/etc/nixos/configuration.nix) to customize your environment.  NixOS comes pretty bare, so you&amp;rsquo;ll really need to add to it quickly.  Nix packages are installed into the Nix store (/nix/store) and then made available to users via symlinks.  This means that two users can install different versions of the same package and each will be put into the Nix store seperately and made available to the appropriate user.  Configuration.nix is an ini-type text file, and applications are specified under environment.systemPackages.  The example below adds Firefox and flameshot.  A quick note - the camel case below is deliberate and Nix will throw errors if you leave it out.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;environment.systemPackages = with pkgs; [
  firefox
  flameshot
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the config is changed, run &lt;strong&gt;nixos-rebuild switch&lt;/strong&gt; to apply the configuration and switch to the new environment.  Nix will compare the current state to the desired state, realize that the difference is the Firefox package and install it.  Each change is called a generation, and you can also apply a previous generation to roll-back to a previous state.&lt;/p&gt;
&lt;p&gt;Applications can also be installed using nix-env.  This functions more like apt and immediately installs.  Actions managed via nix-env aren&amp;rsquo;t tracked as a generation and won&amp;rsquo;t be reproduced if you apply your configuration.nix file to another computer.  Both methods pull from a git environment.  Below is the command to install Firefox.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nix-env -i firefox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nix repositories are just git compilations of instructions about how to build an app.  Sometimes there is a binary package available as well.  When you install an app, it checks the local store, then the binaries, then uses the build instructions if it has to.  Nix can also install flatpaks.&lt;/p&gt;
&lt;p&gt;Add a line to &lt;em&gt;configuration.nix&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services.flatpak.enable = true;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then rebuild and add a flatpack repo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nixos-rebuild switch
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I used this to install Obsidian.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flatpak install flathub md.obsidian.Obsidian
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;my-experience&#34;&gt;My Experience&lt;/h2&gt;
&lt;p&gt;KDE on NixOS is pretty much like every other KDE installation.  Most applications you want are easy to install, but commercial applications and less common ones may be problems.  I had issues with VMWare Workstation and the drivers for my Brother printer.  I switched to virtmanager for VMs, but I haven&amp;rsquo;t found a way to load the printer drivers.  I have a collection of fonts from over the years and I&amp;rsquo;d like those installed via configuration.nix, but I had to install manually. It looks like I &lt;em&gt;could&lt;/em&gt; do this if I had a local repo.  I&amp;rsquo;d like to define shares (I use NFS or SSHFS internally) and - while I&amp;rsquo;ve seen examples that purport to do this - I haven&amp;rsquo;t been able to get that to work.&lt;/p&gt;
&lt;p&gt;In short, you can&amp;rsquo;t assume that things will &amp;ldquo;just work&amp;rdquo; in the way they do in Fedora or Ubuntu.  It&amp;rsquo;s worth noting that it took us &lt;em&gt;years&lt;/em&gt; to reach that level of maturity and NixOS is developing quickly.  NixOS is about 95% there as a daily driver, but that last five percent can be a killer.  I have a spare laptop that I typically use when I&amp;rsquo;m sitting in the living room, trying to read email but still be around the family.  It travels with me as well.  It&amp;rsquo;s typically used for browsing, email, and those daily activities.  NixOS is great on that machine, but it can&amp;rsquo;t print.  I tried to install Obsidian on it and that became an adventure.  It also seems like the Nix repos aren&amp;rsquo;t kept up to date (or possibly I&amp;rsquo;m updating wrong) because I&amp;rsquo;m seven versions behind on Firefox and about that on Thunderbird.&lt;/p&gt;
&lt;p&gt;My &lt;em&gt;Configuration.nix&lt;/em&gt; file is in a repo on Github for reference.  I never felt like Nix was close enough to move my primary machine (it still runs Pop! OS).  I think I&amp;rsquo;m going to reimage my laptop back to Pop! or Kubuntu, just because I don&amp;rsquo;t have the time for the various adventures Nix sends me on.  Still, Nix has a definite vision and I believe it bears watching.  It will be easy enough to re-install later when I have time simply by reapplying my config from Git.&lt;/p&gt;
&lt;p&gt;I think Nix is currently a great option for cases where you need a defined and reproducable build, use standard parts (like nginx, bind, or mysql), and can tolerate not being on the &amp;ldquo;bleeding edge&amp;rdquo;.  Sounds like the perfect server, right?  I&amp;rsquo;ll definitely think of Nix for my next server build.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VMWare PSA update</title>
      <link>https://nextpertise.net/220727_psa_update/</link>
      <pubDate>Wed, 27 Jul 2022 13:00:36 -0400</pubDate>
      
      <guid>https://nextpertise.net/220727_psa_update/</guid>
      <description>&lt;p&gt;I wrote back on &lt;a href=&#34;https://nextpertise.net/posts/220105_psa_vmware&#34;&gt;January 5th&lt;/a&gt; about an issue with VMWare Workstation on the latest Linux kernels.  I&amp;rsquo;m using Pop! OS and it is fairly aggressive about keeping the system on fairly recent kernels.  VMWare doesn&amp;rsquo;t support the newest kernels and Workstaion thus can&amp;rsquo;t recompile vmmon and vmnet after a kernel upgrade.  This is probably a problem shared by anyone who keeps their kernel updated, but it&amp;rsquo;s worth saying that - if your goal is stability - you don&amp;rsquo;t have to upgrade the kernel when offered.&lt;/p&gt;
&lt;p&gt;I previously recommended a project from Michal Kubeček that maintained the &lt;a href=&#34;https://github.com/mkubecek/vmware-host-modules&#34;&gt;necessary patches&lt;/a&gt;.  That project is still great, but you have to periodically download a new copy to stay current.  Today when I hit this issue again, I used a different project - the &lt;a href=&#34;https://github.com/LinuxEuphony/vmware-host-modules-builder-cli&#34;&gt;VMWare host modules Builder CLI&lt;/a&gt;.  This project builds on and automates the Kubeček project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Builder CLI&lt;/strong&gt; supports Debian (and thus Pop!), Arch, and is working on Fedora support.  When run, the script confirms that you are logged in as root and that there is internet connectivity.  It checks for unmet dependencies and cleans up.  As part of the script it installs ncat and wget, as well as open-vm-tools.  It detects your kernel and VMWare Workstation versions, downloads the updates, and guides you through installation.  It was quick and easy on my system.&lt;/p&gt;
&lt;p&gt;To run the VMWare Host Modules Builders script, download and unzip the script, then make the script executable.  For Debian, the script is called &lt;em&gt;debian-vmware-host-modules-builder-cli.sh&lt;/em&gt;.  Thus run the script as root (or sudo).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220727_vmwarescript.png&#34; alt=&#34;Script prompt&#34;&gt;&lt;/p&gt;
&lt;p&gt;Method 1 worked fine for me, although I had to reboot to get everthing working.  That&amp;rsquo;s consistent with the behavior from the older method as well.  It&amp;rsquo;s a little disruptive, since downloading a new kernel can cause VMWare Workstation to have errors until you reboot.  Once you reboot into the new kernel, you have to check vmware, and then run the script if needed and then reboot again with the patches loaded.  Simple enough to just only do updates after business hours and make sure everything is working before you walk away.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>5G Troubleshooting</title>
      <link>https://nextpertise.net/220723_5g_troubleshooting/</link>
      <pubDate>Sat, 23 Jul 2022 12:14:47 -0400</pubDate>
      
      <guid>https://nextpertise.net/220723_5g_troubleshooting/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220723_droid_signal.jpg#floatsmallleft&#34; alt=&#34;Signal Strength on Android&#34;&gt;&lt;/p&gt;
&lt;p&gt;My office sits beside an Interstate and generally the Interstate corridor is one of the best places to find cellular coverage.  Sure enough, we have towers reasonably close to the east and west of the building along the Interstate.  The construction of the buildings, like many office buildings, has a strong steel and concrete &amp;ldquo;core&amp;rdquo; with open office space around the perimeter.    My analysis is that those cores, along with the way the buildings set next to each other, creates 5G/LTE shadows within the buildings.&lt;/p&gt;
&lt;p&gt;My buildings are setup along &amp;ldquo;modern&amp;rdquo; cubicle-farm ideas.  To get a feel for where the dead zones are, I got readings on signal strength using my phone at all the cube row intersections.  Wireless signal strength is denoted in decibel-milliwats (dBm).  A decibel is a comparison of two numbers, with a 10dB difference translating as a 10 fold increase.  A 100x difference would be 20dB.  dBm compare a signal to a milliwat.&lt;/p&gt;
&lt;p&gt;For LTE, signals weaker than -85dB are poor service.  5G uses newer radios and can do pretty well down to -105dB.  T-Mobile, through the acquisition of Sprint, uses low and high bands (800 MHz, 1.9 GHz, and 2.5 GHz) and the lower frequencies penetrate obstructions better (remember how Nextel used to work everywhere?).  Verizon and AT&amp;amp;T use higher frequencies and don&amp;rsquo;t penetrate building interiors as well.  Work uses Verizon, so helps explain the reception issues.&lt;/p&gt;
&lt;h2 id=&#34;determing-5g-signal-strength&#34;&gt;Determing 5G signal strength&lt;/h2&gt;
&lt;p&gt;Using Android, you can find signal strength under &lt;em&gt;Settings &amp;gt; About Phone &amp;gt; Status &amp;gt; SIM card status&lt;/em&gt;.  In my testing this display updated dynamically, so I could just leave it up and walk around.  In the example pictured, my signal strength is -91dB on my LTE phone.&lt;/p&gt;
&lt;p&gt;On an IOS device, dial &lt;em&gt;3001#12345#&lt;/em&gt;.  This brings up some technician information.  Go to the second tab and choose &lt;em&gt;RAT &amp;gt; Serving Cell Info&lt;/em&gt;.  The signal strength is labeled &lt;strong&gt;RSRP&lt;/strong&gt;.  In my experience, this display updates over minutes.  If readings are needed faster, just redial the number to refresh the display.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220723_IOS4.jpg#floatsmallright&#34; alt=&#34;Signal Strength on IOS-2&#34;&gt;  &lt;img src=&#34;https://nextpertise.net/220723_IOS3.jpg#floatsmallright&#34; alt=&#34;Signal Strength on IOS-1&#34;&gt;&lt;/p&gt;
&lt;p&gt;I understand there are apps that measure signal strength, but this was a pretty basic setup and I was fine was a more ad hoc approach.  It seems like every app is a new way to track or show ads anyway, and this prevented yet another app on my phone.&lt;/p&gt;
&lt;h2 id=&#34;pico-cells&#34;&gt;Pico Cells&lt;/h2&gt;
&lt;p&gt;My office purchased &amp;ldquo;pico cells&amp;rdquo; - devices that produce a 5G signal over a small indoor area and transmit the traffic over your network to the provider.  I positioned these on the opposite sides of the building that face cell towers and stuck the 5G &amp;ldquo;hockey puck&amp;rdquo; in the window.  The pico cells made an impressive difference.  Close by, my signal went from -110dBm to -65dBm and the zone that received better than -100 dBm extended out about 60 meters.  I repeated the measurement to ensure I had good coverage and here I noticed that the phones tended to be &amp;ldquo;sticky&amp;rdquo; to a particular cell.  Notice in the screen shot that the cellular tower ID is identified.  Intuitively, one might expect the phone to &amp;ldquo;flip&amp;rdquo; to the next tower as soon as the signal was better but what I saw was that the phone tended to keep a tower until it&amp;rsquo;s signal got very weak.&lt;/p&gt;
&lt;p&gt;Of course, the cellID will be useful if we have user coverage complaints.  Each of the picocells reported a different ID and I noted those in our recordds so we can trace issues.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nautilus Tweaks</title>
      <link>https://nextpertise.net/220717_nautilus_tweaks/</link>
      <pubDate>Sun, 17 Jul 2022 17:04:02 -0400</pubDate>
      
      <guid>https://nextpertise.net/220717_nautilus_tweaks/</guid>
      <description>&lt;p&gt;Nautilus, the Gnome file manager, has a number of available plug-ins available that make it much easier to use.  It also supports a scripting function that you can use to develop your own extensions.  The extentions can be easily added using &lt;em&gt;apt&lt;/em&gt;, but many of them will not be active until a reboot.  You can short-circuit that process by using &lt;strong&gt;nautilus -q&lt;/strong&gt; to quit all open instances of nautilus and then opening a new window.  I&amp;rsquo;m using all of the following extensions with &lt;em&gt;Pop! OS 22.04&lt;/em&gt;, so I can verify they work in COSMIC.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220717_gnomeimageresize.png#floatsmallright&#34; alt=&#34;Nautlus Image Resize&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;easily-downsize-an-image&#34;&gt;Easily Downsize an Image&lt;/h2&gt;
&lt;p&gt;The first plug-in, and the one I use the most, is the image converter.  I maintain a simple internal web page with the sites I use the most and I like to grab an image to use as a site icon.  There are a lot of ways to get a good icon - some sites allow you to right click and save as.  Some icons are available on &lt;a href=&#34;https://images.google.com&#34;&gt;Google Images&lt;/a&gt;.  I also sometimes just use Flameshot to grab a screen portion.  The problem with all these methods is that they don&amp;rsquo;t create a standard image size.  I can dynamically resize, but that slows down my page display.  I can also use GIMP to resize, but that&amp;rsquo;s an involved process.&lt;/p&gt;
&lt;p&gt;This is a problem that pops up fairly often.  There&amp;rsquo;s never the exact right icon in Lucidchart, so I want to pull one in.  I create a new GNS3 device and want to put a cool image on it.  In all these cases, I want a standard size.  The solution is the Nautilus Image Converter.  This can be installed from the command line as shown.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nautilus-image-converter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Right click an image and you&amp;rsquo;ll be offered two new menu options - rotate and resize.  This let&amp;rsquo;s you easily scale the image or set it to a desired size (96x96 works well for a lot of icons, I use 72x72 for GNS3 icons per their style guide).  You can change the current file or save it as a new file.&lt;/p&gt;
&lt;h2 id=&#34;preview-a-file&#34;&gt;Preview a File&lt;/h2&gt;
&lt;p&gt;Gnome Sushi is a way to quickly preview a file.  Sushi works with most text, music, image, and video formats.  Install this using apt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install gnome-sushi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed, choose a file and hit [space] to open a preview.  Arrow keys can be used to move through the Nautilus directory with the preview window updating to show each file.  [Esc] can be used to close the preview.&lt;/p&gt;
&lt;h2 id=&#34;admin&#34;&gt;Admin!&lt;/h2&gt;
&lt;p&gt;Windows has a cool right-click option to &amp;ldquo;open as Administrator&amp;rdquo;.  This plug-in is similar - the context window will show &amp;ldquo;Edit as Administrator&amp;rdquo;.  Choosing it will open a prompt to escalate priviledges (side note, this works really well with &lt;a href=&#34;https://nextpertise.net/posts/220501_howdy/&#34;&gt;Howdy&lt;/a&gt;.  This extension is trying to open whatever file as a text file, so it doesn&amp;rsquo;t work with images (for instance).  Install this as shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nautilus-admin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220717_foldercolors.png#floatsmallright&#34; alt=&#34;Nautlus Image Resize&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;folder-colors&#34;&gt;Folder Colors&lt;/h2&gt;
&lt;p&gt;Folder colors is an arguably less useful add-in.  This allows particular folders be be changed from the default color.  My experience is that this is most useful when applied sparingly.  I use this to highlight important folders that I want to be able to easily zoon in on in a list.  Install this plug in as shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install folder-color
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed and Nautilus is restarted, there should be a &amp;ldquo;Folder&amp;rsquo;s Color&amp;rdquo; option in the context menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220717_hash.png#floatsmallright&#34; alt=&#34;Hashing&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;hash&#34;&gt;Hash&lt;/h2&gt;
&lt;p&gt;Hashing is a mathematical technique for testifying that a file has not changed since it&amp;rsquo;s originator created it.  A hash takes a set of numbers and converts them to a specific length code, or &amp;ldquo;hash&amp;rdquo;.  It&amp;rsquo;s important that the length is consistent - we don&amp;rsquo;t want that to provide a clue to the length of the file!  The simplest hash would be just to add up all the binary ones in a file and return &amp;ldquo;0&amp;rdquo; if there are an even number and &amp;ldquo;1&amp;rdquo; to indicate odd.  Obviously, that&amp;rsquo;s not a real hash, but it starts to convey the idea.  Modification to the file might change the hash and alert users.  A clever miscreant might recognize the problem and change the file in a way that keeps the same hash and file size, so we need more complicated math to make this more difficult.&lt;/p&gt;
&lt;p&gt;If you download a file from the Internet, the originator may publish a hash that you can use to verify your download.  Typically you&amp;rsquo;d do this from the command line using an implementation of the hashing algorithym (examples follow).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;md5sum myfile
sha1sum myfile
sha256sum myfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can install a Nautilus add-in, as shown below, to do this as well.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nautilus-gtkhash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go to &amp;ldquo;properties&amp;rdquo; in the context menu and you&amp;rsquo;ll see a window similar to the example.  Go to the Digest tab (1) and select the hashes you&amp;rsquo;d like to computer (2).  Press the Hash button(3) and it will compute your hashes.  Is this easier than the command line?  Probably not, but if you&amp;rsquo;re in a graphical workflow sometimes this is easier.&lt;/p&gt;
&lt;h2 id=&#34;new-document&#34;&gt;New Document&lt;/h2&gt;
&lt;p&gt;The last tip is around creating new blank documents.  Windows allows you to create a new text file, for instance, so this feature allows you to do the same in Gnome.  There&amp;rsquo;s nothing to add-in.  Gnome has a templates folder in your home directory (~/Templates).  Any file you place here will be available under New Document.  To play with this, just create a document in that directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;touch ~/Templates/&amp;quot;New Document&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, in any directory, right click and you should see a &amp;ldquo;New Document&amp;rdquo; option with an indicator that you can create a variety of documents based on templates.  You could, for instance, create a markdown file with Hugo header information already defaulted and name it &amp;ldquo;New Markdown&amp;rdquo;.  You could take a spreadsheet formatted for accounting and call it &amp;ldquo;New Expense Report&amp;rdquo;.  That said, this is the feature I use the least.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Filezilla</title>
      <link>https://nextpertise.net/220626_filezilla/</link>
      <pubDate>Sun, 26 Jun 2022 18:00:16 -0400</pubDate>
      
      <guid>https://nextpertise.net/220626_filezilla/</guid>
      <description>&lt;p&gt;Filezilla produces a set of graphical file transfer tools and this has been a high-quality product for a very long time.  I&amp;rsquo;ve used Filezilla since the early 2000s, as have a lot of other folks, and it&amp;rsquo;s something of a standard in industry where FTP/FTPS is used.  Part of the charm is that the Filezilla client is very accessible for non-technical folks - a little introduction and they can manage their own downloads.&lt;/p&gt;
&lt;p&gt;The traditional Filezilla open-source client supports FTP and SFTP.  Filezilla makes an open-source FTP/FTPS server that makes it easy to host an FTP site.  Filezilla server used to be a great way to support FTP on a Windows server (and I used it that way 15 years ago), but researching this article I see that it is now offered for other OS as well.  They have also released a &lt;a href=&#34;https://filezilla-project.org/filezilla_pro.php&#34;&gt;Filezilla Pro&lt;/a&gt; client that includes support for things like WebDAV, S3, and various cloud file stores.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220626_Filezilla.png#floatright&#34; alt=&#34;Filezilla&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;using-filezilla&#34;&gt;Using Filezilla&lt;/h2&gt;
&lt;p&gt;I still occassionally have to explain Filezilla to new folks, so I thought I&amp;rsquo;d document a quick run through.&lt;/p&gt;
&lt;p&gt;When you first start Filezilla, local files are on the left and remote files are on the right.  Because you haven&amp;rsquo;t connected anywhere, the right pane will be blank to start.  Note the path for each side is shown above the files (marked (1)).&lt;/p&gt;
&lt;p&gt;You can &amp;ldquo;quick connect&amp;rdquo; by typing in the particulars in the top row (marked (2) in the picture).  To attach to a remote FTP server, for instance, you might fill in host with an IP address (like 1.2.3.4) or a Fully Qualified Domain Name (an FQDN looks like &amp;ldquo;ftp.makingthisup.com&amp;rdquo;).  Username and password are for the remote system and will be supplied by the administrator of that system.  Most FTP systems use port 21 and most FTPS systems use port 22, so it&amp;rsquo;s safe to assume these port numbers unless you&amp;rsquo;ve been given an alternative.  When everything is ready, click the button!&lt;/p&gt;
&lt;p&gt;Another way to connect is to use bookmarks.  This is particularly useful if you attach to the same remote systems repeatedly.  To create a bookmark, click the top left icon that looks like a file folder (marked (3) in the picture).  Once that screen opens, click New Site and fill in the same particulars that were used for the quick connect.  Bookmarks offer a range of logon types including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anonymous - don&amp;rsquo;t trust any site using this 🙂&lt;/li&gt;
&lt;li&gt;Normal - just fill in the user/pass below.&lt;/li&gt;
&lt;li&gt;Ask - it will pop a box for login when you connect.&lt;/li&gt;
&lt;li&gt;Interactive - not really sure, don&amp;rsquo;t recall using that&lt;/li&gt;
&lt;li&gt;Key file - used if you have a cryptographic key supplied by an SFTP server owner.  If you are using FTP you don&amp;rsquo;t need this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;re done, click OK to save it or &amp;ldquo;Connect&amp;rdquo; to save and to start a session immediately.&lt;/p&gt;
&lt;p&gt;Remote files will appear in the area marked (4).  Filezilla functions like a normal file manager with two side-by-side windows open.  Click &amp;ldquo;..&amp;rdquo; to go up a level, click a directory to open it.  Once you&amp;rsquo;ve found the files you need, either double-click the remote files to start a transfer or drag them to a local directory.&lt;/p&gt;
&lt;p&gt;Filezilla has a lot of features that address more advanced cases, but this introduction covers the basics that are used 99% of the time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interviewing</title>
      <link>https://nextpertise.net/220530_interviewing/</link>
      <pubDate>Mon, 30 May 2022 14:41:15 -0400</pubDate>
      
      <guid>https://nextpertise.net/220530_interviewing/</guid>
      <description>&lt;p&gt;After the &lt;a href=&#34;https://nextpertise.net/posts/220506_tower_of_hanoi/&#34;&gt;Tower of Hanoi&lt;/a&gt; discussion, I was trying to think about other tricks I&amp;rsquo;ve picked up over my career that aren&amp;rsquo;t really taught anywhere.  We&amp;rsquo;ve been filling an open position at work and I had the opportunity to coach the process, and I thought that would be a good topic to share.  I&amp;rsquo;m going to try to have this discussion from both perspectives, the person looking and the person hiring, and point out how each can contribute to a better outcome.&lt;/p&gt;
&lt;h2 id=&#34;looking-for-a-job&#34;&gt;Looking for a Job&lt;/h2&gt;
&lt;p&gt;There are two sides to the hiring process - the person looking for the job and the person who is trying to fill a job.  We&amp;rsquo;re going to approach this discussion from both sides to understand (my opinion) of how each of those people can help the other. There are a lot of other people in the middle - recruiters and HR for instance - but their job is to define the broad band of acceptability.  As a job seeker, the whole point of your resume is to get through this filtering.  As a hiring manager, your job is to make sure that the automated processes used here don&amp;rsquo;t filter out good candidates.&lt;/p&gt;
&lt;p&gt;Both sides are under a lot of stress.  The hiring manager is worried about only getting to talk to someone for an hour and then making a decision about hiring.  Done poorly, it&amp;rsquo;s like speed dating into marriage!  Keeping in mind that we spend more time with our co-workers than our spouses and it&amp;rsquo;s easy to see that making a bad decision will make everyone&amp;rsquo;s life some shade of miserable.  The job seeker is worried about landing a job, particularly if they are unemployed.  The seeker doesn&amp;rsquo;t always realize that the only thing worse than getting a job is getting the &lt;em&gt;wrong&lt;/em&gt; job.&lt;/p&gt;
&lt;p&gt;Story time: One of the best hires I ever made, a man of deep experience who has a real love for helping people, drove the office nuts.  He was a talker, and our office was a bunch of introverts who liked to keep the lights off and stay in their cubicles with their heads down.  Everyone involved in this story are good people, but throwing an extrovert into a pool of introverts made everyone uncomfortable.  This is the classic example of the importance of finding a good fit.&lt;/p&gt;
&lt;p&gt;A story from the other side: I once interviewed for an IT Director position at a hospital.  It went well, but the CIO told me he wanted to fire everyone in that department and have me re-hire from scratch.  That was a heck of an opportunity and would have been a somewhat prestigious position, but what they wanted just wasn&amp;rsquo;t me.  When I think about the person I want and try to be, I see myself as a teacher and mentor.  Cutting an entire department as soon as I walked in the door would have been tough and it would have left me with a target on my back that I&amp;rsquo;m unprepared to handle.  We had some discussions about alternatives approaches but I couldn&amp;rsquo;t get the CIO to at least give me time to do an evaluation.  In the end I withdrew, and I am thankful that I had that insight into the organization and was able to back out.&lt;/p&gt;
&lt;h2 id=&#34;the-goal-of-an-interview&#34;&gt;The Goal of an Interview&lt;/h2&gt;
&lt;p&gt;In my opinion, the &lt;strong&gt;goal of an interview isn&amp;rsquo;t to get hired&lt;/strong&gt;.  It&amp;rsquo;s to find a job where you and the organization can be successful together.  Yes, part of that is talking about your experience and the programming languages you&amp;rsquo;ve used, but that &lt;em&gt;should be&lt;/em&gt; the smallest part.  Your resume and all those intermediaries should have filtered out the people who didn&amp;rsquo;t have the right set of buzzwords.  By the time an interview is happening those hurdles should be mostly past.&lt;/p&gt;
&lt;p&gt;When I interview, whichever side of the table I&amp;rsquo;m on, I want to understand the people I would be working with.  Would I be comfortable working with them for a long time?  I also want to understand the culture.  Culture can be overused and become an empty word, but I&amp;rsquo;m trying to describe the constellation of things that describe the work environment.  Here&amp;rsquo;s a quick set of examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Am I comfortable with the jokes and discussion?  I wouldn&amp;rsquo;t want to work in a group that was constantly vulgar, for instance.&lt;/li&gt;
&lt;li&gt;How are they organized?  Do they have a take on ITIL, is it a free-for-all?  How do they handle priortization and disagreements?&lt;/li&gt;
&lt;li&gt;Most importantly: Do they need me?  How could I see myself contributing to the relationship?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bad-interviews&#34;&gt;Bad Interviews&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve all had them.  I once sat through an hour long interview where the guy barely asked a question.  He got wound up explaining the job, talked for an hour, then shook my hand and offered me the job.  I thought, &lt;em&gt;&amp;ldquo;Wow, what makes you think I&amp;rsquo;d be a good fit?&amp;rdquo;&lt;/em&gt;  I&amp;rsquo;m positive that readers have their own tales.&lt;/p&gt;
&lt;p&gt;There are a lot of stock questions that can be used.  Job seekers can (and should) have a canned response to these.  &lt;em&gt;What is your biggest failure?  Give me an example of a good team you were on?&lt;/em&gt;  Really, the whole process of sitting down at a desk and going over a resume is pretty predictable.  The biggest thing either side learns is how prepared the other was.&lt;/p&gt;
&lt;p&gt;Bad interviewers, in my experience, basically hire at random.  Most of the work is done by the HR screening.  Even if you are a good hire, there&amp;rsquo;s a good possibility that other people in the group aren&amp;rsquo;t.  If you are unsure of what kind of interviewer you are, just think back to who did most of the talking and how much actual memorable information was shared.  I have no advice for the interviewer here - until they recognize the issue the advice is wasted.  For the job seeker, when you experience this kind of interview then assume the job is a bad fit until proven otherwise.&lt;/p&gt;
&lt;h2 id=&#34;my-approach-to-a-job-interview&#34;&gt;My approach to a job interview&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve worked in the industry for 30 years and been interviewed a number of times.  I&amp;rsquo;ve hired people on five continents and from a variety of backgrounds.  I&amp;rsquo;ve learned from a variety of places and people.  I hesitate to say that my way is the best, but I think it&amp;rsquo;s teachable and reliably pretty good at finding people who are good fits.&lt;/p&gt;
&lt;p&gt;The first thing I suggest is breaking the format.  Don&amp;rsquo;t sit down at a desk or in a conference room.  Conduct the interview while doing a plant tour or while walking around the office and introducing the person.  Go for a walk outside.  I once drove someone around to show them the area and talk about housing while we did the interview.  Do something to get out of the programmed responses.  If you are the job seeker, ask to be shown around to try to get out of that stilted situation.&lt;/p&gt;
&lt;p&gt;The second thing I suggest is to start with some soft questions that just re-iterate the basics.  Sometimes there&amp;rsquo;s a story that the needs to be shared, and this presents a great opportunity for getting that off the chest.  This is reciprocally true - both sides have opening statements they want to get out.&lt;/p&gt;
&lt;p&gt;The place I try to work to and to spend most of the interview is &amp;ldquo;joint troubleshooting&amp;rdquo;.  I take an example of a recent issue, simplify it, and present it for discussion.  I&amp;rsquo;ve found this works really well when I don&amp;rsquo;t know the answer - we&amp;rsquo;re trying to collaboratively turn the problem in different orientations and think it through together.  This gives me an idea of what the person is like to work with and how they think on their feet.  When it doesn&amp;rsquo;t go well, I still get some ideas.  As a job seeker, the agenda of the interview is outside your control but you can sometimes prompt this kind of discussion with a question such as &amp;ldquo;Tell me about your most worrying issue.  I&amp;rsquo;d like to hear about the kind of problems you face and how you are working through them.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;an-alerternative-to-interviewing&#34;&gt;An alerternative to Interviewing&lt;/h2&gt;
&lt;p&gt;Recommendations.&lt;/p&gt;
&lt;p&gt;This is my final thought on this subject.  As a manager, I hope that I&amp;rsquo;ve done a good job of hiring good people who are invested in our success.  I try to reiterate to those folks that hiring good people is the #1 thing we can do to improve the work environment.  If I&amp;rsquo;ve hired good people and they understand how important it is to bring in new employees who &amp;ldquo;fit&amp;rdquo; and who add value, then it&amp;rsquo;s the height of chutzpah to believe that I&amp;rsquo;m going to learn something in an interview that trumps a recommendation.  Many times, people recommend folks that they worked with for years.  These are folks that they&amp;rsquo;ve had good and bad times with and they still recommend them.  I&amp;rsquo;d rather have a referral from a trusted co-worker than a perfect interview.&lt;/p&gt;
&lt;p&gt;Regardless of which side of the table you&amp;rsquo;re seated at, I wish you the best and hope these ideas are helpful!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tower of Hanoi Backup Strategy</title>
      <link>https://nextpertise.net/220506_tower_of_hanoi/</link>
      <pubDate>Fri, 06 May 2022 21:23:38 -0400</pubDate>
      
      <guid>https://nextpertise.net/220506_tower_of_hanoi/</guid>
      <description>&lt;p&gt;When I was getting started in IT in the late 80s, my mentor taught me the most effecient way to handle backup tapes.  He called it the &amp;ldquo;Tower of Hanoi&amp;rdquo; strategy.  This has come up in various contexts through the years, and I&amp;rsquo;ve had to explain it.  I thought it might be interesting, particularly to younger professionals, to understand the problem and how it was solved using this algorithm.  Who knows? Maybe there will be a new application you run across!&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-game&#34;&gt;Understanding the Game&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220506_Tower_of_Hanoi.png#floatsmallright&#34; alt=&#34;Tower of Hanoi&#34;&gt;
The game involves three pegs.  One peg has three rings of increasing size.  The objective is to move the stack from peg one to peg two.  The rules are that you can only move one ring at a time and smaller rings always have to sit on larger rings.&lt;/p&gt;
&lt;p&gt;The solution is to move the red ring to peg 2, green to 3, and red to 2 (this puts the top two rings on peg 3).  Move the blue ring to 2, red to 1, green to two, and red to 2.  Bingo!&lt;/p&gt;
&lt;p&gt;Analyzing the pattern though, you find that every other move is the smallest ring.  Every other other move is the mid-sized green ring.  Every other other other move is the largest ring.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-problem&#34;&gt;Understanding the Problem&lt;/h2&gt;
&lt;p&gt;In those days we backed up to tape.  In 2022, we still use tape sometimes.  I setup a ToH strategy using USB sticks at church.  These days it could be your cloud backup retention strategy.  Whatever the media, we want to use the fewest number (of tapes or sticks or whatever) to minimize costs, while being able to have the most up-to-date backup covering the longest period of time.&lt;/p&gt;
&lt;p&gt;Say a file became corrupted after a week.  Ideally, you&amp;rsquo;d want to go back through your backups and find the last one before the corruption and restore the file to make sure you had the most recent version of the file.&lt;/p&gt;
&lt;p&gt;A popular strategy in the 80s was to have one tape for each day of the week and one tape for each week of the month.  Thus at any time you used nine tapes and had backups that were something like 1 day, 2 days, 3, 4, 5, and 7 days, plus tapes that were two weeks, three weeks,and four weeks old.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-solution&#34;&gt;Understanding the Solution&lt;/h2&gt;
&lt;p&gt;JD taught me the Tower of Hanoi strategy as a better solution.  In this strategy, every other day you use tape 1.  Of the remaining days, every other day you use tape 2.  YOu continue this recursive pattern until you&amp;rsquo;ve used all your tapes.  With six tapes, you end up with ages 1 day, 2 days, 4 days, 8 days, 16 days, and 32 days.  This strategy consumes fewer media and covers an arbitrarily long period in a rational way.&lt;/p&gt;
&lt;p&gt;In the illustration, the most current tape is on the left and the oldest on the right.  Notice the recursive pattern of tape rotation.  Tapes are reused on a regular pattern, so I&amp;rsquo;ve marked the most recent tape to illustrate the rage of dates covered by this method.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220506_ToHTapes.png&#34; alt=&#34;Tower of Hanoi Tape Rotation&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;using-the-algorithm-in-the-real-world&#34;&gt;Using the Algorithm in the real world&lt;/h2&gt;
&lt;p&gt;This is an efficient and rational way to commit the few resources to retain a long range of backups.  I like it a lot and it&amp;rsquo;s a common approach I take.  However, I&amp;rsquo;ve found that trying to explain this to non-technical folks is casting pearls before swine.  My advice: tell them to buy more tapes.&lt;/p&gt;
&lt;p&gt;All that said, throughout my career it&amp;rsquo;s been true that concepts recycle on a predictable basis and what&amp;rsquo;s old is new again.  Understanding some of these ideas has a way of paying off eventually.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also true that I owe my long career to a mentor who took an interest in a younger me.  I&amp;rsquo;m blessed that I get to see him occassionally to this day.  I&amp;rsquo;ll never be able to repay him, but I try to pay it forward a little bit at a time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Howdy - Linux face recognition authentication</title>
      <link>https://nextpertise.net/220501_howdy/</link>
      <pubDate>Sun, 01 May 2022 16:16:31 -0400</pubDate>
      
      <guid>https://nextpertise.net/220501_howdy/</guid>
      <description>&lt;p&gt;My friend Jared recommended that I checkout &lt;a href=&#34;https://github.com/boltgolt/howdy/&#34;&gt;Howdy&lt;/a&gt;, which is a PAM add-in to support authentication by &lt;em&gt;facial recognition&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The first thing I did was install &lt;strong&gt;cheese&lt;/strong&gt; so that I could make sure that my face was in the camera&amp;rsquo;s field of view.  Next was installing Howdy.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo add-apt-repository ppa:boltgolt/howdy
sudo apt update
sudo apt install howdy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/howdy.png#floatsmallright&#34; alt=&#34;Howdy&#34;&gt;
Howdy offfers three levels of certainty that a face is a match - Fast, Balanced, or Secure.  I chose Fast each time.  I&amp;rsquo;ve installed PAM modules (yes, I know that&amp;rsquo;s redundant) before and I remember it being a bit of a trick.  In this case, the howdy installation takes care of all the details and you are (almost) ready to roll.  I&amp;rsquo;ve installed Howdy on a few different machines and in both cases it said &amp;ldquo;Camera ID set&amp;rdquo; at the end of the install but neither worked.  We&amp;rsquo;ll list the video devices as shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@pop-os:~# ls -ltr /dev/video*
crw-rw----+ 1 root video 81, 1 Apr 29 20:11 /dev/video1
crw-rw----+ 1 root video 81, 0 Apr 29 20:11 /dev/video0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the machines I&amp;rsquo;ve tested with, this reports multiple camera paths for each physical camera.  I read at one point that these correspond to different camera modes, but that doesn&amp;rsquo;t match my testing here.  On the machines I tested, I could use either camera path and it worked fine.&lt;/p&gt;
&lt;p&gt;With that in mind, pick a camera path and type &lt;strong&gt;sudo howdy config&lt;/strong&gt; (this edits the config file without having to use nano to find the path).  Scroll down (for me it was about in the middle of the file) and replace the existing &lt;em&gt;device_path&lt;/em&gt; variable as shown.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# The path of the device to capture frames from
# Should be set automatically by an installer if your distro has one
device_path = /dev/video0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Almost there.  At this point, your camera should work but you need to train the system on your face.  To do that, use &lt;strong&gt;sudo howdy add&lt;/strong&gt;.  Look into the camera - you&amp;rsquo;ll see it come on and take a picure.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@pop-os:~# sudo howdy add
No face model folder found, creating one
Adding face model for the user brent
Enter a label for this new model [Initial model] (max 24 characters): Brent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Brent_and_William.jpg#floatsmallright&#34; alt=&#34;William and I&#34;&gt;
To confirm its working, open a &lt;em&gt;new&lt;/em&gt; termainal and escalate to root (sudo -i).  If it works, the camera will come on and then you will be authenticated.  Howdy works for authentication into the GUI and for sudo or wherever you need to authenticate.  I tested authentication for initial login and for sudo.&lt;/p&gt;
&lt;p&gt;I installed this on a laptop one night and enrolled with the light on beside me.  Later, the light was off and it wouldn&amp;rsquo;t authenticate until I turned the light back on.  The Howdy algorithm is somewhat sensative to lighting conditions, but I didn&amp;rsquo;t make a study of exactly how far I could push this.  It&amp;rsquo;s worth mentioning that Howdy supplements existing authentication, so if your face isn&amp;rsquo;t detected after a few seconds it rolls back to the traditional password prompt.&lt;/p&gt;
&lt;p&gt;Just for fun, I tried to fool Howdy.  It was able to correctly deny access to my wife and my youngest son.  William and I look similar, so I thought that might work.  William then tried to make himself look like me - smiling and even putting on glasses.  Howdy worked perfectly for these casual bypass attempts.  I also tried using my driver&amp;rsquo;s license, but Howdy denied this as well (it says it&amp;rsquo;s using IR, so I didn&amp;rsquo;t expect that to work).&lt;/p&gt;
&lt;p&gt;This was a lot of fun to setup and test.  I was initially wary about locking myself out, but never really felt like that was a danger.  For casual home use, this seems like a pretty cool idea.  I&amp;rsquo;m going to be a little more conservative on my work laptop.  It&amp;rsquo;s exposed to more potentially serious and malicious people at the office and at Starbucks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Finding Windows Keys on Hardware</title>
      <link>https://nextpertise.net/220404_winkey/</link>
      <pubDate>Mon, 04 Apr 2022 13:55:41 -0400</pubDate>
      
      <guid>https://nextpertise.net/220404_winkey/</guid>
      <description>&lt;p&gt;My son&amp;rsquo;s computer blew up and we didn&amp;rsquo;t have a copy of the Windows key.  This is something I have run into before - I typically blow Windows off new PCs and install Linux, but then occassionally want to create a Windows VM using that key.  It used to be on a sticker on the laptop, but it&amp;rsquo;s not anymore.  It turns out a copy of the key is stored in BIOS or UEFI and accessible via ACPI.  ACPI (Advanced Configuration and Power Interface) is an abstract interface that provides a standrard way to access hardware functions.&lt;/p&gt;
&lt;h2 id=&#34;discovering-windows-keys-in-bios-using-linux&#34;&gt;Discovering Windows Keys in BIOS using Linux&lt;/h2&gt;
&lt;p&gt;ACPI tables are stored in /sys/firmware/acpi/tables.  As an administrator, you can read those text files to see the various settings and values.  The table with the Windows key is MSDM.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo strings /sys/firmware/acpi/tables/MSDM
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;discovering-windows-keys-in-bios-using-windows&#34;&gt;Discovering Windows Keys in BIOS using Windows&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve seen some tools to grab the key from ACPI under Windows.  I haven&amp;rsquo;t used any of these tools, but this is simple to get from a Windows command line.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wmic path softwarelicensingservice get OA3xOriginalProductKey
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Powerpoint Live (or You don&#39;t know how to share Powerpoint with Teams)</title>
      <link>https://nextpertise.net/220329_teams/</link>
      <pubDate>Tue, 29 Mar 2022 21:11:24 -0400</pubDate>
      
      <guid>https://nextpertise.net/220329_teams/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220329_teams1.png#floatsmallleft&#34; alt=&#34;Teams Powerpoint Windows&#34;&gt;&lt;/p&gt;
&lt;p&gt;My company uses Teams.  I have had a poor impression of Microsoft historically, but I am really impressed with Teams.  It&amp;rsquo;s a solid application with a lot of capabilities.  Plus, Teams - and all the O365 web apps - really work well on Linux.&lt;/p&gt;
&lt;p&gt;In meetings, everytime someone presents slides they do it by sharing their desktop.  It&amp;rsquo;s funny, Teams is so intuitive that no one does a lot of training around it.  I discovered &lt;a href=&#34;https://techcommunity.microsoft.com/t5/microsoft-365-blog/introducing-powerpoint-live-in-microsoft-teams/ba-p/2140980&#34;&gt;Powerpoint Live&lt;/a&gt; almost by accident, because I was presenting from Linux.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As an aside, &lt;em&gt;never&lt;/em&gt; share your desktop.  I taught online years ago and developed the habit of sharing only a specific application after seeing a colleague get a pop-up notification for spam with an X-rated subject line.  Not only do you run the risk of &amp;ldquo;the Internet&amp;rdquo; happening, but folks pick up all kinds of clues from your desktop like the names of files on the desktop and the browser tabs you have open.  Just don&amp;rsquo;t do it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Teams allows you to share just one application, but even better it has a powerpoint presentation mode!  The mode is able to be used when presenting from Windows, Linux, and iPhone.  I presume it works on Android, but didn&amp;rsquo;t test it.&lt;/p&gt;
&lt;p&gt;To the left is a screenshot from Windows.  When you present, instead of sharing a window or screen choose a powerpoint file under &amp;ldquo;PowerPoint Live&amp;rdquo;.  On Windows it can be a local file, on the iPhone it needs to be a file from OneDrive.  That&amp;rsquo;s it.  It&amp;rsquo;s automatically full screen for the viewer.  This mode also provides the viewer controls to move forwards and backwards in the presentation and to move to the current presenter slide.&lt;/p&gt;
&lt;p&gt;I was impressed with how well this works when presenting from the iPhone.  I could imagine leading a meeting from a Starbucks just using my phone (I&amp;rsquo;d need airpods to free my hands to work the controls, obviously).  Powerpoint Live works very well from Linux as well.  On both Linux and IOS, the presentation needs to be on OneDrive.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220329_teams2.png#floatsmallright&#34; alt=&#34;Teams Powerpoint Windows&#34;&gt;
The best experience was presenting from Windows.  As shown below (notice my drawn-in arrow), you get some really cool presentation tools.  The arrow is like a mouse cursor.  The red is a freehand marker.  Yellow is a highlighter.  The rightmost erases a particular doodle.  The coolest tool is the laser pointer, which is in-between the pointer and the red marker.  It shows a dot on the screen but allows you to circle or underline for emphasis but the line you draw fades in a few seconds.&lt;/p&gt;
&lt;p&gt;I used my work account and (free) personal microsoft account to login to two computers and try this.  I recommend that you setup a similar lab experience to understand the nuances before you do the big budget presentation, but it&amp;rsquo;s intuitive and just so much better than sharing the application.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disabling RCS on Android</title>
      <link>https://nextpertise.net/220328_rcs/</link>
      <pubDate>Mon, 28 Mar 2022 17:22:45 -0400</pubDate>
      
      <guid>https://nextpertise.net/220328_rcs/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/disable_chat.jpg#floatsmallright&#34; alt=&#34;Disabling Chat&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;googles-move-to-rcschat&#34;&gt;Google&amp;rsquo;s move to RCS/Chat&lt;/h1&gt;
&lt;p&gt;You really shouldn&amp;rsquo;t care about Google&amp;rsquo;s supported messaging app.  They certainly don&amp;rsquo;t.  They change ideas about messaging more often then their underwear.  Still, they&amp;rsquo;ve made a move from SMS to RCS recently and they&amp;rsquo;re taking you along with them.&lt;/p&gt;
&lt;p&gt;SMS is about thirty years old.  It allows 160 character messages and has features built in to support carrier billing.  Despite it&amp;rsquo;s limitations, it&amp;rsquo;s become the default way to communicate for a certain portion of the population and a part of nearly everyone&amp;rsquo;s life.&lt;/p&gt;
&lt;p&gt;Apple has led the way in showing the limitations of SMS with their chat app.  SMS is run by the carriers, who have seen it as a cash-cow and not an area for innovation.  Apple didn&amp;rsquo;t try to shoe-horn their offering onto SMS, they built a whole new IP-based application.  Apple added in features like end-to-end encryption for privacy, read receipts, activity indicators, and high-res photos.&lt;/p&gt;
&lt;p&gt;Google has recently been shamed for the poor state of messaging on Android and as a result has tried to create an alternative to iMessage around RCS.  Google&amp;rsquo;s take on RCS is called Chat, and there&amp;rsquo;s a protocol built out to support the new service.  Chat takes up many of the improvements that iMessage (and others) have brought to messaging - things like read receipts, activity indicators, and integration with video.  It &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; include support for end-to-end encryption.  I&amp;rsquo;ve heard this is in development, but I&amp;rsquo;m suspecious that the carriers are loath to give up access to the data.&lt;/p&gt;
&lt;h2 id=&#34;should-you-care&#34;&gt;Should you care?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/digits_app.png#floatsmallleft&#34; alt=&#34;Digits&#34;&gt;&lt;/p&gt;
&lt;p&gt;No.  As mentioned, if this effort fails it will become the new cherry on the pile of failed messaging apps from Google.  If it succeeds, it will work like Slack/iMessage/etc and you won&amp;rsquo;t really think about it.&lt;/p&gt;
&lt;p&gt;I have a bit of a unique case.  My personal phone is an S9 and I have a seperate work phone.  My personal carrier, T-Mobile, has a DGITS app that carries your T-Mobile phone number to another device via IP.  So I have the DIGITS app on my work phone and only have to carry one phone.  DIGITS supports voice and text - SMS texts.  I leave my personal phone turned on at my desk at home.&lt;/p&gt;
&lt;h2 id=&#34;disabling-chat&#34;&gt;Disabling Chat&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been missing texts in DIGITS that come to the old phone.  It didn&amp;rsquo;t make sense until I spoke to a close friend (Hi Mike!) and he mentioned RCS and speculated that since I was missing his texts maybe my app didn&amp;rsquo;t support it.  He tested by turning off RCS when communicating with me.&lt;/p&gt;
&lt;p&gt;So this leads to my current theory: when users message my personal number, my home phone negotiates chat and receives the message, leaving my DIGITS app out of the loop.  I&amp;rsquo;ve resolved this by going into my personal phone and turning off &amp;ldquo;chat&amp;rdquo; and forcing it to use SMS.&lt;/p&gt;
&lt;p&gt;To do this, open the (Google) messages app and choose the three vertical dots to find the settings.  Under settings, choose &lt;em&gt;chat features&lt;/em&gt;.  That brings you to the options shown on the left.  The first option - Enable chat features - is the one that disables the chat protocol.&lt;/p&gt;
&lt;p&gt;This is a solution for folks that have two places to receive texts, which is a small group.  It&amp;rsquo;s not a bad tradeoff.  I don&amp;rsquo;t really care about longer bodies of texts or the little blinking activity indication.  If Chat supported end-to-end encryption I might reconsider and hopefully DIGITS will support chat before I have to make that choice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Webapps</title>
      <link>https://nextpertise.net/220223_webapps/</link>
      <pubDate>Wed, 23 Feb 2022 17:37:37 -0500</pubDate>
      
      <guid>https://nextpertise.net/220223_webapps/</guid>
      <description>&lt;h1 id=&#34;using-web-applications&#34;&gt;Using Web Applications&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve found that the quality and capability of applications delivered over the web has been on-par with what is expected in a native application.  In my experience, Lucidchart was an early example of what was possible and today I actually prefer it to Visio.  I&amp;rsquo;ve also been very impressed by O365.  On Linux, I can use O365 to open an office file from OneDrive, edit and save it and get many (most?) of the features I expect in the office applications.  From a work compatibility mode, this really simplifies using a Linux machine.&lt;/p&gt;
&lt;p&gt;These applications run in a tab in the browser.  Generally, I find this to be a good use of screen real estate.  However, this approach still ties up space on the browser button bar and status bar and adds a little cognitive load in starting the app and finding it on the screen.  Two applications that address these last issues are &amp;ldquo;Web App Manager&amp;rdquo; from the Linux Mint project and Nativefier.  Both wrap the application in a browser to make it look like a native program.&lt;/p&gt;
&lt;h2 id=&#34;web-app-manager&#34;&gt;Web App Manager&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Web_App_Manager.png#floatsmallright&#34; alt=&#34;Web&#34;&gt;&lt;/p&gt;
&lt;p&gt;I really like Linux Mint.  I think there&amp;rsquo;s a real clarity of vision to the project around making the power of Linux and open source accessible.  They develop utilities as part of that vision and Web App Manager is a great example.&lt;/p&gt;
&lt;p&gt;Web App Manager makes it easy to manage and use Web Apps.  It can be &lt;a href=&#34;http://packages.linuxmint.com/pool/main/w/webapp-manager/&#34;&gt;downloaded as a DEB&lt;/a&gt; or installed from the Mint repository.  If you are running an Ubuntu flavor or derivative (I use Pop!) then this is shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install ./Downloads/linuxmint-keyring*.deb
sudo sh -c &#39;echo &amp;quot;deb https://packages.linuxmint.com ulyssa main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/mint.list&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Web_Apps_New.png#floatsmallleft&#34; alt=&#34;New Web App&#34;&gt;
Creating a new application is as as easy as entering in a name and address.  The program will let you select an icon or find one for you.  You can choose to retain the browser navigation bar - this ends up being just a new Firefox window, so why bother? - or to start in Private mode.  Web App Manaager will then create the entry in the desktop menu.&lt;/p&gt;
&lt;p&gt;This ends up creating an application window, just as billed, that behaves like an application.  You can even register it as the default email client.  The big issue I have is that the resulting window doesn&amp;rsquo;t have close, minimize, or maximize buttons.  This is a very solid option.&lt;/p&gt;
&lt;p&gt;Setting up an Outlook application was as easy as specifying &lt;a href=&#34;https://outlook.office365.com&#34;&gt;https://outlook.office365.com&lt;/a&gt;, selecting the icon, and putting it in a category for Gnome.  Web App Manager allows you to select the browser it runs in, but my system has Firefox, Ungoogled Chrome, and LibreWolf installed and it only offered Firefox.  My guess is it only looks for the major browsers.&lt;/p&gt;
&lt;h2 id=&#34;nodejs-nativefier&#34;&gt;nodejs-nativefier&lt;/h2&gt;
&lt;p&gt;Setting up Nativifier is a little more complicated.  Nativifier uses  NPM to create an Electron app and this is the first issue with considering it.  This application requires a lot of  dependencies be downloaded for NPM and my security friends cast a sceptical eye toward nodejs.  That&amp;rsquo;s not to say it&amp;rsquo;s a no-go, just an item to consider.  Electron is something that folks like or don&amp;rsquo;t.  It can produce an app using web technologies that can be easily versioned for different operating systems, but it doesn&amp;rsquo;t carry a native look or feel.  Not a big deal for me, but your mileage may vary.&lt;/p&gt;
&lt;p&gt;Installing npm and then nativifier on Ubuntu derivitives looks like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install npm
sudo apt install nativefier -g
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Creating the web app is done from the command line.  The example below builds the same Outlook web app.  The options here specify the OS and  architecture, as well as setting the resulting electron to minimize to the system tray.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nativefier -p linux -a x64 https://outlook.office365.com  --tray
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When I ran this it produced a directory called SignIntoOutlook containing an executable of the same name.  I renamed the directory and executable to &lt;em&gt;Outlook&lt;/em&gt; and gave the application execution permission.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x Outlook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The resulting application is a window that has the web application inside - that part is the same in both apps or even in a browser.  A minor quibble is that it seems to start a little slower (Web App Manager is probably just faster because I already have a Firefox window open). However, this brings us to the next set of big issues for nativefier.&lt;/p&gt;
&lt;p&gt;Nativefier builds an electron app but doesn&amp;rsquo;t add it to the menu.  This is easily done in Cinnamon, which has menu editing built in.  You can download Menu Editor for Gnome to add it.  Since I run Pop-OS!, I created an &lt;em&gt;Outlook.desktop&lt;/em&gt; file in ~/.local/share/applications similar to the one shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Desktop Entry]
Version=1.1
Type=Application
Name=Outlook
Comment=Outlook Web Electron app
Icon=mail-send-receive
Exec=/home/brent/Outlook/Outlook
Actions=
Categories=Office;  
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;closing-thoughts&#34;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;Both Web App Manager and Nativefier produce a working executable that to a good extent feels like a part of the desktop environment.  Since the actual functionality comes from the underlying software as a service, they both function in largely similar ways.&lt;/p&gt;
&lt;p&gt;Web App Manager is definitely the choice if you have less experience.  It&amp;rsquo;s easier to tweak, it automatically adds things to the menu, and it&amp;rsquo;s only dependency is the browser. The only negative I have is that the app window doesn&amp;rsquo;t have a close button, which sounds silly but is annoying in practice.  Alt-F4 or selecting it in the application dock allow you to close, FYI.&lt;/p&gt;
&lt;p&gt;Nativefier actually puts an Electron wrap around, gives window controls, and has the option to minimize to the tray.  However, it required NPM, the only way to tweak the app is to rebuild it from the command line, and it didn&amp;rsquo;t integrate with the application menu.  None of those are big deals if you are comfortable with the command line.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Problems with Proxmox VE</title>
      <link>https://nextpertise.net/220219_proxmox/</link>
      <pubDate>Sat, 19 Feb 2022 15:37:06 -0500</pubDate>
      
      <guid>https://nextpertise.net/220219_proxmox/</guid>
      <description>&lt;p&gt;Look, I know you&amp;rsquo;re reading this, but sometimes I write these posts for myself.  To remind myself of how I built or repaired something.  This is one of those posts.&lt;/p&gt;
&lt;p&gt;My home server ran VMWare ESXi for a long time.  I had trouble upgrading it from 6.5 and I was intrigued by Proxmox VE and putting my home network more firmly in the open source camp.  I&amp;rsquo;ve been running Proxmox VE 7.1 for a while now.&lt;/p&gt;
&lt;h2 id=&#34;quick-review-of-pve&#34;&gt;Quick review of PVE&lt;/h2&gt;
&lt;p&gt;My experience with PVE has been mixed.  VMWare hid a lot of it&amp;rsquo;s Linux base, where PVE is like an opinionated distro aimed at virtualization.  With PVE, you are definitely administering a debian derivitive box.  PVE will host VMs and also does OS-level containers, which is an interesting take and seems to conserve processor.  I implemented my internal servers this way and it&amp;rsquo;s indistinguishable from a full VM in terms of use    .&lt;/p&gt;
&lt;p&gt;Probably the biggest &amp;ldquo;issue&amp;rdquo; is that I use VMWare Workstation to have a Windows VM on my Linux machine.  Workstation was a pretty good front-end for ESXi and you could migrate loads between the two.  Obviously, that use case is out the window now.&lt;/p&gt;
&lt;p&gt;Generally, PVE runs as good as or better than ESXi.  However, on the occassion that something goes sideways you are combing through blog posts and support forums (assuming you don&amp;rsquo;t have a subscription, which I don&amp;rsquo;t for home).  I like that the things I learn in PVE are transferable to Linux and vice versa, but I wouldn&amp;rsquo;t make PVE your first experience with Linux.&lt;/p&gt;
&lt;h2 id=&#34;back-to-the-show&#34;&gt;Back to the show&lt;/h2&gt;
&lt;p&gt;Power went out at the house the other night and the VMs (actually OS-level containers, but that&amp;rsquo;s arduous to say and if I abbreviate it OSLC no one will know what I&amp;rsquo;m nattering on about) storage had an issue.  When PVE tried to load those volumes it gave an error &lt;em&gt;&amp;ldquo;activating LV &amp;lsquo;pve/data&amp;rsquo; failed: Activation of logical volume pve/data is prohibited while logical volume pve/data_tmeta is active. (500)&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I tried several approaches to resolve this.  You can see the error from the PVE command line via &lt;strong&gt;lsblk&lt;/strong&gt;.  What actually worked was to make the interfering volumes inactive. Seems obvious, but I needed the command &lt;strong&gt;vgchange&lt;/strong&gt;.  As a note, after I deactivated &lt;em&gt;tmeta&lt;/em&gt; I got an error because &lt;em&gt;tdata&lt;/em&gt; was active so I had to deactivate that as well.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#deactivate the offending volume
lvchange -an pve/data_tmeta
##activate the expected volumes
vgchange -ay
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So this post is a note to myself for the next time.  Hopefully it&amp;rsquo;s helpful to you as well.&lt;/p&gt;
&lt;h3 id=&#34;update-i-had-a-power-outage-in-late-april-and-had-to-follow-this-procedure-again--apparently-its-a-common-failure-state&#34;&gt;Update: I had a power outage in late April and had to follow this procedure again.  Apparently it&amp;rsquo;s a common failure state.&lt;/h3&gt;
</description>
    </item>
    
    <item>
      <title>Oh My Posh</title>
      <link>https://nextpertise.net/220124_oh_my_posh/</link>
      <pubDate>Tue, 25 Jan 2022 19:05:41 -0500</pubDate>
      
      <guid>https://nextpertise.net/220124_oh_my_posh/</guid>
      <description>&lt;p&gt;I really like the powerline-style prompts that jazz up the command line and I&amp;rsquo;d like to be able to carry that experience through from Linux to Windows.  It seems like everytime I install a new systema and think about this, I find another slightly different way to do something similar.  Recently I found &lt;em&gt;Oh My Posh&lt;/em&gt;, which is designed to support Windows, Linux, and MacOS.  The attraction here is that this gives me the prompt style I like from a consolidated source and with a defined way to set it up.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of OMP installed in Linux running inside Tilix.  You can see that it&amp;rsquo;s providing me collapsed directory information, git info, and the time of the last command.  OMP can be customized and the details of that are described extensively in the online docs.
&lt;img src=&#34;https://nextpertise.net/omp_tilix.png#center&#34; alt=&#34;Oh My Posh in Tilix on Linux&#34;&gt;
This has some marginal productivity - the Agnoster theme condenses directory structure in a very visible way and helps me understand the state of Git.  Regardless, it looks cool and a little terminal rice establishes some credibility.  If it looks cool to you too, I&amp;rsquo;ve put together some notes on how it&amp;rsquo;s done.  Follow along!&lt;/p&gt;
&lt;h2 id=&#34;linux&#34;&gt;Linux&lt;/h2&gt;
&lt;p&gt;Installation on Linux involves grabbing the file from Github and making it executable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/posh-linux-amd64 -O /usr/local/bin/oh-my-posh
sudo chmod +x /usr/local/bin/oh-my-posh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, grab the themes JSON collection, uncompress them, and set the permissions appropriately.  With the themes locally stored, you can easily switch as the mode strikes.  Agnoster fits my needs, so that&amp;rsquo;s what is used in the examples, but you can substitute anywhere you see it mentioned.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ~/.poshthemes
wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/themes.zip -O ~/.poshthemes/themes.zip
unzip ~/.poshthemes/themes.zip -d ~/.poshthemes
chmod u+rw ~/.poshthemes/*.json
rm ~/.poshthemes/themes.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, edit ~/.bashrc to run Oh My Posh as part of the shell.  Notice in the code below that I&amp;rsquo;ve specified the &amp;ldquo;agnosterplus&amp;rdquo; layout.  Substitute whichever theme you are interested in there.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval &amp;quot;$(oh-my-posh --init --shell bash --config ~/.poshthemes/agnosterplus.omp.json)&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&amp;rsquo;ll need to specify the terminal font in your terminal application.  A lot of the styling is done through extra ligatures included in &lt;a href=&#34;https://www.nerdfonts.com/&#34;&gt;nerd fonts&lt;/a&gt; - font files that are re-compiled to include additional symbols.  Grab a font you like (I&amp;rsquo;m using Meslo in this example, but I&amp;rsquo;m also partial to JetBrains NF) and set it as the default in the terminal profile.&lt;/p&gt;
&lt;p&gt;This setup is used by bash, regardless of the terminal application.  I have Tabby, Tilix, and the included Terminal from Pop! and all three &amp;ldquo;just work&amp;rdquo;.  As mentioned, the only cavaet is getting a good font setup in the terminal profile.&lt;/p&gt;
&lt;h2 id=&#34;windows-powershell&#34;&gt;Windows PowerShell&lt;/h2&gt;
&lt;p&gt;As mentioned, Oh My Posh works swimmingly with PowerShell on Windows.  I have it working in the Powershell terminal and in the Windows Terminal (but recommend the later).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/omp_windows.png&#34; alt=&#34;Om My Posh in Windows Terminal&#34;&gt;&lt;/p&gt;
&lt;p&gt;OMP can be installed on Windows using PowerShell, &lt;a href=&#34;https://nextpertise.net/posts/220118_choco/&#34;&gt;Chocolatey&lt;/a&gt;, &lt;a href=&#34;https://nextpertise.net/posts/211228_winget/&#34;&gt;Winget&lt;/a&gt;, or scoop.  I prefer Choco, so that&amp;rsquo;s what is used in the examples below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;choco install oh-my-posh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then edit the profile.  You may get an error because there&amp;rsquo;s not an existing profile.  If so, just create one.  Type &lt;strong&gt;$profile&lt;/strong&gt; in PowerShell to see what the filename and location should be.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notepad $profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add the following into the profile:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module oh-my-posh
oh-my-posh --init --shell pwsh --config ~/agnosterplus.omp.json | Invoke-Expression
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again, you&amp;rsquo;ll need to use the &lt;a href=&#34;https://www.nerdfonts.com/&#34;&gt;nerd font&lt;/a&gt; of your choice.  Set this up in the PowerShell Terminal or Microsoft Terminal.  Both apps use the same $profile, so you just need to change the font in the terminal.&lt;/p&gt;
&lt;h2 id=&#34;windows-cmd&#34;&gt;Windows CMD&lt;/h2&gt;
&lt;p&gt;OMP is even available for the traditional command line.  For cmd, install &lt;a href=&#34;https://chrisant996.github.io/clink/&#34;&gt;clink&lt;/a&gt;.  Clink adds some of the editing features of Bash to the traditional CMD.  Download clink and run the installer.  You can verify the installer by running &lt;strong&gt;clink info&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clink info
version  : 1.3.2.222baa
session  : 8504
binaries : C:\Program Files (x86)\clink\1.3.2.222baa
state    : C:\Users\Brent\AppData\Local\clink
    &amp;lt; output trimmed&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next create a file called oh-my-posh.lua in your clink directory.  Note that this directory is given from &lt;strong&gt;clink info&lt;/strong&gt;.  The load string below starts OMP - note the theme is specified as well.  This section of text can be replaced if you disagree with me on the theme to be used.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;notepad AppData\Local\clink\oh-my-posh.lua
    &amp;lt;add this text&amp;gt;
load(io.popen(&#39;oh-my-posh --config=&amp;quot;C:/Users/Brent/.oh-my-posh/themes/agnosterplus.omp.json&amp;quot; --init --shell cmd&#39;):read(&amp;quot;*a&amp;quot;))()
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Sudo for Windows Powershell</title>
      <link>https://nextpertise.net/220124_sudo_on_windows/</link>
      <pubDate>Sun, 23 Jan 2022 18:28:41 -0500</pubDate>
      
      <guid>https://nextpertise.net/220124_sudo_on_windows/</guid>
      <description>&lt;p&gt;Some Windows Powershell commands must be run from Powershell running in an administrative context.  It&amp;rsquo;s a little bit of a pain when you need to invoke Powershell this way (right click it in the menu).  The real problem is once there&amp;rsquo;s a terminal up, do you limit this to just the command that requires it or do you just work out of the open (administrative) terminal window?  Choosing to remain in that admin context could lead to trouble.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/sudologo.png#floatsmallleft&#34; alt=&#34;Sudo Logo&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-need-for-sudo&#34;&gt;The need for sudo&lt;/h2&gt;
&lt;p&gt;Unix has a nice way of handling this.  The command prompt starts with your user priviledges.  It can be escalated for a single command with &amp;ldquo;sudo&amp;rdquo; - substitute user do.  Wouldn&amp;rsquo;t it be cool (and more secure) if a similar command existed for Powershell on Windows?&lt;/p&gt;
&lt;p&gt;Luke Sampson has a set of powershell scripts that appropximate Linux commands on &lt;a href=&#34;https://github.com/lukesampson/psutils/blob/master/sudo.ps1&#34;&gt;Github&lt;/a&gt;.  These include sudo and are meant to be installed using &lt;em&gt;scoop&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;using-scoop&#34;&gt;Using Scoop&lt;/h2&gt;
&lt;p&gt;Scoop is an installer, like winget or choco, but it&amp;rsquo;s aimed more at simple installs.  Scoop doesn&amp;rsquo;t require a developer to make a special installer - it can use a ZIP and instructions in a JSON.  These JSON files are stored in buckets - basically these are curated compilations of JSON files stored in a Git.&lt;/p&gt;
&lt;p&gt;Scoop specializes in simple programs, like command-line tools such as sudo.  In fact, many linux-like tools can be easily installed by scoop such as sudo, git, and curl.  Scoop puts everything in your users directory, so it doesn&amp;rsquo;t cause a lot of UAC pop-ups.&lt;/p&gt;
&lt;p&gt;Scoop and sudo can be installed as shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# allow powershell scripts
Set-ExecutionPolicy unrestricted
# install scoop
iwr -useb get.scoop.sh |iex
# install sudo 
scoop install sudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use &lt;strong&gt;scoop search&lt;/strong&gt; to see if a program is available through scoop.  Check out the github site to see other buckets that are available as well.&lt;/p&gt;
&lt;h2 id=&#34;using-sudo-in-powershell-for-windows&#34;&gt;Using Sudo in Powershell for Windows&lt;/h2&gt;
&lt;p&gt;Once installed, you can escalate priviledges on a command-by-command basis by prefixing them with &amp;ldquo;sudo&amp;rdquo;, just like you would on Linux.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo set-executionpolicy
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Deploying a WIM Image to VMWare</title>
      <link>https://nextpertise.net/220122_deploying_wim/</link>
      <pubDate>Sat, 22 Jan 2022 12:54:46 -0500</pubDate>
      
      <guid>https://nextpertise.net/220122_deploying_wim/</guid>
      <description>&lt;p&gt;Work uses Windows, but I need a Linux workstation with that set of tools.  I find WSL2 incomplete . . . partly because my personal workflow is Linux based.  I spoke with the Windows expert and we agreed to use VMWare Workstation to deploy my Windows environment alongside my Linux system.  Deploying the standard Windows image to a remote VMWare environment wasn&amp;rsquo;t something we had setup already.  Since I&amp;rsquo;m trying to be a special case, he sent me the WIM file to figure out how to deploy.&lt;/p&gt;
&lt;h1 id=&#34;what-the-heck-is-a-wim&#34;&gt;What the heck is a WIM?&lt;/h1&gt;
&lt;p&gt;A WIM is a file-based Windows Image that is made to be easy to test and deploy.   It&amp;rsquo;s kind of like a ZIP, to my understanding, in that it captures all the files and the directory structure of a partition in a file.  Being file-based makes it easy to modify (more on this later).  Because it&amp;rsquo;s not a sector-by-sector image you can deploy it to different sized drives.&lt;/p&gt;
&lt;h2 id=&#34;how-dont-you-deploy-it&#34;&gt;How don&amp;rsquo;t you deploy it?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/fogserver.png#floatsmallleft&#34; alt=&#34;Fog Project&#34;&gt;
I tried several approaches to using the WIM file.  I&amp;rsquo;ll mention them briefly here so that you can learn from my experience.&lt;/p&gt;
&lt;p&gt;The first thing I tried was making a Windows VM using the Windows 10 downloadable &lt;a href=&#34;https://www.microsoft.com/en-us/software-download/windows10ISO&#34;&gt;disk image&lt;/a&gt; from Microsoft. Once booted, I added a drive and expanded the WIM to the new drive.  I deleted my drive with generic Windows and rebooted.  I think this didn&amp;rsquo;t work because the new disk wasn&amp;rsquo;t set as a primary partition.  This approach may be doable, but I moved on pretty quickly.&lt;/p&gt;
&lt;p&gt;The next thing I tried was to deploy it via netboot using a &lt;a href=&#34;https://github.com/FOGProject/fogproject&#34;&gt;Fog Server&lt;/a&gt;.  That project is pretty stinking cool!  I was able to get a VM to reference the server for boot information.  The problem here was that I didn&amp;rsquo;t know what it was looking for (first time with PXE).  When I decided it wanted an ISO, I thought &amp;ldquo;if I knew how to convert to the WIM to an ISO, I could just boot that directly in the VM!&amp;rdquo; and abandoned the Fog Server approach.  I may come back to this to learn more about PXE booting.&lt;/p&gt;
&lt;h1 id=&#34;how-do-you-deploy-wim&#34;&gt;How do you deploy WIM?&lt;/h1&gt;
&lt;p&gt;Microsoft has a series of articles that you&amp;rsquo;ll need to read to understand how to do this.  I&amp;rsquo;ve referenced them, but be warned that they reference each other circlically and there&amp;rsquo;s not a good starting point.  To help you, I&amp;rsquo;m going to attempt to draw a straight line through how &lt;em&gt;I&lt;/em&gt; accomplished this.&lt;/p&gt;
&lt;h2 id=&#34;1---build-a-winpe-dvd-image&#34;&gt;1 - build a WinPE DVD Image&lt;/h2&gt;
&lt;p&gt;You need to boot into a &lt;a href=&#34;https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-intro?view=windows-11&#34;&gt;WinPE&lt;/a&gt; environment to deploy the WIM image.   Windows PE is a small OS made to facilitate installation, used by Windows as a &amp;ldquo;pre-boot&amp;rdquo; environment.  To build your WinPE boot disk, download the &lt;a href=&#34;https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install&#34;&gt;Windows Assessment and Deployment Kit&lt;/a&gt; on a Windows PC and install the ADK executable.&lt;/p&gt;
&lt;p&gt;Start the &lt;strong&gt;Deployment and Imaging Tools Environment&lt;/strong&gt; as an administrator and create a working set of files using the &lt;strong&gt;copype&lt;/strong&gt; command.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;copype amd64 C:\WinPE_amd64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The documentation says you can build an ISO now.  &lt;strong&gt;Don&amp;rsquo;t!&lt;/strong&gt;  There are some batch files that will make this easier - download a zip from &lt;a href=&#34;https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/oem-deployment-of-windows-desktop-editions-sample-scripts?preserve-view=true&amp;amp;view=windows-10#apply-image&#34;&gt;here&lt;/a&gt; and pull the scripts out and place them in the root of your WinPE directory.  Also, grab the WIM file that you&amp;rsquo;re trying to deploy and stick that in the WinPE directory as well.  Now you can build the ISO using the &lt;strong&gt;MakeWinMedia&lt;/strong&gt; command.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MakeWinPEMedia /ISO C:\WinPE_amd64 C:\WinPE_amd64\Acme_Installer.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That should create an ISO that&amp;rsquo;s about a half-gig larger than the WIM file.
&lt;img src=&#34;https://nextpertise.net/tpm.png#floatsmallright&#34; alt=&#34;TPM&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2---build-a-blank-vm-and-enable-secure-boot&#34;&gt;2 - Build a blank VM and enable Secure Boot&lt;/h2&gt;
&lt;p&gt;I created an empty VM with an empty hard drive.  The critical piece here is that my image expects to be deployed to a TPM environment.  TPM requires UEFI and that the VM be encrypted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/vmsetup.png#floatsmallright&#34; alt=&#34;VM Configuration&#34;&gt;
In VMWare Workstation, enable UEFI under Virtual Machine Settings: go to the Options tab, select Advanced, and set the Firmware type to UEFI and Enable Secure Boot.  This is shown in the picture to the right.  While at the Options tab, select Access Control, click the button to encrypt the virtual machine, and choose a password.&lt;/p&gt;
&lt;p&gt;Next add the Trusted Platform Module.   Add it under the Hardware tab by clicking the Add button at the left-bottom of the window.&lt;/p&gt;
&lt;p&gt;Finally, we need the new VM to boot from the ISO we created earlier.  Add the new WinPE ISO to the CD drive and make sure it&amp;rsquo;s marked connected.&lt;/p&gt;
&lt;h2 id=&#34;3---boot-winpe-and-deploy-the-image&#34;&gt;3 - Boot WinPE and deploy the image&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;re ready to install the WIM image!  Boot the new VM using the WinPE boot disk.  It will boot to a prompt.  The procedure here is laid out by &lt;a href=&#34;https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/capture-and-apply-windows-using-a-single-wim?view=windows-11&#34;&gt;Microsoft&lt;/a&gt;.  Use the scripts that you added to the boot disk to first help partition the drive and then to apply the image.  &lt;em&gt;CreatePartition-UEFI.txt&lt;/em&gt; and &lt;em&gt;ApplyImage.bat&lt;/em&gt; were included in those scripts.  Obviously image names will change.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diskpart /s CreatePartitions-UEFI.txt
D:\ApplyImage.bat D:\Images\ACME-Standard.wim
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The ApplyImage batch file will ask a few questions you need to be prepared for.  You can safely answer &amp;ldquo;no&amp;rdquo; to all of them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You will be asked if you want to create a recovery partition.  Recovery Partitions are a great tool, but I want to keep this VM as small as possible and I&amp;rsquo;ll setup recovery mechanisms at the VM level, so I answered no.&lt;/li&gt;
&lt;li&gt;Do you want a compact OS install?  This runs the OS from compressed files, saving a lot of disk space.  Of course, everything has to be uncompressed to be run, so it will slow things down and might take more memory.  Even though I want a small VM, I chose to not install it as a compressed OS because I want to have good performance.&lt;/li&gt;
&lt;li&gt;Does the WIM file have extended attributes? I&amp;rsquo;m not a Windows guy, but I chose &amp;ldquo;no&amp;rdquo; and everything was fine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From this point, the VM will go through a preliminary setup, doing things like setting the keyboard type.  It will reboot, ask you to login, and then continue the higher level (Cortana led) part of setup.  From here, everything should install as you would expect!&lt;/p&gt;
&lt;p&gt;As an interesting side-note, the WinPE boot disk includes an FTP client.  That might be useful script out some additional file copies to the new machine.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chocolatey Installer for Windows</title>
      <link>https://nextpertise.net/220118_choco/</link>
      <pubDate>Tue, 18 Jan 2022 15:27:47 -0500</pubDate>
      
      <guid>https://nextpertise.net/220118_choco/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m setting up a new Windows 10 VM (this time in VMWare) and decided to use Chocolatey to install applications this time, since I tried &lt;em&gt;winget&lt;/em&gt; last time.  I haven&amp;rsquo;t tried Chocolatey in a while, and I&amp;rsquo;ve spent a lot of time exclusively in Linux since then so I was curious what I would make of it, especially in comparison to &lt;a href=&#34;https://nextpertise.net/posts/211228_winget/&#34;&gt;Winget&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://chocolatey.org/&#34;&gt;Chocolatey&lt;/a&gt; is a package manager like apt.  You can use it to search for, install, update, and uninstall programs.  This is particularly useful if you have a &amp;ldquo;standard setup&amp;rdquo; for new computers - it&amp;rsquo;s possible to build a script to install the apps you expect.  Windows Update only covers Microsoft programs, so Chocolatey fills another gap by updating all the programs it installs from the command line.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/chco-square.svg#floatsmallleft&#34; alt=&#34;Logo&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;chocolatey&#34;&gt;Chocolatey&lt;/h2&gt;
&lt;p&gt;Chocolatey is free open-souce software that has been around for a while and I&amp;rsquo;ve used it before.  Chocolatey works like &lt;em&gt;apt&lt;/em&gt;, using the &lt;em&gt;choco&lt;/em&gt; command.  You can search for a package, install it, or uninstall it. &lt;em&gt;Choco upgrade&lt;/em&gt; will upgrade all the Chocolatey-managed applications on your system.  This last piece is especially useful, since Windows Update focuses just on Microsoft properties.&lt;/p&gt;
&lt;p&gt;Chocolatey uses the command &lt;em&gt;choco&lt;/em&gt;.  The command sequence below shows looking for all packages in the repository that are include &amp;ldquo;libre&amp;rdquo;.  That allows me to see the name of the LibreWolf package, which I then choose to install.  Finally, the upgrade command can be used to upgrade specific packages or to get them all.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;choco list libre
choco install librewolf
choco upgrade all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;em&gt;choco list &amp;ndash;local-only&lt;/em&gt; to see a list of programs installed on the local system by choco.  There&amp;rsquo;s also a GUI, installed by &lt;em&gt;choco install chocolateygui&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Choco compares very well to Microsoft&amp;rsquo;s &lt;em&gt;winget&lt;/em&gt;.  The application set available seems a little larger.  Like &lt;em&gt;winget&lt;/em&gt;, choco will be familiar to &lt;em&gt;apt&lt;/em&gt; users (but there are some syntactical differences.  I used winget to easily install Git, WinFSP, SSHFS, the Microsoft Terminal, and Librewolf.   A later upgrade picked up new versions of Librewolf and Git and installed them without difficulty.   &lt;em&gt;Choco&lt;/em&gt; also seemed to apply some KB patches I was missing and even upgraded itself!&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Setup is very easy.  Installation can be done from an administrative powershell using these commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy AllSigned
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(&#39;https://community.chocolatey.org/install.ps1&#39;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;pretty-solid&#34;&gt;Pretty Solid&lt;/h2&gt;
&lt;p&gt;When I tried winget, I had issues with dependencies.  Chocolatey picked these up and installed without an issue, so Librewolf grabbed the Visual C redistributable module and installed it without prompting, for instance.  &lt;em&gt;Choco&lt;/em&gt; has a wide range of supported applications, particularly if you like to use FOSS.&lt;/p&gt;
&lt;p&gt;The biggest issue with Chocolatey is image.  The name doesn&amp;rsquo;t build credibility, and with Microsoft building a competing product now I expect IT departments to focus on &lt;em&gt;winget&lt;/em&gt;.  That said, &lt;em&gt;choco&lt;/em&gt; is a more complete solution with a bigger catalog as of today and it&amp;rsquo;s definitely the better fit for home.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up a Basic FTP server on Linux</title>
      <link>https://nextpertise.net/220117_linux_ftp/</link>
      <pubDate>Mon, 17 Jan 2022 15:49:07 -0500</pubDate>
      
      <guid>https://nextpertise.net/220117_linux_ftp/</guid>
      <description>&lt;h1 id=&#34;brother-printers-work-well-with-linux&#34;&gt;Brother Printers work well with Linux&lt;/h1&gt;
&lt;p&gt;My last two printers have been Brother multi-function copiers (MFCs).  These printers work really well with everything in the house - Windows, Linux, even the school Chromebooks.  They have a Linux driver available on their website for all their printers, the print quality is excellent, and they&amp;rsquo;ve been very durable.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re looking for a printer that plays well with others, take a look.&lt;/p&gt;
&lt;p&gt;My Brother MFC-L3770CDW printer can scan to SMB, FTP, or a flash drive you plug in.  I wanted to set it up to FTP scans into the personal directories of family members.&lt;/p&gt;
&lt;h1 id=&#34;basic-ftp-with-linux&#34;&gt;Basic FTP with Linux&lt;/h1&gt;
&lt;p&gt;FTP is a very old file transfer protocol.  VSFTP (&amp;ldquo;Very Secure&amp;rdquo;) is the default FTP server for Linux.  Regardless of the name, plain vanilla FTP transmits usernames and passwords in clear text and setting it up to be &amp;ldquo;Very Secure&amp;rdquo; takes a little extra effort.  I&amp;rsquo;m also using it because it&amp;rsquo;s compatible with my printer, but securing it might interfere with that connection.  So this setup isn&amp;rsquo;t security optimized and is really only appropriate for a home network.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;As a note, if secure file transfer is interesting to you, check out the articles on &lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3/&#34;&gt;SSHFS&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On Ubuntu, installation can be done through apt.  Configuration is done by editing the &lt;em&gt;/etc/vsftpd.conf&lt;/em&gt; file.  After editing, you&amp;rsquo;ll need to restart the service.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install vsftpd
sudo nano /etc/vsftpd.conf
sudo systemctl restart vsftpd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The configuration file is mostly comments, with each setting preceded by documentation.  Remove the hash to &amp;ldquo;uncomment&amp;rdquo; a line.  Here&amp;rsquo;s the relevant settings that I used in this case.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
allow_writeable_chroot=YES
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This configuration turns off IPv6 since I&amp;rsquo;m not using it.  It limits access to valid users on the server, allows those users to write files, and limits each user to their personal folder.  VSFTP will throw an error if a chroot&amp;rsquo;d user has both SSH and FTP write priviledges, which makes sense under more secure circumstances.  In this case, I turned off the security check.  Be very careful when setting this up, sentences like that last are usually followed by tragedy!  It&amp;rsquo;s only appropriate because I&amp;rsquo;m limiting access to the server and it&amp;rsquo;s not &amp;ldquo;mission critical&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Testing is easy with Filezilla or from the command line.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brent@server:~$ ftp 192.168.1.2
Connected to 192.168.1.2.
220 (vsFTPd 3.0.3)
Name (192.168.1.2:brent): brent
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once complete, this worked like a champ.  I created &lt;em&gt;~/scan&lt;/em&gt; directories under each user and setup a quick-connect button from the Brother printer.  Voila - scans directly to each users home directory!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PSA VMWare</title>
      <link>https://nextpertise.net/220105_psa_vmware/</link>
      <pubDate>Wed, 05 Jan 2022 17:49:07 -0500</pubDate>
      
      <guid>https://nextpertise.net/220105_psa_vmware/</guid>
      <description>&lt;h1 id=&#34;public-service-annoucement-on-vmware-workstation&#34;&gt;Public Service Annoucement on VMWare Workstation&lt;/h1&gt;
&lt;p&gt;That&amp;rsquo;s a little dramatic, but I have had a fit with VMWare Workstation and want to pass along what I&amp;rsquo;ve learned.  I recently upgraded my desktop and VMWare performance went in the dump.&lt;/p&gt;
&lt;h3 id=&#34;backstory&#34;&gt;Backstory&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m running Pop!_OS 21.10 using kernel 5.15.  I&amp;rsquo;m using VMWare Workstation 16.2.1 (latest as of early January 2022).  Since I do a lot with virtualization, I have 64GB of RAM.  I was running a Gen 6 i7 and recently upgraded my processor and motherboard to get to gen 12.  Wow! What a difference!  Everything runs super-fast, but VMWare suddenly became anemic.&lt;/p&gt;
&lt;h2 id=&#34;whatd-i-do-to-fix-it&#34;&gt;What&amp;rsquo;d I do to fix it?&lt;/h2&gt;
&lt;p&gt;Workstation has trouble running on recent kernels.  Michal Kubeček maintains a &lt;a href=&#34;https://github.com/mkubecek/vmware-host-modules&#34;&gt;repository&lt;/a&gt; with kernel patches.  Download the patch from GitHub - instructions are included in the repository.  You&amp;rsquo;ll know this worked because VMWare boots.&lt;/p&gt;
&lt;p&gt;The ultimate fix was to tell VMware not to swap memory, since I have plenty.  To do this, run Workstation as root:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo -i vmware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go to &lt;strong&gt;Edit&lt;/strong&gt; &amp;gt; &lt;strong&gt;Preferences&lt;/strong&gt; and under &amp;ldquo;Memory&amp;rdquo; select &amp;ldquo;Fit all virtual machine memory into reserved host RAM&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/220105_VMWS_Memory.png&#34; alt=&#34;VMWare Workstation Settings&#34;&gt;&lt;/p&gt;
&lt;p&gt;I searched all over the Internet and tried a dozen different things to fix this.  I know this is a short article, but I wanted to make sure that others had a less frustrating time!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Winget</title>
      <link>https://nextpertise.net/211228_winget/</link>
      <pubDate>Tue, 28 Dec 2021 11:46:32 -0500</pubDate>
      
      <guid>https://nextpertise.net/211228_winget/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m experimenting with KVM and decided to build a new Windows VM.  I&amp;rsquo;m currently using Pop!_OS 21.10 which uses the 5.15 kernel.  Turns out that breaks Windows on VMWare workstation and it looks like the cause is VMWare not keeping up with the latest kernels.  There are some patches available, but it&amp;rsquo;s the week between Christmas and New Years and seemed like a good chance to review the FOSS alternative.&lt;/p&gt;
&lt;p&gt;Part of my troubleshooting process on Linux was to make sure that I haven&amp;rsquo;t made a change that&amp;rsquo;s impacting VMWare.  Pop! has a really cool feature that will roll-back to a clean install, but leave your personal files.  Reinstalling missing applications is pretty easy in linux.  Installing hugo again is as easy as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;chocolatey&#34;&gt;Chocolatey&lt;/h2&gt;
&lt;p&gt;Chocolatey is free open-souce software that has been around for a while and I&amp;rsquo;ve used it before.  Chocolatey works like &lt;em&gt;apt&lt;/em&gt;, using the &lt;em&gt;choco&lt;/em&gt; command.  You can search for a package, install it, or uninstall it. &lt;em&gt;Choco upgrade&lt;/em&gt; will upgrade all the Chocolatey-managed applications on your system.  This last piece is especially useful, since Windows Update focuses just on Microsoft properties.&lt;/p&gt;
&lt;h2 id=&#34;winget&#34;&gt;Winget&lt;/h2&gt;
&lt;p&gt;Microsoft has developed a similar tool called &lt;em&gt;winget&lt;/em&gt;.  I have a bias toward open source, but my job is in a corporate Windows environment.  I&amp;rsquo;m not sure that I could get Chocolatey in the door, but Winget might be something that could be used.  I decided to give it a whirl in this VM and try to get some experience.&lt;/p&gt;
&lt;p&gt;Installation is a little non-obvious.  If you go to the &lt;a href=&#34;https://github.com/microsoft/winget-cli/&#34;&gt;Github page&lt;/a&gt;, it recommends installation through the Windows Store.  However, I searched the store and didn&amp;rsquo;t find anything.  Instead, I downloaded the &lt;strong&gt;msixbundle&lt;/strong&gt; file from the latest release and ran it.&lt;/p&gt;
&lt;p&gt;Winget will be intuitive for apt users.  &lt;strong&gt;Winget search libre&lt;/strong&gt; showed me available applications with &lt;em&gt;libre&lt;/em&gt; in the title including LibreOffice and Librewolf.  &lt;strong&gt;Winget install librewolf&lt;/strong&gt; installed the firefox-based web browser.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/211228_Winget.png&#34; alt=&#34;Winget Example&#34;&gt;&lt;/p&gt;
&lt;p&gt;One of the best features of apt is the easy way that components are upgraded.  Running &lt;strong&gt;winget upgrade&lt;/strong&gt; will list installed applications that have an upgrade avaialable.  It even caught an application I did not install with winget!  &lt;strong&gt;Winget upgrade &amp;ndash;all&lt;/strong&gt; will install all available upgrades.  You can also specify specific applications that you want to upgrade.&lt;/p&gt;
&lt;h2 id=&#34;not-baked-yet&#34;&gt;Not baked yet&lt;/h2&gt;
&lt;p&gt;I identified three issues in my early experimentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apt&lt;/strong&gt; will identify dependencies and include them during the application installation.  Librewolf completed installation without an error, but wouldn&amp;rsquo;t run without the &lt;a href=&#34;https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170&#34;&gt;Visual C redistributable module&lt;/a&gt;.  &lt;strong&gt;Winget search&lt;/strong&gt; didn&amp;rsquo;t turn up a way to install the dependency, so I installed it directly from the Microsoft site.&lt;/p&gt;
&lt;p&gt;I mentioned earlier that winget identified upgrades even for applications it didn&amp;rsquo;t install.  That true and would be an enormous advantage of the tool.  But . . . it didn&amp;rsquo;t work.  The upgrade failed and pointed me to a log.  The log showed that the service needed to be stopped before upgrading.  Once I stopped the service and re-ran the &lt;strong&gt;winget upgrade &amp;ndash;all&lt;/strong&gt; command, the process completed successfully.&lt;/p&gt;
&lt;p&gt;Winget doesn&amp;rsquo;t get a &amp;ldquo;half-point&amp;rdquo; with the upgrade problem.  Instead of a simple update, this requires that I identify and shutdown services before running the upgrade, then manually restart them.  It&amp;rsquo;s doable, but far from the easy process that is expected on Linux.&lt;/p&gt;
&lt;p&gt;The third issue I found was that the Windows Decrapifier wasn&amp;rsquo;t included in winget.  Is this because the pool of installable applications is comparitvely shallow?  This seems reasonable since it&amp;rsquo;s a relatively new project.  You can see the complete list of currently supported applications (here)[https://github.com/microsoft/winget-pkgs/tree/master/manifests/d].  Is the lack of the decrapifier an editorial decision?  Possibly, but if so it portends an anemic future for the tool.&lt;/p&gt;
&lt;p&gt;##So?
Winget shows promise and it&amp;rsquo;s worth keeping an eye on.  But I won&amp;rsquo;t be recommending it to the end-user support group today.  Give me dependency recognition, easy upgrading, and broader support and this will be a standard part of the tool bag.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Czkawka</title>
      <link>https://nextpertise.net/210926_czkawka/</link>
      <pubDate>Sun, 26 Sep 2021 15:07:20 -0400</pubDate>
      
      <guid>https://nextpertise.net/210926_czkawka/</guid>
      <description>&lt;p&gt;Czkawka is a &amp;ldquo;simple, fast, and free app to remove unnecessary files&amp;rdquo;.  I heard it mentioned on one of the Jupiter Broadcasting shows and decided to look into it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210924_Czkawka.png#floatsmallleft&#34; alt=&#34;Czkawka logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;I have a server that I map folders to using NFS or SFTP that has a lot of accumulated junk.  I&amp;rsquo;ve got twenty plus years of kids pictures, and as the computer expert in the family I&amp;rsquo;m expected to protect these like crown jewels.  However, backing up pictures all the time leads to a lot of duplicates.  I also keep all my the family files there - school, work, personal, hobbies - and there ends up being a lot of duplication there as well.  Not only are duplicate files a problem for local storage, but I pay to back (not much) it all up to Backblaze B2.  Czkawka would be a big help if it helped me sort all those files and conserve space.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Czkawka is available as an AppImage file from Github.  I&amp;rsquo;m using version 3.2 to test.&lt;/p&gt;
&lt;p&gt;AppImages are a way of distributing Linux applications can run on any distro - they include all the dependencies so it&amp;rsquo;s as easy as download and run.  They are similar to snaps or flatpaks.  They can run from anywhere, so I tend to try them out in my Download directory and then organize them in an &amp;ldquo;~/Apps&amp;rdquo; directory if I decide to keep them.&lt;/p&gt;
&lt;p&gt;After downloading, you may need to make the file executable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x linux_czkawka_gui.AppImage
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;
&lt;p&gt;Once the program starts, there are four buttons across the top to focus a Czkawka search.  They are &amp;ldquo;included&amp;rdquo; and &amp;ldquo;excluded&amp;rdquo; directories, &amp;ldquo;excluded items&amp;rdquo;, and &amp;ldquo;allowed extensions&amp;rdquo;.  The first three are obvious, the last is used to limit searches by type (ZIP files, for instance).  Once a set of directories and files is described, the &amp;ldquo;search&amp;rdquo; button in the lower left starts the process.&lt;/p&gt;
&lt;p&gt;I started by adding the ~/Downloads directory and searching for duplicates.  This turned up a few examples of duplicates which it helpfully grouped.  Using the program was a bit non-intuitive - you can&amp;rsquo;t just click on a file and delete it.  Instead, you use the &lt;strong&gt;select&lt;/strong&gt; button at the bottom of the window and have a variety of options to select the oldest, newest, or custom.  Czkawka doesn&amp;rsquo;t really let you interact at the file level but at the summary level and the idea is that you&amp;rsquo;d select all the dups to be deleted in a big set based on some criteria like age.  Custom let&amp;rsquo;s you select duplicates by file path or a pattern in the name.  Once you&amp;rsquo;ve selected a set you can choose the Delete button to remove them.
&lt;img src=&#34;https://nextpertise.net/210924_Czkawka_example.png#floatsmallleft&#34; alt=&#34;Czkawka logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m not sure about deleting a whole bunch of files, I used &amp;ldquo;select one oldest&amp;rdquo; to pick individual files for deletion.  This was tedious, but at least the process was under my control.  It would have been nice to use the check box on the side to pick the ones I wanted to delete, but the interface isn&amp;rsquo;t oriented that way.  Czkawka &lt;em&gt;does&lt;/em&gt; organize the list by size, so you can start at the top to maximize the time spent on freeing up space.&lt;/p&gt;
&lt;h2 id=&#34;more-than-just-duplicates&#34;&gt;More than just duplicates&lt;/h2&gt;
&lt;p&gt;Czkawka does more than just find duplicate files.  It will also search for a variety of errors.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Empty directories&lt;/em&gt; is pretty obvious, but I was surprised how many orphaned folder&amp;rsquo;s I&amp;rsquo;d left moving things around.  This process was simple, I selected all, and it remove them.  It will also search for &lt;em&gt;Empty Files&lt;/em&gt; (zero bytes), which again surprised me by finding examples.  &lt;em&gt;Zeroed Files&lt;/em&gt; (those filled with zeros) didn&amp;rsquo;t turn up anything in my test set.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Invalid Symlink&lt;/em&gt; will catch things where the referenced file isn&amp;rsquo;t present.  Because I mount remote file systems, I decided not to pursue this for fear it was giving false positives (maybe the mapping was just down).  &lt;em&gt;Broken files&lt;/em&gt; are those that show corruption.  This found a number of files in my Download directory.  This could be flagging corruption or an unsupported format.  Because of the number of hits and the nature of what was being called out, I decided to defer removing these to look into further.&lt;/p&gt;
&lt;p&gt;It will look for big files.  My current use case didn&amp;rsquo;t include this, but I verified it worked.  This could be very useful in some administrative situations where a database or a log file has eaten available free space.  I might run this occasionally just to identify any runaway inflation (or the things that are causing it).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Temporary Files&lt;/em&gt; looks for a variety of extensions including: #, thumbs.db, *.bak, *.temp, *.ds_store, *.crdownload, *.download, *.part, *.cache, *.dmp, and *.partial.&lt;/p&gt;
&lt;p&gt;The most fascinating option was to look for &lt;em&gt;similar images&lt;/em&gt;.  This option uses a perceptual hash to look for images that may differ in resolution or cropping.  This worked really well.  I found cases where we had saved cropped images and was able to delete the extra versions.  &lt;em&gt;Music Duplicates&lt;/em&gt; uses tags to perform a similar analysis.  Here I would have appreciated details, such as the different encoding used.&lt;/p&gt;
&lt;h2 id=&#34;speed&#34;&gt;Speed&lt;/h2&gt;
&lt;p&gt;Czkawka is billed as fast.  My testing mostly backed this up.  On a local disk, searches ran seconds.  It took longer to process a directory over SFTP, for instance, although this would be expected.&lt;/p&gt;
&lt;p&gt;I developed a couple ideas about how to best handle these situations.  First, I suggest installing the application on the file server and running it locally.  My file server is headless, but Czkawka has a command line version for just such situations.  Second, try reducing the size of the search field.  Use subdirectory to limit it, for instance.  Third, I suggest running some of the quicker scans (like &amp;ldquo;empty files&amp;rdquo;) first to reduce the size of the dataset.&lt;/p&gt;
&lt;p&gt;At one point I was searching through a hundred thousand remote files.  As you might expect, the search took a few minutes.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;I liked it and plan to keep using it.&lt;/p&gt;
&lt;p&gt;Any time I look at a Linux program, I remember that it is being developed and freely offered to the community.  The people behind these projects need to be celebrated and appreciated.  That said, not everything on GitHub is &amp;ldquo;fully baked&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pleased to report that Czkawka is a well thought out and reasonably fast program that does what I expected - it helps me &amp;ldquo;weed the garden&amp;rdquo; on my file server and remove the detritus.  I&amp;rsquo;m not crazy about the file selection process and I recommend that you bring up a file manager to compare with the Czkawka searches to make sure you understand what it is finding.  &lt;em&gt;Anytime&lt;/em&gt; you are dealing with a mass deletion program you want to be extra careful!  But the results made sense to me.  I didn&amp;rsquo;t delete everything it nominated, but I was able to save a lot of space in the end.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using WebDAV on Apache</title>
      <link>https://nextpertise.net/210906_apachedav/</link>
      <pubDate>Mon, 06 Sep 2021 13:00:30 -0400</pubDate>
      
      <guid>https://nextpertise.net/210906_apachedav/</guid>
      <description>&lt;p&gt;In recent articles, I walked through how to setup a home &lt;a href=&#34;https://nextpertise.net/posts/210830_apache&#34;&gt;webserver&lt;/a&gt; with &lt;a href=&#34;https://httpd.apache.org&#34;&gt;Apache&lt;/a&gt; on Linux and how to configure home &lt;a href=&#34;https://nextpertise.net/posts/210831_dnsonubuntu&#34;&gt;DNS server&lt;/a&gt; using &lt;a href=&#34;https://www.isc.org/bind/&#34;&gt;bind&lt;/a&gt; on Linux, complete with custom in-home domain for local name resolution.  This article revisits the webserver and creates a second virtual host to handle WebDav.&lt;/p&gt;
&lt;p&gt;WebDAV is a file sharing protocol built on top of HTTP.  Many operating systems can attach to WebDAV folders to upload and download files, including Linux, Windows, Mac, IOS, and Android.  I have a password database that I want to keep sync&amp;rsquo;d between different computers and phones and I&amp;rsquo;m not comfortable hosting that &amp;ldquo;in the cloud&amp;rdquo;, so this allows me to self-host.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using Ubuntu Server 21.04 for this exercise.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-dns&#34;&gt;Setting Up DNS&lt;/h2&gt;
&lt;p&gt;My forward lookup zone file includes an A record for the server and a CNAME for the dav share, similar to the output below.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;www IN  A   192.168.26.53
dav IN  CNAME   www.stewart.lan
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the zone file is updated and &lt;strong&gt;named&lt;/strong&gt; restarted, this can be tested by pinging &amp;ldquo;&lt;a href=&#34;https://www.stewart.lan&#34;&gt;www.stewart.lan&lt;/a&gt;&amp;rdquo; and &amp;ldquo;dav.stewart.lan&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-apache&#34;&gt;Setting up Apache&lt;/h2&gt;
&lt;p&gt;If you haven&amp;rsquo;t already done so, the first thing to do is to install apache2.  Next, enable the webdav Apache modules.  Apache using &lt;strong&gt;a2enmod&lt;/strong&gt; and &lt;strong&gt;a2dismod&lt;/strong&gt; for handling modules.  Finally, create a folder to handle the WebDAV files and set the permissions up.  When complete, restart Apache to load the modules.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install apache2
sudo a2enmod dav
sudo a2enmod dav_fs
sudo mkdir /var/www/dav
sudo chown -R wwwroot:wwwroot /var/www/dav
sudo systemctl restart apache2.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;setting-up-the-dav-site&#34;&gt;Setting up the DAV site&lt;/h2&gt;
&lt;p&gt;Apache is now ready to host a WebDAV site, but needs a configuration.  For this, create a text file under /etc/apache2/sites-available (I named mine &lt;em&gt;dav.conf&lt;/em&gt;).  The serveralis parameter tells it to respond to requests to dav.stewart.lan and the alias directive tells Apache the root location is the &lt;em&gt;dav&lt;/em&gt; folder.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brent@webnamer:/etc/apache2/sites-available$ cat dav.conf 
DavLockDB /var/www/DavLock                      #database file Apache uses to lock files
&amp;lt;VirtualHost *:80&amp;gt;
    ServerName stewart.lan
    ServerAlias dav.stewart.lan
    alias / /var/www/dav
        ServerAdmin brent@stewart.tc
        DocumentRoot /var/www/dav/
        &amp;lt;Directory /var/www/dav/&amp;gt;
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
    &amp;lt;/Directory&amp;gt;
    &amp;lt;Location /dav&amp;gt;
        DAV On
        AuthType Basic
        AuthName &amp;quot;webdav&amp;quot;
        AuthUserFile /var/www/passwd.dav
        Require valid-user
    &amp;lt;/Location&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable the site and reload Apache&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a2ensite dav.conf
sudo systemctl restart apache2.service
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;add-authentication&#34;&gt;Add Authentication&lt;/h2&gt;
&lt;p&gt;Go to the directory referenced by DavLockDB and create an empty file named &lt;em&gt;users.password&lt;/em&gt;.  Set the file ownership to www-data.  Finally, add users to this file using htdigest (you&amp;rsquo;ll be prompted for passwords).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo touch /var/www/users.password
sudo chown www-data:www-data /var/www/passwd.dav
sudo htdigest /var/www/passwd.dav webdav newuser
Adding user newuser in realm webdav
New password:
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;confirming-the-setup&#34;&gt;Confirming the setup&lt;/h2&gt;
&lt;p&gt;There are a &lt;em&gt;lot&lt;/em&gt; of ways to test.  You can browse to that URL, use an application, or attach to it from your file manager using the url webdav://dav.myserver.  Confirm that you are prompted for a password as expected!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DNS on Ubuntu</title>
      <link>https://nextpertise.net/210831_dnsonubuntu/</link>
      <pubDate>Tue, 31 Aug 2021 19:08:11 -0400</pubDate>
      
      <guid>https://nextpertise.net/210831_dnsonubuntu/</guid>
      <description>&lt;p&gt;Continuing from my &lt;a href=&#34;https://nextpertise.net/posts/210830_apache/&#34;&gt;previous post&lt;/a&gt;, I have recently rebuilt my server infrastructure at home, migrating from VMWare to Proxmox VE.  I&amp;rsquo;m still getting the hang of Proxmox, although I&amp;rsquo;m feeling favorable towards it so far.  In the meantime, I wanted to document some of the little pieces to setting up a home network.  This time I&amp;rsquo;ll provide a walk through of a simple local DNS server.  My goal at home is to create a &amp;ldquo;stewart.lan&amp;rdquo; network that I can use to reference local resources.&lt;/p&gt;
&lt;p&gt;Like the Apache server I built last time, this server is running Ubuntu 21.04 Server and my instructions are written from that perspective.  Some commands may change as you move to non-Debian distributions or with different versions.  Installation of DNS services is done with &lt;strong&gt;bind9&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install bind9
sudo ufw allow 53
sudo ufw allow 53/udp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the service is installed, &lt;strong&gt;bind&lt;/strong&gt; configuration files are found in &lt;em&gt;/etc/bind&lt;/em&gt;.  In my configuration there are five files that I modified or created: the service configuration file &lt;em&gt;named.conf&lt;/em&gt; which loads in &lt;em&gt;named.conf.local&lt;/em&gt; and &lt;em&gt;named.conf.options&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@webnamer:/etc/bind# cat named.conf
include &amp;quot;/etc/bind/named.conf.options&amp;quot;;
include &amp;quot;/etc/bind/named.conf.local&amp;quot;;

###

root@webnamer:/etc/bind# cat named.conf.local
//
// Do any local configuration here
//
zone &amp;quot;stewart.lan&amp;quot; {
    type master;
    file &amp;quot;/etc/bind/forward.stewart.lan&amp;quot;;
    allow-query { any; };
};

###

root@webnamer:/etc/bind# cat named.conf.options 
acl internal-network {
    192.168.24.0/22;
    localhost;
    localnets;
};
options {
    directory &amp;quot;/var/cache/bind&amp;quot;;
    forwarders {
	    192.168.26.53;  //this server
	    208.67.222.222; //OpenDNS1
	    208.67.220.220; //OpenDNS2
	    8.8.8.8;        //Google DNS1
	    8.8.4.4;        //Google DNS2
    };
    allow-query { internal-network; };
    allow-query-cache { internal-network; };
    allow-recursion { internal-network; };
    allow-transfer { none; };
    allow-update { none; };
    dnssec-validation yes;
    auth-nxdomain no;
    recursion yes;
    notify no;
    listen-on { any; };
    listen-on-v6 { none; };
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anytime DNS config files are changed the system will need to be restarted.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl restart named
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With these files in place recursive lookups (like &lt;em&gt;google.com&lt;/em&gt;) should be working.  This can be tested by changing DNS on a machine, or by using &lt;strong&gt;dig&lt;/strong&gt; or &lt;strong&gt;nslookup&lt;/strong&gt;.  &lt;strong&gt;Dig&lt;/strong&gt; accepts arguments for the DNS server to use, the domain to be queried, and the type of record (by default A) to be returned.  In the example below, the server and the domain to be returned are specified.   &lt;strong&gt;NSLookup&lt;/strong&gt; is a similar command that queries DNS servers.  In the example below, the server command tells it to connect to the new server and then the &amp;ldquo;www&amp;rdquo; is a query for a record (haven&amp;rsquo;t gotten to the local zone setup yet).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@webnamer:/etc/bind# dig 192.168.26.3 stewart.lan

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.16.8-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; stewart.lan
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 35138
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1b490288965657d7010000006131687c06bba43e1f56fdbc (good)
;; QUESTION SECTION:
;stewart.lan.			IN	A

;; AUTHORITY SECTION:
stewart.lan.		604600	IN	SOA	localhost. root.localhost. 6 604820 86600 2419600 604600

;; Query time: 0 msec
;; SERVER: 192.168.26.53#53(192.168.26.53)
;; WHEN: Thu Sep 02 20:12:44 EDT 2021
;; MSG SIZE  rcvd: 118

root@webnamer:/etc/bind# nslookup
&amp;gt; server 192.168.26.53
Default server: 192.168.26.53
Address: 192.168.26.53#53
&amp;gt; www
Server:		192.168.26.53
Address:	192.168.26.53#53

&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If there are problems at this point this point, use &lt;strong&gt;named-checkconf&lt;/strong&gt; to review the configuration files for errors.  By default, &lt;em&gt;named&lt;/em&gt; logs can be reviewed with &lt;strong&gt;tail /var/log/syslog&lt;/strong&gt; as well.&lt;/p&gt;
&lt;p&gt;A forward lookup zone (which matches names to numbers) needs to be created if we want a local zone.  My house is named &lt;em&gt;stewart.lan&lt;/em&gt;, but any name is fine with the caveat that collisions with valid public name spaces should be avoided.  A forward lookup zone is a text file similar to the one below.  Note that this file was referenced in the &lt;em&gt;named.conf&lt;/em&gt; setup.  A records link names to IPs.  CNAMEs are alias records.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brent@webnamer:/etc/bind$ cat forward.stewart.lan
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                            6         ; Serial
                        604820         ; Refresh
                        86600         ; Retry
                        2419600         ; Expire
                        604600 )       ; Negative Cache TTL
;
;Name Server Information
@       IN      NS      ns.stewart.lan.

;IP address of Your Domain Name Server(DNS)
ns IN       A      192.168.26.53

;A Record for Host names
gw     IN       A       192.168.26.1
ns	IN	A	192.168.26.53
pop	IN	A	192.168.25.7
print	IN	A	192.168.24.17
oldprint	IN	A	192.168.24.11
server	IN	A	192.168.26.9
proxmox	IN	A	192.168.26.10
library	IN	A	192.168.26.11


;CNAME Record
www	IN	CNAME	ns.stewart.lan.
dav	IN	CNAME	ns.stewart.lan.
newprint	IN	CNAME	print.stewart.lan.
pve	IN	CNAME	proxmox.stewart.lan.
webnamer	IN	CNAME	ns.stewart.lan
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This setup doesn&amp;rsquo;t show the reverse lookup zone (24.168.192.in-addr.arpa), but that can be built easily and added if needed.  Reverse zones link numbers to names and are used for authentication usually.  With DNS setup and the forward zone in place, we should be able to ping by name (link &lt;em&gt;printer.stewart.lan&lt;/em&gt;).  If there are problems, use &lt;strong&gt;named-checkzone&lt;/strong&gt; to confirm that the format of your zone file is correct.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Simple Apache Setup on Linux</title>
      <link>https://nextpertise.net/210830_apache/</link>
      <pubDate>Mon, 30 Aug 2021 16:38:48 -0400</pubDate>
      
      <guid>https://nextpertise.net/210830_apache/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been running the free version of ESXi 6.5 for a while, but the vulnerabilities kept piling up and I had issues upgrading it.  I&amp;rsquo;ve been looking at ProxMox VE for a while and last week I decided to give it a chance.  I want to get more experience with the server before I write about it, so I&amp;rsquo;ll start by detailing a simple process to get a local webserver running.  Browsers keep trying to throw distracting junk in front of me for start pages when what I really want is to quickly get to the sites I need.  I put together a simple page that organizes my personal and work links for this purpose.&lt;/p&gt;
&lt;p&gt;I built this server on Ubuntu 21.04 Server and my instructions are written from that perspective.  Notes around the firewall and restarting the service will vary by distribution and version, but I&amp;rsquo;ll leave translation as an exercise to the reader.  Installing a webserver is straightfoward - there are a variety to choose from, but Apache is good for this purpose because it&amp;rsquo;s so well documented.  Once the package is downloaded and the service started, you should be able to browse to http://127.0.0.1 and see the default Apache page.  When I did this at home, Ubuntu 21.04 had the firewall up by default, so I needed to allow the Apache service.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install apache2
sudo ufw allow &#39;Apache&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&amp;rsquo;ll need to put your files somewhere for serving.  Apache puts content in &lt;em&gt;/var/www&lt;/em&gt; by default so I created a directory for my site user at &lt;em&gt;/var/www/stewart&lt;/em&gt;.  With that done, the website needs to be defined for Apache.  The Apache config files are found at &lt;em&gt;/etc/apache2&lt;/em&gt;.  To setup a new site I created a &lt;em&gt;stewart.conf&lt;/em&gt; under &lt;em&gt;/etc/apache2/sites-available&lt;/em&gt;.  Below is a simple configuration file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerAdmin my@email
    ServerName www.stewart.local
    ServerAlias www.stewart.local
    DocumentRoot /var/www/stewart
    &amp;lt;Directory /var/www/stewart&amp;gt;
        Options Indexes FollowSymLinks Multiviews
        AllowOverride All
        Require all granted
        allow from all
    &amp;lt;/Directory&amp;gt;
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The site then needs to be activated.  Enabling the site is done with &lt;strong&gt;a2ensite&lt;/strong&gt; and it can be disabled with &lt;strong&gt;a2dissite&lt;/strong&gt;.  This will create a link into the &lt;em&gt;/etc/apache2/sites-enabled/&lt;/em&gt; directory.  The web service will need to be restarted at that point as well.  When it restarts, it reads the conf files it finds in sites-enabled.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo a2ensite stewart.conf
sudo systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With that, you should be able to browse to the local server and see the site!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cockpit</title>
      <link>https://nextpertise.net/210501_cockpit/</link>
      <pubDate>Sat, 01 May 2021 14:44:32 -0400</pubDate>
      
      <guid>https://nextpertise.net/210501_cockpit/</guid>
      <description>&lt;p&gt;If &amp;ldquo;web-based graphical interface for administering Linux&amp;rdquo; makes you think &lt;em&gt;Webmin&lt;/em&gt;,  then you  need to look at &lt;em&gt;Cockpit&lt;/em&gt;.  Cockpit is a modern web-based management tool for all your Linux servers.  It&amp;rsquo;s similar to webmin, but slicker.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210506_Cockpit_Login.png#floatsmallleft&#34; alt=&#34;Login&#34;&gt;&lt;/p&gt;
&lt;p&gt;Installation in Ubuntu is a breeze.  I installed this on all my linux machines and can manage all of the systems from one dashboard (again, Cockpit has to be installed on them all).  &lt;strong&gt;Cockpit&lt;/strong&gt; is the base install, with other packages to add functionality for storage, networking, pack manager, virtual machines, and containers.  After installation, browse to https://linux_ip:9090 to find the login screen for Cockpit.  Login using the same credentials you use to login to ssh.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install cockpit cockpit-storaged cockpit-networkmanager 
cockpit-packagekit cockpit-machines cockpit-podman
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210506_Cockpit_Dashboard.png#floatsmallright&#34; alt=&#34;Dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;Once logged in, the Dashboard is the information hub.  By default it shows processor, memory, network, and storage graphs.  From this screen you can also add additional servers to this instance of cockpit (the + button).  I have setup several servers on cockpit on my server, and the graph shows all of them.&lt;/p&gt;
&lt;p&gt;Click on the server name at the bottom of the Dashboard (or click the Host button on the side) to zoon in to instance specific information.  From here you can get hardware details or drill down into different areas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logs makes it easy to look through all the logs on the system.  For instance, I can query all the logs from the current session for &amp;ldquo;Alert and above&amp;rdquo; messages.  I can even match to a text pattern!  This is one of the easiest ways to quickly comb through Linux logs.&lt;/li&gt;
&lt;li&gt;Storage lets you dig into the details of the attached drives, including NFS mounts&lt;/li&gt;
&lt;li&gt;Networking shows utilizaiton graphs and critical parameters, such as IP&lt;/li&gt;
&lt;li&gt;Accounts shows all the accounts on the box.  It also allows you to add, change or delete accounts.  Password reset?  It&amp;rsquo;s a snap through here.&lt;/li&gt;
&lt;li&gt;Services shows all the running services, like Windows task manager.  You can rest stop or start services from here as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a software updates tab that makes it easy to keep everything up-to-date.  Click the update button and watch the progress bar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210510_Cockpit_Terminal.png#floatleft&#34; alt=&#34;Terminal&#34;&gt;
Finally, there&amp;rsquo;s built-in access to the console from the web interface.  If you are managing a server and there&amp;rsquo;s something that can&amp;rsquo;t be done from the GUI, just click the terminal tab and do it from the command line.&lt;/p&gt;
&lt;p&gt;If you have a group of devices, this is a great way to administer them from one console.  The log searching in particular is one of the best implementations I&amp;rsquo;ve seen.  More than that, you can quickly access the things you need in a &amp;ldquo;headless&amp;rdquo; environment such as adding accounts, confirming administrative details, or updating software.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll talk about automation in the future but there&amp;rsquo;s a need for an interactive way to manage servers and this compliments ansible nicely.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hugo Markdown Cheatsheet</title>
      <link>https://nextpertise.net/210424_hugo_markdown_cheatsheet/</link>
      <pubDate>Sat, 24 Apr 2021 12:42:56 -0400</pubDate>
      
      <guid>https://nextpertise.net/210424_hugo_markdown_cheatsheet/</guid>
      <description>&lt;p&gt;Markdown is a fantastic distraction-free way to write.  Using Markdown in VSCode is one of the things I like most about building this blog with Hugo.  It&amp;rsquo;s important to realize that the site CSS and Hugo shortcodes that are present play a big role in the way you write for the Hugo platform.  Those elements are usually included in the theme.  My theme is called &lt;em&gt;next&lt;/em&gt; and you can clone it from Github.&lt;/p&gt;
&lt;p&gt;This post is a reference for how to use Markdown with my CSS and shortcodes.  I built my own hugo theme and CSS because I wanted to understand how it all worked.  I don&amp;rsquo;t think that my setup is the fanciest, but you are welcome to clone it or fork it.  If you are new to Hugo, CSS, or HTML in general then my efforts are cleaner and probably more understandable than one of the advanced themes.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been doing this for nine months - pretty much the entire pandemic - and I&amp;rsquo;ve started to realize that I&amp;rsquo;ve forgotten some of the things I used months ago.  This document is therefore a reference for &lt;strong&gt;me&lt;/strong&gt;.  My career has never centered on HTML or CSS, so this has been an awesome learning opportunity.  &lt;a href=&#34;https://mikedane.com&#34;&gt;Mike Dane&lt;/a&gt; has some fantastic videos that helped me get started.&lt;/p&gt;
&lt;h2 id=&#34;basic-markdown&#34;&gt;Basic Markdown&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;quick&lt;/strong&gt; &lt;em&gt;brown&lt;/em&gt; &lt;strong&gt;&lt;em&gt;fox&lt;/em&gt;&lt;/strong&gt; jumped over the &lt;strike&gt;frog&lt;/strike&gt; &lt;mark&gt;lazy dog&lt;/mark&gt;.  Use the backslash to display literal symbols instead of processing them {}.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The &lt;span style=&#34;font-weight:bold&#34;&gt;__quick__&lt;/span&gt; &lt;span style=&#34;font-style:italic&#34;&gt;_brown_&lt;/span&gt; &lt;span style=&#34;font-style:italic&#34;&gt;__&lt;/span&gt;*fox*__ jumped over the {{\&amp;lt;strike &amp;#34;frog&amp;#34;&amp;gt;}} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{\&amp;lt;highlight &amp;#34;lazy dog&amp;#34;&amp;gt;}}.    Use the backslash to display literal 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;symbols instead of processing them \{}.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note that &amp;ldquo;\&amp;rdquo; literals appear in the shortcodes to force shortcode syntax display and are not used in production.  Double tildes &amp;ldquo;~~&amp;rdquo; can be used before and after to strikethorugh as well.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I picked up the shortcodes  for highlighting and strikethrough  from Ashish Lahoti at &lt;a href=&#34;https://codingnconcepts.com/hugo/&#34;&gt;codingconcepts.com&lt;/a&gt;, who has several interesting Hugo articles on his blog.&lt;/p&gt;
&lt;h2 id=&#34;lists&#34;&gt;Lists&lt;/h2&gt;
&lt;p&gt;Unnumbered and ordered list are easy and intuitive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bullet&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Numbered&lt;/li&gt;
&lt;li&gt;Example&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;*&lt;/span&gt; Bullet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;1.&lt;/span&gt; Numbered
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;2.&lt;/span&gt; Example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;headings&#34;&gt;Headings&lt;/h2&gt;
&lt;p&gt;Headings are created by successive hash symbols.&lt;/p&gt;
&lt;h1 id=&#34;heading-one&#34;&gt;Heading One&lt;/h1&gt;
&lt;h2 id=&#34;heading-two&#34;&gt;Heading Two&lt;/h2&gt;
&lt;h3 id=&#34;heading-three&#34;&gt;Heading Three&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# H1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## H2     
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### H3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;I usually use Heading one for the title and heading two inside an article.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;blockquotes&#34;&gt;Blockquotes&lt;/h2&gt;
&lt;p&gt;Block quotes are accomplished by tabs.  Consecutive lines are assumed to be a continuation.  You can also use the &amp;ldquo;greater than&amp;rdquo; sign to indicate a section is a blockquote.  When presenting this way add two spaces at the end of every line to indicate the following line is also a part of the block and a new line, otherwise it won&amp;rsquo;t respect returns.  You can also use multiple greater thans to create an indented section.  This comes in using my CSS Blockquote style.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a block quote.  “Two things are infinite: the universe and human stupidity; and I&amp;rsquo;m not sure about the universe.”
― Albert Einstein&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a indented block quote.  Because my CSS centers them, it looks a little wonky.  “Darkness cannot drive out darkness: only light can do that. Hate cannot drive out hate: only love can do that.”
― Martin Luther King Jr., A Testament of Hope: The Essential Writings and Speeches&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;and here&amp;rsquo;s the actual typed Markdown.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;This is a block quote.  “Two things are infinite: the universe and human stupidity; and I&amp;#39;m not sure about the universe.”
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;&lt;/span&gt;― Albert Einstein 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt; This is a indented block quote.  Because my CSS centers them, it looks a little wonky.  “Darkness cannot drive out darkness: only light can do that. Hate cannot drive out hate: only love can do that.”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;― Martin Luther King Jr., A Testament of Hope: The Essential Writings and Speeches 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;p&gt;Code can be accomplished a number of ways.  It can be surrounded by three ticks (`).  The easiest way to create a code block is to add a line to the block, then tab and add your code.  Leave a line after the block and the tabbed section will be treated as a code block.&lt;/p&gt;
&lt;h3 id=&#34;tick-block&#34;&gt;Tick block&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Print (&amp;#34;tick block&amp;#34;)
Print (&amp;#34;using three ticks before and after&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```
Print (&amp;quot;tick block&amp;quot;)
Print (&amp;quot;using three ticks before and after&amp;quot;)
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;tab-block&#34;&gt;Tab block&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Print (&amp;quot;tick block&amp;quot;)
Print (&amp;quot;using three ticks before and after&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and here&amp;rsquo;s what that looks like - line before and after, tabbed block.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 
          Print (&amp;quot;tick block&amp;quot;)
          Print (&amp;quot;using three ticks before and after&amp;quot;)
 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;non-printing-characters&#34;&gt;Non-printing characters&lt;/h3&gt;
&lt;p&gt;You can also make this work with non-printing characters as demonstrated below.  Pretty weak approach, but sometimes I don&amp;rsquo;t have a better way to make columns line up.&lt;/p&gt;
&lt;p&gt;          non-printing characters were used to indent this line . . .&lt;/p&gt;
&lt;h2 id=&#34;tables&#34;&gt;Tables&lt;/h2&gt;
&lt;p&gt;Tables are created using a table shortcode as demonstrated below.




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table: Demonstration&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Letters&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Numbers&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Symbols&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;A&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;B&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;C&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;Ignore the backslashes below - the shortcut kicks in when displaying if I leave them out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\{\{\&amp;lt; bootstrap-table table_class=&amp;#34;table table-responsive table-hover&amp;#34; thead_class=&amp;#34;table-info&amp;#34; caption=&amp;#34;Table: Demonstration&amp;#34; \&amp;gt;\}\}  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| Letters | | Numbers | | Symbols  |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|:-----:|:--:|:-----|-|-----|  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| A |  | 0   | | \* |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| B |  | 1 | | $ |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| C |  | 2 | | % |   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\{\{\&amp;lt;/bootstrap-table&amp;gt;\}\}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I copied the shortcode for bootstrap tables from &lt;a href=&#34;https://mybluelinux.com&#34;&gt;MyBlueLinux&lt;/a&gt;.  I&amp;rsquo;m not sure who the author is, but they are interested in many of the same things I am - networking, Linux, and so on.  Readers of my blog would probably enjoy this site as well.
&lt;img src=&#34;https://nextpertise.net/gns3.png#floatsmallright&#34; alt=&#34;GNS3&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;links-and-images&#34;&gt;Links and Images&lt;/h2&gt;
&lt;p&gt;Links in Markdown are formatted as shown below for &lt;a href=&#34;https://gns3.com&#34;&gt;GNS3&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;GNS3&lt;/span&gt;](&lt;span style=&#34;color:#a6e22e&#34;&gt;https://gns3.com&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Images in markdown are formatted similarly to links, but start with an exclamation.  The code to bring in the GNS3 symbols is shown below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\![GNS3]\(/gns3.png#floatsmallright)  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My CSS supports the following directives - these are all dynamic and change the image size based on the window size, which gives a much cleaner look.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;floatsmallright&lt;/li&gt;
&lt;li&gt;floatsmallleft&lt;/li&gt;
&lt;li&gt;floatright&lt;/li&gt;
&lt;li&gt;floatleft&lt;/li&gt;
&lt;li&gt;center&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m not sure where I copied this idea from (God bless open source and github!).  You can find this in the next theme style.css in my Github account, along with all the shortcodes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 Attached to ESXi</title>
      <link>https://nextpertise.net/210421_gns3_attached_to_esxi/</link>
      <pubDate>Wed, 21 Apr 2021 20:11:14 -0400</pubDate>
      
      <guid>https://nextpertise.net/210421_gns3_attached_to_esxi/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210421_GNS3-30.png#floatsmallleft&#34; alt=&#34;VLAN Setup&#34;&gt;&lt;/p&gt;
&lt;p&gt;I got a little distracted.  I have been coming up to speed on Ansible, which got me started on Vagrant.  Vagrant got me building VMs in VMWare Workstation , which got me thinking how neat it would be to place those &lt;em&gt;automagically&lt;/em&gt; into my GNS3VM environment hosted on ESXi.  Didn&amp;rsquo;t get that far - yet  - but the progress I made is pretty cool in it&amp;rsquo;s own right.&lt;/p&gt;
&lt;p&gt;Most GNS3 users are using a GNS3 VM to host their topologies.  Mine sits on an ESXi server.  I discussed a few days ago how to connect GNS3 into a network (see &lt;a href=&#34;https://nextpertise.net/posts/210417_connecting_gns3/&#34;&gt;Connecting GNS3&lt;/a&gt;. Here I want to do something more complex - I&amp;rsquo;d like to connect ESXi instances into arbitrary points in a GNS3 network.  The topology will still have a connection &amp;ldquo;out&amp;rdquo; to the home network and Internet, but I want to add an ESXi VM &amp;ldquo;inside&amp;rdquo; the network as well.&lt;/p&gt;
&lt;p&gt;The approach I used was to attach the VMs into an ESXi VSwitch VLAN and then use additional cloud appliances to attach those VLAN into the GNS3 topology.  &lt;em&gt;This seems obvious in retrospect&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;setup-on-esxi&#34;&gt;Setup on ESXi&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210422_GNS3Shell.png#floatsmallright&#34; alt=&#34;Alt&#34;&gt;
The first step is to go onto the VMWare ESXi server and create a new VLAN on the vSwitch.  From the ESXi management interface, select the networking tab and &amp;ldquo;add port group&amp;rdquo;.  I created VLAN 30 and called it &amp;ldquo;GNS3-30&amp;rdquo; and assigned it to my default virtual switch (vSwitch0).&lt;/p&gt;
&lt;h2 id=&#34;setup-the-gns3vm&#34;&gt;Setup the GNS3VM&lt;/h2&gt;
&lt;p&gt;Next I went to the GNS3vm VMWare properties and added an interface.  The interface will attach to the VM &amp;ldquo;live&amp;rdquo;, but you&amp;rsquo;ll need to go into the GNS3vm to configure it before it can be used.&lt;/p&gt;
&lt;p&gt;To setup the interface, login and choose &amp;ldquo;Shell&amp;rdquo; from the main menu.  The interface needs to be added to &lt;strong&gt;netplan&lt;/strong&gt;.  I ended up adding two interfaces (more fun!) and also took the chance to set a static IP for my server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /etc/netplan  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano 90_gns3vm_static_netcfg.yaml  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the edited YAML file I&amp;rsquo;m using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;network&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;renderer&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;networkd  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ethernets&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;eth0&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;addresses&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;192.168.25.52&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;/24]  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;gateway4&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;192.168.25.1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;nameservers&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;addresses&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.8.8&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;8.8.4.4&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;eth1&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;eth2&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;dhcp4&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;no&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When I did this step, it replaced the existing eth0 on the GNS3VM and made my old interface eth1.  This disconnected the VM because the IP information was associated with eth0.  I diagnosed this by using the VMWare interface and the &lt;em&gt;ifconfig&lt;/em&gt; command on the GNS3VM to identify and associate names and MAC addresses, but it took a little time to understand what happened.  I&amp;rsquo;m still not sure why, but be alert for this issue if you add an interface.  My Internet GNS3 cloud appliance had to be disconnected (you cannot add interfaces to a cloud with existing connections), eth1 added, and reconnected to get it to work.&lt;/p&gt;
&lt;h2 id=&#34;adding-to-gns3-topology&#34;&gt;Adding to GNS3 Topology&lt;/h2&gt;
&lt;p&gt;Recall from &lt;a href=&#34;https://nextpertise.net/posts/210417_connecting_gns3/&#34;&gt;Connecting GNS3&lt;/a&gt; that I&amp;rsquo;ve setup my home network to expect a GNS3 border router at 192.168.25.82 and it will be the route to 192.168.28.0/22.  In this simplest case, I&amp;rsquo;m attaching another interface on that same router to a different vSwitch VLAN and routing between them.  I &lt;em&gt;could&lt;/em&gt; have put the new VLAN deep in the GNS3 topology.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210422_AddingACloud.png#center&#34; alt=&#34;Setup in GNS3&#34;&gt;&lt;/p&gt;
&lt;p&gt;So pause before this next paragraph.  Recall that there are three contexts, one physical, one in terms of the ESXi vSwitch, and one inside GNS3.&lt;/p&gt;
&lt;p&gt;Attaching a new cloud (in GNS3) that uses the GNS3VM interface (in the vSwitch context) attached to the new VLAN (in my case, eth0 -&amp;gt; VLAN30) will bring that new network into the virtual lab.&lt;/p&gt;
&lt;p&gt;At this point I attached a Windows VM to the new VLAN and set it&amp;rsquo;s interface to DHCP.  I connected the cloud to the virtual router (in GNS3), setup the interface, and added DHCP server capability.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;int g0/2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ip add 192.168.30.1 255.255.255.224  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip dhcp pool GNS3  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  network 192.168.30.0 /27  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I can verify that this works inside the Windows VM, and by verifying that an IP has been assigned from the router.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Router1# __sh ip dhcp bindings__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Bindings from all pools not associated with VRF:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IP address   Client-ID/        Lease expiration    Type
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             Hardware address/  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             User name  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.30.2 0100.0c29.e965.fd Apr 30 2021 12:05 AM  Automatic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;d really like to be able to &lt;strong&gt;Vagrant up&lt;/strong&gt; straight into GNS3.  I&amp;rsquo;m not even sure why, except that it would be cool.  Right now I can build a VM on Workstation, transfer it to ESXi and place it in the VLAN and thus in the GNS3 topology.&lt;/p&gt;
&lt;p&gt;I can easily extend the vSwitch VLAN to my home network, but for this to really work I&amp;rsquo;ll need to implement a trunk to my desktop and be able to place Workstation VMs into the VLAN.&lt;/p&gt;
&lt;p&gt;One of the things I love about GNS3 is that it pushes me to understand things and learn new techniques.  I&amp;rsquo;ll work on that as I have time in the days ahead.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Connecting GNS3 to Real Networks</title>
      <link>https://nextpertise.net/210417_connecting_gns3/</link>
      <pubDate>Sat, 17 Apr 2021 10:48:58 -0400</pubDate>
      
      <guid>https://nextpertise.net/210417_connecting_gns3/</guid>
      <description>&lt;p&gt;I mentioned a month or so ago that I wanted to set out on a journey to create a set of template networks and then substitute in the various appliances that are supported under GNS3.  The idea is to start with Cisco, which I know best, and then explore the differences.  I&amp;rsquo;m still really excited about that but . . .  life.  So we&amp;rsquo;re off to a slow start.  I&amp;rsquo;m going to break down some of the topics into smaller pieces so I can keep that project moving forward.  First up - how to connect you GNS3 lab environment to a &amp;ldquo;real&amp;rdquo; network.&lt;/p&gt;
&lt;h2 id=&#34;current-lab-state&#34;&gt;Current Lab State&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210417_labinprogress.png#floatright&#34; alt=&#34;GNS3 Lab state&#34;&gt;
My home network is built using Meraki gear.  That&amp;rsquo;s not a typical home setup, but I was supporting a lot of Meraki for a while and it was a good way to &amp;ldquo;eat the dogfood&amp;rdquo;.  I divide the home into subnets so that high risk devices (IoT, kids computers) are isolated.  I have an ESXi server that hosts my GNS3 VM, but I haven&amp;rsquo;t switched over to the web client yet.  I&amp;rsquo;m still using the GNS3 front end running on PopOS!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a diagram of the lab I&amp;rsquo;m building.  In this first step we want to use 192.168.28.0/22 for our GNS3 environment and communicate from it to the local network and the Internet.&lt;/p&gt;
&lt;h2 id=&#34;attaching-the-cloud&#34;&gt;Attaching the Cloud&lt;/h2&gt;
&lt;p&gt;My local network is represented by &amp;ldquo;Cloud1&amp;rdquo;.  I placed this into the lab and attached a connection to the virtual Cisco router.  I chose the G0/1 interface when I placed the connection, but this can later be found by hovering over the virtual router in GNS3.  You can label connections in GNS3 by clicking the &amp;ldquo;Show/Hide Inteface Labels&amp;rdquo; button.  In this case I just placed some text.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210417_LocalRouting.png#floatleft&#34; alt=&#34;Understanding Local Routing&#34;&gt;&lt;/p&gt;
&lt;p&gt;The Meraki device isn&amp;rsquo;t really within the GNS3 topology, it&amp;rsquo;s just a link to the Meraki Dashboard.  It&amp;rsquo;s convenient to have this easily accessible - refer to &lt;a href=&#34;https://nextpertise.net/posts/210113_gns3_links/&#34;&gt;Adding Hyperlinks to GNS3 Topologies&lt;/a&gt; for a walk through on how to do that.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-routing&#34;&gt;Setting up routing&lt;/h2&gt;
&lt;p&gt;My &amp;ldquo;real&amp;rdquo; Meraki router knows how to reach all the local VLANs because it&amp;rsquo;s directly attached to each of them.  It&amp;rsquo;s going to need to know how to reach the lab environment.  This is done under &amp;ldquo;Security &amp;amp; SD-WAN&amp;rdquo; &amp;gt; &amp;ldquo;Addressing and VLANs&amp;rdquo;.  At the bottom of that page is a place for static routes.  Identify an IP on the local network that you&amp;rsquo;ll use for the virtual router and then add a static route.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210417_MerakiStatic.png#floatleft&#34; alt=&#34;Meraki Static Route&#34;&gt;&lt;/p&gt;
&lt;p&gt;I added a route to 192.168.28.0/22 going to the virtual router.  Even though I&amp;rsquo;m setting up a simple switching lab, giving a block of addresses to the lab means that I won&amp;rsquo;t have to revisit this process when we start talking about more complicated networks.&lt;/p&gt;
&lt;p&gt;The virtual router needs a default route pointing to the home router.  It&amp;rsquo;s also worth noting that I&amp;rsquo;m &lt;strong&gt;not&lt;/strong&gt; using a DHCP address for the virtual router.  You can do this and it &lt;em&gt;will&lt;/em&gt; work, but the address will change with each reboot and you&amp;rsquo;ll need to update the router configuration constantly.  Another option would be to use DHCP and a routing protocol.  This might be more of an option with another home router, but the Meraki is particularly weak in supporting dynamic routing.  Finally, I put an address on the inside of the virtual router.&lt;/p&gt;
&lt;p&gt;The following output has been edited for brevity, but shows the added commands and the test ping to Google.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Router# sh run  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname Router  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;interface GigabitEthernet0/0  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ip address 192.168.28.1 255.255.255.0  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; interface GigabitEthernet0/1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ip address 192.168.25.82 255.255.255.0  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;!  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip route 0.0.0.0 0.0.0.0 192.168.25.1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Router#ping __8.8.8.8__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type escape sequence to abort.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;!!!!!  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Success rate is 100 percent (5/5), round-trip min/avg/max = 20/25/29 ms  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We also want to verify that traffic is flowing from the Internet into our virtual GNS3 lab environment.  To do this I&amp;rsquo;ll source a ping from the G0/0 interface.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Router# ping  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Protocol [ip]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Target IP address: 8.8.8.8  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Repeat count [5]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Datagram size [100]:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Timeout in seconds [2]:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Extended commands [n]: y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ingress ping [n]:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source address or interface: 192.168.28.1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type of service [0]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set DF bit in IP header? [no]:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Validate reply data? [no]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Data pattern [0x0000ABCD]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Loose, Strict, Record, Timestamp, Verbose[none]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sweep range of sizes [n]:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type escape sequence to abort.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Packet sent with a source address of 192.168.28.1   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;!!!!!  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Success rate is 100 percent (5/5), round-trip min/avg/max = 20/27/31 ms  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Router#
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-1-complete&#34;&gt;Step 1 complete&lt;/h2&gt;
&lt;p&gt;Our lab environment is reachable from the local network and it can reach out to the public Internet as needed at this point.  The next step will be to setup the switches!&lt;/p&gt;
&lt;h2 id=&#34;play-along-at-home&#34;&gt;Play along at home&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s an associated Github repository for these labs (brentstewart/gns3labs).  So far it just has this initial version of the switching lab in it.  The topology is there, but it doesn&amp;rsquo;t have configurations anything other than the router.  I&amp;rsquo;ll continue to refine this lab and add more labs to that repository as we continue this adventure.  Please clone the repo and work these with me!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CPUFetch</title>
      <link>https://nextpertise.net/210413_cpufetch/</link>
      <pubDate>Tue, 13 Apr 2021 17:50:03 -0400</pubDate>
      
      <guid>https://nextpertise.net/210413_cpufetch/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210413_lscpu.png#floatright&#34; alt=&#34;LSCPU Output&#34;&gt;
I don&amp;rsquo;t have to check CPU statistics very often, but occassionally I need to remember details like how many cores I have.  The traditional way to get CPU information in Linux is to use &lt;strong&gt;lscpu&lt;/strong&gt;.  Here&amp;rsquo;s the top of the output on my desktop.  I&amp;rsquo;ve truncated the picture - the output is a full page or two of details about your CPU and it&amp;rsquo;s capabilities.  You can also &lt;strong&gt;cat /proc/cpu&lt;/strong&gt;, which has similar info, or list hardware with &lt;strong&gt;lshw&lt;/strong&gt;.  &lt;strong&gt;lshw&lt;/strong&gt; provides a &lt;em&gt;lot&lt;/em&gt; of output, so you can filter that down with &lt;strong&gt;lshw -class CPU&lt;/strong&gt;.  All of these options work, but they vary from cluttered to hard-to-read.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210413_cpufetch.png#floatleft&#34; alt=&#34;CPUFetch&#34;&gt;
I came across a fun utility to do the same thing, but prettier.  CPUfetch doesn&amp;rsquo;t display the same level of detail, but it pulls the most interesting pieces.  It&amp;rsquo;s actually a little clearer and easier to read because it doesn&amp;rsquo;t have as much detail.  With the pretty logo to the left I assume the name is a nod to Neofetch, a utility I build in to my &lt;strong&gt;.bashrc&lt;/strong&gt; to show on startup and use all the time.&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t solve a lot of problems, but it is kinda cool.  If you agree, check it out on Github.  To install, clone the repository and &lt;strong&gt;make&lt;/strong&gt; the executable.  I put all my repos in a single directory to organize them, a practice I suggest.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Dr-Noob/cpufetch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd cpufetch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./cpufetch  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It will also compile on Android, Windows and MacOS, if you&amp;rsquo;re into that kinda thing.  The readme at github has some other sample pictures and some ways to modify the output.  Have fun!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using the SSH client config file</title>
      <link>https://nextpertise.net/210402_ssh_config/</link>
      <pubDate>Fri, 02 Apr 2021 15:40:47 -0400</pubDate>
      
      <guid>https://nextpertise.net/210402_ssh_config/</guid>
      <description>&lt;p&gt;This article continues a series of articles I&amp;rsquo;ve done on SSH.  We&amp;rsquo;ve used the server configuration file (sshd_config) to set parameters, but many folks do not realize that there is a client configuration file as well.  In fact, ssh uses command line options, then the &lt;em&gt;client&lt;/em&gt; file, then the server file when building the capabilities of a new connection.&lt;/p&gt;
&lt;h2 id=&#34;simple-example&#34;&gt;Simple Example&lt;/h2&gt;
&lt;p&gt;The file is a plain text file found in &lt;strong&gt;~/.ssh&lt;/strong&gt;.  It doesn&amp;rsquo;t exist by default, so a new file with that name needs to be created.  The simplest version of an ssh config file looks something like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host server  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname 10.1.1.1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user brent  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even at this stage, this is beneficial.  We can use the &lt;strong&gt;host&lt;/strong&gt; to resolve a name, so even without DNS we don&amp;rsquo;t have to remember IPs.  Because the user is specified we can now simplify our ssh command to: &lt;strong&gt;ssh server&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I am often moving between locations and don&amp;rsquo;t have access to internal DNS.  I can share this file between my desktop and laptop and ease some of the memorization required to move through the environment.&lt;/p&gt;
&lt;h2 id=&#34;what-else-can-we-do&#34;&gt;What Else Can We do?&lt;/h2&gt;
&lt;p&gt;Building on the previous example, we can also specify a non-standard port or a specific key.  We can add additional hosts as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host server  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname 10.1.1.1  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user root  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host server2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname 10.2.2.2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user vagrant  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;localforward &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt; 10.1.1.1:2222
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host home    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname 192.168.1.10  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user brent 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This example includes three servers.  The first now uses a non-standard port.  The second is setup to forward tcp traffic on 2222 to the first server.  Each has a different username specified.&lt;/p&gt;
&lt;p&gt;Other examples of additional commands can be found in the OpenSSH documentation (referenced below).&lt;/p&gt;
&lt;h2 id=&#34;wildcards&#34;&gt;Wildcards&lt;/h2&gt;
&lt;p&gt;The last complication I&amp;rsquo;ll add is to add the following to the config file above.  Wildcards allow us to specify things that apply to multiple hosts.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host serv*  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;identityfile server_id_rsa  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host *  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ForwardX11Trusted yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Connecting to &amp;ldquo;server&amp;rdquo; will now pull in the the key file and X11 command.  For &amp;ldquo;home&amp;rdquo; only the X11 forwarding would be added.&lt;/p&gt;
&lt;p&gt;These days we&amp;rsquo;re connecting to local servers with one set of credentials and cloud hosts with a different set.  Often there&amp;rsquo;s some specific options that have to be used when connecting to the cloud host - to specify a keyfile for instance.  Particularly given the complication of managing cloud assets, the client config file can be an important tool.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll close by discussing security.  Building an ssh client config file can make life easier and there&amp;rsquo;s a natural desire to share that work in a team.  This is probably safe, assuming that servers are locked down with something more than passwords.  Reference my article on &lt;a href=&#34;https://nextpertise.net/posts/200812_using_ssh2&#34;&gt;PAM changes&lt;/a&gt; if you are interested in that.  If you are managing a large environment, it&amp;rsquo;s probably good to think about some centralized authentication (like sssd) so that you can quickly update credentials.  The config file - by itself - doesn&amp;rsquo;t compromise security except for allowing an outsider to &amp;ldquo;case the joint&amp;rdquo;.  Still, I&amp;rsquo;d suggest handling the config file conservatively and limiting distribution.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rational Change Control</title>
      <link>https://nextpertise.net/210318_changecontrol/</link>
      <pubDate>Wed, 17 Mar 2021 19:42:22 -0400</pubDate>
      
      <guid>https://nextpertise.net/210318_changecontrol/</guid>
      <description>&lt;p&gt;Nobody likes change but a baby.  That&amp;rsquo;s the saying anyway.  Yet in IT, we have to deal with constant change.  Not only that, we have to manage it to minimize risk and harm.  &lt;strong&gt;And&lt;/strong&gt; we have to balance the natural tendency to manage through bureaucracy against the need to get things done without paperwork getting in the way.&lt;/p&gt;
&lt;p&gt;This article isn&amp;rsquo;t about why you need change control: &lt;strong&gt;you do&lt;/strong&gt;.  It&amp;rsquo;s not about the value of ITIL or ticketing: &lt;strong&gt;they&amp;rsquo;re necessary&lt;/strong&gt;.  But if you&amp;rsquo;re going to turn this &amp;ldquo;computer-thing&amp;rdquo; into a career, you need to figure out change control and that&amp;rsquo;s what this article is about.&lt;/p&gt;
&lt;p&gt;A lot of my thinking on this topic comes from working with people like Dan and Umesh.  These are thoughts that we developed together and made work, and that&amp;rsquo;s why I feel confident recommending them to you.&lt;/p&gt;
&lt;h2 id=&#34;planning-and-oversight&#34;&gt;Planning and oversight&lt;/h2&gt;
&lt;p&gt;Change control documentation needs to layout the change for review.  Review is not a second-guessing session, although if you propose something stupid it can be.  Good change review is going to make sure that the plan makes sense, that the right people are notified, that there are no conflicts with other IT changes or business requirements, and that the appropriate level of specificity is present in the docs.&lt;/p&gt;
&lt;p&gt;The right level of specificity . . . that sounds tricky.  Generally, I&amp;rsquo;ve found that proposed changes fall into three piles.  The easy pile really doesn&amp;rsquo;t need to be reviewed, it just needs a little documentation.  The medium pile needs a little review, perhaps by a manager, and a little more verbiage in the docs.  The hard pile needs a lot of careful thought and benefits from a collaborative and thorough review.  It needs to be reviewed at several stages, including by a Change Advistory Board.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210321_Change_Matrix.png#floatsmallleft&#34; alt=&#34;Change Matrix&#34;&gt;&lt;/p&gt;
&lt;p&gt;The table on the left is the one that I&amp;rsquo;ve developed and used.  Changes are described by risk and asset criticality.&lt;br&gt;
&lt;strong&gt;Risk&lt;/strong&gt; – risk is subjective from the perspective of the person performing the change. What is not risky for you might be more risky for me.&lt;br&gt;
• Low – I’ve done this a million times and it always works. There is a redundant system and backout plan.&lt;br&gt;
• Medium – I’ve done this a few times and it usually works. There is a redundant system and backout plan.&lt;br&gt;
• High – I don’t have a lot of experience OR there isn’t a redundant system or backout process that meets the availability budget.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asset Criticality&lt;/strong&gt; – This is defined per CI or environment. Availability budget is an SRE concept that specifies the target availability based on budgeting and does not include regular scheduled downtime. The exact AB percentages and how they are measured will change based on the environment, but they might look something like this.&lt;br&gt;
• Low – interruption or loss impact one or a small number of non-critical systems/users at non-critical times&lt;br&gt;
• Medium – interruption or loss impacts ability to conduct business (availability budget &amp;gt;98%)&lt;br&gt;
• High – an interruption or loss of this system would impact clients (availability budget &amp;gt; 99.99%)&lt;/p&gt;
&lt;p&gt;Yes, this ranking is a little arbitrary.  My experience is that having an overly complicated system leads to folks using the system to justify making changes &amp;ldquo;less critical&amp;rdquo;.  A simpler system trusts the engineers more and they typically respond to that trust with more conservative assessments.  That said, if nothing bad happens then changes will be viewed as less risky over time.  One important component is that the CAB needs to review a sample of non-critical changes and push back by calling out some examples of mis-classified changes.&lt;/p&gt;
&lt;h2 id=&#34;documentation-and-review&#34;&gt;Documentation and review&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210321_Change_Control.png#floatsmallright&#34; alt=&#34;Change Matrix&#34;&gt;&lt;/p&gt;
&lt;p&gt;CAB documentation needs the full kit and caboodle and here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt;  Why is this change necessary?  What is being done (in 20 words or less)?&lt;br&gt;
&lt;strong&gt;Basics:&lt;/strong&gt; Who is doing the work?  What is the proposed change window?  &lt;strong&gt;NOTE&lt;/strong&gt;: I recommend that a change window include recovery time.  If that&amp;rsquo;s not known, I generally allocate 1/3 of the window for the change, 1/3 for the troubleshooting, and 1/3 for backout.  In a complicated change, I actually script steps and expected time of completion for each, plus have a hard fail-back moment.&lt;br&gt;
&lt;strong&gt;Affected devices (CIs):&lt;/strong&gt; Which pieces are being changed?&lt;br&gt;
&lt;strong&gt;Risk of Change:&lt;/strong&gt; If we go forward, what&amp;rsquo;s the worst that could happen?&lt;br&gt;
&lt;strong&gt;Risk of NOT making the change:&lt;/strong&gt; &lt;em&gt;Ah&lt;/em&gt;, here&amp;rsquo;s an important point.  In IT there is often risk in making a change, but if you DON&amp;rsquo;T apply that patch you are vulnerable.  If you DON&amp;rsquo;T upgrade, power supplies fail.  Stuff will happen and it&amp;rsquo;s important to point out that sitting on our hands won&amp;rsquo;t save us.&lt;br&gt;
&lt;strong&gt;Impact:&lt;/strong&gt;  Describe the impact &lt;em&gt;assuming everything goes as planned&lt;/em&gt;.  For instance, the plan is to upgrade an OS which will require a reboot.  Users will &lt;em&gt;at minimum&lt;/em&gt; see an impact for minutes while the device reboots.&lt;br&gt;
&lt;strong&gt;Details:&lt;/strong&gt; This section is a breakdown of the steps involved.  The level of detail has to be worked out in each organization, but I generally find that it needs to be detailed enough that multiple people familiar with the equipment could read the doc and would interpret it similarly and complete the same steps.  Using the exact commands can be good, but it&amp;rsquo;s best to be a little vague so that a missed detail doesn&amp;rsquo;t require another change control document.&lt;br&gt;
I like to breakdown the activity into three areas.  Pre-downtime and Downtime cover the preparation and the activity during the change window.  These steps also need to describe how the change will be tested.  Backout Plan talks about steps to be taken if it doesn&amp;rsquo;t go well.  Each of these steps need to include communications - who will be notified and when will they be notified?&lt;/p&gt;
&lt;p&gt;In my opinion, CAB level changes should be previewed by the manager to prevent wasting the Boards&amp;rsquo; time.  The manager should also review the result to ensure it meets the commitment.  Less complicated changes don&amp;rsquo;t need this level of detail.  &amp;ldquo;Medium&amp;rdquo; changes can usually focus on the details and just be approved by a manager.&lt;/p&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;Change systems are about organizing people and getting them to talk to one another.  They&amp;rsquo;re also about holding folks accountable for a professional level of forethought.  Notice that I didn&amp;rsquo;t say results - we all recognize that even the best planned and most predictable upgrades can go sideways without it being someone&amp;rsquo;s fault.  But if the right kind of thought process was used, we&amp;rsquo;re equipped to recognize the problems and correct them, or at least escape unharmed.&lt;/p&gt;
&lt;p&gt;Similarly, making sure that the right people are consulted and updated means that these little &amp;ldquo;oops&amp;rdquo; moments become events that generate &lt;em&gt;more&lt;/em&gt; trust.  Imagine a VIP saying, &amp;ldquo;You told me something might happen, when it did you were prepared for it and kept me in the loop, and harm was minimize because of the thoughtful approach.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I like to say that a good change process is like a victory lap - all the hard work is done before the change ever starts.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Making a Memorial DVD</title>
      <link>https://nextpertise.net/210308_kdenlive/</link>
      <pubDate>Mon, 08 Mar 2021 21:59:17 -0500</pubDate>
      
      <guid>https://nextpertise.net/210308_kdenlive/</guid>
      <description>&lt;p&gt;A good friend lost his father to COVID last week.  It was unexpected - he was only about 60 and in good health.  My friend asked for help putting together a memorial DVD.  Perhaps you&amp;rsquo;ve seen these - at a receiving in the US it&amp;rsquo;s common these days to find a TV that displays a collection of pictures of the deceased, perhaps with some background music.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have any special expertise in Video and I didn&amp;rsquo;t have long to figure it out.  If you&amp;rsquo;re in a similar situation then 1) leave a note in the comments and I&amp;rsquo;ll pray for your friends family and 2) here are some quick and dirty instructions that will let you be of service.&lt;/p&gt;
&lt;h2 id=&#34;gathering-input&#34;&gt;Gathering input&lt;/h2&gt;
&lt;p&gt;I received a collection of sixty photos, a few digital pictures, as well as some MP3 files that were some of his Dad&amp;rsquo;s favorites.  I scanned all the pictures in as JPG at 300 dpi and put them in a directory with the MP3s.  I used GIMP to crop the photos.  I originally left the white borders around some pictures, but later found this created artifacts on the slideshow and re-edited to crop to just the picture.  I found the obituary online for some of the details I would need for the title page.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install gimp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;creating-the-dvd&#34;&gt;Creating the DVD&lt;/h2&gt;
&lt;p&gt;This section isn&amp;rsquo;t a software recommendation.  I wanted something that I could quickly understand and that wasn&amp;rsquo;t overly complicated to use.  I tried a few video editors and quickly picked kdenlive.  Even though I&amp;rsquo;m using Pop!OS Gnome, kdenlive worked fine.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install kdenlive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By default, kdenlive shows two video tracks and two audio tracks.  I deleted the extra tracks.  Right clicking in the resources box (below the file menu) allowed me to import the audio files and an &lt;em&gt;image sequence&lt;/em&gt;.  The image sequence importer allowed me to bring in a group of pictures in the same format from a single directory.  The picture files I received were PNG, so I used GIMP to convert them and then imported the entire set of pictures from the working directory.  The image sequence sorts by default to alphabetical order.  I had been given the pictures in rough chronological order and numbered them as they scanned, so they were already in the right order and I didn&amp;rsquo;t have to spend a lot of time.  I was lucky, but I definitely suggest that technique if you need to make this on short notice.&lt;/p&gt;
&lt;p&gt;The image sequence import allows you to specify how long each picture displays as well.  These DVDs are typically played in the background where they provide a distraction to folks in the receiving line and I wanted it to have enough tempo so it wouldn&amp;rsquo;t be boring.  I decided to change photos every 10 seconds and this turned out to be well received.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210308_kdenlive.png#center&#34; alt=&#34;The Memorial DVD&#34;&gt;&lt;/p&gt;
&lt;p&gt;I created a title by right clicking in the resource box and &amp;ldquo;adding title clip&amp;rdquo;.  This gave me a PowerPoint-like interface where I could add some text.   In this case, I created a simple title with the name, birth date and date of death.  It also let me specify how long it would display.&lt;/p&gt;
&lt;p&gt;Dragging the image sequence or the title onto the video track (&amp;ldquo;V1&amp;rdquo;) blocked off a period of time and labeled it &amp;ldquo;Image Sequence&amp;rdquo;.  Sixty photos displayed for 10 seconds each gives ten minutes of video, so I dragged out a few more copies of the Image Sequence to fill out the DVD.  I left a brief black screen between sequences, then a copy of the title to show the name of the deceased, before restarting the slide show.&lt;/p&gt;
&lt;p&gt;Dragging the audio files onto the audio track (&amp;ldquo;A1&amp;rdquo;) was a similar process.  I simply dragged enough songs to cover the time, leaving brief spaces between.  I was able to watch the video and I paid special attention to the transitions to make sure they were clean and not distracting.  I &lt;em&gt;think&lt;/em&gt; kdenlive will handle fancy image transitions but I elected not to spend too much time on them.  I had a day to put this together and the &amp;ldquo;plain vanilla&amp;rdquo; transitions were respectful and not distracting.&lt;/p&gt;
&lt;p&gt;At this point you can go to &lt;strong&gt;Project &amp;gt; Render&lt;/strong&gt; to compile the ensemble to an ISO file.  Here I hit another problem - I don&amp;rsquo;t have a DVD burner!  I have an old laptop running Linux, so I used SFTP to transfer the file to it and used brasero to burn the DVD.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install brasero
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Last step!  I dug out an old DVD player to verify that the burned DVD would read okay.  It did and the resulting display looked sharp and clean.  I burned a copy for the funeral, and extras for my friend and his siblings.&lt;/p&gt;
&lt;h2 id=&#34;the-reception&#34;&gt;The Reception&lt;/h2&gt;
&lt;p&gt;This was a rush job by an stark amatuer, but the result was appreciated by the family.  I want to the thank the folks at kdenlive - it&amp;rsquo;s a slick program, worked reliably, and was easy to pick up.  The DVD I made probably was more of a credit to their hard work and gift to the community than to my contribution.  That said, this is a doable project.  I could see this idea being a nice feature at an anniversary or birthday party, or even at a company Christmas party.  If you have the opportunity to be of service in this way, I hope this walk through will be a beneficial introduction.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tsukae - A tool for graphing command usage</title>
      <link>https://nextpertise.net/210306_tsukae/</link>
      <pubDate>Sat, 06 Mar 2021 22:59:08 -0500</pubDate>
      
      <guid>https://nextpertise.net/210306_tsukae/</guid>
      <description>&lt;p&gt;Readers may recall that six months ago I wrote about the &lt;a href=&#34;https://nextpertise.net/posts/200817_mostcommonlinuxcommand/&#34;&gt;most commonly used Linux commands&lt;/a&gt;.  I had seen a series of articles with that title and decided to see what my most common commands were.  I suggested the following as a way to pull command history and count usage.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;history | awk ‘&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;print $2&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;’ | sort | uniq -c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/irevenko/tsukae&#34;&gt;Tsukae&lt;/a&gt; is a much better way to accomplish this task.  It&amp;rsquo;s much simpler and can produce the output in Bar or Pie chart, or as a list.  Tsukae is written by Ilya Revenko and can be cloned from GitHub.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/tsukae.gif&#34; alt=&#34;Tsukae Demo&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;installing-tsukae&#34;&gt;Installing Tsukae&lt;/h2&gt;
&lt;p&gt;Tsukae needs Go to run (&lt;strong&gt;apt install golang-go&lt;/strong&gt;).  Once cloned, just go into the directory and build the executable.  Tsukae expects a &lt;em&gt;blacklist&lt;/em&gt; file to be present at &lt;em&gt;~/.config/tsukae/blacklist&lt;/em&gt;.  &lt;del&gt;This may be created automatically in future releases, but I got an error when I first ran the program and so created the file myself.&lt;/del&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/irevenko/tsukae.git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd tsukae  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go get -d ./...  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~~mkdir ~/.config/tsukae  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch blacklist~~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Update!&lt;/strong&gt;  I posted an issue for the above on GitHub and the author published an update today to fix.  I tested it and confirmed it resolved the issue.  This is a great example of the power of GitHub - everyone contributes in whatever way they can, and all contributions are appreciated.  In my case, by suggesting an improvement and helping test.  It&amp;rsquo;s why I continue to recommend that everyone participate in that community.  And thanks again to Ilya!&lt;/p&gt;
&lt;h2 id=&#34;running-tsukae&#34;&gt;Running Tsukae&lt;/h2&gt;
&lt;p&gt;When you run Tsukae you must specify the shell, as well as the number of commands to pull.  In the example below, I&amp;rsquo;ve gotten the top six bash commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./tsukae bash &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; Most Used bash Commands  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;255&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;148&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; apt  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;148&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; cd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;107&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; ls  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;74&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; hugo  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;43&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; nano  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Commands list &lt;em&gt;cd&lt;/em&gt; and &lt;em&gt;ls&lt;/em&gt; might be uninteresting.  Adding those to the &lt;em&gt;blacklist&lt;/em&gt; text file will omit them in the future.&lt;/p&gt;
&lt;p&gt;Git is a weird command to run most often, but I tend to run it a lot to sync the blog and upload new content.  I use the hugo command in development mode at the same time.  Tsukae is an interesting insight into how I&amp;rsquo;m using this computer.  It&amp;rsquo;s not a vital command to accomplish work, but the next time you see one of those &amp;ldquo;Top 25 Linux Command&amp;rdquo; articles you can see how closely their list matches yours.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Project - Testing *Every* GNS3 Network Appliance</title>
      <link>https://nextpertise.net/210215_network_templates/</link>
      <pubDate>Sat, 27 Feb 2021 17:46:15 -0500</pubDate>
      
      <guid>https://nextpertise.net/210215_network_templates/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m kicking off an exciting new project, and I&amp;rsquo;d appreciate your thoughts as I get started.  GNS3 supports a many different appliances and I&amp;rsquo;m fascinated by how they work and compare.  I&amp;rsquo;ve supported many of them in my work, but I&amp;rsquo;d like to build a lab for each one that demonstrated the core functions of the device. My hope would be to produce a reference that would allow folks to quickly gain traction with new equipment.  Part of the goal is to directly compare the setup between devices, so the network structure would be static.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m proposing three basic topologies to test switching, routing, and firewalling.  There will obviously be some limitations to my approach.  That list leaves off some appliances categories: endpoints, security tools, NAS, and load balancers come to mind.  If this is successful, I&amp;rsquo;ll come back and explore those in their own environments.  I&amp;rsquo;m also not going to try to teach all the protocols and concepts as I go - this is two fold in that I have to scope this project to a reasonable size and also that&lt;/p&gt;
&lt;h2 id=&#34;switching&#34;&gt;Switching&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Topo-Switching.svg#floatsmallright&#34; alt=&#34;Switching Topology&#34;&gt;&lt;/p&gt;
&lt;p&gt;The goals of the switching lab would be to cover the following key switching capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spanning-tree and Rapid Spanning Tree&lt;/li&gt;
&lt;li&gt;VLANs&lt;/li&gt;
&lt;li&gt;Trunk&lt;/li&gt;
&lt;li&gt;Port channel&lt;/li&gt;
&lt;li&gt;Intervlan routing (possibly with a router on a stick)&lt;/li&gt;
&lt;li&gt;Port security&lt;/li&gt;
&lt;li&gt;Management - Telnet, SSH, HTTP, Syslog, TFTP&lt;/li&gt;
&lt;li&gt;Authentication - static or RADIUS/TACACS
The topology features three switches, but with the redundant connection provides some interesting cases for STP.  Spanning Tree, possibly alone on this list, is a requirement for switches.  It works so well that a lot of younger engineers don&amp;rsquo;t even realize the problems that it prevents!  The redundant connections can later be used for a port-channel as well.  There&amp;rsquo;s an external router (if the switch being considered is layer 2 only), plus three target devices to work through some VLAN examples.  There are some advanced cases that this doesn&amp;rsquo;t cover, mostly because I want to make these labs accessible for those who don&amp;rsquo;t have tons of memory.  Do you see anything I&amp;rsquo;m missing?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;routing&#34;&gt;Routing&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Topo-Routing.svg#floatsmallright&#34; alt=&#34;Routing Topology&#34;&gt;
The goals of the routing lab would cover the following capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPv4 and v6 support&lt;/li&gt;
&lt;li&gt;Intervlan and WAN Routing&lt;/li&gt;
&lt;li&gt;Static Routing&lt;/li&gt;
&lt;li&gt;Dynamic routing - RIP, OSPF, EIGRP, BGP&lt;/li&gt;
&lt;li&gt;Access-lists&lt;/li&gt;
&lt;li&gt;Site-to-site VPN&lt;/li&gt;
&lt;li&gt;Management - Telnet, SSH, HTTP, Syslog, TFTP&lt;/li&gt;
&lt;li&gt;Authentication - static or RADIUS/TACACS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three routers covers most simple cases.  It&amp;rsquo;s important to point out that I&amp;rsquo;m not attempting to model &lt;em&gt;good designs&lt;/em&gt;.  I&amp;rsquo;m trying to create a lab that exercises the most definitive features of each class of devices while using the least amount of memory and processor so that these labs are accessible.  One interesting note here - I don&amp;rsquo;t have a lot of experience with IPv6.  But the reason for the challenge is to push ourselves.  There&amp;rsquo;s enough complication here that we can implement a relatively static design with a lot of different tools to see how they differ.
These labs will be fun to demonstrate and exercise the different routing protocols.  Of course it would be great to have a bigger lab to do things like iBGP and eBGP, but the goal here is to compare the different appliances.&lt;/p&gt;
&lt;h2 id=&#34;firewall&#34;&gt;Firewall&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Topo-Firewall.svg#floatsmallright&#34; alt=&#34;Firewall Topology&#34;&gt;
Firewalls are pretty straightforward to test.  The biggest question is whether we want to go full red-team or just demonstrate configuration options.  I chose the latter to be consistent at this stage, but I may come back to them when I&amp;rsquo;m ready to include Kali and Parrot.  Functions to be demonstrated include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Bump on a wire&lt;/li&gt;
&lt;li&gt;Routing functions&lt;/li&gt;
&lt;li&gt;S2S VPN&lt;/li&gt;
&lt;li&gt;client VPN&lt;/li&gt;
&lt;li&gt;ACL / Policy&lt;/li&gt;
&lt;li&gt;Management - Telnet, SSH, HTTP, Syslog, TFTP&lt;/li&gt;
&lt;li&gt;Authentication - static, RADIUS or TACACS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve created a repository to house all the lab files and each setup will be a separate directory with instructions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 2.2.18</title>
      <link>https://nextpertise.net/210219_gns3_2.2.18/</link>
      <pubDate>Fri, 19 Feb 2021 14:29:40 -0500</pubDate>
      
      <guid>https://nextpertise.net/210219_gns3_2.2.18/</guid>
      <description>&lt;p&gt;GNS3 2.2.18 was released on February 15th, no doubt to spare our significant others.  There are a lot of improvements and bug fixes, but this seems to be an incremental release.  3.0 seems to be shaping up to be the next big release, in the second half of this year.&lt;/p&gt;
&lt;p&gt;There are a lot of updates around handling QEMU disks.  B-ehlers contributed a patch around creating a QEMU config disk, which could be used by IOS to get a day 0 config.  There&amp;rsquo;s now an option to create a config disk which defaults to Off.  There&amp;rsquo;s a change to prevent QEMU disk interfaces from being set to IDE and setting the default interface type to &amp;ldquo;none&amp;rdquo;.  There&amp;rsquo;s also an option to allow cloned QEMU disks to be resized before the node starts.&lt;/p&gt;
&lt;p&gt;GNS-GUI gets &lt;a href=&#34;https://github.com/GNS3/gns3-gui/issues/3118&#34;&gt;SSL&lt;/a&gt; support, an unused image file was &lt;a href=&#34;https://github.com/GNS3/gns3-gui/issues/3114&#34;&gt;removed&lt;/a&gt;, and logic was added to hide the import/export functions whena configfile attribute is empty.  You can also edit the config files.&lt;/p&gt;
&lt;p&gt;The Server side now includes Web UI 2.2.18.  Bugs are fixed around VCPS and uBridge.  The API is expanded and Python is updated to 3.6.&lt;/p&gt;
&lt;p&gt;I recently wrote about the &lt;a href=&#34;https://nextpertise.net/posts/210211_gns3_february21&#34;&gt;state of GNS&lt;/a&gt;.  Be sure to read that article for recently updated appliances. My experience this week with 2.2.18 continues to be solid.  The improvements are helpful - particularly the config disk option and the way it supports scripting for the cloud.  However, many users will not notice changes.&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;I recommend upgrading &lt;em&gt;assuming you have a little time to sort out any issues&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch. I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day. When I have had issues, they&amp;rsquo;ve been resolvable with an hour or two of concentration. &lt;strong&gt;Note&lt;/strong&gt; that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version. If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png#center&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it. On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;. If you have a server VM (and I recommend it), start by getting a snapshot of your current server. I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk. After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VHEditor - Visual Studio Code for Android</title>
      <link>https://nextpertise.net/210218_vheditor/</link>
      <pubDate>Thu, 18 Feb 2021 20:07:38 -0500</pubDate>
      
      <guid>https://nextpertise.net/210218_vheditor/</guid>
      <description>&lt;p&gt;These days I live in VSCode.  I confess to having developed a hardened opinion of Microsoft in years past, but I have been impressed with their work in recent years.  O365 runs like a champ in a browser.  Teams is a really well done application, which I&amp;rsquo;ve come to &lt;em&gt;prefer&lt;/em&gt; over Zoom and (especially) Webex.  But VScode is in a league of it&amp;rsquo;s own.  I didn&amp;rsquo;t know how much I needed a really well done IDE, but it&amp;rsquo;s become a must-have.&lt;/p&gt;
&lt;p&gt;I use VSCode for writing this blog.  There are extensions that make working with MarkUp easy and that facilitate uploading to Github.  I use the built-in terminal to execute Hugo commands while I&amp;rsquo;m working (like &lt;em&gt;hugo server -D&lt;/em&gt; to preview articles in a browser).  The workspace allows me to move files around or quickly move between files for comparison or editing.&lt;/p&gt;
&lt;p&gt;I also use VSCode to write Python (again, with some great extensions).  The biggest surprise is that I&amp;rsquo;ve moved my notes into VSCode.  I sync my notes to a private Github repo, so that I can make them available on whichever machine I&amp;rsquo;m working with.  I used to use Simplenote for this, and there&amp;rsquo;s nothing wrong with Simplenote.  But by handling this in VSCode I can consolidate tools.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/vheditor.png#floatright&#34; alt=&#34;VHEditor&#34;&gt;
I am going to do some traveling and it occurred to me that I didn&amp;rsquo;t want to lug a laptop.  Wouldn&amp;rsquo;t it be &lt;em&gt;cool&lt;/em&gt; if I could use my Kindle HD for VSCode?  I already travel with the Kindle for books, and VSCode would fit in the 8&amp;quot; display.  It seemed possible, but looking through the Google Play store didn&amp;rsquo;t turn up a Microsoft VSCode app.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I stumbled on VHEditor.  But the story goes a little further back to two other projects I&amp;rsquo;ve been watching with interest: VSCodium and Code-Server.&lt;/p&gt;
&lt;p&gt;VSCode is mostly open source, with some &amp;ldquo;special&amp;rdquo; parts added onto the FOSS bits.  Microsoft add telemetry, the gallery, a logo and other pieces.  VSCodium takes the open pieces and compiles a clean version with no telemetry.  The downside is that Microsoft prohibits clones from accessing the VS Code Marketplace, which means that some extensions you need aren&amp;rsquo;t available.  An open Marketplace is available at &lt;a href=&#34;https://open-vsx.org&#34;&gt;open-vsx.org&lt;/a&gt;, but not all extensions are published to that service yet.  For me, the Github extension I use is an issue, so I currently use the original MicroSoft version.  But I like VSCodium and have used it a lot.&lt;/p&gt;
&lt;p&gt;Code-Server takes the same source code and produces a web version.  I don&amp;rsquo;t have a use-case for Code-Server currently, but it seems like a fascinating idea.  All of this brings us back to VHEditor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/vheditorpic.jpeg#floatleft&#34; alt=&#34;VHEditor in action&#34;&gt;&lt;/p&gt;
&lt;p&gt;VHEditor takes Code-Server and Termux and creates a space in the Android OS for this to run.  There&amp;rsquo;s a terminal that works and code-server is running locally.  Basically, when you run VHEditor, it starts Code-Server and accesses it via a loopback address.  VHEditor runs pretty well on my Kindle HD - paired with a small bluetooth keyboard, I can definitely use this to write notes and blog posts.  I have cloned multiple repositories down to the Kindle.&lt;/p&gt;
&lt;p&gt;It feels like there are some kinks to work out.  You use &amp;ldquo;pkg install git&amp;rdquo; on the terminal to setup Git (there&amp;rsquo;s a note about this on GitHub), and that format makes me wonder if it&amp;rsquo;s running in a BSD container.  Also, the first repo I cloned worked straight from VHEditor.  The second required me to &lt;strong&gt;git clone&lt;/strong&gt; from the shell.  Still, the result is not only usable but useful.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve expressed the opinion that the secret sauce in IT right now is Git + Python + WebAPIs.  VSCode has become this tool that fits into that mix of products perfectly.  VHEditor allows me to bring that all the way down to my tablet and is definitely worth a look.&lt;/p&gt;
&lt;p&gt;If you are familiar with VSCode, you know there&amp;rsquo;s a lot of things on the screen.  I have a large phone, but I just don&amp;rsquo;t see this being useful on a display below 8&amp;quot;.  You are also really going to need a bluetooth keyboard, especially to use any of the key combinations.  The app is currently sitting at 3 1/2 stars - I read through the reviews and the issues I see relate to unfamiliar or less technical users.  Be prepared to put a little thought into it, but I recommend checking this out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 Update for February, 2021</title>
      <link>https://nextpertise.net/210211_gns3_february21/</link>
      <pubDate>Thu, 11 Feb 2021 07:03:01 -0500</pubDate>
      
      <guid>https://nextpertise.net/210211_gns3_february21/</guid>
      <description>&lt;p&gt;The GNS3 project continues to see regular updates, even though we haven&amp;rsquo;t see a release since December.  I check in on the project periodically and I&amp;rsquo;m going to make updating the status a regular feature of the blog.&lt;/p&gt;
&lt;h2 id=&#34;state-of-2217&#34;&gt;State of 2.2.17&lt;/h2&gt;
&lt;p&gt;The current release has been stable in my personal testing.  I use if for all kinds of things, including VMs, containers, and networking out to my physical topology.  A review of the issues reported in GitHub shows 15 bugs reported, with several related to Big Sur.  If you have a new M1 Mac, you might want to run the GNS3 VM and use the Web UI.  The M1 is new and I&amp;rsquo;m hearing reports of software being ported every week, so give this a little time.&lt;/p&gt;
&lt;h2 id=&#34;new-and-updated-appliances&#34;&gt;New and updated appliances&lt;/h2&gt;
&lt;p&gt;In the appliance space, we&amp;rsquo;ve seen steady activity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cisco IOS-V was updated to include 15.8.3&lt;/li&gt;
&lt;li&gt;EXOS was updated to 31.1&lt;/li&gt;
&lt;li&gt;OpenWrt was updated to 19.07.6&lt;/li&gt;
&lt;li&gt;Ubuntu Cloud was updated to 20.04&lt;/li&gt;
&lt;li&gt;Vyos was updated to support 1.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/fossadusk.jpg#floatsmallright&#34; alt=&#34;Puppy Linux&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;puppy-linux&#34;&gt;Puppy Linux&lt;/h3&gt;
&lt;p&gt;Puppy Linux was added.  Puppy is a little weird - it&amp;rsquo;s not really a distribution, but a collection of installers from other distros that have been customized by the Puppy system (&amp;ldquo;Woof-CE&amp;rdquo;) and that adhere to a philosophical consistency.  The GNS3 installer includes builds around three versions of Ubuntu - the latest version is &amp;ldquo;Focal&amp;rdquo;.  Puppy Linux builds are generally known to be small but have the tools you need built in, and to run well on older hardware.  This makes it a good fit for GNS3 where we want to have VMs in the network to use as clients or servers and where we are sensitive to overhead (especially when topologies get complex).&lt;/p&gt;
&lt;h2 id=&#34;openmediavault&#34;&gt;OpenMediaVault&lt;/h2&gt;
&lt;p&gt;OpenMediaVault is a NAS server that supports SSH, S/FTP, CIFS, and other types of file access.  NAS services are an important part of corporate network environments and this provides a great opportunity to explore those services.  Corporate data centers tend to focus on Exablock, Equallogic, or NetApp (or similar solutions from VMWare or Cisco), but those aren&amp;rsquo;t represented in GNS3.  Build your own NAS has focused on FreeNAS for a long time.  If you are just wanting a stand-in to test with, I&amp;rsquo;d recommend using FreeNAS.  However, OMV is a newer option and it&amp;rsquo;s nice to have a choice. One of the big differences is that FreeNAS is based on FreeBSD and OMV is based on Linux, which may make it more accessible for some users.  The current version of the appliance in GNS3 is 5.5.11.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Won&#39;t you be my Neighbor?</title>
      <link>https://nextpertise.net/210209_ipneighbors/</link>
      <pubDate>Tue, 09 Feb 2021 18:33:05 -0500</pubDate>
      
      <guid>https://nextpertise.net/210209_ipneighbors/</guid>
      <description>&lt;p&gt;Cisco devices have long had the Cisco Discovery Protocol (CDP).  CDP is a data link layer advertisement that is periodically broadcast (every 30 seconds).  Devices can listen and build a list of directly attached &amp;ldquo;neighbors&amp;rdquo; that includes critical information like the name, IP, type of device, and the port attached.  Other vendors developed their own protocols, including Nortel, Foundry, and Microsoft.  This information can be useful, either to familiarize yourself with a network or to communicate network information between systems.&lt;/p&gt;
&lt;h2 id=&#34;arp-for-network-discovery&#34;&gt;ARP for Network Discovery&lt;/h2&gt;
&lt;p&gt;PCs don&amp;rsquo;t typically support CDP, but you can do get some of this information by looking at the ARP table.  All network communication takes place at layer 2. When a device wants to communicate with another local device and only knows it&amp;rsquo;s IP, it uses the Address Resolution Protocol to send a data-link layer broadcast asking &amp;ldquo;Who&amp;rsquo;s using this IP?&amp;rdquo;.  The response is a MAC address.  This is easy to see using Wireshark, especially if you can place your network card in promiscuous mode, so if you&amp;rsquo;re unfamiliar with the process take a look!&lt;/p&gt;
&lt;p&gt;We can inspect the ARP table to see a list of other local systems on our network.  There are three problems with this - first, the arp command is slow. Second, this will only show things that have communicated with your PC recently.  You can use some type of broadcast to try to goose other devices to identify themselves (i.e. &lt;strong&gt;ping 192.168.0.255&lt;/strong&gt;).  Third, the devices only identify their layer 2 and 3 addresses so we don&amp;rsquo;t know much about them.  The command below shows the &lt;strong&gt;arp&lt;/strong&gt; command on Linux, but parallel commands are available in every operating system and network device.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pop &amp;gt; pop-os &amp;gt; ~ &amp;gt; $ &amp;gt;  __arp__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Address              HWtype    HWaddress    Flags Mask             Iface  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_gateway             ether    0c:8d:db:8f:60:c0   C      enp0s31f6  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.50        ether    00:0c:29:19:61:6d     C      enp0s31f6  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vcenter.stewart.tc   ether    0c:ee:99:81:23:03   C      enp0s31f6  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.5         ether    00:0c:29:9d:a2:38   C      enp0s31f6  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.4         ether    96:ee:a6:5d:30:ec   C      enp0s31f6  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A slightly more useful command for discovering devices on the local network is &lt;strong&gt;ip neigh&lt;/strong&gt;.  This gives the same information but is much more responsive.  It still depends on the target having been in communication recently.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pop &amp;gt; pop-os &amp;gt; ~ &amp;gt; $ &amp;gt; __ip neigh__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.1 dev enp0s31f6 lladdr 0c:8d:db:8f:60:c0 REACHABLE  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.50 dev enp0s31f6 lladdr 00:0c:29:19:61:6d STALE  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.3 dev enp0s31f6 lladdr 0c:ee:99:80:00:03 REACHABLE  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.5 dev enp0s31f6 lladdr 00:0c:29:9d:a2:38 STALE  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.25.4 dev enp0s31f6 lladdr 96:ee:a6:5d:30:ec REACHABLE  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You could achieve something similar with nmap as well.  Running a command like &lt;strong&gt;nmap 192.168.0.0/24&lt;/strong&gt; will identify all the devices that respond locally and which ports are open on each of them, but it&amp;rsquo;s not happening automatically.  NMAP takes a while to run, which makes it less practical, plus it will raise alarms if your network is monitored to any extent.&lt;/p&gt;
&lt;h2 id=&#34;link-layer-discovery-protocol-lldp&#34;&gt;Link Layer Discovery Protocol (LLDP)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/lldp.jpeg#floatright&#34; alt=&#34;LLDP&#34;&gt;
Link Layer Discovery Protocol is a vendor-neutral version of the CDP concept.  Like CDP, LLDP advertises identity and capabilities.  It can be used to communicate Power over Ethernet capabilities or requirements as well as device location.  Information gathered by LLDP is stored in the SNMP device management information Base (MIB) and can be queried using SNMP tools.  Most networking equipment either runs LLDP or allows it to be used.&lt;/p&gt;
&lt;p&gt;LLDP can be enabled for Ubuntu derived Linux servers using the &lt;em&gt;lldpd&lt;/em&gt; package.  It uses snmpd, so install that at the same time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install lldpd snmpd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo service lldpd status start  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo service snmpd status start  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lldpcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once installed, use the &lt;strong&gt;lldpcli&lt;/strong&gt; command to enter an LLDP command line interface.  From the prompt, type &lt;strong&gt;show neighbors&lt;/strong&gt; to list the discovered devices.  In this example, I can see that I&amp;rsquo;m connected to a Cisco Meraki switch on port 6.  LLDP can also be enabled with the -c flag to produce CDP packets.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;lldpcli&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; $ __show neighbors__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\-&lt;/span&gt;------------------------------------------------------------------------------  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LLDP neighbors:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\-&lt;/span&gt;------------------------------------------------------------------------------  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Interface:  enp0s31f6, via: LLDP, RID: 1, Time: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; day, 01:50:10  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chassis:       
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ChassisID:  mac 0c:8d:db:80:72:3e  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; SysName:    MS220-Switch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SysDescr:   Meraki MS220-8P Cloud Managed PoE Switch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MgmtIP:     192.168.26.3  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Capability: Bridge, on  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Port:          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PortID:      ifalias &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PortDescr:   Port &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  TTL:         &lt;span style=&#34;color:#ae81ff&#34;&gt;120&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unknown TLVs:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  TLV:         OUI: 00,18,0A, SubType: 1, Len: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; 00,F6,40,25  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\-&lt;/span&gt;------------------------------------------------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;who-cares&#34;&gt;Who cares?&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Why&amp;rdquo; is always a useful question - I&amp;rsquo;ve always found that people who understand something embrace the opportunity it presents.&lt;/p&gt;
&lt;p&gt;So, why bother with LLDP?  It&amp;rsquo;s really going to be most useful to network support people.  Putting this on my laptop allows me to quickly get my bearings on a network as I relocate.  I can identify the port I&amp;rsquo;m attached to either from the PC or from the switch side.  It may sound mundane, but just understanding the port is a lot easier than tracing cables!  Pentesters can use it for reconoitering.  As always, use your power for good!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Linux Install Script</title>
      <link>https://nextpertise.net/210207_installscript/</link>
      <pubDate>Sun, 07 Feb 2021 10:32:29 -0500</pubDate>
      
      <guid>https://nextpertise.net/210207_installscript/</guid>
      <description>&lt;p&gt;I install Linux pretty regularly.  Sometimes I&amp;rsquo;m setting up a new server instance, sometimes I&amp;rsquo;m deploying it to new hardware.  Many times I&amp;rsquo;m doing a clean install on a new release.  Very often, I&amp;rsquo;m reinstalling my workstation because I want to try a new flavor.  Whether you are a distro-hopper or just need to handle Disaster Recovery process, installing Linux and customizing it to fit your particular needs can take a half day or more.&lt;/p&gt;
&lt;p&gt;In addition to the time, installing requires you to make sure that you bring critical applications forward, attach to required printers and servers, and put expected security elements in place.  It&amp;rsquo;s easy to forget a step.  If you haven&amp;rsquo;t done it in a while, it&amp;rsquo;s difficult to remember &lt;em&gt;how&lt;/em&gt; to handle a step.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why years ago I started building an install script.  These days my I keep it in a private Github repository.  When setting up a new instance, I just grab the repo and run script.  For the record, it still takes a while, but I don&amp;rsquo;t have to babysit it.&lt;/p&gt;
&lt;h2 id=&#34;creating-a-private-github-repository&#34;&gt;Creating a private GitHub Repository&lt;/h2&gt;
&lt;p&gt;Login to Github, go to the Repositories tab and click new.  Give your repository a name and select &amp;ldquo;Private&amp;rdquo;.  If you have an existing repository, go to the Settings tab and scroll to the bottom where it says &amp;ldquo;Danger Zone&amp;rdquo;.  There&amp;rsquo;s an option to make the repository private.  Not everyone makes their install script private, but I worry about revealing details of the programs I use, internal resources, or paths.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210207_GitNew.png#floatcenter&#34; alt=&#34;New Repo&#34;&gt;&lt;/p&gt;
&lt;p&gt;Private repos are also good for personal notes and documentation.  I used to keep notes in Simplenote, but now I use Visual Studio Code and a private repository.  I like having everything I need to reference in my Code workspace.  You could also use a private repository for documentation, with a slick pandoc CI process to build EPUB or PDF versions that you deliver (see my &lt;a href=&#34;https://nextpertise.net/posts/200919_pandoc_improved/&#34;&gt;article&lt;/a&gt;).  I used to use Scrivner for writing, but you can setup a similar workflow using Visual Studio Code and Github.&lt;/p&gt;
&lt;h2 id=&#34;building-an-install-script&#34;&gt;Building an Install Script&lt;/h2&gt;
&lt;p&gt;Nope, I&amp;rsquo;m not going to share my install script.  As I said before, it&amp;rsquo;s &lt;em&gt;private&lt;/em&gt;.  But let&amp;rsquo;s talk about what&amp;rsquo;s in it and how it&amp;rsquo;s built.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First, it specifies the execution environment.  Not all versions of Linux use bash as the default shell for scripts and that other environment may not support the commands I use, so I want to nail this down.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Install some cool essential tools ============================&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt upgrade -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install traceroute nmap snapd flatpak htop net-tools gconf2 hugo git geary unzip -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install vlc filezilla pithos pdfshuffler thunderbird wireshark -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install gigolo gvfs-fuse flameshot network-manager-openvpn network-manager-vpnc -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install network-manager-openconnect network-manager-pptp network-manager-openvpn-gnome -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install network-manager-vpnc-gnome network-manager-openconnect-gnome network-manager-pptp-gnome -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install python-software-properties libkf5globalaccel-bin libfreerdp-plugins-standard network-manager-applet -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add-apt-repository ppa:graphics-drivers/ppa -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Setup Profile Sync Daemon https://github.com/graysky2/profile-sync-daemon&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#https://github.com/graysky2/profile-sync-daemon  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install profile-sync-daemon  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl --user enable psd.service  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl --user start psd.service  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt upgrade -y  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, I install a bunch of stuff that I want on any machine I use.  For instance, &lt;em&gt;why isn&amp;rsquo;t traceroute included in everything?&lt;/em&gt;  Other common pieces include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Networking and Security tools like nmap, htop, filezilla, and wireshark.  Gigolo for mounting drives.&lt;/li&gt;
&lt;li&gt;VPN support (that&amp;rsquo;s the network-manager stuff)&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m agnostic on packaging, so I install support for snaps and flatpaks&lt;/li&gt;
&lt;li&gt;and finally some applications I really like (hugo, pithos, vlc, pdfshuffler, and &lt;a href=&#34;https://nextpertise.net/posts/201210_flameshot/&#34;&gt;flameshot&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notice that I break the installs into groups - this makes it easier to track down problems if they occur.  The &amp;ldquo;-y&amp;rdquo; at the end answers &amp;ldquo;yes&amp;rdquo; and allows the command to continue without waiting for a response from me.  Some of the things I install are already present, but they&amp;rsquo;re not present on &lt;em&gt;all&lt;/em&gt; distros so specifying the tools I want just makes sure that they&amp;rsquo;re there (if they&amp;rsquo;re already installed, apt just skips them).  A special word about Profile Sync Daemon, since not many folks have heard of it.  This puts the browser profile into a ram disk and speeds up the browser.&lt;/p&gt;
&lt;h2 id=&#34;fixing-the-terminal&#34;&gt;Fixing the Terminal&lt;/h2&gt;
&lt;p&gt;I wrote about the &lt;a href=&#34;https://nextpertise.net/posts/201130_powerline-windows/&#34;&gt;Powerline shell&lt;/a&gt; a while back.  Since I started using it, I hate to be without it.  Powerline depends on having an appropriate font and I use JetBrainsMono.  Finally, I prefer &lt;a href=&#34;https://nextpertise.net/posts/201125_tilix/&#34;&gt;Tilix&lt;/a&gt; to the default terminal.  This sections makes all those things happen.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fix terminal ====================================================&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip3 install powerline-shell  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://download.jetbrains.com/fonts/JetBrainsMono-2.225.zip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip JetBrainsMono-2.225.zip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -R fonts /usr/share/ -r  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fc-cache -f -v  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install tilix -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;function _update_ps1() {  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    PS1=$(powerline-shell $?)  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;if [[ $TERM != linux &amp;amp;&amp;amp; ! $PROMPT_COMMAND =~ _update_ps1 ]]; then  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    PROMPT_COMMAND=&amp;#34;_update_ps1; $PROMPT_COMMAND&amp;#34;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;fi&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /home/brent/.bashrc  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that I&amp;rsquo;m using an echo to give some feedback about where we are in the process. I download the font, move it to the correct directory, and update the font cache so it&amp;rsquo;s usable.  The rest of this downloads Powerline and sets it up, plus grabs Tilix.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Cleaning up................&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm JetBrainsMono* -f  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf fonts  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\#&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Reminders  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Set JetBrains Mono as terminal font&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/neofetch.png#floatsmallright&#34; alt=&#34;Neofetch&#34;&gt;&lt;/p&gt;
&lt;p&gt;At the end of the script, I have a clean up section and remove the Font files that were left in the install directory.  I don&amp;rsquo;t know how to programmatically tell Tilix to use JetBrains Mono in it&amp;rsquo;s default profile (help!), so I just remind myself to do that.&lt;/p&gt;
&lt;h2 id=&#34;option-stuff&#34;&gt;Option stuff&lt;/h2&gt;
&lt;p&gt;I have a series of sections for handling optional components.  The first three optional sections are almost always turned on: the Firewall, Neofetch, SSH and NFS.&lt;/p&gt;
&lt;p&gt;The structure of these loops is a for statement terminated by done.  Since the conditions of the for are empty, it will loop continually until told to break.  Pressing a &amp;ldquo;y&amp;rdquo; or &amp;ldquo;n&amp;rdquo; executes some logic and breaks, any other key causes it to loop again.  I&amp;rsquo;m not sure this is the best way to do it, but it works.  In Bash, watch the spacing around the brackets and parentheses because it is required!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt; ; ; &lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Would you like to enable the firewall (y/n)?  &amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Read VAR  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Enable Firewall&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ufw enable  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;skipping.............&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Done  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt; ; ; &lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;read VAR  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add-apt-repository ppa:dawidd0811/neofetch -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt-update  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install neofetch -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;neofetch&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /home/brent/.bashrc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;skipping.............&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt; ; ; &lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Would you like to install SSH and NFS (y/n)?  &amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;read VAR  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Setup SSH and nfs ===========================================&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install openssh-server sshfs fail2ban nfs-kernel-server nfs-common -y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start fail2ban  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable fail2van  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/[sshd]  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;enabled = true  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;port = 22  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;filter = sshd  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;logpath = /var/log/auth.log  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;maxretry = 3&amp;#34;&lt;/span&gt; &amp;gt;  /etc/fail2ban/jail.local  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $VAR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;skipping.............&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;break  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/calibre.png#floatright&#34; alt=&#34;Calibre&#34;&gt;
The next sections are things that I would usually want, but not always.  One example is KDE Connect - on Gnome I use the &lt;em&gt;Gnome Connect&lt;/em&gt; extension and don&amp;rsquo;t need to load it.  Other critical tools that I present as an option to myself include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GNS3&lt;/li&gt;
&lt;li&gt;X2Go&lt;/li&gt;
&lt;li&gt;Remina&lt;/li&gt;
&lt;li&gt;Foliate&lt;/li&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;li&gt;Chromium&lt;/li&gt;
&lt;li&gt;Node-Red&lt;/li&gt;
&lt;li&gt;Signal&lt;/li&gt;
&lt;li&gt;Printer drivers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&amp;rsquo;t a perfect script, but the structure allows me to re-run it as many times as I need to and skip the sections that are already installed.  The biggest issue is that new versions (like 21.04 when it comes out in a few months) typically aren&amp;rsquo;t represented in PPAs.  The fix is to specify an older version to pull from, but that&amp;rsquo;s not automated.  Still, this speeds up the process and takes less of my time.&lt;/p&gt;
&lt;h2 id=&#34;drive-mapping&#34;&gt;Drive Mapping&lt;/h2&gt;
&lt;p&gt;Another major piece missing here is drive mapping.  I typically &lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3&#34;&gt;mount foreign drives&lt;/a&gt; using either NFS or SSH.  Although my script pulls in SSH and NFS utilities, it doesn&amp;rsquo;t actually connect shares.  I&amp;rsquo;ve chosen to leave that out and create a separate file for doing that.  This is easier to maintain, and there are cases where I want to rerun the mappping file without all the other installs.&lt;/p&gt;
&lt;p&gt;One of the things that makes it &lt;em&gt;so&lt;/em&gt; easy for me to stand up new machines or to distro-hop is that all my files are saved onto a central server.  I have an Ubuntu Mate install that just acts like a big file share.  This also simplifies backup, since I can concentrate on one server.  The files on the workstations are all transient.&lt;/p&gt;
&lt;h2 id=&#34;so---&#34;&gt;So . . .&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s the deal.  I can run this script, make a few selections, and be up and running on a new machine pretty quickly with minimal effort.  I&amp;rsquo;m tried to show some examples of different kinds of installations, including web downloads and apt-based.  The basic structure is 1) Must Haves, then 2) Optional components encased in loops for easy selection, and 3) a clean-up section.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d love to include VSCode extensions, Gnome extensions, and auto-checking for PPA support into the script.  If anyone has a good refence, I&amp;rsquo;d appreciate it.  In the meantime, this automates 90%.  Good luck creating a similar project!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deskreen</title>
      <link>https://nextpertise.net/210201-deskreen/</link>
      <pubDate>Mon, 01 Feb 2021 13:43:09 -0500</pubDate>
      
      <guid>https://nextpertise.net/210201-deskreen/</guid>
      <description>&lt;p&gt;Deskreen is an open-source utility that allows you to send your Windows, Mac, or Linux desktop onto another screen, including another computer, a tablet, or even a phone.  It can duplicate an application, duplicate an entire display, or extend the desktop and treat the other computer as an additional monitor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deskreen.com/img/plugs/hdmi.jpg#floatsmallleft&#34; alt=&#34;HDMI Plug&#34;&gt;
Deskreen outputs your display to a webpage with an embedded video.  Running the application prompts you to choose an application, existing display, or new display.  It then displays the produced webpage in text and with a 2D barcode.  The page, when opened on a separate device, allows you to play the video stream.&lt;/p&gt;
&lt;h2 id=&#34;testing-deskreen&#34;&gt;Testing Deskreen&lt;/h2&gt;
&lt;p&gt;An easy scenario to imagine would be using a tablet as a second screen for a laptop sitting in a coffee shop.  I tested exactly this setup using PopOS! on a 3rd Gen i7 and a Fire HD 10 9th gen tablet.  I downloaded Deskreen from Github as a DEB and installed it.  In order to fool my laptop into thinking it should produce a second screen, I bought &lt;a href=&#34;https://www.amazon.com/gp/product/B07C4TWZRM/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;HDMI dummy plugs&lt;/a&gt;.  I used Deskreen version 1.02 and 1.03 while testing.&lt;/p&gt;
&lt;p&gt;Once running, Deskreen produced a barcode that I was able to scan from the tablet and use to connect to a webpage.  You can manually type in the link, but it&amp;rsquo;s long and it&amp;rsquo;s randomly generated each time the app start sharing.  I clicked a button on the web page to register.  Back to the PC, where I accepted the connection and chose the output.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210201_Deskreen.jpg#floatsmallright&#34; alt=&#34;My Setup&#34;&gt;
The new display was initially set to the same as my main screen - 1920x1080.  The video was down-converted, but everything was too small to be usable.  I used the display options in PopOS! to adjust the size to 1280x720 and this created a very usable display.  The new screen is responsive, with maybe barely a touch of latency similar to using a low-refresh-rate monitor.  I imagine that the quality and usage of wifi will impact this, but I wasn&amp;rsquo;t able to test that scenario.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210201_Deskreen2.jpg#floatsmallleft&#34; alt=&#34;Phone&#34;&gt;
Just for fun, I sent the settings app to my phone at the same time.  Running two displays didn&amp;rsquo;t seem to bother the PC.  I left the webpage running on the tablet for hours and battery life on the tablet seemed surprisingly good.  I think I could run it for a full day (or more) without having to charge the tablet.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I could imagine a variety of cases where this could be useful.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extra screens&lt;/li&gt;
&lt;li&gt;sharing screens for troubleshooting&lt;/li&gt;
&lt;li&gt;connecting to smart TVs or displays&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The developer, Pavlo Buidenkov, has an excellent set of directions about using Deskreen at deskreen.com.  He also mentions that he&amp;rsquo;s hoping to find developers to collaborate with, so check it out!&lt;/p&gt;
&lt;p&gt;For me, this utility works well and fills a niche in my toolset.  It will be a part of my standard build from here on out!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to Plan Good Downtime</title>
      <link>https://nextpertise.net/210126_downtime/</link>
      <pubDate>Tue, 26 Jan 2021 20:18:24 -0500</pubDate>
      
      <guid>https://nextpertise.net/210126_downtime/</guid>
      <description>&lt;p&gt;In another blog, planning downtime would involve tropical pictures.  Sigh.&lt;/p&gt;
&lt;h2 id=&#34;downtime&#34;&gt;Downtime&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://buidln.clipdealer.com/000/183/082/previews/1--183082-time%20abstract.jpg#floatsmallright&#34; alt=&#34;Time&#34;&gt;
IT downtime is a period when IT systems have a planned outage.  These periods are negotiated with internal and external stakeholders and communicated so that no one is surprised by the lack of availability.  During this time, changes take place to improve performance, enhance reliability, address security concerns, or add features.&lt;/p&gt;
&lt;p&gt;It is a good idea to have a recurring scheduled downtime at least once a month.  Most organizations sync their downtime to &amp;ldquo;patch Tuesday&amp;rdquo;.  Microsoft, Oracle, and other big organizations release patches on the second Tuesday each month.  Since there&amp;rsquo;s a good chance that something in an environment will need to be patched and this leads to a disruption, it&amp;rsquo;s a good time to do other changes as well.&lt;/p&gt;
&lt;p&gt;Sometimes changes must be deployed to react to events.  In those cases the process is hastily put together and it&amp;rsquo;s more critical to have a clear idea of how to structure that time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/plan.jpeg#floatsmallleft&#34; alt=&#34;Plan&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;checklist-for-good-downtime&#34;&gt;Checklist for Good Downtime&lt;/h2&gt;
&lt;p&gt;A six step process for thinking it through.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Plan testing&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Communication Plan&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Build a Script&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Recognize Risks&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Negotiate Window&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Make the change!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;plan-testing&#34;&gt;Plan Testing&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s an old adage to &amp;ldquo;start with the end in mind&amp;rdquo; and that&amp;rsquo;s appropriate when planning changes.  Start by thinking through &lt;em&gt;what&lt;/em&gt; should be tested to confirm success and &lt;em&gt;how&lt;/em&gt; it will be tested.&lt;/p&gt;
&lt;p&gt;Circulate that testing plan within the parties of interest and allow them to modify the tests.  There are cases where a change passes testing but problems are later revealed.  In such cases, you will &lt;em&gt;always&lt;/em&gt; be asked &amp;ldquo;Didn&amp;rsquo;t you test for that?&amp;rdquo;  Having those other folks review the testing plan provides space to skip the blame game in those cases and focus on restoring service.&lt;/p&gt;
&lt;p&gt;How does this apply to &amp;ldquo;emergency&amp;rdquo; changes?  Build a &amp;ldquo;Crown Jewels&amp;rdquo; testing list.  These are the critical services for your organization.  Any testing plan should include these tests, but in a pinch this can serve as a base level set of tests.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll want to automate these tests as much as possible.  Automation allows you to easily re-run the tests many times as you make adjustments.  &amp;ldquo;Ping scripts&amp;rdquo; are a good place to start, but be creative (for instance, wget can serve to test browsing).
&lt;img src=&#34;https://nextpertise.net/process.jpeg#floatsmallright&#34; alt=&#34;Process&#34;&gt;
Finally, make sure to include testing of monitoring.  If you expect alarms when a redundant power supply fails, test that.  When you make a change, confirm that your change didn&amp;rsquo;t interfere with critical monitoring.&lt;/p&gt;
&lt;h2 id=&#34;communication-plan&#34;&gt;Communication Plan&lt;/h2&gt;
&lt;p&gt;With a testing plan in place, the next step is to build a communication plan.  &lt;em&gt;Who&lt;/em&gt; should be updated, &lt;em&gt;how&lt;/em&gt; should they be updated, and &lt;em&gt;when&lt;/em&gt; or &lt;em&gt;how often&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Updates need to go to your management, the equipment owners (internal or external), and the group that is dependent on the service.  Generally, updates to users should be to the point and limited to how the change impacts their use.&lt;/p&gt;
&lt;p&gt;Updates should be sent at critical points in the process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the change is proposed&lt;/li&gt;
&lt;li&gt;At the beginning of the change window&lt;/li&gt;
&lt;li&gt;If the change needs to be backed out, when that decision is made&lt;/li&gt;
&lt;li&gt;When backout is complete, if applicable&lt;/li&gt;
&lt;li&gt;When the change is complete&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep in mind that your change may impact your ability to get to corporate directories, phone systems, or email.  Make sure you have a way to communicate with this group that is not dependent on things affected by the change.  I usually use corporate email as the primary path, but have cell phone numbers &amp;ldquo;just in case&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Another aspect of communications is setting up the time for the change, getting it on people&amp;rsquo;s calendars, insuring they can participate, and publishing the meeting information.&lt;/p&gt;
&lt;h2 id=&#34;build-a-script&#34;&gt;Build a Script&lt;/h2&gt;
&lt;p&gt;A downtime script can be as simple as a spreadsheet.  It needs to have columns for description, time, and responsible party.  Each row describes a task.  The &lt;em&gt;time&lt;/em&gt; column tells the clock-time when that task should be complete.&lt;/p&gt;
&lt;p&gt;Having a script allows the team to do a walk-through and to be aware of what others are doing.  It makes it easier to coordinate and easier to track whether things are progressing as expected.&lt;/p&gt;
&lt;p&gt;This process also applies to the backout script.  Understand how the change will be unwound, roles, and make sure you preserve adequate time to accomplish it.&lt;/p&gt;
&lt;p&gt;A word on time estimates - they&amp;rsquo;re going to be wrong.  Stuff always comes up.  Still, a good faith estimate of each step helps you to get a sense of where things stand relative to expectations at any point.&lt;/p&gt;
&lt;h2 id=&#34;recognize-risks&#34;&gt;Recognize Risks&lt;/h2&gt;
&lt;p&gt;Recognizing risks in a change allows that risk to be communicated to stakeholders so that it can be accepted by those impacted.  Anticipating likely scenarios also provides opportunities to mitigate.&lt;/p&gt;
&lt;p&gt;Is there a risk of disconnection to a remote facility?  Plan on having someone on site or available.&lt;/p&gt;
&lt;p&gt;Is there a risk that an upgrade doesn&amp;rsquo;t work?  Have a backup.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One risk that isn&amp;rsquo;t often discussed is the risk that comes from asking your family to tolerate your work schedule.  As you prep for the activity, take some time to be at home (awake, alert, and agreeable) and spend time with them, especially if your work means that you have to be up all night Saturday night!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;negotiate-window&#34;&gt;Negotiate Window&lt;/h2&gt;
&lt;p&gt;Changes take place within a window.  This period of time needs to be agreed upon by everyone, short enough to minimize the disruption for users and long enough for the IT team to complete it&amp;rsquo;s work with quality.&lt;/p&gt;
&lt;p&gt;One question that needs to be asked - what happens if the work isn&amp;rsquo;t complete by the close of the window?  In other words, is it a &amp;ldquo;hard window&amp;rdquo;?  Unless otherwise advised, assume that it is.&lt;/p&gt;
&lt;p&gt;Take the time estimate from your script (above) and apply a &amp;ldquo;confidence&amp;rdquo; factor of between 50% and 100%.  In other words, if the script calls for thirty minutes, assume it will &lt;em&gt;really&lt;/em&gt; take between 45 minutes and an hour.  This helps to account for the unknown but inevitable stuff that pops up when working.  Adjust your confidence factor over time as you gain insight into task complexity, team competence, and your ability to estimate.&lt;/p&gt;
&lt;p&gt;Next, make sure that a third of the time is for backout.  This is time to work through the recovery process if the change goes awry.  For a half-hour change, we&amp;rsquo;ll budget an hour for implementation.  If at the end of the hour it&amp;rsquo;s not done, we immediately go into backing out the change so that we&amp;rsquo;re done within an hour an a half.  And that&amp;rsquo;s the right period of time to ask for - 300% of your estimate.  Unless you can get more.&lt;/p&gt;
&lt;p&gt;Seriously though, this drop-dead time to begin backout is crucial to being able to have integrity about honoring the window.  IT folks are always &amp;ldquo;5 minutes!&amp;rdquo; away from fixing things and can easily get lost in a spiral without maintaining discipline about when the backout has to begin.&lt;/p&gt;
&lt;h2 id=&#34;make-the-change&#34;&gt;Make the Change!&lt;/h2&gt;
&lt;p&gt;Finally it&amp;rsquo;s time to make the change.  Ask everyone to arrive early and join the conference.  Make sure that backups are up to date and configurations saved before beginning.  Also before beginning, run the test script to make sure that all elements are working before the change to prevent confusion afterward.
&lt;img src=&#34;https://nextpertise.net/winner.jpeg#floatleft&#34; alt=&#34;Winner&#34;&gt;
If the change is a group exercise, it is usually a good idea to have one person act as tracker.  In addition to making sure that the team is ready to begin backout at the right time, the tracker can check off items as they are accomplished, recognize any slippage, and suggest strategies to keep things moving.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a good idea to communicate to stakeholders at the beginning of the window.&lt;/p&gt;
&lt;p&gt;Run the test script again when things are complete (win or lose).  Each script run should produce output, which can be saved, in case there are questions afterward.&lt;/p&gt;
&lt;p&gt;Finally, communicate to stakeholders when things are complete.&lt;/p&gt;
&lt;p&gt;I realize the process is complicated, but it encompasses &lt;em&gt;years&lt;/em&gt; of hard-won ideas.  Each point has a story about the incident where it was learned.  However, well planned exercises run smoothly and feel like a victory lap, making all the effort worthwhile.  I sincerely hope that this helps you to move swiftly past these learning experiences and on to greater success!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Eternal Terminal</title>
      <link>https://nextpertise.net/210125_et/</link>
      <pubDate>Mon, 25 Jan 2021 12:43:51 -0500</pubDate>
      
      <guid>https://nextpertise.net/210125_et/</guid>
      <description>&lt;p&gt;Eternal Terminal acts like ssh - you start a console session on a remote device by typing &lt;strong&gt;et username@host&lt;/strong&gt; and it connects.  ET adds to ssh by allowing reconnects.&lt;/p&gt;
&lt;p&gt;A lot of ssh sessions are short affairs - login, put in a few commands, get some output, logout.  If the session is interrupted it&amp;rsquo;s not a big deal.  Occassionally, however, it&amp;rsquo;s important to stay connected for a period of time.&lt;/p&gt;
&lt;p&gt;In a past life, I used to have to run reports against a database at the data center.  The script I used took a while and any interruption meant starting over.  Eternal Terminal wasn&amp;rsquo;t around at that time, so I solved the problem by deploying a jump server and I could connect to it using x2go and start the session from there.  I could disconnect and reattach later&lt;/p&gt;
&lt;p&gt;That solution required a dedicated VM, which requires some money.  It wasn&amp;rsquo;t a bad solution, but it didn&amp;rsquo;t really address the underlying problem.&lt;/p&gt;
&lt;p&gt;With et (Eternal Terminal), a disconnected session is maintained.  The server continues processing and the client can continue to accept keyboard input.  When the connection is re-established, the environment is still in place.  Frankly, for day-to-day use you won&amp;rsquo;t see much difference between et and a normal SSH session.  If you have workflows that require long-duration connectivity, this could be a great tool.&lt;/p&gt;
&lt;p&gt;Et uses SSH for the initial connection and to exchange keys.  Authentication is handled by SSH.  Once the session is established, et sets up a console.&lt;/p&gt;
&lt;h2 id=&#34;installing-and-using&#34;&gt;Installing and Using&lt;/h2&gt;
&lt;p&gt;To use et, both the client and server must have it installed.  Eternal Terminal can be installed on Ubuntu from the archives:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install et
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Usage is just like ssh, except that if a username is not specified it is assumed to be the same as the client.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;et brent@10.1.1.100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Eternal Terminal survives roaming, rebooting, and disconnection.  A simple way to try it out is to disconnect your network card and reconnect.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Diagrams on Linux</title>
      <link>https://nextpertise.net/210113_gns3_diagram/</link>
      <pubDate>Thu, 21 Jan 2021 17:42:48 -0500</pubDate>
      
      <guid>https://nextpertise.net/210113_gns3_diagram/</guid>
      <description>&lt;p&gt;The articles I post generally start out as a way to share something I&amp;rsquo;ve learned through years of experience.  Less often, they are a way to share something that I&amp;rsquo;m researching currently.  This one started out as a way to share with you how much I rely on Lucidchart and to recommend it, but in the course of reviewing options it became a way to share what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;I thought that options for creating diagrams on Linux were few and most of them were poor.  What I found is that now (2021!) there are several &lt;em&gt;good&lt;/em&gt; options and that all the tools have matured.  I reviewed Creately, Dia, Draw.io, GNS3, LibreOffice Draw, Lucidchart, Pencil, SmartDraw, Visio, and yEd.   About half are desktop applications and the other half web applications.&lt;/p&gt;
&lt;h2 id=&#34;diagramming-software&#34;&gt;Diagramming Software&lt;/h2&gt;
&lt;p&gt;Diagrams are an essential part of IT.  IT teams suffer with poor and out-of-date documentation and the biggest impediment to compiling it are usually the effort required to write and maintain.  It&amp;rsquo;s also true that not everyone in IT enjoys writing.&lt;/p&gt;
&lt;p&gt;Diagramming software solves this by allowing complex architectures to be summarized visually.  Diagrams can pack a lot of detail, can be quickly understood, and relevant information is easily accessible.  In short, being able to produce a clean diagram is a job requirement.&lt;/p&gt;
&lt;p&gt;Diagramming software is different from &amp;ldquo;drawing&amp;rdquo; applications like GIMP because it includes icons that can be quickly placed on a page and connected, along with basic shapes and annotations.  These shapes are layered, so you can bring one into the foreground, and the connecting lines are anchored to shapes so that the line endpoints move as shapes move. This workflow allows the production of well produced pictures with a minimal amount of effort.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;de facto&lt;/em&gt; standard here is Visio.  Many of us have to exchange diagrams in a team, and for those folks, being able to import and export in Visio format is critical in the same way that any word processor should be able to work with *.DOC files.&lt;/p&gt;
&lt;h2 id=&#34;evaluation-criteria&#34;&gt;Evaluation Criteria&lt;/h2&gt;
&lt;p&gt;My most typical use of this software is to produce network diagrams.  Other common diagrams for me include flowcharts, swim lanes, and org charts.  For purposes of this review, I&amp;rsquo;m focusing on network diagrams.&lt;/p&gt;
&lt;p&gt;Each program was evaluated based on the following criteria.  These are listed in  order of importance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visio Import/Export&lt;/li&gt;
&lt;li&gt;Stencils available and easily expandable&lt;/li&gt;
&lt;li&gt;Output to PDF, HTML, and standard graphics formats&lt;/li&gt;
&lt;li&gt;Easy annotation and supported hyperlinks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;desktop-applications&#34;&gt;Desktop Applications&lt;/h2&gt;
&lt;p&gt;This group includes Dia, GNS3, LibreOffice Draw, Pencil, Visio on WINE, and yEd. The default answer for many of us is Visio, but this recent review shows progress in the open-source competitors.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-13_GNS3_Home.png#floatsmallleft&#34; alt=&#34;GNS3 Diagramming&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;visio&#34;&gt;Visio&lt;/h3&gt;
&lt;p&gt;Visio is the standard, but it&amp;rsquo;s not made for Linux.  I&amp;rsquo;ve been able to run 2010 using WINE without issues and 2013 with a little finessing.  The current version (2019) is a little too automated for my taste - it keeps trying to guess what I want and gets in my way.&lt;/p&gt;
&lt;p&gt;Visio checks all the boxes.  It is compatible with Visio, obviously (with the cavaet that the new VSDX format is not supported).  It has plenty of available stencils and most manufacturers produce their own additions.  Visio will output to a ton of formats, including PDF and HTML.  It is easy to annotate and you can create hyperlinks straight from icons (I have created links so that clicking a router opened a PuTTY session).&lt;/p&gt;
&lt;p&gt;Cons for Visio are 1) it&amp;rsquo;s running under WINE, 2) you can&amp;rsquo;t run the later versions (but the 2010 and 2013 are plenty good), and 3) it&amp;rsquo;s expensive.  Currently $270 from Amazon.&lt;/p&gt;
&lt;h3 id=&#34;gns3httpsgns3org&#34;&gt;&lt;a href=&#34;https://gns3.org&#34;&gt;GNS3&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I included this as a lark because I recently wrote about creating hyperlinks in GNS3 and realized it &lt;em&gt;could&lt;/em&gt; be used for this purpose.  If you want to try this out, take a look at &lt;a href=&#34;https://nextpertise.net/posts/210113_gns3_links/&#34;&gt;GNS3 HyperLinks&lt;/a&gt;.  This is free and there are some good diagram primitives you can use, but it doesn&amp;rsquo;t work with Visio.  Annotation and linking is fairly easy.  Not great for this purpose, but it does work in a pinch!&lt;/p&gt;
&lt;p&gt;For me, this can work very well for my home network.  I&amp;rsquo;m not interested in exchanging it with other users, and it allows me to build a &amp;ldquo;live&amp;rdquo; image of the physical network outside the virtual GNS3 world.  The two networks meet sometimes when I connect to the Internet or use a service like syslog.&lt;/p&gt;
&lt;p&gt;Diagramming isn&amp;rsquo;t really what GNS3 is designed for and this probably isn&amp;rsquo;t the tool you&amp;rsquo;re loooking for.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-19_LibreOfficeDraw.png#floatsmallright&#34; alt=&#34;LibreOffice Draw&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;libreoffice-drawhttpswwwlibreofficeorgdiscoverdraw&#34;&gt;&lt;a href=&#34;https://www.libreoffice.org/discover/draw/&#34;&gt;LibreOffice Draw&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;LibreOffice can import Visio files, but can&amp;rsquo;t export.  The importing sometimes has errors - items that aren&amp;rsquo;t placed correctly or dimensions that are changed.  In my opinion, this is an okay way to view and print more than a serious tool for creating.  Even in the case of importing a picture into a text file, I&amp;rsquo;d export a PNG from something else to import into LibreOffice before trying to mess with Draw.&lt;/p&gt;
&lt;h3 id=&#34;pencilhttpspencilevolusvn&#34;&gt;&lt;a href=&#34;https://pencil.evolus.vn/&#34;&gt;Pencil&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Pencil project was something I used a few years ago and it showed a lot of promise.  I remembered it and tried to include it in this review.  If you are interested, grab executables from &lt;a href=&#34;https://github.com/prikhi/pencil/releases&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I messed around with compiling and tried the executable, but had issues with it running.  It now starts, but never displays a window.  It looks like there is active development, so I probably just tested at the wrong point.  Nonetheless, I got tired of messing with it and never did get a chance to try it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-18_yEd.png#floatsmallleft&#34; alt=&#34;yEd&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;yedhttpswwwyworkscomproductsyed&#34;&gt;&lt;a href=&#34;https://www.yworks.com/products/yed&#34;&gt;yEd&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;yEd exists as several editions - there&amp;rsquo;s a desktop version, a web version, and one designed to work with Confluence (Graphity).  yEd is offered free, except in the Confluence tie-in model.
This is a powerful and easy-to-use Java-based tool.  The biggest knock on yEd is it&amp;rsquo;s inability to use Visio drawings or stencils.  You can export to PDF and HTML though.  I haven&amp;rsquo;t figured out a way to do Hyperlinking and you have to deal with a limited set of graphics primitives.&lt;/p&gt;
&lt;p&gt;However, if you have simple diagramming needs this is an awesome tool.  yWorks has provided a real service to the community by making this available for free.  I&amp;rsquo;ve used it over the years and it&amp;rsquo;s always been solid.&lt;/p&gt;
&lt;p&gt;From my perspective, it&amp;rsquo;s not as mature as other options but the price is right and it&amp;rsquo;s worth considering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://dia-installer.de/en/images/dia_screenshot.png#floatsmallright&#34; alt=&#34;Dia&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;dia-httpdia-installerde&#34;&gt;Dia (&lt;a href=&#34;http://dia-installer.de/&#34;&gt;http://dia-installer.de/&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;I haven&amp;rsquo;t used Dia as much - the last time I looked at it I was disappointed.  Since then it&amp;rsquo;s added some support for Visio VDX files and a wealth of new templates.  The interface has a much more solid feel and it is much easier to use.&lt;/p&gt;
&lt;p&gt;I was able to quickly put together good-looking diagrams and came away impressed and appreciative about what the team has produced.  That said, I had trouble importing and exporting Visio files when I tested.  Annotation was less developed than Visio or Lucidchart - text couldn&amp;rsquo;t be rotated, icons couldn&amp;rsquo;t be labeled.  I couldn&amp;rsquo;t create hyperlinks and I couldn&amp;rsquo;t import stencils.&lt;/p&gt;
&lt;p&gt;This is a much improved project and it&amp;rsquo;s obvious they&amp;rsquo;re on the right track.  For professional use, I don&amp;rsquo;t think it&amp;rsquo;s on the Visio or Lucidchart level.  As a free application that is native to Linux, it seems great for more casual usage and bears further watching.&lt;/p&gt;
&lt;h2 id=&#34;web-applications&#34;&gt;Web Applications&lt;/h2&gt;
&lt;p&gt;This group includes LucidChart, Draw.io, Creately and SmartDraw. Like the desktop category, significant work has been done here and there are new and exciting options.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-18_lucidchart.png#floatsmallright&#34; alt=&#34;Lucidchart&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;lucidcharthttpslucidchartcom&#34;&gt;&lt;a href=&#34;https://lucidchart.com&#34;&gt;Lucidchart&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Lucidchart is a web service, using HTML5 and Javascript.  Although it&amp;rsquo;s not technically written for Linux, it works well with most browsers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had very good success with Lucidchart and I think it is on-par or better than Visio.  It can import and export Visio files and stencils and can work with a variety of formats.  It has superior features for annotation and you can easily create hyperlinks.  There are a ton of stencils and templates.  Lucidchart sends out an email each month that walks through example uses - I&amp;rsquo;ve picked up a lot of ideas from reviewing these emails.&lt;/p&gt;
&lt;p&gt;You can use it for personal use for free.  The individual plan includes a gigabyte of storage, includes tags and grouping, and unlimited objects.  There are also team plans with more storage and a few more features.  Lucidchart is a little cheaper than buying Visio and upgrading it every few years if you subscribe to an individual plan.&lt;/p&gt;
&lt;p&gt;After a year of using it, I have come to appreciate Lucidchart &lt;em&gt;more&lt;/em&gt; than Visio.  I&amp;rsquo;ve even come to enjoy that it&amp;rsquo;s online, because this makes it easy to access my diagrams wherever I am.  I particularly like the database/flat-file import option and find the annotation tools more flexible than Visio.  The website is responsive, even over moderate links.&lt;/p&gt;
&lt;p&gt;The con here is that you have to be online and it&amp;rsquo;s running in a browser, but ubiquitous access can also be a plus.  Lucidchart has a free option, but an individual account is $9.95/mo or $108 per year.&lt;/p&gt;
&lt;h3 id=&#34;drawiohttpsappdiagramsnet&#34;&gt;&lt;a href=&#34;https://app.diagrams.net&#34;&gt;Draw.io&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Draw.io, like Lucidchart, is a webapp.  It was another surprise in this recap.  Since the last time I tested it, they&amp;rsquo;ve improved the Visio support so that it&amp;rsquo;s now possible to import and export!  It&amp;rsquo;s a little rough because connections don&amp;rsquo;t flow smoothly and the layout is not precise, but it&amp;rsquo;s close and a very valuable addition.&lt;/p&gt;
&lt;p&gt;Draw.io is responsive online and it supports real-tiome collaboration.  You can save your work to a cloud provider or you can download it locally.  The Visio support is a work in progress, so you can&amp;rsquo;t import stencils, but I could imagine working around that by importing a page with all my objects on it.  The built-in stencils are horrible.&lt;/p&gt;
&lt;p&gt;Draw.io allows hyperlinking to objects and annotation is easy to add and format.  On the whole, it&amp;rsquo;s a rougher but similar experience to Lucidchart.&lt;/p&gt;
&lt;p&gt;If you do occassional diagrams and don&amp;rsquo;t want to spend money, Draw.io is a very solid choice.  Be prepared to do a little extra work, but it is sufficient.&lt;/p&gt;
&lt;h3 id=&#34;createlyhttpscreatelycom-and-smartdrawhttpssmartdrawcom&#34;&gt;&lt;a href=&#34;https://creately.com&#34;&gt;Creately&lt;/a&gt; and &lt;a href=&#34;https://smartdraw.com&#34;&gt;Smartdraw&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Creately and SmartDraw are web SaaS packages.  Both have free trail accounts available.  Smartdraw personal accounts run $9.95 and Creately is $4.95 per month.  Creately seems more limited in file formats, but interestingly has a desktop version available for Windows, Mac, and Linux.  SmartDraw has the ability to import and export to major formats, including Visio.  Both include stencil sets that are comprehensive and SmartDraw has a facility to import Visio stencils.&lt;/p&gt;
&lt;p&gt;I tested Creately online and it&amp;rsquo;s quite good.  The connectors worked really well and flowed in a visually attractive way.  There was a full set of built in stencils, but I didn&amp;rsquo;t find any import features.  The lack of Visio import and export is a big deal.  I&amp;rsquo;m curious if that is resolved in the paid or desktop versions, but I was unable to verify that from the website.&lt;/p&gt;
&lt;p&gt;I used SmartDraw for some sample diagrams.  It seems well-built and easy to use, but I had trouble getting the connectors to work.  It supports hyperlinking to objects and annotation was easy, but less flexible than Lucidchart.&lt;/p&gt;
&lt;p&gt;My impression of SmartDraw was that it was responsive and fully featured, and I&amp;rsquo;m open to using it more.  It felt a little less capable than Lucidchart, but that may just be that I&amp;rsquo;m much more familiar with Lucidchart.  Worth checking out.&lt;/p&gt;
&lt;p&gt;As for Creately, I was also impressed and some features seemed more developed than SmartDraw, but the lack of import/export features would limit my use.&lt;/p&gt;
&lt;h2 id=&#34;conclusion---lucidchart&#34;&gt;Conclusion - Lucidchart&lt;/h2&gt;
&lt;p&gt;If you are producing diagrams as part of your job, I would opt for Lucidchart.  It seems to be the most mature option and it uses being a SaaS product to it&amp;rsquo;s advantage to make this information available across platforms and for collaboration within a team.  It started as a Visio clone, but it&amp;rsquo;s mature enough to start forming an identity of it&amp;rsquo;s own and I prefer it.  On Linux, this is an obvious option.&lt;/p&gt;
&lt;p&gt;If you need to create diagrams, but you don&amp;rsquo;t need to share them (except as PNGs or such) then consider Dia.  This is especially true if you want to use FOSS or want to use a local application.  There are a lot of honorable mentions here - SmartDraw and Creately are at an analogous stage, Draw.io and yEd are free.&lt;/p&gt;
&lt;p&gt;All told I&amp;rsquo;m very encouraged by my findings.  This has gone from a sparse set of options that involved compromise to a rich group of choices that are starting to differentiate themselves.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding Hyperlinks to GNS3 Topologies</title>
      <link>https://nextpertise.net/210113_gns3_links/</link>
      <pubDate>Wed, 13 Jan 2021 21:28:17 -0500</pubDate>
      
      <guid>https://nextpertise.net/210113_gns3_links/</guid>
      <description>&lt;p&gt;GNS3 is great for simulating networks, but what happens when your lab needs to include  devices outside GNS3 (like physical hardware)?  Wouldn&amp;rsquo;t it be nice to include hyperlinks to &amp;ldquo;real&amp;rdquo; assets in the GNS3 diagram?  There&amp;rsquo;s a way to do this!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-13_GNS3_Home.png#floatsmallleft&#34; alt=&#34;Home&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;adding-non-gns3-devices-to-a-topology&#34;&gt;Adding Non-GNS3 Devices To a Topology&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s think about the things that might be interesting to add to a GNS3 topology . . . the home firewall, switch, server.  You could even imagine adding IoT devices to the diagram and controlling them from a GNS3 appliance.&lt;/p&gt;
&lt;p&gt;For this demonstration, I&amp;rsquo;ve built a simplified view of my home network.  I have a Meraki stack - an MX64 Security Appliance (&amp;ldquo;Firewall&amp;rdquo;), an MS220 switch, and some MR33 access points.  To make this a little more interesting, I&amp;rsquo;ve including my ESXi server.&lt;/p&gt;
&lt;p&gt;To add a device, drag a &amp;ldquo;cloud&amp;rdquo; appliance into the topology.  Right click the cloud and change the symbol.  For instance, you can see that I changed the top cloud to use the firewall symbol.  I also changed the label to &amp;ldquo;MX64&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s not an Affinity Blue symbol for access points, so I chose the &amp;ldquo;cog&amp;rdquo;.  You could also grab a picture or manufacturer icon.  Just for fun, in the third picture I went to &lt;a href=&#34;http://images.google.com&#34;&gt;Google Images&lt;/a&gt; and copied a picture of a Meraki access point.  I don&amp;rsquo;t think it looks as good as the cog, but it demonstrates how you could use this technique to introduce all kinds of graphics.&lt;/p&gt;
&lt;p&gt;To extend this concept, in that same example I created a stand alone book icon that links to my documentation.  It would be easy to imagine a link to a Google doc or Sharepoint site in the same way.&lt;/p&gt;
&lt;p&gt;If you use outside graphics, keep in mind that GNS3 &lt;a href=&#34;https://github.com/GNS3/gns3-registry/tree/master/symbols&#34;&gt;recommends&lt;/a&gt; a maximum height and width of 70px.  I find that the &amp;ldquo;summary view&amp;rdquo; size on Google images works pretty well.  You can also resize existing graphics with Imagemagick:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;convert -background none download/meraki.svg -resize x70 meraki.svg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-13_GNS3-Config.png#floatsmallleft&#34; alt=&#34;GNS3 Device Properties&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;creating-hyperlinks&#34;&gt;Creating Hyperlinks&lt;/h2&gt;
&lt;p&gt;GNS3 allows double-clicking a device to open it&amp;rsquo;s terminal.  To accomplish this with an outside device, right click the symbol and choose properties.  Under properties, go to the &amp;ldquo;Misc.&amp;rdquo; tab.  Here you set the link and point to an outside hyperlink.  Since the Meraki is controlled from a centralized webpage, I selected console type &amp;ldquo;HTTPS&amp;rdquo; and used the URL to the controller, &amp;ldquo;dashboard.meraki.com&amp;rdquo;.  You can specify telnet, vnc, spice, http, or https links in this way.  The port defaults to 23 regardless of the protocol chosen, so you&amp;rsquo;ll need to update this.  For https I selected 443.&lt;/p&gt;
&lt;p&gt;Close the properties and try double-clicking!  This cloud device functions as a &amp;ldquo;link&amp;rdquo; to an external URL.  It doesn&amp;rsquo;t consume compute resources or memory, it&amp;rsquo;s just a way to hyperlink to an external resource.  Note that all the devices in this example are managed from web pages, which I suspect will be a common case.&lt;/p&gt;
&lt;h2 id=&#34;network-connections&#34;&gt;Network Connections&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/2021-01-14_GNS3_Custom_Icon.png#floatright&#34; alt=&#34;Custom Icon&#34;&gt;&lt;/p&gt;
&lt;p&gt;With the device in place, the GNS3 &amp;ldquo;Add a Link&amp;rdquo; tool can be used to draw connections.  Here we run into a slight problem - clouds only have one interface by default (eth0).  That means that GNS3 will only let you attach one link.&lt;/p&gt;
&lt;p&gt;If you need extra links, go into the properties again and on one of the interface tabs add additional interfaces.  You can easily add the loopback (lo0), or if you need a bunch just go to UDP tunnels and start adding tunnels.&lt;/p&gt;
&lt;p&gt;In my case, all the Meraki appliances are managed from the Dashboard so I used a GNS3 switch to connect all the devices and changed it&amp;rsquo;s symbol to use the affinity blue icon.  This doesn&amp;rsquo;t allow me to set a link on the switch symbol, but it was easy and also doesn&amp;rsquo;t tie up resources.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important to keep in mind that using GNS3 network connections is being done for illustration, but they&amp;rsquo;re not going to &amp;ldquo;function&amp;rdquo; as GNS3 links.  You can&amp;rsquo;t introduce error or capture packets, outside connects are just a graphical representation.&lt;/p&gt;
&lt;p&gt;Just for fun, I wanted to have a red line connect over to ESXi because that is a trunk link.  There&amp;rsquo;s not a way to color GNS3 links, so I used the line tool on the top icon bar.  While this adds some pizzazz to the diagram, the resultant link isn&amp;rsquo;t attached and doesn&amp;rsquo;t move when the diagram is rearranged.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using this Hyperlink technique can be a great help when documenting topologies or linking to outside dependent resources.  Coupled with the ability to import images, it&amp;rsquo;s possible to make very functional and visually attractive topologies.  It&amp;rsquo;s even possible to use this as a Visio replacement in simple cases, although you&amp;rsquo;re much more limited when doing diagrams in GNS3.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Custom Keycaps - Updated</title>
      <link>https://nextpertise.net/201230_keycaps/</link>
      <pubDate>Tue, 12 Jan 2021 17:30:38 -0500</pubDate>
      
      <guid>https://nextpertise.net/201230_keycaps/</guid>
      <description>&lt;h2 id=&#34;from-12-30-20&#34;&gt;From 12-30-20&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/201230_n.png#floatsmallleft&#34; alt=&#34;N&#34;&gt;&lt;/p&gt;
&lt;p&gt;My kids got me a Ducky mechanical keyboard for Christmas.  It&amp;rsquo;s a wonderful keyboard, but the Windows keys are hurting my sensibilities.  I decided that I wanted to replace the default Windows logo with the &amp;ldquo;starburst N&amp;rdquo; from my Nextpertise logo.&lt;/p&gt;
&lt;p&gt;I found that &lt;a href=&#34;https://www.maxkeyboard.com/custom-backlight-compatible-keycap-for-backlit-keyboard.html&#34;&gt;Max Keyboard&lt;/a&gt; will custom print keycaps.  At the ordering page there&amp;rsquo;s a link to a chart showing the &lt;a href=&#34;https://www.maxkeyboard.com/mechanical-keycap-layout-and-size-chart.html&#34;&gt;size&lt;/a&gt; of the various keys on different keyboards.  I already new that I needed R1 1.25 keys from Ducky, but MaxKeyboard had the Ducky layout as well so I was able to confirm.&lt;/p&gt;
&lt;p&gt;MaxKeyboard wanted a file to print the image from.  I used a postscript program called &amp;ldquo;rays.ps&amp;rdquo; (available in my postscript github repo) for the original graphic, but MK wanted at least 300x300 and the resolution on my existing picture was a quarter that.&lt;/p&gt;
&lt;p&gt;I decided to update the postscript to just output the &amp;ldquo;N&amp;rdquo; and used a larger size.  Here&amp;rsquo;s the code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-postscript&#34; data-lang=&#34;postscript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/Times &lt;span style=&#34;color:#a6e22e&#34;&gt;findfont&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;300&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;scalefont&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setfont&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    /rays  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.5&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;359&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {&lt;span style=&#34;color:#a6e22e&#34;&gt;gsave&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;rotate&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;moveto&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1200&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lineto&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;stroke&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;grestore&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#a6e22e&#34;&gt;def&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;translate&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;1.5&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setlinewidth&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;newpath&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;moveto&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;(N)&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;true&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;charpath&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;clip&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;newpath&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;98&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;translate&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;rays&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;showpage&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Of course, you can easily show this onscreen using: &lt;strong&gt;gs rays.ps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the past, I&amp;rsquo;ve used GIMP to read the Postscript and produce other formats.  Yes, GIMP can do that!  But to simplify the operation, I had Ghostscript output directly to PNG.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gs -r600 -sDEVICE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;pngmonod -sOutputFile&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;n.png rays.ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MaxKeyboards has an easy to follow ordering page where you can upload your graphic and specify how you want the image placed.  You can even have them print on the front of the keys.  The black part of the image will be translucent to fit with my backlit keyboard.&lt;/p&gt;
&lt;p&gt;I should get my new keys next week!  Looks like the total cost will be about $10 per key.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210112_NewKeycaps.webp#floatright&#34; alt=&#34;Nextpertise Keycaps&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;update-1-12-21&#34;&gt;Update 1-12-21&lt;/h2&gt;
&lt;p&gt;I received the new keys today!  You can see the new keys in the picture here.&lt;/p&gt;
&lt;p&gt;As a side story, after I sent in my purchase I noticed that the PNG file I created had a lot of white space.  I was a little worried that the logo would be small and printed to the side.  MaxKeyboard apparently recognized my error and fixed it.  I was also worried that the fine lines of the rays wouldn&amp;rsquo;t translate well through the 3D printing process.  As you can tell from the picture, they came through perfect.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s really fun when small things like this give you happiness.  I giggled a little taking off the Windows keys and replacing them!  The new keys fit perfectly and the size was dead on.&lt;/p&gt;
&lt;p&gt;MaxKeyboard did a great job!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VMWare File Transfer Options including SFTP </title>
      <link>https://nextpertise.net/210110_vmware-sftp/</link>
      <pubDate>Sun, 10 Jan 2021 16:51:18 -0500</pubDate>
      
      <guid>https://nextpertise.net/210110_vmware-sftp/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210110_VMWare-SFTP.png#floatright&#34; alt=&#34;VMWare SFTP&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to be upgrading my home VMware server and need to backup the VMs.  My server uses ESXi 6.5 and I&amp;rsquo;ll need to backup the files before upgrading.  Longtime readers may recall that I&amp;rsquo;m using &lt;a href=&#34;https://nextpertise.net/posts/200804_homebackup&#34;&gt;Backblaze&lt;/a&gt; to backup the &lt;em&gt;data&lt;/em&gt; on my server.  That is going swimmingly so far.  I want to backup the images so I don&amp;rsquo;t have to rebuild the VMs after this is done.&lt;/p&gt;
&lt;h2 id=&#34;admin-interface&#34;&gt;Admin interface&lt;/h2&gt;
&lt;p&gt;One way to accomplish this is to login to the admin web portal and export the VMs.  Under each VM, go to Actions &amp;gt; Export and this queues downloading the component files.  Exporting over HTTP is slow though.&lt;/p&gt;
&lt;h2 id=&#34;vmware-workstation&#34;&gt;VMWare Workstation&lt;/h2&gt;
&lt;p&gt;A second option is to backup from VMWare Workstation.  I prefer using this to manage server VMs anyway.  First, connect to the server under &lt;em&gt;File&amp;gt;Connect to Server&lt;/em&gt;.  Once the server is attached to workstation and you can see the VMs, right click a machine and choose &lt;em&gt;Manage &amp;gt; Download&lt;/em&gt;. This is also fairly slow.&lt;/p&gt;
&lt;h2 id=&#34;using-ssh-with-vmware&#34;&gt;Using SSH with VMWare&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/210110_Filezilla.png#floatright&#34; alt=&#34;Filezilla to VMWare&#34;&gt;&lt;/p&gt;
&lt;p&gt;To speed up the action, I wanted to grab the VMDKs directly from the server using SFTP.  To set this up, login to the administrative interface of ESXi and look under &amp;ldquo;Host&amp;rdquo;.  Choose &amp;ldquo;Actions&amp;rdquo; and &amp;ldquo;Enable SSH&amp;rdquo;. SFTP is a part of SSH, so this also enables SFTP.  This isn&amp;rsquo;t the best way to grab the backup, since it will take a little work to stand these up again, but it is faster.&lt;/p&gt;
&lt;p&gt;To make this super easy, I used Filezilla.  Under the site manager, I selected SFTP, entered the IP address, and username.  When connecting, you&amp;rsquo;ll need to accept the host key and navigate to /vmfs/volumes/YOUR_VOLUME_NAME/ and each of the VMs will have a directory.  You can also easily upload images this way - ISOs can be saved to to VMWare easily this way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing a Blog - Reflections after a half year</title>
      <link>https://nextpertise.net/210102_hugoafter6/</link>
      <pubDate>Sat, 02 Jan 2021 11:45:16 -0500</pubDate>
      
      <guid>https://nextpertise.net/210102_hugoafter6/</guid>
      <description>&lt;p&gt;I started writing this blog back in July of 2020.  There was a lot going on at that point, and yet a lot of nothing.  My employer was acquired in May and management was cut, so I was surprised to be out of job.  We were quarantining, which added a degree of difficulty to the job search, and summer is a slow time to find work anyway.  Against all this uncertainty, I wanted to do &lt;em&gt;something&lt;/em&gt; and decided to start writing.  I hoped that the blog might provide a way to establish my &lt;em&gt;bona fides&lt;/em&gt;, and if nothing else it gave me a chance to share what I was working on (since I no longer had co-workers to share with).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s now January of 2021.  I&amp;rsquo;m employed and the blog has been going for six months.  I thought I&amp;rsquo;d take a look back at the experience of starting a blog.  Has it accomplished what I hoped?  How hard was it and what things would I change?&lt;/p&gt;
&lt;p&gt;Most posts here are technical and this article is intended to address technical things I&amp;rsquo;ve learned.  At the same time, writing is a personal expression and accomplishes personal goals, so I also want to share how this experience has worked for me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll skip to the conclusion . . . I&amp;rsquo;ve found it valuable, technically approachable, and I think it&amp;rsquo;s something most people should consider.  With that conclusion in mind, one of the biggest challenges is trying to figure out how to get started.  There&amp;rsquo;s some good information online and the Hugo community is very supportive, but it&amp;rsquo;s mostly organized into how to accomplish small discrete tasks and not around helping communicate the big picture.  Hopefully this will encourage you to give it a try and help you avoid some of the problems that might derail you.&lt;/p&gt;
&lt;h2 id=&#34;what-i-did-well&#34;&gt;What I did well&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://d33wubrfki0l68.cloudfront.net/c38c7334cc3f23585738e40334284fddcaf03d5e/2e17c/images/hugo-logo-wide.svg#floatsmallright&#34; alt=&#34;Hugo&#34;&gt;
&lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt; is a winner.  I write articles in Markdown, which is lightly formatted plain text.  Hugo then automatically applies formatting and plugs it into the navigational structure.  Hugo takes my raw files and generates a set of set of finished static HTML files.  Because of the way Hugo works, I haven&amp;rsquo;t had to think about server infrastructure or spend a lot of time &amp;ldquo;coding&amp;rdquo;, I&amp;rsquo;ve been able to take the time I have and focus on writing.&lt;/p&gt;
&lt;p&gt;I write articles in &lt;a href=&#34;https://vscodium.com/&#34;&gt;VSCodium&lt;/a&gt;.  Microsoft&amp;rsquo;s Visual Studio is open-source and VSCodium has stripped out the telemetry.  The two products are almost perfectly equivalent, so take your pick.  VSCodium is very easy to use, once you get the hang of it.  I open my local copy of the Nextpertise repo in the left pane and a terminal below.  I typically write with &lt;strong&gt;hugo server -D&lt;/strong&gt; running so I can check output on the fly.  I used to use different products for note taking, but I&amp;rsquo;ve switched over to VSCode for that, and I could really imagine writing a longer book using VSCode and then outputting via &lt;a href=&#34;https://nextpertise.net/posts/200919_pandoc_improved/&#34;&gt;pandoc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://code.visualstudio.com/assets/images/home-git.svg#floatsmallright&#34; alt=&#34;Visual Studio Code&#34;&gt;
Blog files are kept in a local copy of a Git repository.  After I finish updating, I sync up to GitHub which backs up my files and starts the process of moving them &amp;ldquo;live&amp;rdquo;.  Like VSCodium, Git has become a central tool for me in a variety of settings.  I use it for this blog, for code that I write, for artifacts that I contribute to GNS3, and even for keeping notes (you can have a private Repo).  I&amp;rsquo;ve learned about Git, started contributing to more projects, published my first &amp;ldquo;app&amp;rdquo;, and even expirimented with CI/CD.  One of the benefits of writing the blog is that I&amp;rsquo;ve grown technically and picked up these cool tools.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://dka575ofm4ao0.cloudfront.net/pages-transactional_logos/retina/89884/render-logo-dark3.png#floatsmallleft&#34; alt=&#34;Render&#34;&gt;
&lt;a href=&#34;https://render.com&#34;&gt;Render&lt;/a&gt; hosts the site, and that has been a big win.  Render hosts static sites for free, so my only cost has been the domain.  Render integrates with GitHub via a CI process, so when I sync my repository it automatically generates web content with Hugo and posts it to the Render CDN network.  I&amp;rsquo;ve had friends in different parts of the world confirm that performance is uniformly great.  Like other decisions I made early on, this has worked out to allow me to focus my time on content.&lt;/p&gt;
&lt;p&gt;So those are the big wins: Hugo, VSCodium, GitHub, and Render.  How did I decide on that workflow and set of vendors?  The truth is that I saw &lt;a href=&#34;https://www.mikedane.com/&#34;&gt;Mike Dane&amp;rsquo;s Giraffe Academy&lt;/a&gt; Hugo videos on Youtube and thought &amp;ldquo;I can do that&amp;rdquo;.  I was also starting to learn Python and had been fooling around with Visual Studio.  GitHub was something I&amp;rsquo;d been using for a while, especially to work with the GNS3 project, but I&amp;rsquo;d been using it more at work as well.  It really just all came together.  One of the things that I think I did right was I didn&amp;rsquo;t over-analyze things.  I expirimented enough to make sure that I had a good plan and then I just went for it.&lt;/p&gt;
&lt;p&gt;Would I revisit any of these decisions?  There are several static site generator alternatives (the other one I hear most about is Jekyll), but so far I&amp;rsquo;ve been able to do everything I want with Hugo.  I expirimented with hosting in &lt;a href=&#34;https://nextpertise.net/posts/200728_s3review/&#34;&gt;AWS S3&lt;/a&gt; and AWS offers this free in the first year.  &lt;a href=&#34;https://www.netlify.com/&#34;&gt;Netlify&lt;/a&gt; is similar to Render in that it too focuses on the JAMStack space.  Netlify has a lot of good technical documentation and videos of lectures, and they sponsor and participate in the community.  I think all three would have been good options, but for me at this point: it&amp;rsquo;s not broke.  I think that is really the magic of Render: the technical and financial barrier to doing this was significantly lowered, and that encouraged me to start and has allowed me to focus on the part I enjoy since.&lt;/p&gt;
&lt;p&gt;Another of my early decisions that has really born fruit - making my own CSS and theme.  Hugo allows you to clone a theme from GitHub.  As I mentioned earlier, the Hugo community is very supportive and there are a lot of themes shared via their &lt;a href=&#34;https://themes.gohugo.io/&#34;&gt;gallery&lt;/a&gt;.  I initially started with someone else&amp;rsquo;s theme, but I quickly realized that it was going to take a lot of work to understand how it all fit together.  This was particularly true because I don&amp;rsquo;t have a lot of background in web design.  The Giraffe Academy videos are really good and Mike gets into the early stages of developing a theme there.  I used some of the Giraffe Academy ideas as a basic theme and built up from there.  I&amp;rsquo;ve been able to leverage the blog to learn HTML and CSS.  The theme generally get&amp;rsquo;s more complicated because I want to solve a new problem, so &amp;ldquo;rolling my own&amp;rdquo; has allowed me to grow with the site.&lt;/p&gt;
&lt;h2 id=&#34;what-i-would-change&#34;&gt;What I would change&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png#floatsmallright&#34; alt=&#34;Google&#34;&gt;
My biggest issue has been building readership.  I still don&amp;rsquo;t think I&amp;rsquo;ve got a great handle on how to do that.  Google and Bing make it easy to register your page with them so it shows up in search results.  Google also has free online classes in using their Analytics and Search portals.  I recommend you do those things, but I&amp;rsquo;m still seeing slow and steady growth in readership and not a big growth.  Because the site isn&amp;rsquo;t widely read, it really didn&amp;rsquo;t get my name out when I was job hunting.  I recommend spending some time understanding how to publicize your site.  If anyone has great ideas and could leave them in the comments, I would appreciate your thoughts!&lt;/p&gt;
&lt;p&gt;Another mistake has been setting &lt;strong&gt;draft=false&lt;/strong&gt; in the Archtype.  Turning off the &amp;ldquo;drafts&amp;rdquo; feature in Hugo has resulted in publishing pages that weren&amp;rsquo;t finished.  Yes, you will be annoyed that you forget to &amp;ldquo;publish&amp;rdquo; by setting &lt;strong&gt;draft=false&lt;/strong&gt;, but it was a dumb idea to just turn it off.&lt;/p&gt;
&lt;p&gt;Finally, when I started I didn&amp;rsquo;t really design the site for growth.  I put all the files in the &amp;ldquo;content&amp;rdquo; directory and let them pile up, making them hard to organize.  Over New Year&amp;rsquo;s, I went back and prepended dates to file names and moved everything under a &amp;ldquo;posts&amp;rdquo; subdirectory.  This also allowed me to create the &amp;ldquo;Archives&amp;rdquo; link and made curation easier.&lt;/p&gt;
&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;I started the blog with two goals: sharing some cool things I&amp;rsquo;ve learned and marketing myself during a period of unemployment.  The blog  didn&amp;rsquo;t really help get a job, but it kept me busy and focused on moving forward during a potentially depressing period.  However, I&amp;rsquo;ve found it cathartic to write and I hope that people have read and found value in this work.&lt;/p&gt;
&lt;p&gt;Creating this site has also given me a &amp;ldquo;real world&amp;rdquo; case to learn about HTML and CSS, cloud hosting, and online analytics.  It&amp;rsquo;s also pushed me to get more involved in various online communities and to learn at a deeper level so I can share my conclusions here.&lt;/p&gt;
&lt;p&gt;George Carlin used to have a bit about the difference in the quality of experience betweeen &lt;em&gt;riding&lt;/em&gt; and &lt;em&gt;driving&lt;/em&gt;.  It was a funny routine, but it stuck with me (like several of his thoughts) because it was true.  Learning through necessity pushes you to go deeper and wider.  Although my day job is management, continuous detailed learning is an important part of the IT industry.&lt;/p&gt;
&lt;p&gt;This has been easy enough that I&amp;rsquo;ve thought about creating sites for my church or the Trail Life group I lead.  If you have an expertise and an interest in sharing it, I would encourage you!  Let me know how I can help!  For those of you already on the path, I&amp;rsquo;m going to continue this conversation in a second column to detail some of the cool things I&amp;rsquo;ve learned how to do!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 2.2.17</title>
      <link>https://nextpertise.net/201231_gns3_2.2.17/</link>
      <pubDate>Thu, 31 Dec 2020 08:29:40 -0500</pubDate>
      
      <guid>https://nextpertise.net/201231_gns3_2.2.17/</guid>
      <description>&lt;p&gt;GNS3 2.2.17 was released in December. It features bug fixes and some small added features.&lt;/p&gt;
&lt;p&gt;On the GUI side, the biggest news is that 2.2.17 brings support for MacOS Big Sur.  It fixes an issue with the use of Qemu that affected some appliances because the -nographic switch was set automatically.  The WebUI updates underlying dependencies, closes a security issue and addresses some bugs, including one that cauased an annoying error message in Firefox.  The server now allows configuring VNC port ranges and updates code to remove deprecated Python methods.&lt;/p&gt;
&lt;p&gt;GNS3 2.2 continues to be a stable platform and we see in this release a refinement.  Unless you run Big Sur, there doesn&amp;rsquo;t appear to be anything earth-shattering.&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;Obviously you should upgrade if you have Big Sur.&lt;/p&gt;
&lt;p&gt;For the rest of us, this version includes a security &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2020-7774&#34;&gt;fix&lt;/a&gt;. I&amp;rsquo;ve read the CVE and it appears to affect input validation.  It&amp;rsquo;s not obvious how this would be exploited in GNS3 or what the risk is from the write-up, but it&amp;rsquo;s rated HIGH.&lt;br&gt;
I recommend upgrading &lt;em&gt;assuming you have a little time to sort out any issues&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch. I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day. When I have had issues, they&amp;rsquo;ve been resolvable with an hour or two of concentration. &lt;strong&gt;Note&lt;/strong&gt; that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version. If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you need to wrap up some work and don&amp;rsquo;t want to risk an upgrade at the moment, I &lt;em&gt;would&lt;/em&gt; recommend disabling the WebUI.  I can&amp;rsquo;t find a way to do this however, so I started an &lt;a href=&#34;https://github.com/GNS3/gns3-server/issues/1857&#34;&gt;issue&lt;/a&gt; and hopefully that will be incorporated in 2.1.18!  In the meantime, if you want to protect the interface you&amp;rsquo;ll need &amp;ldquo;compensating controls&amp;rdquo;.  That&amp;rsquo;s a term of art for blocking access somewhere else (like in a firewall).&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it. On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;. If you have a server VM (and I recommend it), start by getting a snapshot of your current server. I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk. After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
&lt;h2 id=&#34;new-and-updated-appliances&#34;&gt;New and updated appliances&lt;/h2&gt;
&lt;p&gt;Folks continue to contribute appliances. If you are interested in doing this, refer to my articles on &lt;a href=&#34;https://nextpertise.net/posts/200904_creating_GNS3_appliance/&#34;&gt;creating an appliance&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/200902_updatinggns3appliances/&#34;&gt;Updating an appliance&lt;/a&gt;. Here&amp;rsquo;s a list of the new and updated appliances since November first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arista VEOS&lt;/li&gt;
&lt;li&gt;Aruba VGW&lt;/li&gt;
&lt;li&gt;Cisco IOSv L2&lt;/li&gt;
&lt;li&gt;Huawei USG6Kv&lt;/li&gt;
&lt;li&gt;Opnsense&lt;/li&gt;
&lt;li&gt;RHEL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;rsquo;s really nice to see RHEL.  I didn&amp;rsquo;t even realize Red Hat was missing, but in the last few months I&amp;rsquo;ve come to understand how many companies depend on RHEL (or it&amp;rsquo;s clones).  One good example of this is that Amazon Linux (used in a lot of AWS EC2 instances) is a RHEL clone.  The original was based on RHEL6 and AL2 is based on RHEL7.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SSH Crypto</title>
      <link>https://nextpertise.net/201229_ssh-crypto/</link>
      <pubDate>Tue, 29 Dec 2020 13:01:35 -0500</pubDate>
      
      <guid>https://nextpertise.net/201229_ssh-crypto/</guid>
      <description>&lt;h1 id=&#34;cleaning-up-crypto&#34;&gt;Cleaning up Crypto&lt;/h1&gt;
&lt;p&gt;A previous article - &lt;a href=&#34;https://nextpertise.net/posts/201223_ssh-admin/&#34;&gt;SSH Admin&lt;/a&gt; - went through understanding who was logging into a Linux server using SSH or SFTP.  To continue that thought, let&amp;rsquo;s suppose that we are required to make sure that only cypher suites recommended in the CIS benchmarks are in use on a server.  Before we disable old options, we need to check and make sure that no one is using them!&lt;/p&gt;
&lt;h2 id=&#34;understanding-local-crypto&#34;&gt;Understanding local crypto&lt;/h2&gt;
&lt;p&gt;From a client, we can see which cipher elements are supported.  Each of these commands outputs a range of protocols.  When connecting to a server, the client transmits protocols that it supports and the server reciprocates.  They then agree to use the first option from the client&amp;rsquo;s list that is supported on the server (or the connection fails).  The table below lists commands used to see the protocols supported on a client.  The examples were chosen because they were well known and establish context, and not as a recommendation.&lt;/p&gt;




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table: SSH options&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Example options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cipher&lt;/td&gt;
&lt;td&gt;ssh -Q cipher&lt;/td&gt;
&lt;td&gt;3des-cbc, aes256-cbc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAC&lt;/td&gt;
&lt;td&gt;ssh -Q mac&lt;/td&gt;
&lt;td&gt;hmac-md5, hmac-sh2-256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key&lt;/td&gt;
&lt;td&gt;ssh -Q key&lt;/td&gt;
&lt;td&gt;ssh-rsa, ecdsa-sha2-nistp256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kex&lt;/td&gt;
&lt;td&gt;ssh -Q kex&lt;/td&gt;
&lt;td&gt;diffie-hellman-group1-sha1, curve25519-sha256&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Setting up an SSH connection goes through some basic phases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kex (key-exchange) is used to complete an asymmetrically encrypted initial key exchange.&lt;/li&gt;
&lt;li&gt;Keys are exchange.  The key list is types of keys supported.&lt;/li&gt;
&lt;li&gt;The body of the communication is encrypted symmetricly.&lt;/li&gt;
&lt;li&gt;MAC or &amp;ldquo;message authentication code&amp;rdquo; is a hash that verifies the integrity of transmissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;understanding-remote-clients-crypto&#34;&gt;Understanding remote clients crypto&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s surprising that there isn&amp;rsquo;t a command to show which cipher suites are in use by particular clients.  To build a tool, I went into /etc/ssh/sshd_config and set the logging level to grab everything.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;# Logging&lt;br&gt;
SyslogFacility AUTH&lt;br&gt;
LogLevel DEBUG3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This can then be reviewed using &lt;strong&gt;journalctl -u ssh&lt;/strong&gt; to display entries related to the sshd unit.  I noticed that the relevant lines were at DEBUG1 level and that each sequence completed with the &amp;ldquo;password accepted&amp;rdquo; line.  Based on this pattern, I wrote a utility in Python to create a report.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dec 28 15:56:44 pop-os sshd[701591]: debug1: kex: algorithm: curve25519-sha256 [preauth]&lt;br&gt;
Dec 28 15:56:44 pop-os sshd[701591]: debug1: kex: host key algorithm: ecdsa-sha2-nistp256 [preauth]&lt;br&gt;
Dec 28 15:56:44 pop-os sshd[701591]: debug1: kex: client-&amp;gt;server cipher: &lt;a href=&#34;mailto:chacha20-poly1305@openssh.com&#34;&gt;chacha20-poly1305@openssh.com&lt;/a&gt; MAC: &lt;!-- raw HTML omitted --&gt; compression: none [preauth]&lt;br&gt;
Dec 28 15:56:44 pop-os sshd[701591]: debug1: kex: server-&amp;gt;client cipher: &lt;a href=&#34;mailto:chacha20-poly1305@openssh.com&#34;&gt;chacha20-poly1305@openssh.com&lt;/a&gt; MAC: &lt;!-- raw HTML omitted --&gt; compression: none [preauth]&lt;br&gt;
Dec 28 15:56:46 pop-os sshd[701591]: debug1: PAM: password authentication accepted for pop&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/brentstewart/ssh-crypto&#34;&gt;&lt;strong&gt;ssh-crypto&lt;/strong&gt;&lt;/a&gt; is a Python3 program to read ssh debugging and identify who has logged in and what settings were used.  It expects a file name, which is a text file that contains ssh logging output.  First make sure that sshd is logging at least at DEBUG1.  Restart the SSH service for the new logging setting to take effect.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sudo service sshd restart&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Keep in mind that the crypto fields won&amp;rsquo;t be populated for logins before the loggin change takes effect.  To create the text file for analysis, export from journalctl.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;journalctl -u ssh &amp;gt; ~/ssh.txt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Again, __ssh-crypto assumes that the system has Python3, uses Systemd, has debugging setup.&lt;/p&gt;
&lt;h3 id=&#34;usage&#34;&gt;Usage&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt; pop  pop-os  ~  $  ~/git/ssh-crypto/ssh-crypto.py ~/ssh.txt
-------------------------------------------------------------------------------------------------------------------
| # |       User        |       IP       |     Algorithm      |        Host        |            Cipher            |
-------------------------------------------------------------------------------------------------------------------
|  0|pop                |192.168.25.2    |undefined           |undefined           |undefined                     |
|  1|pop                |192.168.25.72   |undefined           |undefined           |undefined                     |
|  2|pop                |192.168.25.81   |undefined           |undefined           |undefined                     |
|  3|pop                |192.168.25.81   |undefined           |undefined           |undefined                     |
|  4|pop                |192.168.25.81   |undefined           |undefined           |undefined                     |
|  5|pop                |192.168.25.81   |curve25519-sha256   |ecdsa-sha2-nistp256 |chacha20-poly1305@openssh.com |
|  6|pop                |192.168.25.81   |curve25519-sha256   |ecdsa-sha2-nistp256 |chacha20-poly1305@openssh.com |
-------------------------------------------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;removing-weak-ciphers&#34;&gt;Removing Weak Ciphers&lt;/h2&gt;
&lt;p&gt;Per the CIS Ubuntu 20.04 Standard (5.2.12), FIPS compliant ciphers include aes256-ctr, aes192-ctr, aes128-ctr.  FIPS compliant MACs include hmac-sha2-256 and 512.  FIPS allows a pretty broad range of key exchange protocols, including ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, diffie-hellman-group16-sha512, diffie-hellman-group18-sha512, and diffie-hellman-group14-sha256.
To limit the server to only accept these options, edit /etc/ssh/sshd_config.  Here are the ones I&amp;rsquo;ve chosen to support.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr&lt;br&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256&lt;br&gt;
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using ssh-crypto will allow review of recent client connections and unused ciphers can be weeded out.  After communicating the change to users, specific recalcitrant users can be identified for follow-up with the utility before ultimately removing the old protocols.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SSH Administrative Trivia</title>
      <link>https://nextpertise.net/201223_ssh-admin/</link>
      <pubDate>Wed, 23 Dec 2020 18:47:30 -0500</pubDate>
      
      <guid>https://nextpertise.net/201223_ssh-admin/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s consider an interesting case: we&amp;rsquo;d like to identify remote ssh users.  Remember that SFTP is a part of SSH, so these commands will also identify SSH users.  There are a variety of ways to do this and some are even fairly obviouis.&lt;/p&gt;
&lt;h2 id=&#34;who-or-w&#34;&gt;Who or w&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Who&lt;/strong&gt; is a utility to display logged in users.  The man page can walk you through the various switches, but the two I find most valuable are &lt;em&gt;-a&lt;/em&gt; to show all and &lt;em&gt;-H&lt;/em&gt; to show headings.  The &lt;em&gt;all&lt;/em&gt; option includes the time that the session has been active, how it&amp;rsquo;s attached, and where it&amp;rsquo;s coming from.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;who -aH
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    NAME       LINE         TIME             IDLE          PID COMMENT  EXIT  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               system boot  2020-12-02 05:47  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               run-level &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;  2020-12-02 05:47  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      ? :1           2020-12-02 08:08   ?          &lt;span style=&#34;color:#ae81ff&#34;&gt;3663&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;:1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      + pts/2        2020-12-23 18:14  old       &lt;span style=&#34;color:#ae81ff&#34;&gt;570072&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;192.168.1.72&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      + pts/6        2020-12-27 15:36 00:01      &lt;span style=&#34;color:#ae81ff&#34;&gt;665161&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;192.168.1.81&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first column - Name - is the local name that these users are logged in as.  In this example, I&amp;rsquo;m logged in as &amp;ldquo;brent&amp;rdquo; on 192.168.1.81 but my ssh session to this computer uses the username &amp;ldquo;pop&amp;rdquo;.  The LINE identifies connection - &lt;em&gt;pts&lt;/em&gt; stands for psuedo terminal slave, or a sub  process of &lt;em&gt;pty&lt;/em&gt; (psuedo-tty).  You may be more familiar with &lt;em&gt;tty&lt;/em&gt; connections - those are direct connections like a local terminal.  Notice that there&amp;rsquo;s a local connection and two remote connections in this example.&lt;/p&gt;
&lt;p&gt;If &lt;strong&gt;who&lt;/strong&gt; is too much typing for you, try &lt;strong&gt;w&lt;/strong&gt;.  It provides very similar output, no switches required&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;w
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     16:22:45 up &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; days, 10:35,  &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; users,  load average: 1.90, 1.70, 1.53  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      :1       :1               02Dec20 ?xdm?  12days  0.00s /usr/libexec/gdm-x-session --run-sc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      pts/2    192.168.1.72    Wed18    3days  0.09s  0.09s -bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      pts/6    192.168.1.81    15:36   46:35   0.02s  0.02s -bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also derive this information from &lt;strong&gt;ps&lt;/strong&gt;.  This command lists active processes and includes active ssh sessions.  Note that you can pipe to &lt;strong&gt;grep&lt;/strong&gt; to limit it to lines that include &amp;lsquo;pts&amp;rsquo; or &amp;lsquo;ssh&amp;rsquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ps  ax&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;last&#34;&gt;Last&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Last&lt;/strong&gt; looks through /var/log/wtmp and shows login activity.  You can specify a username to see when that user logged in and out.  Note that a psuedo-user named &lt;em&gt;reboot&lt;/em&gt; logs in when the system reboots, so &lt;strong&gt;last reboot&lt;/strong&gt; will show a list of all reboots.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;last
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      pts/6        192.168.1.81    Sun Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:36   still logged in  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      pts/2        192.168.1.72    Wed Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:14   still logged in  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      pts/2        192.168.1.2     Wed Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:11 - 18:11  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;00:00&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      :1           :1               Wed Dec  &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; 08:08   still logged in  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reboot   system boot  5.8.0-7630-gener Wed Dec  &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; 05:47   still running  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      :1           :1               Wed Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; 18:02 - down  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;6+11:44&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reboot   system boot  5.8.0-7630-gener Wed Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt; 17:56 - 05:46 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;6+11:50&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      :1           :1               Mon Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 08:31 - down  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;2+09:24&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reboot   system boot  5.8.0-7630-gener Mon Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 08:29 - 17:56 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;2+09:26&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pop      :1           :1               Sat Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 17:40 - down  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;8+14:47&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reboot   system boot  5.8.0-7625-gener Sat Nov &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; 17:39 - 08:28 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;8+14:48&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Last&lt;/strong&gt; shows similar information to &lt;strong&gt;who&lt;/strong&gt;, but shows activity over time instead of just current activity.  On a busy server, &lt;strong&gt;w&lt;/strong&gt; might do a better job of concisely showing current users.  A related utility is &lt;strong&gt;lastb&lt;/strong&gt; which shows &lt;em&gt;bad&lt;/em&gt; login attempts.  In the previous example I mentioned that my account is &amp;ldquo;brent&amp;rdquo; on 192.168.1.81.  I forgot that there was a different user on this machine and you can see here the failed login attempts.  Notice that this command requires elevated priviledges.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo lastb  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent    ssh:notty    192.168.1.81    Sun Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35 - 15:35  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;00:00&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent    ssh:notty    192.168.1.81    Sun Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35 - 15:35  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;00:00&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent    ssh:notty    192.168.1.81    Sun Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35 - 15:35  &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;00:00&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paranoid users may want to review failed logins every time they open a terminal.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sudo lastb&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /home/user/.bashrc  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A similar command is &lt;strong&gt;journalctl -u ssh&lt;/strong&gt;.  This shows the systemd journal, so obviously it&amp;rsquo;s only of use on systemd-based systems.  Modern Fedora/RHEL and Ubuntu are on that list.  The switch &lt;em&gt;-u&lt;/em&gt; limits output to certain units, in this case &lt;em&gt;ssh&lt;/em&gt;.  Note that some systems will require the unit to be listed as &amp;ldquo;sshd&amp;rdquo;.   Notice that this shows socket information and failed attempts and is organized chronologically.  This might be useful if you&amp;rsquo;re trying to match events in troubleshooting.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;journalctl -u ssh  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-- Logs begin at Sat 2020-11-14 17:39:49 EST, end at Sun 2020-12-27 18:10:11 EST. --  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:11:37 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;569656&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Accepted password &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; pop from 192.168.1.2 port &lt;span style=&#34;color:#ae81ff&#34;&gt;52778&lt;/span&gt; ssh2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:11:37 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;569656&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:session&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: session opened &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; user pop by &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:14:55 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;570072&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Accepted password &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; pop from 192.168.25.72 port &lt;span style=&#34;color:#ae81ff&#34;&gt;23639&lt;/span&gt; ssh2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;23&lt;/span&gt; 18:14:55 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;570072&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:session&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: session opened &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; user pop by &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:39 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Invalid user brent from 192.168.25.81 port &lt;span style=&#34;color:#ae81ff&#34;&gt;54850&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:41 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:auth&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: check pass; user unknown  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:41 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:auth&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: authentication failure; logname&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; eu&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:43 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Failed password &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; invalid user brent from 192.168.25.81 port&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:48 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:auth&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: check pass; user unknown  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:51 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Failed password &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; invalid user brent from 192.168.25.81 port&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:57 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Connection closed by invalid user brent 192.168.25.81 port 548&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:35:57 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665153&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: PAM &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; more authentication failure; logname&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; euid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; tty&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;s&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:36:07 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665161&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: Accepted password &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; pop from 192.168.25.81 port &lt;span style=&#34;color:#ae81ff&#34;&gt;54862&lt;/span&gt; ssh2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;27&lt;/span&gt; 15:36:07 pop-os sshd&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;665161&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: pam_unix&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sshd:session&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: session opened &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; user pop by &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;network-commands&#34;&gt;Network commands&lt;/h2&gt;
&lt;p&gt;Finally, there are also a few ways to look at this from a network perspective.  You can show socket statistics with _&lt;em&gt;ss&lt;/em&gt;.  This can be interesting for associating unknown traffic to a process id.  The following example is truncated to give a sense of the output, but the full dump is long.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ss | more
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Netid State Recv-Q  Send-Q  Local Address:Port         Peer Address:Port    Process
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u_seq ESTAB      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;   @00031 &lt;span style=&#34;color:#ae81ff&#34;&gt;4813785&lt;/span&gt;                 *                &lt;span style=&#34;color:#ae81ff&#34;&gt;4813786&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u_seq ESTAB      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;   @00041 &lt;span style=&#34;color:#ae81ff&#34;&gt;8426824&lt;/span&gt;                 *                &lt;span style=&#34;color:#ae81ff&#34;&gt;8426825&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Netstat&lt;/strong&gt; provides another network perspective, this time organized as conversations.  The tabular form of netstat is a little easier to digest.  The version shown uses switches for numeric output, processes info, and all.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;netstat -npa  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Not all processes could be identified, non-owned process info  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; will not be shown, you would have to be root to see it all.&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Active Internet connections &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;servers and established&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcp        &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; 192.168.25.2:22         192.168.25.81:54862     ESTABLISHED -  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;These networking commands give you a different view into what&amp;rsquo;s happening on your server, but for our original purpose they&amp;rsquo;re abstract.  I&amp;rsquo;d recommend trying all these techniques to gain wider familiarity with your server, but I find the most common commands I use are &lt;strong&gt;w&lt;/strong&gt;, &lt;strong&gt;lastb&lt;/strong&gt;, and &lt;strong&gt;journalctl -u ssh&lt;/strong&gt; (depending on what I&amp;rsquo;m trying to troubleshoot).&lt;/p&gt;
&lt;p&gt;Future articles will continue to review some of the administrative issues with maintaining an SSH/SFTP server, such as understanding encryption in use and limiting it to &amp;ldquo;modern&amp;rdquo; protocols.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Technically Correct Verbage Rant</title>
      <link>https://nextpertise.net/201220_networkingrant/</link>
      <pubDate>Sun, 20 Dec 2020 02:00:15 -0500</pubDate>
      
      <guid>https://nextpertise.net/201220_networkingrant/</guid>
      <description>&lt;p&gt;Part of our industry is the need to constantly keep up to date.  I&amp;rsquo;ve been going through some training and flipped the &amp;ldquo;bozo&amp;rdquo; bit on the instructor because he was struggling to explain some basic network concepts.  I&amp;rsquo;m in management these days and often have to quickly evaluate other technical people.  Whether it&amp;rsquo;s hiring, considering contract work, or talking to a potential &amp;ldquo;partner&amp;rdquo;, I form an opinion of you, your company, and your product based on your technical vocabulary.&lt;/p&gt;
&lt;p&gt;Here are three terms that are commonly misused and make me suspecious.&lt;/p&gt;
&lt;h2 id=&#34;bandwith&#34;&gt;Bandwith&lt;/h2&gt;
&lt;p&gt;This one is so common, that even people who understand concepts will slip into a vernacular.  In untechnical slang, &amp;ldquo;bandwidth&amp;rdquo; has come to be synonymous with time and capacity.  A colleague might ask you &amp;ldquo;do you have the bandwidth to handle this?&amp;rdquo;  What they mean is &amp;ldquo;do you have the time?&amp;rdquo;  In this sense, it&amp;rsquo;s trendy and hip and can be more easily forgiven.&lt;/p&gt;
&lt;p&gt;When your ISP says that their bandwidth is 10Mbps they are describing &lt;em&gt;network capacity&lt;/em&gt; or how fully it can be &lt;em&gt;utilized&lt;/em&gt;.  This usage is technically wrong and either indicates that the speaker doesn&amp;rsquo;t understand the term or is pitching the discussion toward a non-technical audience.  Either of these uses is incorrect even in an analogous sense because they both speak to the amount of information over time.&lt;br&gt;
&lt;strong&gt;Bandwidth&lt;/strong&gt; properly describes the difference between the upper and lower frequencies being considered at an instant.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/TCP_CLOSE.svg/260px-TCP_CLOSE.svg.png#floatright&#34; alt=&#34;TCP Acks&#34;&gt;
Further, even the adulterated version of the term is misused.  When a link is said to be &amp;ldquo;10Mbps&amp;rdquo;, it doesn&amp;rsquo;t mean that a 10MB file can be downloaded in one second!&lt;/p&gt;
&lt;p&gt;Notice that ISP speeds are small &amp;ldquo;b&amp;rdquo; bits.  There are eight bits to a byte, so a 10 Megabyte file is 80 Megabits.  Further, files are transmitted a little bit at a time.  The client has to acknowledge receipt periodically.  That means that the server has to pause and wait for that acknowledgement.  Actual file transfer has as much to do with the round-trip time for this ack as with the size of the connection.&lt;/p&gt;
&lt;h2 id=&#34;ip-is-classless&#34;&gt;IP is Classless&lt;/h2&gt;
&lt;p&gt;The thing that really set me off was an AWS networking discussion where the instructor mentioned that we would use the &amp;ldquo;10.10.0.0/16 Class B network&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;A long time ago, IP addresses were just numbers.  I could be &amp;ldquo;1&amp;rdquo; and you could be &amp;ldquo;2&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;At a certain point, the network was divided into smaller networks of different sizes and the idea of an implicit class was used.  In this &lt;em&gt;classful&lt;/em&gt; structure, one could tell what portion of the address was the network prefix based on  the first octet.&lt;/p&gt;




     
    
    
     







&lt;table class=&#34;table table-responsive table-hover&#34;&gt;
&lt;caption&gt;Table: Classful addressing&lt;/caption&gt;
&lt;thead class=&#34;table-info&#34;&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Class&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;First Octet&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Assumed Mask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;A&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;0-127&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;255.0.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;B&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;128-191&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;255.255.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;C&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192-223&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Later (mid-90s) as the Internet started to grow it became obvious that this system lacked necessary flexibility.  IP addresses began to use &lt;em&gt;explicit masks&lt;/em&gt;, so that they could specify network prefixes of any number of bits.  At that point (25 years ago!) class became a thing of the past.&lt;/p&gt;
&lt;h2 id=&#34;slash-notation&#34;&gt;Slash notation&lt;/h2&gt;
&lt;p&gt;Finally, it&amp;rsquo;s technically correct to describe a mask as &amp;ldquo;255.255.240.0&amp;rdquo; but the cool kids would say &amp;ldquo;/20&amp;rdquo;.  That means the first 20 bits are used as the network prefix.  Not understanding this usage is a clear indication I&amp;rsquo;m dealing with a noobie.&lt;/p&gt;
&lt;h2 id=&#34;my-point&#34;&gt;My point&lt;/h2&gt;
&lt;p&gt;Words are important.  The words we choose carry meaning, sometimes beyond their strict definition.  They identify us as knowledgeable and up-to-date in a given subject and inspire confidence in our audience.  I hope you take care to communicate clearly and accurately and avoid these all-too-common flags.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What other mis-uses of technical language am I missing?&lt;/em&gt; I&amp;rsquo;d love your comments.  I&amp;rsquo;ll try to update this discussion as we go forward together!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS Changing EC2 IPs or Water Never Lies</title>
      <link>https://nextpertise.net/201218_aws-changingec2ips/</link>
      <pubDate>Fri, 18 Dec 2020 20:35:31 -0500</pubDate>
      
      <guid>https://nextpertise.net/201218_aws-changingec2ips/</guid>
      <description>&lt;p&gt;I had an issue that required changing the IP address of an EC2 instance.  &lt;strong&gt;The short version: you can&amp;rsquo;t change the primary IP of an EC2 instance.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;water-never-lies&#34;&gt;Water never lies&lt;/h2&gt;
&lt;p&gt;It seems intuitive to me that you can change an IP of a VM, so when asked I said &amp;ldquo;I think so&amp;rdquo;.  Turns out I answered from ignorance, but then I did a smart thing and actually tested the process to understand it better.&lt;/p&gt;
&lt;p&gt;My Dad was a builder.  One time when I was young he was questioned about grading, so he took me to the site and observed it in the rain.  Pointing out that the water ran away from the building, he said, &amp;ldquo;Water never lies&amp;rdquo;.  It seems obvious, but the older I get the more I find it profound.&lt;/p&gt;
&lt;p&gt;People &lt;em&gt;think&lt;/em&gt; a lot of things.  What someone &lt;em&gt;thinks&lt;/em&gt; will happen isn&amp;rsquo;t nearly as interesting as what actually happens.  It&amp;rsquo;s important to test our intuition against experience and continually validate and update our expectations.&lt;/p&gt;
&lt;h2 id=&#34;back-to-the-story&#34;&gt;Back to the story&lt;/h2&gt;
&lt;p&gt;To test IP address mobility in EC2, I created two t2.micro instances running Amazon Linux 2 (which we&amp;rsquo;ll call &amp;ldquo;A&amp;rdquo; and &amp;ldquo;B&amp;rdquo; for convenience). After choosing the AMI and instance type you are prompted to &amp;ldquo;Configure Instance&amp;rdquo;.  In this screen, after selecting the subnet the Network Interface details appear at the bottom of the page.  You can assign a valid unused IP - if left blank an IP will be assigned for you.  I allowed both instances to auto-assign an IP and they were assigned to the &amp;ldquo;primary&amp;rdquo; (eth0) interface.&lt;br&gt;
&lt;img src=&#34;https://nextpertise.net/AWS_Conf_IP.png#floatcenter&#34; alt=&#34;AWS IP configuration&#34;&gt;&lt;/p&gt;
&lt;p&gt;The first thing I tried to do was to change the IP at the prompt.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ifconfig eth0 192.168.255.5 netmask 255.255.255.0  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That would work on a physical instance, but this left the instance unreachable.  After rebooting, I tried changing the IP address from the AWS console and then I tried to remove the interface.  Neither action was allowed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/AWS_Sec_IP.png#floatright&#34; alt=&#34;AWS Secondary IP&#34;&gt;
Next I assigned a secondary IP.  To do this, go to EC2 and select the instance and then select the network interface.  Under the network interface, go to the Actions button in the top right corner and select &amp;ldquo;Manage IP addresses.  In the ensuing screen, expand the &amp;ldquo;eth0&amp;rdquo; selection and you&amp;rsquo;ll see a button for &amp;ldquo;assign new IP address&amp;rdquo;.  When you add another address, AWS will limit you to only valid and available addresses on the subnet.  If the IP is used by another instance - whether active or not - you will &lt;em&gt;not&lt;/em&gt; be able to assign it.&lt;/p&gt;
&lt;p&gt;I tried removing the secondary IP and didn&amp;rsquo;t have a problem.  I was able to take the secondary IP assigned to &amp;ldquo;A&amp;rdquo;, unassign it, and put it on &amp;ldquo;B&amp;rdquo;.  This works, but on AL2 you&amp;rsquo;ll need to restart the network service before the secondary IP will be &amp;ldquo;seen&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl restart networking
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;elastic-network-interfaces&#34;&gt;Elastic Network Interfaces&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/AWS_ENI_IP.png#floatright&#34; alt=&#34;Elastic Network Interface&#34;&gt;
I also played with ENIs.  Originally, my idea was to create a new network interface, add it to the VM, and remove the old one in order to move the IP.  Again, you can&amp;rsquo;t change or delete the primary interfaces of an EC2 instance once created.&lt;/p&gt;
&lt;p&gt;However, you can create a stand-alone ENI and associate an IP with it.  &lt;em&gt;This&lt;/em&gt; can be attached to &amp;ldquo;A&amp;rdquo;, unattached, and attached to &amp;ldquo;B&amp;rdquo; without a networking restart.  In practice, it works very similar to a secondary IP.&lt;/p&gt;
&lt;p&gt;In the Instances page, look in the menu on the left under networking and find &amp;ldquo;Network Interfaces&amp;rdquo;.  From here you can click the &amp;ldquo;create network interface&amp;rdquo; button to create an independent NIC and assign it an IP.&lt;/p&gt;
&lt;p&gt;Interface IPs cannot be reassigned without deleting the instance.  Yes, you can take a snapshot before deleting, but your tolerance for that kind of risk may be limited.&lt;/p&gt;
&lt;p&gt;The best option is to construct your VPC environment so that all references are done via Fully Qualified Domain Name (FQDN).  DNS can easily be updated to point the name &amp;ldquo;server&amp;rdquo; from 10.0.0.1 to 10.0.0.2.&lt;/p&gt;
&lt;p&gt;There are places where we are forced to refernce by IP.  In such cases, I recommend using an ENI.  Disable eth0 if having two IPs bother you.  Upgrading or replacing a VM can be as easy as standing up the new version and transferring the ENI.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found several references on the Internet to the fact that you can&amp;rsquo;t move EC2 IPs, but not a more detailed walk through of what you &lt;em&gt;can&lt;/em&gt; do.  I hope this discussion has been helpful!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Love Letter to Flameshot</title>
      <link>https://nextpertise.net/201210_flameshot/</link>
      <pubDate>Thu, 10 Dec 2020 14:28:39 -0500</pubDate>
      
      <guid>https://nextpertise.net/201210_flameshot/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/flameshot-demo.gif#floatright&#34; alt=&#34;Flameshot&#34;&gt; My friend Jared always extols the Unix philosophy that programs should &amp;ldquo;do one thing and do it well&amp;rdquo;.  One program that fits that description is &lt;em&gt;flameshot&lt;/em&gt;.  Flameshot makes great screenshots and allows you to easily annotate them.&lt;/p&gt;
&lt;p&gt;A few years ago I was put in a position where I had to produce monthly reports that included screenshots from our tools.  The default gnome-screenshot application is difficult to work with.  It has to be re-invoked for each capture and it doesn&amp;rsquo;t allow you to easily adjust the parameters or annotate the picture.  As a result, I&amp;rsquo;d take a bunch of screenshots and each one involved a try or two to capture the right section, then opening in Gimp to edit.  It took &lt;em&gt;forever&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Flameshot made this an easy process.  Since then, I very commonly want to take a screenshot for this blog or for an email.  Usually I&amp;rsquo;m trying to demonstrate a function or show what a screen looks like.  This program allows me to quickly grab the section of the screen I need, highlight, draw, and even obfuscate sensitive portions (like credentials).&lt;/p&gt;
&lt;p&gt;Flameshot can be downloaded from Github, but most distros have it in their archives.  It&amp;rsquo;s available as a flatpak, snap, AppImage, rpm, or deb.  It&amp;rsquo;s even available for Windows.  On Ubuntu, it can be pulled down using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install flameshot  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For snap:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo install snap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For flatpak:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flatpak install https://github.com/flameshot-org/flameshot/releases/download/v0.8.0/org.flameshot.flameshot_0.8.0_x86_64.flatpak  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or grab the AppImage version from the website.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot of gnashing of teeth about which of these formats is better.  Personally, grabbing the DEB means that I update it with the rest of my applications and I haven&amp;rsquo;t had issues with DEB.  I&amp;rsquo;ve used all three of the portable formats and found them to be fungible.  Appimage is both the most portable and the easiest to forget updates with.&lt;/p&gt;
&lt;h2 id=&#34;invoking-flameshot&#34;&gt;Invoking Flameshot&lt;/h2&gt;
&lt;p&gt;Flameshot can be launched from the menu.  It will also install an icon on the bar - on Gnome you need the &lt;a href=&#34;https://extensions.gnome.org/extension/1031/topicons/&#34;&gt;TopIcons&lt;/a&gt; extension to see it.&lt;br&gt;
It also works well to map a keybinding to it, such as PrintScreen.  Link the keypress to the command: &lt;strong&gt;flameshot gui&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;using-flameshot&#34;&gt;Using Flameshot&lt;/h2&gt;
&lt;p&gt;Once you start Flameshot, the screen immediately dims and you are prompted to drag a box around the area of the screen you want to snip.  Once the box is defined, a series of circular option buttons surround the selection to allow editing.&lt;/p&gt;
&lt;p&gt;The animated graphic above does a good job showing this action.  Some of the features I most commonly use are arrows, lines and boxes,and the &amp;ldquo;smear&amp;rdquo; tool to hide sensative parts.  Once done, click the disk icon and save your file.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As I said, Flameshot takes great screen captures.  Since I titled this a &amp;ldquo;love letter&amp;rdquo;, it&amp;rsquo;s obviously a program that I find valuable.  It makes it easy to annotate them.  It&amp;rsquo;s easy to adjust the capture and it&amp;rsquo;s easy to re-invoke if needed.&lt;/p&gt;
&lt;p&gt;Flameshot has become a part of my standard install - frankly I&amp;rsquo;m not clear why it&amp;rsquo;s not included standard with most distributions.  It does one thing really well.  I encourage you to give it a try!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Personal Readme</title>
      <link>https://nextpertise.net/201206_personal-readme/</link>
      <pubDate>Sun, 06 Dec 2020 14:58:31 -0500</pubDate>
      
      <guid>https://nextpertise.net/201206_personal-readme/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GoaDinner.jpg#floatright&#34; alt=&#34;Goa Friends&#34;&gt;
I recently came across the concept of a personal README.  Conceptually, this is an introduction to workstyles and the preferred ways to work with someone.  Usually these are written by folks in management, because you have to be at a certain level before you can dictate how others should interact with you.  The idea comes from Michael Lopp (the VP of Engineering at Slack).  It&amp;rsquo;s a good concept to be familiar with in our industry because it is becoming more common.&lt;/p&gt;
&lt;p&gt;I moved into a new team where this was an expected introduction for a new manager.  I&amp;rsquo;ve put one together and posted it to a Github repository along with my professional documentation, like resume and publication list.  I&amp;rsquo;d like to say I&amp;rsquo;ve extended the concept from a personal readme to a personal Repo, but I suspect that I&amp;rsquo;m behind the times and don&amp;rsquo;t realize it.&lt;/p&gt;
&lt;h2 id=&#34;the-good&#34;&gt;The Good&lt;/h2&gt;
&lt;p&gt;Putting together my personal README wasn&amp;rsquo;t hard.  I found some examples online, but I found many of them to be preachy or self-involved.  Making big moralistic statements seems like the kind of thing that is used to bludgeon the author at a later date.  As far as writing something self-centered, I just don&amp;rsquo;t think anyone cares.&lt;/p&gt;
&lt;p&gt;I decided to focus on the parts that would matter to someone who worked for me.  I wrote about where I believe an IT team adds value, about my expectations and about my communications preferences.&lt;/p&gt;
&lt;p&gt;I found the exercise to have introspective value.  Very few of us are lucky enough to have training about how to manage a team, so we pick it up by reflecting on our own experiences, by ideas we see others use, and by expirimenting.  It&amp;rsquo;s not surprising that everyone ends up with a different style.&lt;/p&gt;
&lt;p&gt;A brief aside: One of the guys I used to work with (Joe - are you out there?) used to mix metaphors when he got upset or excited.  My favorite was &lt;em&gt;&amp;ldquo;throw it up against the wall and see who salutes&amp;rdquo;&lt;/em&gt;.  Still one of my favorite sayings.&lt;/p&gt;
&lt;h2 id=&#34;the-bad&#34;&gt;The Bad&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t think it did any harm.  However retrospectively, I don&amp;rsquo;t think this exercise really held value for the people it was intended to.  The new team dutifully sat through the presentation, but there were &lt;em&gt;no&lt;/em&gt; questions and it hasn&amp;rsquo;t ever come up in conversation.&lt;/p&gt;
&lt;h2 id=&#34;my-conclusion&#34;&gt;My conclusion&lt;/h2&gt;
&lt;p&gt;I tell my Trail Life boys, &amp;ldquo;Leadership is about working together to accomplish goals&amp;rdquo;.  It&amp;rsquo;s a definition that is easily understood by teenagers.  So on a certain level, I don&amp;rsquo;t think the personal readme really empowered me to work more effectively or to accomplish goals more easily.&lt;/p&gt;
&lt;p&gt;The truth, as much as I can discern it, is that people are more impressed by the things you tolerate and not by what you say.  To the extent they listen to what you say, simple heuristics repeated consistently seem to work best.&lt;/p&gt;
&lt;p&gt;Some of my favorite things to say include &amp;ldquo;Play the cards in your hand and not the cards you want&amp;rdquo; (credit to Kap Kim) and &amp;ldquo;be creatively impatient&amp;rdquo; (that one is mine).  Jim Guido, a man I admire immensely, used to say &amp;ldquo;early is on-time, on-time is late, and late is dead&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In spite of all the negatives, I would still recommend writing a readme.  Even though no one else paid attention, I did.  It helped me clarify and organize thoughts that had been bouncing around in my head for a long time.  And I&amp;rsquo;ve referred back to it to ground myself, to think about what I&amp;rsquo;ve learned and where I&amp;rsquo;ve veered off course.&lt;/p&gt;
&lt;p&gt;I think management generally spends too little time thinking about how they know what they think they know.&lt;/p&gt;
&lt;p&gt;So take a look at my &lt;a href=&#34;https://github.com/brentstewart/about-brent.git&#34;&gt;repo&lt;/a&gt; and think about how you would describe yourself.  Writers say that the best way to get to a good second draft is to start with a bad first draft, by which they mean that it&amp;rsquo;s better to just start and get ideas on paper and then edit them later.  So start a text file with your thoughts and worry about editing it once it reaches critical mass.&lt;/p&gt;
&lt;p&gt;I think you&amp;rsquo;ll find this a valuable exercise.&lt;/p&gt;
&lt;p&gt;The picture at the top of the article is me with a group of men I worked with in Goa, India, seven years ago.  I met many good friends through that time, friends that I wouldn&amp;rsquo;t have today if I hadn&amp;rsquo;t become a manager.  They kept this picture at the office and during a conversation last year they took this picture-of-a-picture and sent it to me.  That feeling - that our work together had value and was a memory they cherished the same way I did - was one of the the highs of my career.  That&amp;rsquo;s why it&amp;rsquo;s important to me to try to do it right.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SMAG (command line graphing)</title>
      <link>https://nextpertise.net/201201_smag/</link>
      <pubDate>Tue, 01 Dec 2020 20:35:56 -0500</pubDate>
      
      <guid>https://nextpertise.net/201201_smag/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a neat tool to try out - &amp;ldquo;Show Me a Graph&amp;rdquo; or SMAG.  SMAG is available on Github and is a command line tool to produce live character-based graphs on the command line.&lt;/p&gt;
&lt;p&gt;There are all kinds of situations with modern cloud environments where we are working via SSH and a desktop and graphical tools aren&amp;rsquo;t available.  We still need to troubleshoot and a quick graph is a great way to get a sense of the situation.  Smag takes any command that produces a numeric output and turns that into a graph.&lt;/p&gt;
&lt;p&gt;To use smag, either clone the repository or grab the latest release from Github.  The example from the site monitors the number of processes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./smag &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ps aux | grep ssh | wc -l&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ps aux | grep bash | wc -l&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output needs to produce a number.  I accomplished that with other commands by using &lt;em&gt;grep&lt;/em&gt; to isolate a line in the output and &lt;em&gt;cut&lt;/em&gt; to pick out the number that I want.  I&amp;rsquo;m sure there are a lot of different ways to accomplish a similar result. Here are some sample scenarios that I tried.&lt;/p&gt;
&lt;h1 id=&#34;graph-ping-response-times&#34;&gt;Graph ping response times&lt;/h1&gt;
&lt;p&gt;This example pings Google DNS and graphs the round trip time.  I need ping to exit and return a number, so I set the count to one.  That command is then looped thorugh to create the graph.  Awk is pulling the seventh field - I think I could skip this and cut from the raw row, but this works.
&lt;img src=&#34;https://nextpertise.net/smag-ping.png#floatcenter&#34; alt=&#34;Ping&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./smag &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ping -c 1 -R 8.8.8.8 | grep time= | awk &amp;#39;{print \$7}&amp;#39; | cut -c 6-7&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;graph-cpu-temperatures&#34;&gt;Graph CPU temperatures&lt;/h1&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/smag-sensor.png#floatright&#34; alt=&#34;Temp&#34;&gt;&lt;/p&gt;
&lt;p&gt;For this, you&amp;rsquo;ll need to grab some packages to monitor system parameters.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install lm-sensors  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install hddtemp  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then monitor CPU temperature using the following command.  Note that sensors returns a lot of information, such as temperature per core.  I&amp;rsquo;m arbitrarily grabbing the summary.  You could certainly adjust this to pull the the value that&amp;rsquo;s most relevant to you.  Notice that I have enclosed quotes, so I use the single quote for grep and double quotes for smag.  The two types of quotes do the same thing, but we need to help bash recognize that we have one set inside another.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./smag &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sensors | grep &amp;#39;id 0:&amp;#39; | cut -c 17-20&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;graph-ethernet-packets-received&#34;&gt;Graph Ethernet packets received&lt;/h1&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/smag-eth.png#floatright&#34; alt=&#34;RX Packets&#34;&gt;
You can graph just about anything, but here&amp;rsquo;s a third example to demonstrate the case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./smag &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ifconfig enp0s31f6 | grep &amp;#39;RX packets&amp;#39;|cut -c 20-26&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SMAG is a valuable tool, but trying to remember the library of commands to draw out the values might be an issue over time.  If you have some particular values that you need to access consistently, this might be a good place for an &lt;em&gt;alias&lt;/em&gt;.  Alias allows us to substitute a command for another (usually more complicated) one.  Let&amp;rsquo;s say I want to call up this Ethernet graph pretty often.  I can make this easier to remember:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias smag-eth&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./smag \&amp;#34;ifconfig enp0s31f6 | grep &amp;#39;RX packets&amp;#39;|cut -c 20-26\&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we have enclosed quotes inside enclosed quotes!  Let&amp;rsquo;s parse this out.  The inner-most quotes are used by grep.  I&amp;rsquo;ve used single quotes to distinguish this from the outer quotes.  The next layer of quotes are used by SMAG, but they are inside another layer of quotes.  I&amp;rsquo;m using the backslash to tell alias to treat these quotes as literal characters, which allows them to be enclosed.  Finally, there are double quotes around the aliased command.  Now I can call up this graph by just typing:  &lt;strong&gt;smag-eth&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Thumbs-up.  If this is a problem you need to solve, it&amp;rsquo;s a neat tool to have in your toolbag.  If I had a particular need for this, my recommendation would be to make Smag and a common alias part of my standard build.  A little prep work like that will make things easier if stuff hits the fan.&lt;/p&gt;
&lt;p&gt;I want to mention that I had a question and posted an issue on Github.  &amp;ldquo;Aantn&amp;rdquo;, the developer of Smag, reached out to me and pointed out the error in the command I was using.  I appreciate the work they&amp;rsquo;ve put in to Smag and the impetus to share it with the world, and I especially appreciate the time they took with me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Powerline Windows</title>
      <link>https://nextpertise.net/201130_powerline-windows/</link>
      <pubDate>Mon, 30 Nov 2020 18:23:57 -0500</pubDate>
      
      <guid>https://nextpertise.net/201130_powerline-windows/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://docs.microsoft.com/en-us/windows/terminal/images/powerline-powershell.png#floatright&#34; alt=&#34;Powerline on Windows&#34;&gt;
I work in Windows from time to time.  Writing the article on the &lt;a href=&#34;https://nextpertise.net/posts/201125_tilix/&#34;&gt;Tilix&lt;/a&gt; Powerline setup made me realize that I wanted a similar spiffy prompt in Windows.  Let&amp;rsquo;s step through how to set that up!&lt;/p&gt;
&lt;h2 id=&#34;step-0-we-_are_-programmers---windows-terminal&#34;&gt;Step 0 (We &lt;em&gt;are&lt;/em&gt; programmers) - Windows Terminal&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701?WT.mc_id=-blog-scottha&#34;&gt;Windows Terminal&lt;/a&gt; is a nice addition to Windows, but doesn&amp;rsquo;t ship with Windows 10.  It is a terminal in the Linux-sense, and support tabs and customizations.  Alas, it doesn&amp;rsquo;t do tiling, but it supports Command Line, Powershell, WSL, SSH, and Azure Cloud.  The simplest way to get it is from the Windows Store, but you can also use the link above.&lt;/p&gt;
&lt;h2 id=&#34;step-1---install-a-font-that-supports-ligatures&#34;&gt;Step 1 - Install a Font that Supports Ligatures&lt;/h2&gt;
&lt;p&gt;I prefer &lt;a href=&#34;https://www.jetbrains.com/lp/mono/&#34;&gt;JetBrains Mono&lt;/a&gt;, but this is definitely a question of art.  Microsoft&amp;rsquo;s &lt;a href=&#34;https://github.com/microsoft/cascadia-code/releases&#34;&gt;Cascadia&lt;/a&gt; is one option.  Other options, like the excellent Inconsolata can be found at sites like &lt;a href=&#34;https://www.nerdfonts.com/&#34;&gt;Nerd Fonts&lt;/a&gt; or &lt;a href=&#34;https://www.programmingfonts.org/&#34;&gt;Programming Fonts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;step-2---install-git&#34;&gt;Step 2 - Install Git&lt;/h2&gt;
&lt;p&gt;Because Powerline support Git, I recommend going ahead and getting it installed so you can see it work.  You can download and install it from &lt;img src=&#34;https://git-scm.com/downloads&#34; alt=&#34;here&#34;&gt;.&lt;/p&gt;
&lt;h2 id=&#34;step-3---setup-in-powershell&#34;&gt;Step 3 - Setup in Powershell&lt;/h2&gt;
&lt;p&gt;Open a Powershell session and install the posh-git and &lt;a href=&#34;https://github.com/JanDeDobbeleer/oh-my-posh&#34;&gt;oh-my-posh&lt;/a&gt; add-ins.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Install-Module posh-git -Scope CurrentUser  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Install-Module oh-my-posh -Scope CurrentUser  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enable these modules to start with each new session via the terminal profile.  To open the profile, type &lt;strong&gt;notepad $profile&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#add these lines  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Import-Module posh-git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Import-Module oh-my-posh  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set-Theme agnoster  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that many &lt;a href=&#34;https://github.com/JanDeDobbeleer/oh-my-posh#themes&#34;&gt;themes&lt;/a&gt; are pre-built for oh-my-posh.  Refer to the github site to see samples.  Agnoster is my personal favorite because it&amp;rsquo;s less busy and keeps the prompt on one line.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/WinTerminal.png#floatright&#34; alt=&#34;Settings&#34;&gt;
Next, you&amp;rsquo;ll need to update the terminal settings to use the font.  In Windows Termianl, go to &lt;em&gt;Menu &amp;gt; settings&lt;/em&gt; (this will open VSCode if you have it installed).  Search for the &lt;em&gt;profiles&lt;/em&gt; section and add the &lt;em&gt;fontFace&lt;/em&gt; directive as shown below.  Note that we&amp;rsquo;re setting up Powerline to work with Powershell, not in the other environments, but I also went into the Command Prompt, Ubuntu, and Azure sections and changed them to use my new font.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;profiles&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;defaults&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       // Put settings here that you want to apply to all profiles.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            // Make changes here to the powershell.exe profile.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;guid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{61c54bbd-c2c6-5271-96e7-009a87ff44bf}&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Windows PowerShell&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;commandline&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;powershell.exe&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            __&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fontFace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JetBrains Mono&amp;#34;&lt;/span&gt;,__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; false  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;##Step 4 - Setup in WSL
For WSL, we&amp;rsquo;ll add a Go version of powerline.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install golang-go  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go get -u github.com/justjanne/powerline-go  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then edit the terminal settings to make sure it&amp;rsquo;s used to display new lines.  Edit via &lt;strong&gt;nano ~/.bashrc&lt;/strong&gt; and add the following snippet to the end.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GOPATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$HOME/go  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; _update_ps1&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PS1&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;$GOPATH/bin/powerline-go -error $?&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$TERM&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$GOPATH&lt;span style=&#34;color:#e6db74&#34;&gt;/bin/powerline-go&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PROMPT_COMMAND&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_update_ps1; &lt;/span&gt;$PROMPT_COMMAND&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Voila!&lt;/em&gt;  You should have Powerline functionality and cool fonts working in the different prompts available in Windows.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pop! OS</title>
      <link>https://nextpertise.net/201126_pop-os/</link>
      <pubDate>Thu, 26 Nov 2020 10:17:03 -0500</pubDate>
      
      <guid>https://nextpertise.net/201126_pop-os/</guid>
      <description>&lt;p&gt;I recently wrote about my experiences with &lt;a href=&#34;https://nextpertise.net/posts/201024_ubuntu2010/&#34;&gt;Ubuntu 20.10&lt;/a&gt;.  In that article, I mentioned that I previously found Gnome laggy and the app picker to be annoyingly unsorted.  That article got into Gnome 3.38, which seems to answer my issues by being perkier and providing a way to organize applications.  I also mentioend how much I appreciated Material Design, a tiling extension for Gnome.  That setup - Ubuntu 20.10 with Gnome 3.38 and Material Design - has worked really well on my laptop and a month later I remain enthusiastic about the way it organizes my work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://pop.system76.com/_nuxt/img/623f266-700.png#floatright&#34; alt=&#34;Pop OS&#34;&gt;
But . . . it doesn&amp;rsquo;t work so well on my desktop setup.  The desktop is an i7 with 64GB of memory (perfect for GNS3!) and a 2K and 4K display.  The Material Design extension didn&amp;rsquo;t adapt well to the dual displays.  Gnome was still great, so I started hunting for a different tiling extension but the others didn&amp;rsquo;t install on 3.38.  I had tried &lt;em&gt;Pop! OS&lt;/em&gt; six months ago and really liked where System 76 was headed with auto-tiling, but had been frustrated by Gnome.  I decided to give the distribution another chance.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pop! OS&lt;/em&gt; is an opinionated re-distribution of stock (Gnome) Ubuntu.  System 76 is a long time manufacturer of Linux computers.  They have a great reputation in the community and have been a big promoter and sponsor within the community.  A couple years ago, they decided to customize Ubuntu to optimize the experience for their hardware.  They labeled the result &lt;em&gt;Pop! OS&lt;/em&gt; and made it available for anyone to use.  &lt;em&gt;Pop! OS&lt;/em&gt; 20.10 came out shortly after Ubuntu 20.10 in seperate releases for computers with NVidia cards and those with AMD.&lt;/p&gt;
&lt;p&gt;The most obvious differnce between stock Ubuntu and &lt;em&gt;Pop! OS&lt;/em&gt; is the Gnome setup and skin.  Ubuntu has a very specific user experience and they have their own take on Gnome.  This isn&amp;rsquo;t a criticism.  System 76 has built a different experience, with a more &amp;ldquo;standard&amp;rdquo; Gnome setup but with their Auto-tiling extension.  There is also a relentlessly upbeat feel to the skinning and backgrounds.  It&amp;rsquo;s a peppiness that belies how darn useful the OS is.  Ubuntu is also moving very heavily toward snaps and &lt;em&gt;Pop! OS&lt;/em&gt; supports snaps but is built more along &lt;strong&gt;apt&lt;/strong&gt; lines.&lt;/p&gt;
&lt;p&gt;My experience is that 20.10 improves on 19.10, as one would expect.  The lagginess I saw before is now gone, which may be attributable to updated Gnome desktop.  All the things that I loved about Auto-Tiling are still present, they just work better.  On big displays, I really don&amp;rsquo;t see why you wouldn&amp;rsquo;t want this experience.  Opening a new window automatically divides the display either vertically or horizontally.  Gnome supports multiple workspaces, and I have been setting up desktops for specific workflows (like one for blogging that I&amp;rsquo;m using now).  I don&amp;rsquo;t like the workspace switcher that ships with &lt;em&gt;Pop! OS&lt;/em&gt;, so I installed Workspace Matrix.  I also added &lt;em&gt;Dash to Dock&lt;/em&gt; to give a dock and put the application button in a better location.&lt;/p&gt;
&lt;p&gt;I first experimented with Tiling using i3 and later Regolith.  Regolith in particular has a lot going for it and really opened my eyes to the possibilities, but I found both to be a lot of trouble to setup and work inside.  i3 is very keyboard heavy and the folks who enjoy it the most are very keyboard oriented.  &lt;em&gt;Pop! OS&lt;/em&gt; provides a similar experience, but it&amp;rsquo;s less laborious in a number of ways.  Tiling happens automatically, but if you don&amp;rsquo;t like the arrangement you can drag windows around to adjust the tiling.  It&amp;rsquo;s easier to setup exceptions (pop-up windows, like my password database, that should float and not re-tile the screen).  Keyboard shortcuts are supported, if you are oriented that way, but I rarely have used them in my testing.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pop! OS&lt;/em&gt; also has a conventional Gnome app picker.  Here I have a quibble - I would still prefer a heirarchical menu.  If anyone can suggest a good &lt;em&gt;Dash to Dock&lt;/em&gt; or Gnome extension in the comments, I&amp;rsquo;d appreciate it!&lt;/p&gt;
&lt;p&gt;The animated GIF here is me playing around.  I have two displays - a horizontal 4k on the right and a vertical 2k on the left.  There&amp;rsquo;s a gray area above the 4k because of the way the resolutions match up.  You can see Tilix and GNS3 open on the 4k, and Wireshark and an additional Tilix window open and automatically Tile.  Then I open the application picker on and fonts on the other display.  You can see &lt;em&gt;Dash to Dock&lt;/em&gt; and get a sense of how the system works.  You can also see that Gnome 3.38 now supports grouping applications, like Android, which I find a big improvement.&lt;/p&gt;
&lt;p&gt;There are other differences besides tiling between &lt;em&gt;Pop! OS&lt;/em&gt; and Ubuntu.  There are different application &amp;ldquo;stores&amp;rdquo; and update interfaces, but both accomplish the same things in similar ways.  There are different packaged apps, but you can install anything you need from PPA or snap on either system so this doesn&amp;rsquo;t strike me as worth cataloging.  I used my standard Ubuntu post-install script when I setup &lt;em&gt;Pop! OS&lt;/em&gt; and everything worked.&lt;/p&gt;
&lt;p&gt;So, why not just install the &lt;em&gt;Pop! OS&lt;/em&gt; extension on Ubuntu?  Well, it can be done.  System 76 publishes it to their Github.  They&amp;rsquo;ve packaged it for Fedora, but not yet for Ubuntu, so it would have to be built.  That&amp;rsquo;s not a mountain to climb, but I was ready for a clean install anyway and opted for the full &lt;em&gt;Pop! OS&lt;/em&gt; experience.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t say how much I appreciate what System 76 has done.  They&amp;rsquo;ve created a slightly different take on Ubuntu that looks great on their hardware and they&amp;rsquo;ve made all the parts - from a full OS install to the &amp;ldquo;secret sauce&amp;rdquo; extension easily accessible to the community.  I find &lt;em&gt;Pop! OS&lt;/em&gt; enjoyable and useful and plan on keeping it installed on this machine.&lt;/p&gt;
&lt;p&gt;My laptop is running fine using Ubuntu 20.10 with the Material Design extension, and there&amp;rsquo;s not enough of a difference to make me re-install it.   Besides, I&amp;rsquo;d like to see where each tiler goes.  There&amp;rsquo;s a lot in Material Design to recommend it and it&amp;rsquo;s still early days for that extension.  Frankly, &lt;em&gt;Pop! OS&lt;/em&gt; wasn&amp;rsquo;t quite baked at that stage either.  I intend to keep &lt;em&gt;Pop! OS&lt;/em&gt; on the Desktop. The current &lt;em&gt;Pop! OS&lt;/em&gt; 20.10 feels sharp, responsive, and really well done and I look forward to seeing where System 76 takes this idea next.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tilix</title>
      <link>https://nextpertise.net/201125_tilix/</link>
      <pubDate>Wed, 25 Nov 2020 07:50:59 -0500</pubDate>
      
      <guid>https://nextpertise.net/201125_tilix/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://gnunn1.github.io/tilix-web/src/images/gallery/tilix-screenshot-3.png#floatright&#34; alt=&#34;Tilix&#34;&gt; Tilix is a terminal application for Linux that I recommend as a replacement for the stock program (like gnome-terminal) shipped with your distribution.  This article will walk through some of the reasons I like Tilix and will show you how to use it with GNS3.&lt;/p&gt;
&lt;p&gt;The basic pitch of Tilix is that it is a tiling terminal.  New terminals exist in sessions.  Within a session, terminals can split the window horizontally or veritcally.&lt;/p&gt;
&lt;p&gt;Think of a session like a desktop.  You could create a poor-man&amp;rsquo;s IDE by grouping three sessions on a desktop, with one showing a directory, a second running &lt;strong&gt;nano&lt;/strong&gt;, and the third ready to receive a command.  Another session could be used for networking, with terminals open to a firewall and switch.  You manage sessions with the drop-down menu on the right.&lt;/p&gt;
&lt;p&gt;Sessions can be divided up into terminals.  New terminals split the screen.  You create a new terminal using the &amp;ldquo;horizontal split&amp;rdquo; button or the &amp;ldquo;vertical split&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There are a lot of additional features, such as a search function (particularly useful when scrolling through thousands of lines of syslog output), but the tiling features are what makes this program so darn useful to me.  As I have moved to larger displays (I typically work on a 40&amp;quot; 4K display these days), managing windows is more of a chore and I prefer things that help organize the desktop.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://camo.githubusercontent.com/b0862287feb56d682f22cfa67bc43f5cfa2fd5b59fc291533be741015c6766af/68747470733a2f2f7261772e6769746875622e636f6d2f622d7279616e2f706f7765726c696e652d7368656c6c2f6d61737465722f626173682d706f7765726c696e652d73637265656e73686f742e706e67#floatleft&#34; alt=&#34;Powerline&#34;&gt;Tilix supports any customization that a normal terminal application allows.  I&amp;rsquo;ll dig a little into this aspect in a seperate article, but I&amp;rsquo;ve included links for some of the ways I make my terminal easy to read.  I use the &lt;strong&gt;powerline-shell&lt;/strong&gt; prompt.  I use either JetBrains Mono font or Fira Mono, which both support programming ligatures.  There&amp;rsquo;s a variety of other monospace fonts with ligature support at the Powerline Git Repo.&lt;/p&gt;
&lt;h2 id=&#34;using-tilix-with-gns3&#34;&gt;Using Tilix with GNS3&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Tilix_in_GNS3.png#floatright&#34; alt=&#34;Tilix with GNS3&#34;&gt;
GNS3 allows you to set the terminal application it uses under &lt;em&gt;edit &amp;gt; preferences&lt;/em&gt;.  The drop-down for console sets GNS3 to work with some of the most common applications, such as &lt;em&gt;gnome-terminal&lt;/em&gt; or &lt;em&gt;PuTTY&lt;/em&gt;.  Tilix isn&amp;rsquo;t defined, but it works &lt;em&gt;really&lt;/em&gt; well in this scenario because GNS3 users typically have several terminal sessions on-going and need to easily move between them.&lt;/p&gt;
&lt;p&gt;To configure GNS3 to work with Tilix, choose &amp;ldquo;custom&amp;rdquo; and &lt;strong&gt;edit&lt;/strong&gt;.  Here&amp;rsquo;s the command that is needed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tilix -a session-add-right -t &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%d&amp;#34;&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;telnet %h %p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This setup uses Tilix and opens new terminals to the right of the existing one.  Other options set the title and tell Tilix how to connect to the GNS3 device.  The variables are defined in GNS3 and are visible in the &lt;strong&gt;edit&lt;/strong&gt; screen - %d is the tile, %h is the IP and %p is the port. Tilix has a man page if you want to investigate other options.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kali Linux 2020.4</title>
      <link>https://nextpertise.net/201120_kali_linux_2020_4/</link>
      <pubDate>Fri, 20 Nov 2020 10:30:00 +0000</pubDate>
      
      <guid>https://nextpertise.net/201120_kali_linux_2020_4/</guid>
      <description>&lt;p&gt;My favourite Operating System (Kali Linux) has a new release: 2020.4.&lt;/p&gt;
&lt;p&gt;The changes in this version include, but not limited to: ZSH is now Kali’s new default shell on desktop images and cloud, Bash remains the default shell for other platforms (ARM, containers, NetHunter, WSL) for the time being. Users can, of course, use that which they prefer, but be aware that, visually, Bash has been made to look more like ZSH.
Upon logging into a Kali terminal or console, users may be presented with a &lt;strong&gt;message from Kali developers&lt;/strong&gt; that will point them to more information about that specific installation, in case they need it for troubleshooting&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/kali.PNG#center&#34; alt=&#34;KL&#34;&gt;&lt;/p&gt;
&lt;p&gt;The most interesting part is that, Kali Linux 2020.4 now comes with a number of new tools to play with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metasploit Framework v6 (a tool for developing and executing exploits against remote target machines)&lt;/li&gt;
&lt;li&gt;CertGraph (a tool to crawl the graph of certificate Alternate Names)&lt;/li&gt;
&lt;li&gt;Apple bleee (a tool for getting info about nearby iPhones – device name, OS version, phone number, etc. – by sniffing Bluetooth traffic)&lt;/li&gt;
&lt;li&gt;dnscat2 (a tool for creating an encrypted C&amp;amp;C channel over DNS)&lt;/li&gt;
&lt;li&gt;FinalRecon (an automatic web reconnaissance tool)&lt;/li&gt;
&lt;li&gt;goDoH (a Command and Control framework that uses DNS-over-HTTPS)&lt;/li&gt;
&lt;li&gt;hostapd-mana (a rogue access point)&lt;/li&gt;
&lt;li&gt;Whatmask (a program that helps with network settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kali NetHunter, the distro’s mobile pentesting platform, has a new settings menu for easier back up and restore of configuration files, and a module that ensures persistence of the Magisk Android rooting system.&lt;/p&gt;
&lt;p&gt;Win-KeX 2.5, which provides a Kali Desktop Experience for Windows Subsystem for Linux, comes with a new Enhanced Session Mode for ARM devices and a few other tweaks.&lt;/p&gt;
&lt;p&gt;For additional information, you can check out the release notes at: &lt;a href=&#34;https://www.kali.org/news/kali-linux-2020-4-release/&#34;&gt;https://www.kali.org/news/kali-linux-2020-4-release/&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visio Shapes</title>
      <link>https://nextpertise.net/201117_visio_shapes/</link>
      <pubDate>Tue, 17 Nov 2020 08:00:28 -0500</pubDate>
      
      <guid>https://nextpertise.net/201117_visio_shapes/</guid>
      <description>&lt;h2 id=&#34;stencil-sets-for-you-to-use&#34;&gt;Stencil sets for you to use&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/AffinityBlue.PNG#floatright&#34; alt=&#34;Affinity Blue&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve created a new repository for Visio Stencils.&lt;/p&gt;
&lt;p&gt;Affinity Blue is a set of abstract network icons set in circles.  These are the alternative icons used in the GNS3 project.  I like using them in GNS3 because they provide a nice &amp;ldquo;clean&amp;rdquo; look that makes diagrams easy to quickly understand.  Vendor-specific icons for each type of firewall, for instance, can quickly distract from the function being provided and the flow of traffic.  These icons have been given four cardinal connections points.&lt;/p&gt;
&lt;p&gt;A second set is called &amp;ldquo;Brent&amp;rsquo;s Stencil&amp;rdquo;.  This is a collection of &amp;ldquo;standard&amp;rdquo; shapes taken from a variety of online sources - mostly old Cisco drawings.  If you like the old Cisco documentation diagrams, these give that same look.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/BrentsStencil.PNG#floatleft&#34; alt=&#34;Brent&amp;rsquo;s Stencil&#34;&gt;
This second stencil has been more heavily customized.  Several of the icons have extra connection points (this makes it easier to label lines going to a switch, for instance).  The &amp;ldquo;link&amp;rdquo; lines have been set so that the text will be at the same angle as the line, which helps to clean up diagrams.&lt;/p&gt;
&lt;p&gt;This set is older - I&amp;rsquo;ve used it for at least a decade.  It has some icons that show time has passed like a TDM PBX, analog phone, and ISDN switch.  It also doesn&amp;rsquo;t have much in the way of containers, VMs, or clouds.  Still, this collects a variety of useful icons and puts them in one place.  I hope it is useful to you.&lt;/p&gt;
&lt;h2 id=&#34;creating-a-custom-visio-stencil&#34;&gt;Creating a Custom Visio Stencil&lt;/h2&gt;
&lt;p&gt;For those interested in creating their own stencil set, the process is easy.&lt;br&gt;
&lt;img src=&#34;https://nextpertise.net/Visio_Dev_Mode.PNG#floatright&#34; alt=&#34;Visio Developer Mode&#34;&gt;
First, in Visio go to &lt;strong&gt;File &amp;gt; Options &amp;gt; Advanced&lt;/strong&gt; and enable Developer Mode.  This will allow you to edit the stencil later.&lt;/p&gt;
&lt;p&gt;Grab an icon that you want to use and place it in Visio (either import it or just paste it in).  &lt;img src=&#34;https://google.com/images&#34; alt=&#34;Google Images&#34;&gt; is a pretty good place to find icons or images to use, or you can paste them in from other programs. If you&amp;rsquo;re using an image, make sure to resize the imported image to the size that you&amp;rsquo;ll want it to be most commonly.  Most icons are about a half-inch square or so.&lt;/p&gt;
&lt;p&gt;Next, edit the icons properties.  Right click the image and open the ShapeSheet (top option).  Go to the Connection Points section.  If that section doesn&amp;rsquo;t exist, right click and choose &amp;ldquo;add section&amp;rdquo;.  You can add lines to the connection point table to make it look the way you want.  Each connection point exists on a grid where (0,0) is the bottom left corner and (width,height) is the upper right.  Add a connection point to the middle of the right side by putting it at (width,height*.5).  Right click the grid to add additional lines as needed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Visio_angle.PNG&#34; alt=&#34;Angled Text&#34;&gt;&lt;/p&gt;
&lt;p&gt;In &amp;ldquo;Brent&amp;rsquo;s Stencil&amp;rdquo; I added a line which has text that is angled with the line.  I did that by opening the ShapeSheet for the line and editing the Text Transform box to set the TxtAngle property to ATAN(Height/Width).&lt;/p&gt;
&lt;p&gt;Whether you just clone the repo and use these or want to contribute to the collection, I hope this inspires you to do something cool!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Active Directory Security Assessment with PingCastle</title>
      <link>https://nextpertise.net/201113_pingcastle/</link>
      <pubDate>Fri, 13 Nov 2020 10:30:00 +0000</pubDate>
      
      <guid>https://nextpertise.net/201113_pingcastle/</guid>
      <description>&lt;p&gt;Microsoft Active Directory (AD) is one of the technologies that is predominantly used in several organizations around the world. While we all know its purpose, most of the time it keeps growing or gets convoluted with uncontrolled Organizational Units, ever growing Users, ever increasing Computers, Policies, Integrations etc. While the Administrators remain busy in putting out the fires at work, they rarely get time to optimize, tune, clean or deploy best practices on the AD, and lock it down by implementing good security controls.&lt;/p&gt;
&lt;p&gt;Enter PingCastle. I found this tool through an auditor who was using mimkatz to perform a pentest on an AD, and I found it to be super valuable. This may help some of the AD Admins to quickly identify some of the areas that they can fix within their AD deployments.
The entire Pingcastle project is written in C# and it is available on GitHub, located at: &lt;a href=&#34;https://github.com/vletoux/pingcastle&#34;&gt;https://github.com/vletoux/pingcastle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is an AD security assessment tool, designed to quickly assess the AD security level with a methodology based on a risk assessment and maturity framework.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/pingcastle.PNG#center&#34; alt=&#34;PC&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features of PingCastle&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Health Check - This is the default report produced by PingCastle. It quickly collects the most important information of the Active Directory and establishes an overview. Based on a model and rules, it evaluates the score of the sub-processes of the Active Directory. Then it reports the risks.&lt;/li&gt;
&lt;li&gt;Active Directory Map - This report produces a map of all Active Directory that PingCastle knows about. This map is built based on existing health check reports or when none is available, via a special mode collecting the required information as fast as possible&lt;/li&gt;
&lt;li&gt;Consolidation - When multiple reports of PingCastle have been collected, they can be regrouped in a single report. This facilitates the benchmark of all domains&lt;/li&gt;
&lt;li&gt;Scanner - Checking workstations for local admin privileges, open shares, start-up time is usually complex and requires an admin. PingCastle’s scanner bypasses these classic limits. This feature is awesome and can help to cover some of the most blind spots on the network that are often overlooked&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To learn more about this tool, please visit &lt;a href=&#34;https://www.pingcastle.com/&#34;&gt;https://www.pingcastle.com/&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Winapps</title>
      <link>https://nextpertise.net/201110_winapps/</link>
      <pubDate>Tue, 10 Nov 2020 08:24:53 -0500</pubDate>
      
      <guid>https://nextpertise.net/201110_winapps/</guid>
      <description>&lt;p&gt;Winapps is a project that allows running Windows applications as if they were a part of a Linux Desktop. It&amp;rsquo;s a sleight of hand - the apps run in a VM and an RDP window is created for just that application. However, it integrates with the Linux environment and even let&amp;rsquo;s you use &amp;ldquo;open with&amp;rdquo; types of functionality.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/brentstewart/winapps/develop/demo/demo.gif#floatright&#34; alt=&#34;WinApps&#34;&gt;&lt;/p&gt;
&lt;p&gt;To give it a try, clone the code from &lt;a href=&#34;https://github.com/Fmstrat/winapps&#34;&gt;GitHub&lt;/a&gt;. Remember that it&amp;rsquo;s running programs that are installed on a VM. If you don&amp;rsquo;t have a Windows VM, the project includes an empty KVM machine that Windows and applications can be installed within. You can use an existing Windows VM (or even physical machine) if you have one. Windows doesn&amp;rsquo;t have to be a VM on your local machine - I set this up to run with a copy of Windows I&amp;rsquo;m running on my ESXi server downstairs. Theoretically, you could use your laptop or a remote computer to be the &amp;ldquo;Windows source&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Create a text file at _~/.config/winapps/winapps.conf that looks like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RDP_USER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MyWindowsUser&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RDP_PASS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MyWindowsPassword&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#RDP_IP=&amp;#34;192.168.123.111&amp;#34;  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#DEBUG=&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The IP is only required if Windows is remote. The Debug command tells it to create a log and is optional.&lt;/p&gt;
&lt;p&gt;Finally, run the &lt;strong&gt;install.sh&lt;/strong&gt; script. This script will use the variables defined in the config file and login and scan Windows. If it finds a file it knows, it will setup the link, put an icon and entry in the local application menu, and link the appropriate mime-types.&lt;/p&gt;
&lt;p&gt;When I tested this, I ran into a couple issues running the install script. The script would timeout. Looking at the script, I saw that it was trying to use xfreerdp to login to Windows. I ran that command from the command line and saw that it wasn&amp;rsquo;t connecting. Troubleshooting on Windows revealed that I needed to enable remote desktop under settings&amp;gt;system&amp;gt;remote desktop. Doh! Re-testing with xfreerdp revealed that I needed to accept a certificate.&lt;/p&gt;
&lt;p&gt;With the RDP part confirmed working, I re-ran the script and &lt;em&gt;voila!&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A lot of folks will be interested in running Office and those apps are defined, but I use my Windows VM mostly for things that can&amp;rsquo;t be done on Linux like running the Kindle application. Look in the repository under &lt;em&gt;apps&lt;/em&gt; and you&amp;rsquo;ll see that various programs are defined, each to a directory. In the directory is a definition file that includes mime-types consumed and a path to the application in Windows. There&amp;rsquo;s also an icon in the directory. This is what the install script references when it runs.&lt;/p&gt;
&lt;p&gt;I was able to create a Kindle definition file. I grabbed an SVG icon from Google Images and created an &lt;em&gt;info&lt;/em&gt; file that contained the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# GNOME shortcut name  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kindle&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Used for descriptions and window class  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FULL_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Amazon Kindle&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# The executable inside windows  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WIN_EXECUTABLE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c:\users\brent\appdata\local\amazon\kindle\application\kindle.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# GNOME categories  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CATEGORIES&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Education&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# GNOME mimetypes  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MIME_TYPES&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://microfilums.files.wordpress.com/2010/01/2260894625_ea1feecb2a.jpg#floatleft&#34; alt=&#34;Big Brains&#34;&gt;
I wanted to add the work I&amp;rsquo;d done back to the project, so I forked the &lt;em&gt;develop&lt;/em&gt; branch, added the files, and submitted a Pull Request back to &amp;ldquo;fmstrat&amp;rdquo;. I also added some troubleshooting suggestions for them based on my experience.&lt;/p&gt;
&lt;p&gt;This was a neat adventure to write up because it combines a lot of the things we&amp;rsquo;ve been discussing in this blog. The implementation is a lot like running an X application on a remote machine, which we discussed in &lt;a href=&#34;https://nextpertise.net/posts/200922_using_ssh5/&#34;&gt;Remotely Possible&lt;/a&gt;. Of course we talk a lot about Linux and using Linux in a Windows world, and we talk about Git.&lt;/p&gt;
&lt;p&gt;But this is another chance to hit on a favorite theme of mine. You don&amp;rsquo;t need to be gods-gift-to-programming to make meaningful and appreciated contributions to the open source community. In the day I took to play with this and contribute the Kindle definition, several other people also submitted apps and the library is quickly growing. Similar to defining GNS3 appliances, there&amp;rsquo;s a lot of ways to give back. There&amp;rsquo;s a real satisfaction to contributing in this way that I hope you have a chance to experience.&lt;/p&gt;
&lt;p&gt;As far as Winapps, as I mentioned at the beginning, it&amp;rsquo;s interesting and definitely looks cool. I&amp;rsquo;m not complete sold that it&amp;rsquo;s that much more useful than just pulling up a Windows VM, but it&amp;rsquo;s close enough that it will fit the work styles of some folks really well. It&amp;rsquo;s worth a look!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Web Application Performance Assessment - Quick &amp; Easy</title>
      <link>https://nextpertise.net/201106_webappperfassessment/</link>
      <pubDate>Fri, 06 Nov 2020 04:30:50 -0400</pubDate>
      
      <guid>https://nextpertise.net/201106_webappperfassessment/</guid>
      <description>&lt;p&gt;Today, developers and content creators that maintain web applications are often looking out for ways to improve their site or web apps. This could be for High Performance (lower response time), Better Accessibility (consistent experience across all device types e.g. Tablet, Smartphone, PC), better Search Engine Optimization (SEO) score and other ways to improve the content by following industry best practices. There are many tools out there, which can be very expensive, and some have a steep learning curve.&lt;/p&gt;
&lt;p&gt;I needed something that was very minimalistic, one that provides good information on issues that I can fix quickly and make my web application better. I came across Lighthouse.&lt;/p&gt;
&lt;p&gt;Lighthouse is a tool supported and backed by Google Developers that helps to measure performance and provide recommendations on how to fix some of the issues that are discovered. It is very minimalistic and powerful. Here is a snapshot of the scores and a set of recommendations it provides to improve the web content – I was amazed by this!&lt;/p&gt;
&lt;h2 id=&#34;setting-up-lighthouse&#34;&gt;Setting up Lighthouse&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;As a Google Chrome extension – Simply visit the Google Chrome Extensions and search for Lighthouse plugin&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/lighthouse_extension.PNG#center&#34; alt=&#34;LH&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;CLI Usage and Programmatic Access (requires Google Chrome Browser)&lt;/p&gt;
&lt;p&gt;a.	Install the Node.JS  package, which matches your Operating System (OS) - &lt;a href=&#34;https://nodejs.org/en/download/&#34;&gt;https://nodejs.org/en/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;b.	Open a Terminal or Command Window and issue the command&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NPM install -g lighthouse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;c.	To run a scan against a webpage, open terminal or command windows and issue:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lighthouse &amp;lt;url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/lighthouse_cmd1.PNG#center&#34; alt=&#34;LH&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;reports-generated&#34;&gt;Reports Generated&lt;/h2&gt;
&lt;p&gt;An HTML report is generated that shows the Performance and other metrics along with the recommendations on how fix potential issues.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/lighthouseresults.PNG#center&#34; alt=&#34;LH&#34;&gt; &lt;img src=&#34;https://nextpertise.net/lighthouse_opportunities.PNG#center&#34; alt=&#34;LH&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/lighthouse_best_practices.PNG#center&#34; alt=&#34;LH&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;enhancements--recommendations&#34;&gt;Enhancements &amp;amp; Recommendations&lt;/h2&gt;
&lt;p&gt;You can setup scheduled commands or scripts to makes Lighhouse run on a daily or weekly basis, and generate the output as a CSV or JSON format, instead of HTML. Subsequently, you can use the CSV or JSON format and parse the data to setup thresholds and alerts to trigger when the data points deviate below the predefined threshold levels.&lt;/p&gt;
&lt;p&gt;This way you can setup a repetitive process to monitor your web apps. You can also use the tool internally on your test environment and ensure that all the bugs and performance hindering elements are rectified before you move the web applications to a live environment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 2.2.16</title>
      <link>https://nextpertise.net/201105_gns3_2.2.16/</link>
      <pubDate>Thu, 05 Nov 2020 08:29:40 -0500</pubDate>
      
      <guid>https://nextpertise.net/201105_gns3_2.2.16/</guid>
      <description>&lt;p&gt;GNS3 2.2.16 was released today. This release has a number of bug fixes that are mostly around Qemu and HyperV support. Of general interest, there&amp;rsquo;s a patch for a bug in capturing packets with Wireshark. I had an issue open involving downloading appliances from the application and that was fixed as well. This shapes up to be a good polish on a great application and I wouldn&amp;rsquo;t be surprised if this attention didn&amp;rsquo;t translate into generally better performance in other areas.&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;This version doesn&amp;rsquo;t include a security fix. The VM improvements will help those running KVM or HyperV. There are some bug-fixes that will be of general interest, but aren&amp;rsquo;t critical. I recommend upgrading &lt;em&gt;assuming you have a little time to sort out any issues&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch. I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day. When I have had issues, they&amp;rsquo;ve been resolvable with an hour or two of concentration. &lt;strong&gt;Note&lt;/strong&gt; that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version. If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png#center&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it. On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;. If you have a server VM (and I recommend it), start by getting a snapshot of your current server. I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk. After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
&lt;h2 id=&#34;new-and-updated-appliances&#34;&gt;New and updated appliances&lt;/h2&gt;
&lt;p&gt;Folks continue to contribute appliances. If you are interested in doing this, refer to my articles on &lt;a href=&#34;https://nextpertise.net/posts/200904_creating_gns3_appliance/&#34;&gt;creating an appliance&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/200902_updatinggns3appliances/&#34;&gt;Updating an appliance&lt;/a&gt;. Here&amp;rsquo;s a list of the new and updated appliances since September first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPCop&lt;/li&gt;
&lt;li&gt;Raspian&lt;/li&gt;
&lt;li&gt;Arista VEOS&lt;/li&gt;
&lt;li&gt;Aruba VGW&lt;/li&gt;
&lt;li&gt;Cisco DCNM, IOSv L2, and IOSXRV9k&lt;/li&gt;
&lt;li&gt;Extreme VOSS&lt;/li&gt;
&lt;li&gt;F5 BIG-IP&lt;/li&gt;
&lt;li&gt;Huawei AR1KV, CE12800, NE40e, and USG6KV&lt;/li&gt;
&lt;li&gt;Juniper VMX , VRR, and VQFX&lt;/li&gt;
&lt;li&gt;OpenWRT&lt;/li&gt;
&lt;li&gt;OPNSense&lt;/li&gt;
&lt;li&gt;TACACS&lt;/li&gt;
&lt;li&gt;TinyCore&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;Vyos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow! That&amp;rsquo;s a lot. I added IPCop and Raspian and described the process in those &lt;a href=&#34;https://nextpertise.net/posts/200904_creating_gns3_appliance/&#34;&gt;earlier&lt;/a&gt; and &lt;a href=&#34;https://nextpertise.net/posts/200902_updatinggns3appliances/&#34;&gt;articles&lt;/a&gt;. I&amp;rsquo;m particularly excited about the Huawei additions. That&amp;rsquo;s been a big gap and it&amp;rsquo;s really nice to see that supported. Big thanks to &amp;ldquo;iceking2nd&amp;rdquo; for building those!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ZeroTier Router</title>
      <link>https://nextpertise.net/201027_zerotierrouter/</link>
      <pubDate>Tue, 27 Oct 2020 22:10:59 -0400</pubDate>
      
      <guid>https://nextpertise.net/201027_zerotierrouter/</guid>
      <description>&lt;p&gt;This article continues the exploration of ZeroTier started in a previous &lt;a href=&#34;https://nextpertise.net/posts/201027_zerotier/&#34;&gt;posting&lt;/a&gt;.  The first article described zerotier - an overlay virtual wire that hangs on the internet to connect disparate clients into a psuedo local network.  At the end of the discussion, we had a PC at home and a 4G mobile phone talking over Zerotier.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll continue the thought describing how to connect your local home network to your Zerotier virtual network.  For purposes of this article, let&amp;rsquo;s consider a home network with a little complexity.
&lt;img src=&#34;https://nextpertise.net/ZeroTier_Routing.png#center&#34; alt=&#34;Sample Network&#34;&gt;&lt;/p&gt;
&lt;p&gt;In this example, there is a base network of 192.168.100.0/24.  The 101 network is routed through the firewall and is used for IoT devices, while 102 is used for wireless.  104/22 has a next-hop in GNS3, so that a network can be establish and ennumberated using the network simulator and still route out to the &amp;ldquo;real&amp;rdquo; world.&lt;/p&gt;
&lt;p&gt;We want to create a router that has one interface in the local 192.168.100.0/24 network and a virtual interface in the virtual Zerotier 103.0/24 network, able to route between them.  To do this, I built a new Linux server (an Ubuntu 20.10 VM, but any distro physical or virtual should work).  I named the router &amp;ldquo;ZTRouter&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;A quick note - use care when routing 192.168.0.0/24 and 192.168.1.0/24.  A lot of home routers use these ranges and adding a ZeroTier route to the same destination might lead to confusion.  Select a space out of 10/8, 172.16/12, or 192.168/16 that won&amp;rsquo;t conflict with other routes you need to support.&lt;/p&gt;
&lt;h2 id=&#34;zerotier-routing&#34;&gt;ZeroTier Routing&lt;/h2&gt;
&lt;p&gt;I assigned ZTRouter 192.168.100.2/24 with a default route to the local router at 192.168.100.1.  Next I installed Zerotier and attached it to the SDN built in the last article.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s https://install.zerotier.com | sudo bash  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo zerotier-cli join 0123456789ABCDEF
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo zerotier-cli listnetworks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/ZTrouting.png#floatright&#34; alt=&#34;Zero Tier Routing Configuration&#34;&gt;The router will be automatically assigned an address on the ZeroTier network - in this case I received 192.168.103.88.  &lt;strong&gt;listnetworks&lt;/strong&gt; is used to confirm the connection.&lt;/p&gt;
&lt;p&gt;The routing that will need to be setup might not be obvious, so let&amp;rsquo;s walk through each route.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;192.168.103.0/24 is the Zerotier network.  A range from this network should be used in &amp;ldquo;auto-assign pools&amp;rdquo; in ZeroTier Central, such as 192.168.103.1 - 192.168.103.50.&lt;/li&gt;
&lt;li&gt;192.168.100.0/22 is the summary route to the local network and it points to ZTRouter.  This tells the other ZeroTier clients that this range is available through ZTRouter.&lt;/li&gt;
&lt;li&gt;192.168.104.0/22 is another summary route, this time for GNS3.  Again, this communicates the availability of the range to the ZeroTier network via ZTRouter.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;routing-between-zerotier-and-the-lan&#34;&gt;Routing between ZeroTier and the LAN&lt;/h2&gt;
&lt;p&gt;Next, ZTRouter needs to be enabled as a router.  Edit /etc/sysctl.conf and uncomment the line that says &lt;strong&gt;net.ipv4.forward&lt;/strong&gt;.  This will enable the Linux machine to route when it reboots.  Since we want it to work &lt;em&gt;now&lt;/em&gt;, well use this command as well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sysctl -w net.ipv4.ip_forward&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The local firewall also has to permit the traffic.  Depending on the distro, you may have nftables, iptables, or ufw.  Assuming the system uses iptables, start by getting the interface names.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip link
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For purposes of the article, let&amp;rsquo;s assume it shows you that the ethernet is enp1s0 and ZeroTier is zt1&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PHY_IFACE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;enp1s0; ZT_IFACE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;zt1 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make the iptables changes persistent.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install iptables-persistent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo bash -c iptables-save &amp;gt; /etc/iptables/rules.v4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;reciprocal-routes&#34;&gt;Reciprocal Routes&lt;/h2&gt;
&lt;p&gt;If testing is done at this point, it will show that ZT clients can ping the LAN interface of ZTRouter but can&amp;rsquo;t reach other users on the LAN.  What gives?  The problem is that we&amp;rsquo;ve built a path from the ZT cloud into our LAN, but not the reciprocal path &lt;em&gt;back&lt;/em&gt;.  The local users have a default gateway of the Internet router and &lt;em&gt;it&lt;/em&gt; doesn&amp;rsquo;t have a route to 192.168.103.0/24.  The easy way to fix that is to give it a route.  Everyone&amp;rsquo;s home router will be different, so in psuedo-code you just need to &lt;strong&gt;route 192.168.103.0/24 via 192.168.100.2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Testing will now show that ZeroTier clients can ping devices in the &amp;ldquo;100&amp;rdquo; network!  But, they can&amp;rsquo;t reach the other local VLANs.  The problem is that ZTRouter doesn&amp;rsquo;t have a route.  To fix that, add a summary route going to the Internet router.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip route add 192.168.100.0/22 gw 192.168.100.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add this line to &lt;em&gt;/etc/rc.local&lt;/em&gt; so that it is persistent.&lt;/p&gt;
&lt;p&gt;Note that this summary includes the ZeroTier network.  The routing table prefers the most specific path, so traffic to 103/24 will continue to route to ZeroTier and everything else will take the less specific route to the inter-vlan router.&lt;/p&gt;
&lt;p&gt;At this point, ZeroTier clients will be able to reach all the local subnets (100/24, 101/24, and 102/24).  Traffic to GNS3 can also be pointed to the Internet router, or it can be directed to a GNS3 router.  Note that 100/22 and 104/22 can&amp;rsquo;t be summarized into 100/21 because they fall across a bit-boundary, so they&amp;rsquo;ll have to be configured as two routes.&lt;/p&gt;
&lt;p&gt;One place that can cause trouble is route selection.  On ZTRouter, the ZeroTier summary route for 100/22 will be in the routing table.  The static route created &lt;em&gt;must&lt;/em&gt; be a lower metric so that it takes precedence.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;This is a slick setup.  ZeroTier makes a great VPN client, punches through NATs, and can create sophisticated routing.  The two places I expect folks to get hung up are getting the routes correctly configured in ZeroTier Central and making sure there is a reciprocal route back to the ZeroTier VPN range.  If you have problems, work your way out from the router one step at a time and make sure you understand how the routes are working going in &lt;em&gt;both&lt;/em&gt; directions (I&amp;rsquo;ve taught routing for twenty years and everyone always forgets to check the path back).&lt;/p&gt;
&lt;p&gt;Of course, most networks won&amp;rsquo;t be as sophisticated as the one shown here and will be very straightforward to setup.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to write an event to Windows and Linux logs</title>
      <link>https://nextpertise.net/201025_how_to_write_an_event_to_windows_event/</link>
      <pubDate>Sun, 25 Oct 2020 16:29:57 -0400</pubDate>
      
      <guid>https://nextpertise.net/201025_how_to_write_an_event_to_windows_event/</guid>
      <description>&lt;p&gt;Anyone who has trouble sleeping should discover the joys of reviewing Syslog data.  System logging contains a wealth of information that can assist in troubleshooting, security, and incident handling.  The hard part is wading through all the data to put together a useful and actionable story.  There are a wealth of tools to help us correlate and make sense these days, such as SIEM, but there are still times when we need to get into the data.&lt;/p&gt;
&lt;p&gt;One of the first problems we encounter in understanding syslog is figuring out where to start in the stream of events.  It would be nice if there were a bookmark that we could reference.  This article is about inserting that bookmark into either Windows Event logs or Linux Journals.&lt;/p&gt;
&lt;h2 id=&#34;powershell-sudo&#34;&gt;PowerShell sudo&lt;/h2&gt;
&lt;p&gt;A brief aside: The dichotomy of an admin PowerShell session and a regular PowerShell session is annoying.  One specific but near-to-my-heart example is the built-in terminal in Visual Studio Code (or VSCodium) for Windows, which uses a &amp;ldquo;non-admin&amp;rdquo; session.&lt;/p&gt;
&lt;p&gt;Linux systems have sudo.  Sudo allows a single command to run in an elevated state and sudo commands can be intermingled with un-priviledged commands.  The following script uses &lt;em&gt;scoop&lt;/em&gt; to grab a &amp;ldquo;sudo&amp;rdquo; application for Powershell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex (new-object net.webclient).downloadstring(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://get.scoop.sh&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set-executionpolicy unrestricted -s cu &lt;span style=&#34;color:#f92672&#34;&gt;-f&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scoop install sudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-to-write-an-event-to-windows-event-log&#34;&gt;How to write an Event to Windows Event Log&lt;/h2&gt;
&lt;p&gt;This technique allows you to place comments into the Windows event logs, for instance to mark the beginning or completion of a change window.  We could also build this into certain scripts so that they left an entry when they ran.  It could even be automated into systems so that the markings took place without a person having to remember.&lt;/p&gt;
&lt;p&gt;The general process is to create an information &amp;ldquo;source&amp;rdquo; to write into (if it doesn&amp;rsquo;t already exist) and then to write the event.&lt;/p&gt;
&lt;h3 id=&#34;creating-a-log-source&#34;&gt;Creating a log source&lt;/h3&gt;
&lt;p&gt;Since we&amp;rsquo;re creating log events for comments, let&amp;rsquo;s create a log source that matches our username.  If there are several admins, it may be a good idea to use a format like &amp;ldquo;admin-username&amp;rdquo; so that we can later search logs for &amp;ldquo;admin*&amp;rdquo;.  Creating a new source requires PowerShell to run with Administrator priviledges.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-eventlog -logname application -source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;brent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that you can use the environment variable &lt;em&gt;$env:username&lt;/em&gt;.  You can build this into a script - if the source already exists, the command will return an error to that effect.&lt;/p&gt;
&lt;h2 id=&#34;logging-an-entry&#34;&gt;Logging an entry&lt;/h2&gt;
&lt;p&gt;To create a log entry use the &amp;ldquo;write-eventlog&amp;rdquo; cmdlet.  Specify the log (like Application or Security), the source that we defined, and the message.  The EventID isn&amp;rsquo;t significant, so you could also use this numeric field if you had something suitable (like a ticket number).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Write-EventLog -LogName Application -Source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;brent&amp;#34;&lt;/span&gt; -EntryType Information -Message &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sample text&amp;#34;&lt;/span&gt; -EventID &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is also possible to write an entry on a remote computer. The example below assumes that the source &amp;ldquo;bstewart&amp;rdquo; exists on the remote computer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Write-EventLog -computername &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Server&amp;#34;&lt;/span&gt; -LogName Application -Source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bstewart&amp;#34;&lt;/span&gt; -EntryType Information -Message &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sample text&amp;#34;&lt;/span&gt; -EventID 1__  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;scripting&#34;&gt;Scripting&lt;/h2&gt;
&lt;p&gt;This can all be simplified in a script, saved as &amp;ldquo;log.ps1&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sudo New-eventlog -logname application -source $env:username  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Catch&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Output &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Log source already exists&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Write-eventlog -logname application -source $env:username -entrytype information -message $args[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] -eventid &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;write-host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The following was written to the Application log using the source &lt;/span&gt;$env:username&lt;span style=&#34;color:#e6db74&#34;&gt; for that log.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;write-host $args[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run the command from powershell to write a string.  It will try to create a source based on your username.  If one exists, it will use it and keep moving.  The argument is passed through as the message.  You could easily extend this script to have a second argument to pass the eventid as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; .\log.ps1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Something happened&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;linux-much-easier&#34;&gt;Linux (much easier)&lt;/h1&gt;
&lt;p&gt;Writing to the Linux journal is pretty straight-forward.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Sample text&amp;#39;&lt;/span&gt; | Systemd-cat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To take a look at this, just use &lt;strong&gt;journalctl -f&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll talk about logging to syslog another time, or maybe I can talk Myron into delving in because he has great experience with pulling things out of SIEMs.  Whether you use this in the scope of a SIEM or just for local logging, I&amp;rsquo;m sure you&amp;rsquo;ll find this idea useful.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ZeroTier Basic Configuration</title>
      <link>https://nextpertise.net/201027_zerotier/</link>
      <pubDate>Sun, 25 Oct 2020 16:29:57 -0400</pubDate>
      
      <guid>https://nextpertise.net/201027_zerotier/</guid>
      <description>&lt;p&gt;Zerotier is a virtualized network that runs &amp;ldquo;on top of&amp;rdquo; the Internet.&lt;/p&gt;
&lt;p&gt;Traditional VPN solutions are built around a VPN server, which acts as a hub location with a stable IP.  Modern teams feature mobile workers and home connections with random IPs behind service-provider NATs.  Start-up teams and home users are left with few options, all of which involve some level of compromise.&lt;/p&gt;
&lt;p&gt;Zerotier works around this by offering a stable point to connect end-points.  The connection strategy resembles VoIP connections - there&amp;rsquo;s a registration to a central point, that tries a variety of ways to create a connection to end points.  It then allows the end-points to speak directly.  All traffic between end-points is encrypted peer-to-peer.&lt;/p&gt;
&lt;p&gt;Zerotier allows the creation of a &amp;ldquo;virtual ethernet&amp;rdquo; that connects disparate endpoints.  I created a ZeroTier network and tested it with Fedora and Ubuntu Linux, as well as an Android phone.  I was able to connect to the ZeroTier network from a guest wifi and over a 4G connection.  Once connected, it behaved like a local network.  I was able to SSH, browse and download files, access a Calibre server, and use KDE Connect.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-a-zerotier-network&#34;&gt;Setting up a ZeroTier network&lt;/h2&gt;
&lt;p&gt;Go to &lt;a href=&#34;https://www.zerotier.com&#34;&gt;ZeroTier&lt;/a&gt; and scroll down to the bottom to &lt;strong&gt;Sign Up&lt;/strong&gt;.  After signing up, you&amp;rsquo;ll be taken to the ZeroTier Central page and be given a 16-digit hex network id and a made up name (like &amp;ldquo;gratious_donut&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/ZTnetworks.png#floatright&#34; alt=&#34;Zero Tier Networking&#34;&gt;&lt;/p&gt;
&lt;p&gt;Make sure under Access Control that you set your network to private.  This will not allow new connections without your permission.&lt;/p&gt;
&lt;p&gt;Under advanced, choose a network range.  You can use one of the &amp;ldquo;easy&amp;rdquo; options or select an IP address range of your own.  For now, just choose a pre-defined range.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s an option to use IPv6.  The easy way is to click the ZeroTier 6PLANE option.  It&amp;rsquo;s a great idea to be learning about IPv6, but most of us are still using v4 and if that&amp;rsquo;s the case for you then just leave this turned off.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it for Central for now.  Copy your network ID (the 16 digit hex number).  We&amp;rsquo;ll need to revisit Central later, but next we need to setup devices.&lt;/p&gt;
&lt;h2 id=&#34;client-installation&#34;&gt;Client installation&lt;/h2&gt;
&lt;p&gt;The instructions  for setting up clients can be found at &lt;a href=&#34;https://www.zerotier.com/download&#34;&gt;ZeroTier Downloads&lt;/a&gt;.  There&amp;rsquo;s a clicky MSI installer for Windows, and a pkg for Mac.  Smartphone users are directed to their stores.&lt;/p&gt;
&lt;p&gt;On Linux, the software can be installed with this command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s https://install.zerotier.com | sudo bash  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After installation, use &lt;strong&gt;zerotier-cli&lt;/strong&gt; to join the new virtual network.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo zerotier-cli join 123456789ABCDEF  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/ZTclient.png#floatright&#34; alt=&#34;ZeroTier Client&#34;&gt;
Go back to Central and scroll down to clients.  Find the new client and check the Auth? box.  You should add a name and description here as well to help identify this client as you add more endpoints.&lt;/p&gt;
&lt;p&gt;Back at Linux, confirm that you&amp;rsquo;re on the network.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo zerotier-cli status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, let&amp;rsquo;s setup an Android endpoint to have something to talk to.  Grab the app from the Play store.  Click the + in the upper right and type in the network ID.  Slide the ON button over and go back to Central and Authorize the client.&lt;/p&gt;
&lt;p&gt;You can continue to add clients in this manner, but I suggest you pause here.  My next article will be about routing between networks with Zerotier and that may be useful before you move further.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubuntu 20.10</title>
      <link>https://nextpertise.net/201024_ubuntu2010/</link>
      <pubDate>Sat, 24 Oct 2020 18:40:56 -0400</pubDate>
      
      <guid>https://nextpertise.net/201024_ubuntu2010/</guid>
      <description>&lt;p&gt;I had a chance to download Ubuntu 20.10 and install it on a gen 8 i5 laptop.  I typically use Cinnamon for a desktop environment, which I have long found to be mature, usable, and stable.  In the past, I&amp;rsquo;ve found Gnome to be laggy but I&amp;rsquo;ve heard good things about 3.38.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve become enamored of tiling windows as well.  I&amp;rsquo;ve tried i3, Pop OS!, and others.  So another thing I wanted to look into was the Material Design extension.&lt;/p&gt;
&lt;h2 id=&#34;about-ubuntu-2010&#34;&gt;About Ubuntu 20.10&lt;/h2&gt;
&lt;p&gt;Ubuntu releases a Long Term Support (LTS) release biannually.  LTS versions, like 20.04,  are supported for five years and are appropriate for business servers.  Interim releases like 20.10 are supported for nine months.  These releases are kept current and represent the most up-to-date implementation of Ubuntu&amp;rsquo;s vision for the Linux desktop.  Ubuntu supports a variety of DEs including KDE, Budgie, MATE and others. There are unsupported versions for Cinnamon and Deepin as well.  I&amp;rsquo;ve used the MATE version for VMs in the past and it&amp;rsquo;s performed very well, but this time I wanted to check out Gnome.&lt;/p&gt;
&lt;p&gt;The first two things that jumped out at me have to do with login.  First, there&amp;rsquo;s now a built in choice to authenticate via Active Directory.  I have several workstations and servers and the idea of being able to easily centralize authentication is &lt;em&gt;very&lt;/em&gt; appealing.  I haven&amp;rsquo;t had time to build that part out, but I will be looking into that process in the months ahead.  I&amp;rsquo;m hoping I can make it work with FreeIPA.&lt;/p&gt;
&lt;p&gt;The other thing - and this sounds minor - is the responsiveness of the login screen.  It&amp;rsquo;s been my past opinion that Gnome was slow, but logging in is breezy.  I use Windows 10 at work and the Ubuntu lock screen is especially quick comparted to that.&lt;/p&gt;
&lt;p&gt;The default Gnome experience has an &lt;em&gt;application grid&lt;/em&gt; like Android (all the apps in alphabetical order).  This was always annoying to me - partly because I&amp;rsquo;m a heirarchical organizer and partly because I could never remember the name of the app I wanted.  The new 3.38 allows you to organize your apps in whatever order makes sense to you and to pull icons into folders.  This is a big win for me.&lt;/p&gt;
&lt;p&gt;Ubuntu is still running Gnome on X.  X Windows is stable and mature and has better support for NVidia video cards, but the next generation Wayland is coming and Ubuntu hasn&amp;rsquo;t pushed that envelope yet.&lt;/p&gt;
&lt;p&gt;Ubuntu 20.10 includes Linux kernel 5.8.0.25.  This was billed as the &amp;ldquo;biggest release of all time&amp;rdquo; by Linux Torvalds.  Most of the improvements are around drivers and the Spectre patch.  According to Phoronix, there&amp;rsquo;s good benefit for ATI graphics.  Otherwise, from a desktop perspective, this won&amp;rsquo;t be a big deal.&lt;/p&gt;
&lt;p&gt;Applications, such as LibreOffice (7.0), Firefox (82), and Thunderbird (78.3.2), have been updated to latest versions.&lt;/p&gt;
&lt;p&gt;To me, the biggest difference between Gnome and Mate or Cinnamon is app selection.  At the end of the day, despite the improved performance, it&amp;rsquo;s not enough to make me want to switch.&lt;/p&gt;
&lt;h2 id=&#34;tiling-with-material-design&#34;&gt;Tiling with Material Design&lt;/h2&gt;
&lt;p&gt;As I mentioned before, the window tiling paradigm really makes sense to me.  I&amp;rsquo;ve tried i3 and Regolith, which I like, but they suffer from the same problem as Gnome - having an easy way to browse available applications.  Pop OS! has a tiling extension for Gnome that&amp;rsquo;s well thought out, but I abandoned it because it made Gnome &lt;em&gt;less&lt;/em&gt; responsive.  Still, the Pop OS! experience came the closest to what I imagined tiling could be.&lt;/p&gt;
&lt;p&gt;Recently I was introduced to &lt;strong&gt;Material Design&lt;/strong&gt;.  I decided to install it on my new Ubuntu 20.10 installation and try to &amp;ldquo;live in it&amp;rdquo; for a better test.  &lt;strong&gt;Material Design&lt;/strong&gt; is a gnome extension that provides a few really specific tiling options.&lt;/p&gt;
&lt;p&gt;To install Material Design in Ubuntu 20.10, go to &lt;a href=&#34;https://extensions.gnome.org&#34;&gt;https://extensions.gnome.org&lt;/a&gt; and add the extension.  Unfortunately, Ubuntu doesn&amp;rsquo;t support the Gnome add-in page out of the box.  At the Gnome page, load the firefox extension.  You&amp;rsquo;ll also need to install some supporting pieces for it to run properly.  Note that the chrome-gnome-shell is used by both Firefox and Chrome.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install libproxy1-plugin-networkmanager gnome-shell-extension-system-monitor  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install chrome-gnome-shell  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows are on desktops, with the taskbar across the top showing you what&amp;rsquo;s on the current desktop.  Desktops are shown on the side bar, so you can think of the two bars as showing a grid of apps X desktops. The version of Material design at Gnome supports four windowing modes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single Window - each application takes up the full window and you can use the taskbar to move easily between them.&lt;/li&gt;
&lt;li&gt;Split - each application takes up either the left or right half of the screen.  The app order is shown on the taskbar, and you can drag to rearrange.  Many times I&amp;rsquo;m typing in one window with another for reference, so this mode sets up exactly what I&amp;rsquo;m looking for.&lt;/li&gt;
&lt;li&gt;Half - the first application occupies the left half of the screen.  Subsequent apps stack to the right.  You can drag windows or rearrange the taskbar to change which applications go in each spot.&lt;/li&gt;
&lt;li&gt;Free - this is the &amp;ldquo;normal&amp;rdquo; Gnome experience, with tiling turned off.
&lt;img src=&#34;https://raw.githubusercontent.com/material-shell/material-shell/master/documentation/tiling_showcase.gif#floatright&#34; alt=&#34;Material Design&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my testing, I found that I could set different modes for each desktop.  Right now, the desktop I&amp;rsquo;m typing on has Codium on one side and a browser on the other in &amp;ldquo;Split&amp;rdquo; mode.  My other desktop use &amp;ldquo;Half&amp;rdquo; with a big browser on the right and a terminal, Enpass, and settings stacked on the right.&lt;/p&gt;
&lt;p&gt;I also installed the &lt;strong&gt;Gnome menu&lt;/strong&gt; so that I&amp;rsquo;d have the heirarchical app picking experience I like.  Material shell has a button for the gnome app grid but I want something different.  I&amp;rsquo;m unimpressed with &lt;strong&gt;Gnome Menu&lt;/strong&gt;.  Anyone want to recommend a menu extension?  Gnome Menu hits the minimum reqs - it&amp;rsquo;s an organized menu.  On the other hand, you can&amp;rsquo;t type to search, it doesn&amp;rsquo;t open sub-menus automatically, and it doesn&amp;rsquo;t a place where frequently used apps or files can be quickly found.&lt;/p&gt;
&lt;p&gt;In the end though, the beauty of Linux is that the machine is &lt;em&gt;yours&lt;/em&gt;.  In a half hour I installed a new distro with a new DE, updated it and installed some critical apps, customized the desktop for tiling and changed the application selection process.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m going to keep Ubuntu 20.10 and Material Design on this machine for a while.  It works well on the 1920x1080 17&amp;quot; display.  I&amp;rsquo;m also curious how the combination will work on my desktop with it&amp;rsquo;s two 4k displays, but I&amp;rsquo;ll take a little time before making that decision.&lt;/p&gt;
&lt;p&gt;Ubuntu 20.10 has answered my objections to the laggy experience of Gnome and given me a &amp;ldquo;standard&amp;rdquo; desktop experience I can customize to my interests.  I&amp;rsquo;m curious about your impressions - write to me and let me know!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SSHFS Automount</title>
      <link>https://nextpertise.net/201017_sshfs_automount/</link>
      <pubDate>Sat, 17 Oct 2020 12:13:01 -0400</pubDate>
      
      <guid>https://nextpertise.net/201017_sshfs_automount/</guid>
      <description>&lt;p&gt;I described using SSHFS as an alternative to NFS back in &lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3/&#34;&gt;Using SSH3&lt;/a&gt;. I&amp;rsquo;ve been using SSHFS as a standard way to mount since then, partly because I can use the same technique on a variety of OS and partly because it seems to work cleaner for me than straight NFS. However, I&amp;rsquo;ve been using a batch file to mount drives and that&amp;rsquo;s getting old. I&amp;rsquo;d like to just add the SSHFS targets into &lt;em&gt;/etc/fstab&lt;/em&gt; and get them to automount.
As a general rule, the Arch Wiki is a great place to find all things Linux. Even though I&amp;rsquo;m running an Ubuntu variant, the Arch Wiki set me straight. For this to work there are a number of things that have to be set.
First, as described in &lt;a href=&#34;https://nextpertise.net/posts/200812_using_ssh2/&#34;&gt;Using SSH2&lt;/a&gt; I need to make sure that logging into my target is done with keys so that an interactive password is not required. See the previous article for a more detailed walk through, but the basic process is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id brent@192.168.1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;test&#34;&gt;test&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh brent@192.168.1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Second, edit &lt;em&gt;/etc/fuse.conf&lt;/em&gt; to allow non-root users to access drives when they&amp;rsquo;re mounted with the &lt;em&gt;allowother&lt;/em&gt; option.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/fuse.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# add or uncomment the following line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user_allow_other
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find out your user id and group id. This is easy: there&amp;rsquo;s an &lt;strong&gt;id&lt;/strong&gt; &lt;em&gt;username&lt;/em&gt; command. Note that the ellipsis below just indicate that I&amp;rsquo;m in other groups and I&amp;rsquo;ve edited those out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;➜ id brent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1000&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;brent&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; gid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1000&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;brent&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;** ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, add the targets to your &lt;em&gt;etc/fstab&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/fstab  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sshfs#brent@192.168.1.1:/home /home/remote fuse user,_netdev,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; reconnect,uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;UID,gid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;GID,idmap&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;user,allow_other &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you exit nano the remote directory should be mounted and active! It will also be there automatically each time you log back in. Hope this is helpful!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3_2.2.15</title>
      <link>https://nextpertise.net/201008_gns3_2.2.15/</link>
      <pubDate>Thu, 08 Oct 2020 09:21:45 -0400</pubDate>
      
      <guid>https://nextpertise.net/201008_gns3_2.2.15/</guid>
      <description>&lt;p&gt;GNS3 2.2.15 is out. Not much to report . . . reviewing the release notes indicates thi is mostly bug fixes.&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;This version doesn&amp;rsquo;t include a security fix, and the bug fixes aren&amp;rsquo;t issues I&amp;rsquo;ve run into.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch. I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day. &lt;strong&gt;Note&lt;/strong&gt; that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version. If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png#center&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it. On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;. If you have a server VM (and I recommend it), start by getting a snapshot of your current server. I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk. After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
&lt;p&gt;I ran into an issue upgrading the server side - docker-ce was missing a dependency. To resolve, I dropped down the shell and used docker&amp;rsquo;s instructions for installing on an Ubuntu host.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, I rebooted and re-initiated the upgrade to 2.2.15 and everything worked. The experience reiterates my point that GNS3 server upgrades sometimes have problems that can easily knock you off your game for a few days. Make sure you have a good backup before upgrading, or that you are not under time pressure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Whitelisting Approach to Security</title>
      <link>https://nextpertise.net/201110_whitelisting_approach/</link>
      <pubDate>Wed, 07 Oct 2020 06:30:00 +0000</pubDate>
      
      <guid>https://nextpertise.net/201110_whitelisting_approach/</guid>
      <description>&lt;p&gt;Today, I am sure that you would be hearing a lot of buzz around ransomware and other malware outbreaks.  To combat some of these threats on a home consumer scale, we mostly use a traditional &lt;strong&gt;Anti-Malware&lt;/strong&gt; (Anti-Virus) software. As you may know, this technology is based on signatures, patterns and heuristics, which are extracted from the malware behaviour or type; thus, as the number of malware instances increase, becoming more sophisticated in the ever increasing threat landscape, it becomes very hard for the Anti-Virus companies to keep up with the pace. I would like to call this a “Cat and a Mouse Chase”.  Anti-Virus software may give you the best protection against known malware, but it may never give you adequate protection against unknown malware, whose signatures, patterns and heuristics are not known to anyone. By design, the traditional Anti-Virus fails miserably and is unable to keep up with todays sophisticated and evolving malware. This post is a follow-up to &lt;a href=&#34;https://nextpertise.net/posts/200805_reasonablysecurebrowsing/&#34;&gt;reasonable secure browsing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Instead of focussing on blocking known malware through an Anti-Virus software, how about we only allow the applications and programs we trust and use on daily basis, and block everything else? Well, this is exactly what is called a &lt;strong&gt;“Whitelist”&lt;/strong&gt; approach, while the former that we discussed above is called a &lt;strong&gt;“Blacklist”&lt;/strong&gt; approach. This approach can be nearly 100% effective in blocking all malware if used correctly; however, most of the Whitelisting software out there is very expensive and only targeted towards enterprise use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/whitelist.png&#34; alt=&#34;WL&#34;&gt;&lt;/p&gt;
&lt;p&gt;I use something called as &lt;strong&gt;AppSamvid&lt;/strong&gt;, which is a free utility that is freely available at: &lt;a href=&#34;https://cdac.in/index.aspx?id=cs_eps_appsamvid&#34;&gt;https://cdac.in/index.aspx?id=cs_eps_appsamvid&lt;/a&gt;
You can use this on any of your Windows based system and have it run as a Whitelisting software. Once installed, you would need to provide the list of applications and software utilities that you trust and use daily. Ideally, you should setup your system and create an effective “Baseline” that is a known ‘good’ or ‘trusted’ system state. Beyond this, any attempts to execute applications that are not listed in the Trusted list would be automatically blocked. You can unblock applications by providing the path or the file Hash. This is highly effective in blocking known and known malware.&lt;/p&gt;
&lt;p&gt;Give this a try and get one step closer in perfecting your system security!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Calibre 5.0</title>
      <link>https://nextpertise.net/201001_calibre/</link>
      <pubDate>Thu, 01 Oct 2020 20:27:16 -0400</pubDate>
      
      <guid>https://nextpertise.net/201001_calibre/</guid>
      <description>&lt;p&gt;One of my favorite open-source programs is &lt;strong&gt;Calibre&lt;/strong&gt;. Calibre is like iTunes for books, in the sense that it allows you to build a library and helps with indexing and completing metadata. It even fetches book art!
&lt;img src=&#34;https://lh3.googleusercontent.com/rXiQJLi7-4RUi9MPoBBBHvNkI9GmuEnhhNlsdkDLavAhH0K5R_vINazBmxOR_kc1TAT0BGEG1iLlcBU2yLV2X9Cr7BZ0tF140P2AZZ_nuRyAmtqffTQdxlVrppjW0KDVI-D-7yKG=d#center&#34; alt=&#34;Calibre&#34;&gt;&lt;/p&gt;
&lt;p&gt;I like e-readers. I have an Amazon Kindle Tablet and a Likebook Mars. Before that I used a Kobo and I&amp;rsquo;ve had a Nook and the old Sony Reader. I mostly read technical PDFs and sci-fi books in EPUB or MOBI. The Kindle is great for technical books because its easy to pinch in and out of diagrams. The Kindle is also harder on the eyes and can be distracting (it also has games and email, etc.). The Likebook is great for reading things like a good Science Fiction novel. It&amp;rsquo;s built to be a straight-up reader, so it&amp;rsquo;s not as distracting. I like the e-paper screen and it&amp;rsquo;s easy on the eyes. The Likebook has a quad-core processor and runs Android, so it&amp;rsquo;s reasonably fast (it&amp;rsquo;s just that epaper as a medium has a low refresh rate).&lt;/p&gt;
&lt;p&gt;I get books from all over the place. I buy books that are interesting, I purchase &amp;ldquo;humble bundles&amp;rdquo; of programming books, and I subscribe to lists of free books like Bookbub and Centsless Ebooks.&lt;/p&gt;
&lt;h2 id=&#34;how-i-use-calibre&#34;&gt;How I Use Calibre&lt;/h2&gt;
&lt;p&gt;My first use-case is to build and maintain my &amp;ldquo;pleasure reading&amp;rdquo; library of ebooks.&lt;/p&gt;
&lt;p&gt;Calibre can import all the different ebook formats and convert to any other. It supports TXT, AZW, MOBI, PRC, PDF, RTF, DOC, EPUB and others. In fact, you can tell Calibre the ebook model you are using and it will automatically convert books to the correct format for that device and use the screensize to format the book to work with your reader. Calibre can also look up missing metadata, like authors, descriptions, and art.&lt;/p&gt;
&lt;p&gt;I use Apprentice Alf&amp;rsquo;s de-DRM tools to allow converting and formatting. To be clear - I&amp;rsquo;m an author and piracy deprives me of a reason to write so &lt;em&gt;don&amp;rsquo;t steal&lt;/em&gt;! But it&amp;rsquo;s annoying that ebooks are locked in to a particular reader (what if that store goes Zune?) and it&amp;rsquo;s nice to be able to buy a book at the lowest price. DeDRM installs into Calibre as a plugin and just automatically strips DRM as a step in the conversion process.&lt;/p&gt;
&lt;p&gt;The second place I use Calibre is for technical material. Open source projects and IT vendors put out a lot of their information as PDFs. I also put user manuals and other reference material into Calibre. The program allows me to curate those documents, apply meta-data, and easily search for &amp;ldquo;all docs by Cisco&amp;rdquo; or &amp;ldquo;recent books about Python&amp;rdquo; or &amp;ldquo;books by Brent Stewart&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Libraries are directories and you can easily use Calibre to curate a library that can be shared - for instance, important documentation with appropriate metadata. Multiple instances of Calibre can access the same library as well - a technique I used for a while to access books from my desk or my laptop.&lt;/p&gt;
&lt;p&gt;Calibre (like iTunes) makes it easy to plug in an ebook and transfer files from your library. More and more I&amp;rsquo;m using a feature in Calibre that produces a web interface and allows you to grab books over wifi. Both my Kindle tablet and Likebook can open the OPDR-compatible web page and use it to search and download. I can still plug them into local USB, but wireless access is easier.&lt;/p&gt;
&lt;h2 id=&#34;other-major-features&#34;&gt;Other Major Features&lt;/h2&gt;
&lt;p&gt;Calibre is written in Python, and has been packaged to run on pretty much any OS. Downloads are available for Linux, Windows and Mac, plus I&amp;rsquo;ve seen it ported to Haiku and AmiOS. If the different machines can reach the same share drive, the different Calibre implementations can all work out of the same library (see &lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3/&#34;&gt;SSH File Sharing&lt;/a&gt; article).&lt;/p&gt;
&lt;p&gt;Calibre has a feature that will run a scheduled job to grab articles from the web. You can use this to build a virtual newspaper delivered fresh every morning. This feature is interesting, but I&amp;rsquo;ve found it less compelling as the world has become more &amp;ldquo;always connected&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Calibre also includes a reader that will open all the ebook formats it supports. This makes it easy to read on the desktop. If you are reading for work - for instance, a programming book where you want to work examples as you go - or using books for reference, this can be particularly helpful.&lt;/p&gt;
&lt;p&gt;Calibre has a large set of plug-ins to help catalog ebooks, set the appropriate metadata, and clean up formatting.&lt;/p&gt;
&lt;h2 id=&#34;calibre-50&#34;&gt;Calibre 5.0&lt;/h2&gt;
&lt;p&gt;The author of Calibre, Kovid Goyal, continues to develop the program and has released point versions pretty consistently for years. He recently released version 5 and for the most part this major version shows continued incremental improvement. There&amp;rsquo;s now a dark mode (check that off the buzzword list!), better in-book searching, and the ability to highlight text in books.&lt;/p&gt;
&lt;p&gt;The big news is that the code has been updated to Python 3. Python 2 has been deprecated, so this was an important step for the continuation of the project. It doesn&amp;rsquo;t make a difference from the usability perspective, but it&amp;rsquo;s nice to know that the project is in good shape.&lt;/p&gt;
&lt;h2 id=&#34;recommendation&#34;&gt;Recommendation&lt;/h2&gt;
&lt;p&gt;I maintain a &amp;ldquo;reinstall script&amp;rdquo; to quickly setup the programs that I depend on when I do a new install (for the record, I have versions of this for Windows, RHEL-based Linux,Debian-based Linux, and Mac). Calibre is on that august list of programs that I can&amp;rsquo;t live without. Calibre has always been a great program, but Kovid continues to improve it bit by bit and maintained a high level of quality throughout. I depend on Calibre and &lt;em&gt;highly&lt;/em&gt; recommend it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OpenDNS For Home</title>
      <link>https://nextpertise.net/200930_opendnsforhome/</link>
      <pubDate>Wed, 30 Sep 2020 08:07:00 +0000</pubDate>
      
      <guid>https://nextpertise.net/200930_opendnsforhome/</guid>
      <description>&lt;p&gt;Today, technology has advanced to a point, where it is much more affordable as compared to the last 25 years. We can recollect that having a computer with 32MB of Memory was a great thing; however, today&amp;rsquo;s smartphones come with 12GB of memory out of the box!&lt;/p&gt;
&lt;p&gt;Speaking of smartphones, I&amp;rsquo;m confident that you have one too. Maybe even your parents and not forgetting children, colleagues and family members. With easy access to Technology, content on the Internet readily available at the click of a button or a swipe, how do you control this content, especially if you have young ones in your house or family? No doubt, that they would use it for their productivity, school or education work, but how do you monitor and ensure that they are not misusing it?&lt;/p&gt;
&lt;p&gt;This post is a follow-up to &lt;a href=&#34;https://nextpertise.net/posts/200826_dnsservices/&#34;&gt;DNS Services&lt;/a&gt;. Brent mentioned about OpenDNS in this blog and how it can help to control the content from the Internet. Keeping that into account, and the above mentioned concern, we can use OpenDNS to block inappropriate content, control the usage of social media and other content that as a parent or a supervisor you feel that it has negative effects on your young ones at home, and also help you to keep a track of their activity and know at all times about what they access.&lt;/p&gt;
&lt;p&gt;If you signup to use OpenDNS on your home network, which by the way is totally free of cost, you can get the following benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block Malware&lt;/strong&gt; - Protect your devices from malicious code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/OD-malware.JPG&#34; alt=&#34;DDG&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block Content&lt;/strong&gt; - Block specific content from the Internet, based on the type or categories. For e.g. Pornography and other content that you feel is harmful&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/OD-categories.JPG&#34; alt=&#34;DDG&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control Access&lt;/strong&gt; - Set Time based access for content like Social Media sites so that your young ones don&amp;rsquo;t be a prey to the addiction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/OD-requests.JPG&#34; alt=&#34;DDG&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitor Usage&lt;/strong&gt; - Keep an eye on the usage and using this information educate your folks at home about the risks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you need to sign up and use OpenDNS, simply signup on their portal: &lt;a href=&#34;https://opendns.com&#34;&gt;https://opendns.com&lt;/a&gt; using your email address and subsequently use &lt;strong&gt;208.67.222.222&lt;/strong&gt; and &lt;strong&gt;208.67.220.220&lt;/strong&gt; as the DNS servers on your Home network. That’s how easy it is to get started with OpenDNS and protect your loved ones at home with this technology.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using SSH (Part 5) - Remotely Possible</title>
      <link>https://nextpertise.net/200922_using_ssh5/</link>
      <pubDate>Tue, 22 Sep 2020 14:47:47 -0400</pubDate>
      
      <guid>https://nextpertise.net/200922_using_ssh5/</guid>
      <description>&lt;p&gt;I confess that I never meant for this to be an SSH blog. It was an easy topic to write about when we started, but friends keep suggesting new things I should cover. The takeaway then is that SSH is a heck of a tool and can be used to accomplish a lot of different things.&lt;/p&gt;
&lt;p&gt;Today&amp;rsquo;s topic is running a GUI program on a remote computer and displaying the output locally. Pretty cool, right? This is suprisingly easy to do.&lt;/p&gt;
&lt;p&gt;Why would we want to do this? I already covered that under &amp;ldquo;pretty cool&amp;rdquo;, but I suppose I could say something about using your netbook to run a big program that needs lots of RAM and CPU.&lt;/p&gt;
&lt;p&gt;To demonstrate, I&amp;rsquo;m going to run the text editor from my server on my desktop.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -X brent@192.168.1.1 &lt;span style=&#34;color:#75715e&#34;&gt;# -X or -Y work  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pluma
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/XRemote.png#center&#34; alt=&#34;Displaying a remote program&#34;&gt;&lt;/p&gt;
&lt;p&gt;Simply SSH into a remote host using either the -X or -Y switch. From the remote prompt, enter the command to run the graphical program of your choosing and the window will be displayed locally. Using &amp;ldquo;-X&amp;rdquo; (as shown in the code) allows this to work but keeps the X11 Security extension restrictions. Using &amp;ldquo;-Y&amp;rdquo; like I did in the screen capture bypasses those restrictions. From an operative point of view, they act identically.&lt;/p&gt;
&lt;p&gt;This has been the most straightforward of the series. If you&amp;rsquo;re interested in SSH, check out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nextpertise.net/posts/200811_using_ssh1/&#34;&gt;SSH - Part 1 Basics and Banners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nextpertise.net/posts/200812_using_ssh2/&#34;&gt;SSH - Part 2 Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nextpertise.net/posts/200813_using_ssh3/&#34;&gt;SSH - Part 3 File Shares&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nextpertise.net/posts/200830_using_ssh4/&#34;&gt;SSH - Part 1 Port Forwarding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Privacy Enabled Search Engines </title>
      <link>https://nextpertise.net/200921_privacyenabledsearchengines/</link>
      <pubDate>Mon, 21 Sep 2020 08:07:02 +0000</pubDate>
      
      <guid>https://nextpertise.net/200921_privacyenabledsearchengines/</guid>
      <description>&lt;p&gt;In the early days, when we didn’t know something, we would ask our parents or elders. With today’s digital transformation, we would normally run to a large search engine, provided by the big tech giants. These providers store and log countless search terms every day. Have you ever wondered what these tech giants do with the infinite data that is collected via the search engines?&lt;/p&gt;
&lt;p&gt;Yes, you’ve guessed it right. They index it in their large data warehouses where they run complex machine learning algorithms to profile users, predict patterns and harness intelligence from this big data. This information is used to make product recommendations, shared to third parties to boost sales, etc. The real question is, how far would you trust these search engines with respect to your personal privacy?&lt;/p&gt;
&lt;p&gt;This post is a follow-up to &lt;a href=&#34;https://www.nextpertise.net/posts/200805_reasonablysecurebrowsing/&#34;&gt;reasonable secure browsing&lt;/a&gt;. As a Security and a Privacy paranoid person, I would always recommend alternate search engines for better privacy protection. Below are two widely used Secure and Privacy focussed search engines that I use:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DuckDuckGo&lt;/strong&gt; – This is my personal favourite and it is integrated in my Firefox browser. I absolutely love it for it&amp;rsquo;s Security, Trackers Blocking and Sleek Integration features. It has a feature-rich plugin for the Firefox browser that ranks all the sites you visit and displays a privacy score, while blocking the violating content. It can also be used on your Android and iOS based mobile devices – Do give this a try, and feel the difference! &lt;a href=&#34;https://duckduckgo.com/&#34;&gt;https://duckduckgo.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/DDG-1.png&#34; alt=&#34;DDG&#34;&gt;  &lt;img src=&#34;https://nextpertise.net/DDG-2.png&#34; alt=&#34;DDG&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;StartPage&lt;/strong&gt; – This a Dutch search engine company that emphasises on online privacy. The coolest feature about this search engine is that for the extra paranoid, it offers an ‘Anonymous View’ that allows users to search results via a proxy. I absolutely love their marketing phrase – &lt;em&gt;&amp;ldquo;We don&amp;rsquo;t log or share user personal information. Ever. We believe it’s Your Data. Not Big Data &amp;ldquo;&lt;/em&gt;. Try StartPage from &lt;a href=&#34;https://www.startpage.com&#34;&gt;https://www.startpage.com&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>CI for Docs with Pandoc (take 2)</title>
      <link>https://nextpertise.net/200919_pandoc_improved/</link>
      <pubDate>Sat, 19 Sep 2020 13:18:28 -0400</pubDate>
      
      <guid>https://nextpertise.net/200919_pandoc_improved/</guid>
      <description>&lt;p&gt;In a previous &lt;a href=&#34;https://nextpertise.net/posts/200818_pandoc/&#34;&gt;post&lt;/a&gt;, I built out a Continuous Integration process for documentation. That process allowed the team to pull a Github repository and keep a local copy of documentation. As the markdown files were updated and the repository pushed, a clean PDF with table of contents was generated.
I identified a few problems with that and I&amp;rsquo;ve been working to improve the process. If you take a look at the associated github project you can follow my struggles. Here&amp;rsquo;s where we are with the open issues from last time:&lt;/p&gt;
&lt;p&gt;The generated document placed the cover &lt;em&gt;after&lt;/em&gt; the table of contents. It also include the github README.md in the generated file. The Github CI process uses &lt;em&gt;.github/workflows/test.yml&lt;/em&gt; to build the workflow and my file pulled in all the markdown files alphabetically.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\-&lt;/span&gt; run: echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;::set-env name=FILELIST::\$(printf &amp;#39;%s &amp;#39; \*.md)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;with:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  args: --template eisvogel2.tex --o output/result.pdf &lt;span style=&#34;color:#ae81ff&#34;&gt;\$&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;{{&lt;/span&gt;env.FILELIST&lt;span style=&#34;color:#f92672&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I fixed this by changing FILELIST to use &lt;strong&gt;d*.md&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I was also able to improve the output a little by generating a default latex layout.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pandoc -D latex &amp;gt; ~/next.latex 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also found that including YAML headers in the markdown transferred over to the output. Pandoc only takes the first headers it finds, so I placed my files in doc0.md. I was able to transfer all my customizations from the latex file to the YAML, which is much cleaner to maintain. Here&amp;rsquo;s a version of that file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;My Sample Doc&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;subtitle&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;author&lt;/span&gt;: [&lt;span style=&#34;color:#ae81ff&#34;&gt;Brent Stewart]  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2020-09-18&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;abstract&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;|  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;This is a sample document used to demonstrate documentation via pandoc and Github.  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;keywords&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;institute&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nextpertise.Net&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;numbersections&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;toc&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;geometry&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;margin=2.5cm  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;header-include&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;\pagebreak  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;include-before&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;include-after&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;logo&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Feed-icon.png&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;header-includes&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;|  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\usepackage{fancyhdr}  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\pagestyle{fancy}  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\lfoot{Prepared September 18th, 2020}  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\rfoot{Page \thepage}  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\cfoot{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that this also cleaned up the command line used to invoke pandoc,as things like the Table of Contents directive were moved to YML. You can also use this technique to change fonts, margins, headers, and such.&lt;/p&gt;
&lt;h2 id=&#34;whats-not-working&#34;&gt;What&amp;rsquo;s &lt;strong&gt;not&lt;/strong&gt; working&lt;/h2&gt;
&lt;p&gt;That the good news. Using the existing directions and my &lt;strong&gt;mymeta.md&lt;/strong&gt; example, you can get a nice clean output. What&amp;rsquo;s not working is having a cover page. That led me into customizing the latex file, which led me to find the eisvogeltemplate project. Pascal Wagler has developed a &lt;em&gt;very&lt;/em&gt; nice and usable latex template (it&amp;rsquo;s currently in my github project). I was able to use it locally and output wonderful PDFs. It has some dependencies that required I grab the full latex distribution (apt install texlive-full), but otherwise no problems.&lt;/p&gt;
&lt;p&gt;I wanted to update the pandoc Docker file to support the eisvogel template. I made a custom Dockerfile to pull pandoc/ubuntu-latex
and add in the full set of texlive files.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-tex&#34; data-lang=&#34;tex&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;from pandoc/ubuntu-latex  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;run apt update &amp;amp;&amp;amp; apt install texlive-full texlive-full -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This was then built and pushed to Docker hub.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-docker&#34; data-lang=&#34;docker&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker build --tag&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;pandoc_texlive:1.0&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;docker push brentstewart/pandoc_texlive:1.0&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I went back to github and updated the CI action to use the new docker file and to run &lt;strong&gt;pandoc &amp;ndash;template eisvogel.tex -o Output/result.pdf d*.md&lt;/strong&gt; and . . . didn&amp;rsquo;t work! I keep getting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-tex&#34; data-lang=&#34;tex&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;! LaTeX Error: File `adjustbox.sty&amp;#39; not found.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works on my local system, but it doesn&amp;rsquo;t work if I run docker locally with my image. The default pandoc images don&amp;rsquo;t have the required files either.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried rebuilding Docker with just the texlive-extras (a smaller set of Latex files). I tried editing the latex to remove the dependencies. So far nothing has worked.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Good progress was made on the project. I improved the CI output and simplified the CI process by using the default docker file and by supplying instructions in YAML. I also was able to produce really nice PDFs locally using the eisvogel.tex template.&lt;/p&gt;
&lt;p&gt;Trying to duplicate this last step on Github failed because I&amp;rsquo;m missing includes in the docker system, and trying to update that Docker system has been a source of frustration! I&amp;rsquo;ll update this when I have some more time, but we&amp;rsquo;re getting close.&lt;/p&gt;
&lt;p&gt;If anyone out there want&amp;rsquo;s to take a look at the github project and the docker image, I&amp;rsquo;d welcome your thoughts!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3_2.2.14</title>
      <link>https://nextpertise.net/200915_gns3_2.2.14/</link>
      <pubDate>Tue, 15 Sep 2020 09:21:45 -0400</pubDate>
      
      <guid>https://nextpertise.net/200915_gns3_2.2.14/</guid>
      <description>&lt;p&gt;GNS3 2.2.14 came out today (9/15).  The GUI fixes a bug in the way new appliance versions are created.  The server side tweaks how Qemu runs and includes Beta 4 of the Web-UI.
&lt;img src=&#34;https://nextpertise.net/GNS3WebUI.png#center&#34; alt=&#34;GNS3 WebUI&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;This version doesn&amp;rsquo;t include a security fix, and the bug fixes aren&amp;rsquo;t issues I&amp;rsquo;ve run into.  The Web-UI is coming along nicely.  In my initial testing, I&amp;rsquo;m able to add a node to a topology, add links, and manage things from the webpage.  It looks like this would make it easy to collaborate with others on a shared topology.  I can also envision using this as my sole access to GNS3.  I  suggest you start evaluating it.  If you do find a bug, be sure to log an issue on the GNS3 Github repository.&lt;/p&gt;
&lt;p&gt;I have run into issues before that affected my ability to run GNS3 and took me a day or so to sort out (at least once was because I upgraded my OS, not because of GNS3).  If you have ongoing work that depends on GNS3, hold off until you have a little slack in your schedule.  One way to evaluate the risk is to look at the GNS3 community forum to see if there are posts about the new version.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch.  I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day.  &lt;strong&gt;Note&lt;/strong&gt; that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version.  If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png#center&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it.  On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;.  If you have a server VM (and I recommend it), start by getting a snapshot of your current server.  I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk.  After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git (and run) a File!</title>
      <link>https://nextpertise.net/200910_git_a_file/</link>
      <pubDate>Thu, 10 Sep 2020 11:03:09 -0400</pubDate>
      
      <guid>https://nextpertise.net/200910_git_a_file/</guid>
      <description>&lt;p&gt;I maintain a private Github repository for my Linux install scripts.  My install scripts setup PPAs, install programs that I typically use, and setup my system the way I want it.  The repository has scripts for Ubuntu and Red Hat variants, plus secondary scripts that perform other admin tasks.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/githubpriv1.png#floatsmallright&#34; alt=&#34;GitHub Repository Settings&#34;&gt;&lt;/p&gt;
&lt;p&gt;These scripts aren&amp;rsquo;t supposed to have personal information in them, but things like IP addresses, paths, and security measures could sneak in.  I don&amp;rsquo;t want to have to worry about revealing something that opens me to attack, so the repos are private.
&lt;img src=&#34;https://nextpertise.net/githubpriv2.png#floatright&#34; alt=&#34;GitHub Repository Settings&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;creating-a-github-private-repository&#34;&gt;Creating a GitHub Private Repository&lt;/h2&gt;
&lt;p&gt;Github allows free accounts to host private repositories.  Initialize a repo on Github.  To make it private, go under &lt;em&gt;Settings&lt;/em&gt; and choose &lt;em&gt;options&lt;/em&gt;.  Scroll down to the bottom to the section labeled &amp;ldquo;Danger Zone&amp;rdquo; and helpfully outlined in red.  The first option is to &lt;em&gt;Change repository visibility&lt;/em&gt;.  Click here will give you the option to move this repository to private.&lt;/p&gt;
&lt;p&gt;Private repositories operate just like public ones in my experience.  The only difference is that access is limited.&lt;/p&gt;
&lt;h2 id=&#34;using-a-linux-install-script&#34;&gt;Using a Linux install script&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a snippet of the Ubuntu script to give you an idea of what I&amp;rsquo;m doing.  This section sets up fail2ban (an SSH security measure) and installs VSCodium.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo setup fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/[sshd]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;enabled = true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;port = 22
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;filter = sshd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;logpath = /var/log/auth.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;maxretry = 3&amp;#34;&lt;/span&gt; &amp;gt;  /etc/fail2ban/jail.local
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;##VSCodium&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;deb https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/ vscodium main&amp;#39;&lt;/span&gt; | sudo tee --append /etc/apt/sources.list.d/vscodium.list
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install codium
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I build and tear down a lot of Linux machines (mostly VMs and EC2 instances).  The initial install lacks some of the tools I expect, and I don&amp;rsquo;t want to go through a process to build the environment.  The script automates this setup, saves me time and makes sure that I don&amp;rsquo;t forget anything!&lt;/p&gt;
&lt;p&gt;Up until recently my process was to install Linux, grab git, then clone the repository.  From there, I could move into the repository and run the scripts I wanted.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir git/linuxinstall
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd git/linuxinstall
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone__ https://github.com/brentstewart/Private_linuxinstall.git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x myscript.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./myscript.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/githubsettings.png#floatright&#34; alt=&#34;Github Settings&#34;&gt;&lt;/p&gt;
&lt;p&gt;This works, but it&amp;rsquo;s a bunch to type.  It also downloads more than the one file I need and leaves a repository on the drive.  None of these are problems, but Linux is for the lazy and it feels like there&amp;rsquo;s a better way to do this.&lt;/p&gt;
&lt;h2 id=&#34;an-easier-way&#34;&gt;An easier way&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t want a multi-step process and I don&amp;rsquo;t want to download my whole repository.  The method I&amp;rsquo;ve developed to achieve this is to do all this in one line.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s --header &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Authorization: token aaabbbcccdddeeefff1112223334445556667778&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--header &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Accept: application/vnd.github.v3.raw&amp;#39;&lt;/span&gt; --remote-name --location 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://api.github.com/repos/brentstewart/Private_linuxinstall/contents/hw.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x hw.sh &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash hw.sh &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm hw.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That a lot, so let&amp;rsquo;s break down each piece.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s --header &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Authorization: token aaabbbcccdddeeefff1112223334445556667778&amp;#39;&lt;/span&gt; --header &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Accept: application/vnd.github.v3.raw&amp;#39;&lt;/span&gt; --remote-name --location__ https://api.github.com/repos/brentstewart/Private_linuxinstall/contents/hw.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Curl&lt;/strong&gt; is used to transfer data via various protocols, including https.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;-s&lt;/strong&gt; puts &lt;strong&gt;curl&lt;/strong&gt; in silent mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/githubpat.png#floatright&#34; alt=&#34;Github Token&#34;&gt;
&lt;strong&gt;- - header &amp;lsquo;Authorization: token X&amp;rsquo;&lt;/strong&gt; is used to authenticate to Github.  You&amp;rsquo;ll need to create a token for your account, so choose settings under your account (upper right).  Choose &lt;em&gt;Developer Options&lt;/em&gt; and &lt;em&gt;Personal Access Tokens&lt;/em&gt;.  Create a new token and copy it to your script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ndash;header &amp;lsquo;Accept: application/vnd.github.v3.raw&amp;rsquo; &amp;ndash;remote-name&lt;/strong&gt;  are options that are documented by github as required.  Don&amp;rsquo;t change these parts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;- - location&lt;/strong&gt; &lt;a href=&#34;https://api.github.com/repos/brentstewart/Private_linuxinstall/contents/hw.sh&#34;&gt;https://api.github.com/repos/brentstewart/Private_linuxinstall/contents/hw.sh&lt;/a&gt; is the part that took an &lt;em&gt;embarrassingly&lt;/em&gt; long time to get right.  I read a lot of blog posts and api docs and tried a lot of things that didn&amp;rsquo;t work.  I gather that the working examples I found online were from a previous iteration of github and the methods have been deprecated.  This, however, works!  The parts you&amp;rsquo;ll need to change here are your Github username and the name of repository.  &lt;em&gt;Contents&lt;/em&gt; stays on the path unchanged, but you&amp;rsquo;ll need to add in the file you are looking for on the end.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want to run my install script over and over, so the referenced file just has &lt;strong&gt;echo Hello World&lt;/strong&gt; in it (thus hw.sh).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;amp;&amp;amp;&lt;/strong&gt; is used to join multiple commands on a single line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;chmod +x hw.sh&lt;/strong&gt; makes the file that was just downloaded executable&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bash hw.sh&lt;/strong&gt; runs the script&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rm hw.sh&lt;/strong&gt; deletes the file so that the new environment is clean&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This approach has some interesting benefits.  First, the slug of a command is the kind of thing that can be cut and paste into new machines.&lt;/p&gt;
&lt;p&gt;Second, this approach is open to automation because it removes the login to Github (replaced by the token) and allows the process to complete unsupervised.  As such, this would be the kind of thing that could be used to start up EC2 instances.  In that case, you could easily automate a standard EC2 startup to pull a script from Github.  Then you could maintain the current script and improve it over time without having to go into Cloudformation or EC2 to change processes.&lt;/p&gt;
&lt;p&gt;A bonus conclusion as well - the result didn&amp;rsquo;t end up looking like I expected.  I spent a lot of time trying to pipe commands together, and never developed that approach to a usable point.  It&amp;rsquo;s important to have a good understanding of different approaches to a problem so that you can deal with the &amp;ldquo;expected unexpected&amp;rdquo; and keep moving.&lt;/p&gt;
&lt;p&gt;I hope this discussion helps you!  If you have other approaches to this problem, I&amp;rsquo;d love to hear about them in the comments below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fonts on Linux</title>
      <link>https://nextpertise.net/200909_fonts_on_linux/</link>
      <pubDate>Wed, 09 Sep 2020 16:42:10 -0400</pubDate>
      
      <guid>https://nextpertise.net/200909_fonts_on_linux/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a little bit of a font nerd.  In the early 90s, someone who knew computers and had a laser printer had an easy opportunity to get into graphic design.  I knew computers and the college had a laser printer, so I got a copy of &lt;strong&gt;Looking Good in Print&lt;/strong&gt; and dabbled.  I&amp;rsquo;ve written about this earlier in describing my love of &lt;a href=&#34;https://nextpertise.net/posts/200803_funwithpostscript/&#34;&gt;Postscript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to have some font options on Linux, there are some great places to get high-quality fonts that work well with Linux applications.  This is a minor, but hopefully useful tip!&lt;/p&gt;
&lt;h2 id=&#34;formats&#34;&gt;Formats&lt;/h2&gt;
&lt;p&gt;Most Linux desktop environments support a variety of formats, but the most common are PostScript, OpenType, and TrueType.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Postscript&lt;/em&gt; is the oldest of the three.  Developed by Adobe in the 1984, they found a home on the Apple LaserWriter and were &lt;em&gt;the&lt;/em&gt; way to print high quality fonts.  They were expensive to license though, so Microsoft and Apple developed TrueType which was a similar vector-based approach to font description.  &lt;em&gt;TrueType&lt;/em&gt; added in the idea of &amp;ldquo;hinting&amp;rdquo; which offered more control over how glyphs were presented.  &lt;em&gt;OpenType&lt;/em&gt; is the evolution of TrueType and allows more complex descriptions of shapes and larger character sets (up to 64K).&lt;/p&gt;
&lt;p&gt;All three formats work in Linux.  Unless you are very detail oriented, I doubt you&amp;rsquo;ll be able to tell which font is TrueType and which is OpenType.  There are a a lot of TrueType fonts available, but I use OpenType if I have a choice.&lt;/p&gt;
&lt;h2 id=&#34;using-apt&#34;&gt;Using Apt&lt;/h2&gt;
&lt;p&gt;One way to get fonts is to use the archive for your distribution.  For Ubuntu, there are a variety of fonts available via PPA.  To list and install them use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt search font
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install fonts-noto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Noto is a Google font that is clean and available in a range of type faces.&lt;/p&gt;
&lt;p&gt;This is an easy way to install new fonts, but there&amp;rsquo;s no preview and this approach may require some effort.&lt;/p&gt;
&lt;h2 id=&#34;from-the-web&#34;&gt;From the Web&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/DownloadGoogleFont.png#center&#34; alt=&#34;Google Fonts&#34;&gt;
Option #2 is to search for fonts online.  One great place to get (free!) quality fonts is from &lt;a href=&#34;https://fonts.google.com&#34;&gt;Google&lt;/a&gt;.  Fonts can be previewed online and are easy to download. Google passes these to you as TrueType (TTF) files in a Zip.  Unzip the file and copy the files to &lt;em&gt;/usr/share/fonts&lt;/em&gt;.  The &lt;strong&gt;fc-cache&lt;/strong&gt; command rebuilds the font cache to include the new files and they should be available in programs afterward.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip font.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo cp *ttf /usr/share/fonts/truetype
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo fc-cache -f -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;em&gt;fonts&lt;/em&gt; directory has a set of sub-directories (including &lt;em&gt;postscript&lt;/em&gt;, &lt;em&gt;truetype&lt;/em&gt;, and &lt;em&gt;openscript&lt;/em&gt;) so change the target directory appropriately.  If you downloaded a group of fonts that are sorted into sub-directories, you can grab all the ttf files recursively using &lt;strong&gt;sudo cp *ttf /usr/share/fonts/truetype -r&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This font directory (/usr/share/fonts) makes fonts available to all users.  If you want to install them for just one account, you can install them to &lt;em&gt;~/.fonts&lt;/em&gt;.  I&amp;rsquo;ve never done it that way, since I control my system, but this would be particularly useful if you don&amp;rsquo;t have root privileges.&lt;/p&gt;
&lt;p&gt;The Google site is a great resource, but there are many places to purchase or get open-source fonts &lt;a href=&#34;https://lmgtfy.com/?q=fonts&amp;amp;pp=1&amp;amp;iie=1&#34;&gt;online&lt;/a&gt;.  Hope this helps!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GNS3 version 2.2.13</title>
      <link>https://nextpertise.net/200907_gns3_2.2.13/</link>
      <pubDate>Mon, 07 Sep 2020 15:46:53 -0400</pubDate>
      
      <guid>https://nextpertise.net/200907_gns3_2.2.13/</guid>
      <description>&lt;p&gt;GNS3 2.2.13 dropped Friday (9/4).  The new version doesn&amp;rsquo;t make any changes to the GUI, but fixes a bug that surfaced when using a Qemu device.  It also includes Beta 3 of the Web-UI.
&lt;img src=&#34;https://nextpertise.net/GNS3WebUI.png#center&#34; alt=&#34;GNS3 WebUI&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;should-you-upgrade&#34;&gt;Should you upgrade?&lt;/h2&gt;
&lt;p&gt;For &amp;ldquo;production&amp;rdquo; software, I recommend upgrading to get security fixes or because there is a bug-fix or enhancement that you need.  This version doesn&amp;rsquo;t seem to include a security fix, and the features aren&amp;rsquo;t things I use heavily so it may be optional.  That said, the Web-UI is coming along nicely.  In my initial testing, I&amp;rsquo;m able to add a node to a topology, add links, and manage things from the webpage.  It looks like this would make it easy to collaborate with others on a shared topology.  I can also envision using this as my sole access to GNS3.  This is marked &amp;ldquo;beta&amp;rdquo;, but it seems to be in good shape.  I definitely suggest you start evaluating it.  If you do find a bug, be sure to log an issue on the GNS3 Github repository.&lt;/p&gt;
&lt;p&gt;I have run into issues before that affected my ability to run GNS3 and took me a day or so to sort out (at least once was because I upgraded my OS, not because of GNS3).  If you have ongoing work that depends on GNS3, hold off until you have a little slack in your schedule.  One way to evaluate the risk is to look at the GNS3 community forum to see if there are posts about the new version.&lt;/p&gt;
&lt;p&gt;My personal experience with GNS3 has been that &lt;em&gt;most&lt;/em&gt; upgrades go without a hitch.  I usually just go for it, but I&amp;rsquo;m not typically dependent on GNS3 from day to day.  Note that &lt;em&gt;gns3-gui&lt;/em&gt; and &lt;em&gt;gns3-server&lt;/em&gt; have to be the exact same version.  If for some reason you upgrade one, you either have to roll back or upgrade the other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/GNS3ServerUpgrade.png#center&#34; alt=&#34;GNS3 Server Upgrade&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-do-you-upgrade&#34;&gt;How do you upgrade?&lt;/h2&gt;
&lt;p&gt;On Windows, just download the executable and run it.  On Ubuntu, &lt;strong&gt;sudo apt upgrade&lt;/strong&gt;.  If you have a server VM (and I recommend it), start by getting a snapshot of your current server.  I once had a server upgrade go poorly that resulted in rebuilding my VM, so this is a realistic risk.  After that, log into the server and you can kick-off the upgrade from the menu.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating a new GNS3 Appliance using a script</title>
      <link>https://nextpertise.net/200904_creating_gns3_appliance/</link>
      <pubDate>Fri, 04 Sep 2020 12:00:36 -0400</pubDate>
      
      <guid>https://nextpertise.net/200904_creating_gns3_appliance/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://gns3.com/assets/custom/gns3/images/logo-colour.png#floatleft&#34; alt=&#34;GNS3&#34;&gt;
In &lt;a href=&#34;https://nextpertise.net/posts/200902_updatinggns3appliances/&#34;&gt;&lt;em&gt;Updating a GNS3 Appliance File&lt;/em&gt;&lt;/a&gt; I described editing a GNS3a file to update an appliance.  That is the method I&amp;rsquo;ve used for a long time for updating and for creating new appliances, but the GNS3 team has included a Python program to walk you through the process of creating a new appliance and I thought it would be interesting to give it a try.  I decided to create an appliance for the Raspberry Pi Desktop distribution.&lt;/p&gt;
&lt;p&gt;I was listening to the most recent Linux Unplugged, and they were doing interesting networking using a Pi to connect two different 4G providers.  Their setup allowed choosing an active path based on throughput or errors, or for balancing between multiple paths.  The discussion touched on multi-link, policy-based routing, using Linux routing.  It sounded like something I&amp;rsquo;d like to experiment with!  I&amp;rsquo;ve linked to the show in the references.  In addition, Raspian is a prettty good &amp;ldquo;light&amp;rdquo; desktop for testing in GNS3 and a lot of folks use it with their Pis, so I thought this would be an interesting appliance.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-the-git-environment&#34;&gt;Setting up the Git environment&lt;/h2&gt;
&lt;p&gt;To begin, assuming you haven&amp;rsquo;t done so already, you&amp;rsquo;ll need to clone the gns3-registry repository from GitHub.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/GNS3/gns3-registry.git  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve &lt;em&gt;already&lt;/em&gt; cloned it, make sure that your branch is up to date.  &lt;em&gt;Upstream&lt;/em&gt; is the original source (in this case the GNS3 copy).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git fetch upstream  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/rpi.png#floatleft&#34; alt=&#34;Raspberry Pi&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-new-appliance-wizard&#34;&gt;The new appliance &amp;ldquo;Wizard&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a Python program included in the repository that acts as a &amp;ldquo;wizard&amp;rdquo; in guiding you through the appliance creation process.  Invoke it by running &lt;strong&gt;new_appliance.py&lt;/strong&gt;.  I&amp;rsquo;ve copied the flow below, and I&amp;rsquo;ll interrupt the output occasionally to comment on the process.&lt;/p&gt;
&lt;p&gt;The first few questions are pretty straightforward.  I copied the description from the Raspberry Pi Foundation website.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@MintyTwenty:~/git/gns3-registry$ python3 new_appliance.py 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Appliance id &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;example: cisco-asav&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: Raspian 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Appliance name: Raspian  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Category of the appliance  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; router  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; multilayer_switch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; firewall  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; guest  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; : __4__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description of the appliance. Could be a marketing description: __Raspberry Pi Desktop comes pre-installed with plenty of software &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; education, programming and general use; including Python, Scratch, Sonic Pi, Java, and more.    Appliance created to demonstrate new_appliance.py - read more at https://nextpertise.net. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Name of the vendor: Raspberry Pi Foundation 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Website of the vendor: https://www.raspberrypi.org
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;An optional documentation &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; using the appliance on vendor website&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Product name: Raspberry Pi Desktop  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;An optional product url on vendor website&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : __https://www.raspberrypi.org/downloads/raspberry-pi-desktop__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version of the registry compatible with this appliance  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Document &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; the appliance is working or not  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; stable  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; experimental  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; broken  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Raspberry Pi Desktop is open source, so it&amp;rsquo;s available for free.  I&amp;rsquo;ve removed my email address from the blog, to prevent spam via scrapping.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;About image availability: can be downloaded directly; download requires a free registration; paid but a trial version &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;time or feature limited&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; is available; not available publicly  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; free  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; with-registration  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; free-to-try  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; service-contract  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Maintainer name: Brent Stewart  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Maintainer email: X@X
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next section starts by asking how to use the appliance.  This would be a place to reference built-in credentials or processes that should be used.  Note also that I&amp;rsquo;m specifying a custom symbol.  I took the Raspberry symbol and used Gimp to crop the image and scale it to 63px tall (GNS3 asks for symbols to be less than 70px).  GNS3 asks for an SVG, but Gimp only exports as PNG so that&amp;rsquo;s what I&amp;rsquo;m using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;How to use the appliance&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  Default password is raspberry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;An optional symbol &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the appliance&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : rpi.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The script then prompts for the networking interface names.  If you are not sure, leave this blank.  Examples of different naming schemes including Cisco (gigabit1/1), Linux (enp6s0), and JunOS (4/0/0).  It also asks for the type of card.  I had success using &lt;em&gt;virtio&lt;/em&gt;, which is the paravirtualized adapter using by Qemu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional name of the first networking port example: eth0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional formating of the networking port example: eth&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;}(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional port segment size. A port segment is a block of port. For example Ethernet0/0 Ethernet0/1 is the module &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; with a port segment size of 2&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type of network adapter  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; e1000  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82550  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82551  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82557a  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82557b  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82557c  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82558a  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82558b  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82559a  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82559b  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;11&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82559c  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;12&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82559er  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;13&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82562  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;14&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i82801  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ne2k_pci  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;16&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pcnet  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;17&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; rtl8139  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;18&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;19&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio-net-pci  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; vmxnet3  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: __18__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Number of adapters: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The system prompts for RAM allocation, CPU, and disks.  I set the RAM to 1GB to minimize memory usage on my test system, but my testing indicated that you&amp;rsquo;ll be more comfortable if you can bump this up.  Leave the number of CPUs as the default.  Select SATA as the HDA image and do not specify any other drives.  This confused me the first time, since it loops through the same questions four times without queueing you about what it&amp;rsquo;s doing.  Finally, notice that I&amp;rsquo;m emulating an Intel core since I grabbed the Intel RPi image.  You could use the ARM image, but I didn&amp;rsquo;t see the value at this point.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ram allocated to the appliance &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;MB&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: __1024__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Number of Virtual CPU&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Disk interface &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the installed hda_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ide  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; scsi  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mtd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; floppy  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pflash  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sata  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : __8__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Disk interface &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the installed hdb_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ide  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; scsi  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mtd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; floppy  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pflash  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sata  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Disk interface &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the installed hdc_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ide  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; scsi  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mtd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; floppy  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pflash  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sata  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Disk interface &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the installed hdd_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ide  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; scsi  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mtd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; floppy  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pflash  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; virtio  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sata  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Architecture emulated  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; aarch64  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; alpha  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; arm  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; cris  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i386  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; lm32  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; m68k  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; microblaze  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 9&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; microblazeel  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mips  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;11&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mips64  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;12&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mips64el  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;13&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; mipsel  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;14&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; moxie  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; or32  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;16&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ppc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;17&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ppc64  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;18&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ppcemb   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;19&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; s390x   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;20&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sh4  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;21&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sh4eb  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;22&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sparc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;23&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; sparc64  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;24&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; tricore  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;25&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; unicore32  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;26&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; x86_64  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;27&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; xtensa  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;28&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; xtensaeb  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The system will prompt for the console - set this to VNC.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type of console connection &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; the administration of the appliance  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; telnet  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; vnc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; spice    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I left the boot priority alone.  I didn&amp;rsquo;t enable KVM within KVM :) and didn&amp;rsquo;t change process priority.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional define the disk boot priory. Refer to -boot option in qemu manual &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; more details.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; d  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; c  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; dc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; cd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; n  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; nc  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; nd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 8&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; cn  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 9&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; dn  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command line parameters send to the kernel&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;KVM requirements  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; require  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; allow
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; disable
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional additional qemu command line options&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Process priority &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; QEMU  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; realtime  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; very high  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; high  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; normal  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; low  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; very low  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; null  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally the script gets to images.  I added two images - the blank drive that the GNS3 project posted to SourceForge and the Rpi image I downloaded earlier.  In both cases, checksum can be obtained with the &lt;strong&gt;md5sum&lt;/strong&gt; command on Linux and the file size found with &lt;strong&gt;ls -l&lt;/strong&gt;.  This image isn&amp;rsquo;t encrypted or compressed, so that was left blank.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add image?&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filename: 2020-02-12-rpd-x86-buster.iso
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version of the file: 2020-02-12  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;md5sum of the file: 98f34fb53086752b4c9c452094f30740  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;File size in bytes: &lt;span style=&#34;color:#ae81ff&#34;&gt;3128147968&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Download url where you can download the appliance from a browser&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : https://www.raspberrypi.org/downloads/raspberry-pi-desktop/  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional. Non authenticated url to the image file where you can download the image.&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional, compression type of direct download url image.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; bzip2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; gzip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; lzma  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; xz  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; rar  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; zip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 7z  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add image?&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: y  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filename: empty8G.qcow2    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Version of the file: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;md5sum of the file: f1d2c25b6990f99bd05b433ab603bdb4  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;File size in bytes: &lt;span style=&#34;color:#ae81ff&#34;&gt;197120&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Download url where you can download the appliance from a browser&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty8G.qcow2/download 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional. Non authenticated url to the image file where you can download the image.&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave  blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Optional, compression type of direct download url image.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; bzip2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; gzip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; lzma  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; xz  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; rar  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; zip  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 7&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 7z  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add image?&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: n  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Last, it prompts you to setup a version that links the hardware and the images together to form a group.  I&amp;rsquo;ve only built one version at this point.  Again, the script cycles through prompting you for images, so be prepared for this and understand that you only need the HDA and CD-ROM devices in this scenario.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add appliance version?&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Appliance version name: 2020-02-12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hda_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hdb_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hdc_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hdd_disk_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; cdrom_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; initrd_image    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Image &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; kernel_image  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 2020-02-12-rpd-x86-buster.iso  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; empty8G.qcow2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;optional leave blank &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; skip&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; :  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add appliance version?&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;: n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;submit-a-pull-request&#34;&gt;Submit a Pull Request&lt;/h2&gt;
&lt;p&gt;I created a Raspberry Pi Desktop image, but assuming you&amp;rsquo;ve created a new appliance and want to share it you&amp;rsquo;ll need to submit your new file as a pull request.  If you haven&amp;rsquo;t already cloned the GNS3 Registry Git, refer back to the beginning of the article for instructions on that part.  Make sure your local copy is up-to-date.  Two Python programs are included in the repo.  Run them both on your copy before continuing.  These are QA processes that look for issues before you submit.  They &lt;em&gt;will&lt;/em&gt; take a little time to run.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip3 install -r requirements.txt   &lt;span style=&#34;color:#75715e&#34;&gt;# this does __pip3 install jsonschma__ and __pip3 install pycurl__  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 check.py  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 check_url.py  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next push your local copy to your github copy.  In Github terms, &lt;em&gt;origin&lt;/em&gt; is your copy on Github, and &lt;em&gt;master&lt;/em&gt; is the local copy.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Added Raspberry Pi Desktop appliance&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -f origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now there is an up-to-date local copy of the gns3-registry that includes the updated gns3a appliance and your fork is up-to-date on Github.  Next, offer the update to the project via a &lt;em&gt;Pull Request&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/PullRequest.png#center&#34; alt=&#34;Pull Request&#34;&gt;
Go to the gns3-registry repository on Github and select the Pull Requests tab and click the big green &lt;strong&gt;New pull request&lt;/strong&gt; button. Under Compare, select the link to &lt;em&gt;compare across forks&lt;/em&gt; (since your copy is a fork) and select your fork.  It should show you the changes to files so take a moment to digest that and make sure this PR is doing what you want.  Finally, submit the Pull Request.  Github will email you when there&amp;rsquo;s an update to the request.  If the GNS3 team has a question, they&amp;rsquo;ll submit a comment on the PR and leave it open for you to resolve.  Otherwise, it will get merged in and all the other GNS3 users will be able to enjoy your hard work!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/RPIDesktop.png#floatright&#34; alt=&#34;Raspberry Pi Desktop running in GNS3&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;results&#34;&gt;Results&lt;/h2&gt;
&lt;p&gt;The image seems to run well.  If I test the Linux Unplugged scenario, I can add some additional interfaces to it easily.  I&amp;rsquo;ll probably also add some RAM to liven it up.  If you use this image, it boots into an install screen.  You can use the ISO image with persistence, or you can install.  Be aware that the install process took awhile.&lt;/p&gt;
&lt;p&gt;The focus of the article was on using the included &lt;strong&gt;new_appliance.py&lt;/strong&gt; script to build new appliances.  In the past, I&amp;rsquo;ve just used an existing template and updated it manually for a new appliance.  I found the script interesting, but it took several run-throughs to understand the flow and to get things setup the way I wanted.  For me, it&amp;rsquo;s easier just to crank up &lt;em&gt;nano&lt;/em&gt; and hand edit but the Python program wasn&amp;rsquo;t bad and would be particularly useful to someone who wasn&amp;rsquo;t as familiar with the process.  Hopefully this walk through will help that person understand what to expect and make using the tool a little easier.&lt;/p&gt;
&lt;p&gt;Do you have any custom appliances?  Contributing to an open source project was really cool and I&amp;rsquo;d love for you to have the chance to experience it!  Are there some appliances you &lt;em&gt;wish&lt;/em&gt; we could build for GNS3?  Write in the comments below, and maybe I can help you build it.  I&amp;rsquo;d love to hear how you use this feature!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Updating a GNS3 Appliance File</title>
      <link>https://nextpertise.net/200902_updatinggns3appliances/</link>
      <pubDate>Wed, 02 Sep 2020 08:41:13 -0400</pubDate>
      
      <guid>https://nextpertise.net/200902_updatinggns3appliances/</guid>
      <description>&lt;p&gt;This is a long post, but most of it is file contents.  Keep reading!&lt;/p&gt;
&lt;p&gt;GNS3 appliance files are descriptions of virtual machines used in network simulations.  The appliance files have suffixes of &lt;em&gt;.gns3a&lt;/em&gt; and are included with the GNS3 download.  You can update the files and create new ones.  The goal of this article is to walk through the process of working with appliance files and contributing them back to the community.&lt;/p&gt;
&lt;p&gt;On a personal note, submitting a new GNS3 appliance was the first time I contributed to an open-source project.  I&amp;rsquo;m still learning, but a few years ago I knew &lt;em&gt;nothing&lt;/em&gt;.  Jeremy Grossman, with GNS3, was patient and helped me understand the process of using Git.  Contributing - even in this minor way - was a real high for me and I&amp;rsquo;d love for you to be able to share that feeling and contribute to this and other projects.  GNS3a was my &amp;ldquo;gateway drug&amp;rdquo; into being a contributor and not just a consumer of open source.&lt;/p&gt;
&lt;p&gt;One of the files I&amp;rsquo;ve contributed is the Security Onion appliance.  Security Onion is a Linux distribution that focuses on security tools.  Below is the current version (9/1/20) of the GNS3A file.  Before we create a new appliance, let&amp;rsquo;s update this one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;guest&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion is a Linux distro for intrusion detection, network security monitoring, and log management. It’s based on Ubuntu and contains Snort, Suricata, Bro, OSSEC, Sguil, Squert, ELSA, Xplico, NetworkMiner, and many other security tools. The easy-to-use Setup wizard allows you to build an army of distributed sensors for your enterprise in minutes!&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;vendor_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion Solutions, LLC&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;vendor_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://securityonion.net/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;documentation_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/wiki&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;product_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;product_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://securityonion.net/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;registry_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stable&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;maintainer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Brent Stewart&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;maintainer_email&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X@X&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;usage&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Your default account will have sudo priviledges.  Squil and Squert username and password are configured in the Setup wizard.  MySQL root is set to null.  For more info see https://github.com/Security-Onion-Solutions/security-onion/wiki/Passwords.&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;symbol&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-logo.png&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;qemu&amp;#34;&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;adapter_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;e1000&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;adapters&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ram&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3072&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;arch&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;console_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vnc&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;kvm&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;allow&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.6.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ca835cef92c2c0daafa16e789c343d1d&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2020605952&lt;/span&gt;,   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v16.04.5.3_20181010/securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.5.3.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.5.3&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;886b369548c9c3841bc820cc3ab02bd9&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1895825408&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v16.04.5.3_20181010/securityonion-16.04.5.3.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.4&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9c7cab756b675beb10de4274a3ad3bc6&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1874853888&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v14.04.5.4_20171031/securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.3.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.3&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fb80ccb2d3c0f3f511823fa5858f87d1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1889533952&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v14.04.5.4_20171031/securityonion-14.04.5.3.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3411a599e822f2ac6be560a26405821a&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;197120&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%30disk/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;versions&amp;#34;&lt;/span&gt;:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.6.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.5.3&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.5.3.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.4&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.3&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;: {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.3.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of this is pretty straight forward.  The structure looks like:&lt;/p&gt;
&lt;p&gt;A descriptive section&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name, Description, usage, vendor and product information can be taken from the source website&lt;/li&gt;
&lt;li&gt;Category can be guest, router, firewall, or multilayer_switch.&lt;/li&gt;
&lt;li&gt;Maintainer is the creator.  Notice I&amp;rsquo;ve replaced my email for publication to the web.&lt;/li&gt;
&lt;li&gt;Symbol should be a SVG file with a maximum height of 70px.  Either reference an existing symbol or add a new one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next is the Qemu section that describes how the VM environment should be constructed.  This is straightforward as well.  Console types are VNC or telnet.  You may have to try different ethernet adapters to see what works, but I recommend starting with the Intel e1000 because this model is supported by most VMs.  Using a para-virtualized adapter may give better performance, so you may also want to try vmxnet3.  Most architectures will be 64bit and RAM requirements will usually be on the website.&lt;/p&gt;
&lt;p&gt;That leaves two sections - Images and Versions.  There should be a matching entry in both places.  The images section is a list of virtual hard drives and CD-ROM images to use in the VM and includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filename, version, and download URL&lt;/li&gt;
&lt;li&gt;md5sum - most Linux distributions include the command &lt;strong&gt;md5sum&lt;/strong&gt;.  Download the appliance ISO and use &lt;strong&gt;md5sum myfile.iso&lt;/strong&gt; to generate a checksum.  Most Linux distributions include the checksum on their download page as well, so double check your version.&lt;/li&gt;
&lt;li&gt;filesize is reported on Linux using &lt;strong&gt;ls -l&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If an empty drive image is needed, GNS3 provides them in different sizes on Github (as referenced above)
The versions section needs to have a name that matches the version number provided in the images section.  That ties the images to the correct version.
Notice that I&amp;rsquo;ve set this up to boot to an empty machine and prompt the user to do the installation.  I could also supply a QCOW2 file with Security Onion pre-installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;rsquo;s update this file.  There are a lot of old images listed as options.  I&amp;rsquo;ll remove the image and version sections for 14.04.5.3 and add the most recent (16.04.7.1).  That will leave users with the last 14.x and two images in 16.x including the latest.  Whether dealing with a distribution or a commercial image, changes made between versions may introduce new processes or bugs so leaving some older images gives users an easy workaround.  Here&amp;rsquo;s the updated file.  Scroll below the output for a discussion of submitting this back to the project.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;guest&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion is a Linux distro for intrusion detection, network security monitoring, and log management. It’s based on Ubuntu and contains Snort, Suricata, Bro, OSSEC, Sguil, Squert, ELSA, Xplico, NetworkMiner, and many other security tools. The easy-to-use Setup wizard allows you to build an army of distributed sensors for your enterprise in minutes!&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;vendor_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion Solutions, LLC&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;vendor_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://securityonion.net/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;documentation_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/wiki&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;product_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Security Onion&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;product_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://securityonion.net/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;registry_version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;stable&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;maintainer&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Brent Stewart&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;maintainer_email&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;brent@stewart.tc&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;usage&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Your default account will have sudo priviledges.  Squil and Squert username and password are configured in the Setup wizard.  MySQL root is set to null.  For more info see https://github.com/Security-Onion-Solutions/security-onion/wiki/Passwords.&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;symbol&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-logo.png&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;qemu&amp;#34;&lt;/span&gt;: {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;adapter_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;e1000&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;adapters&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ram&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;3072&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;arch&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;console_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vnc&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;kvm&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;allow&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;: [  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.7.1.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.7.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;6bd811a05c1ec7973b8fca5c34cec13e&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2132803584&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v16.04.7.1_20181010/securityonion-16.04.7.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.6.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ca835cef92c2c0daafa16e789c343d1d&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2020605952&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v16.04.6.1_20181010/securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.4&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9c7cab756b675beb10de4274a3ad3bc6&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1874853888&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/Security-Onion-Solutions/security-onion/releases/download/v14.04.5.4_20171031/securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;md5sum&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3411a599e822f2ac6be560a26405821a&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filesize&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;197120&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%30disk/&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;direct_download_url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://sourceforge.net/projects/gns-3/files/Empty%20Qemu%20disk/empty30G.qcow2/download&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;versions&amp;#34;&lt;/span&gt;: [  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.7.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;: {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.7.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16.04.6.1&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;: {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-16.04.6.1.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;14.04.5.4&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;images&amp;#34;&lt;/span&gt;: {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;hda_disk_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;empty30G.qcow2&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cdrom_image&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;securityonion-14.04.5.4.iso&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;p&gt;In GNS3, go to File &amp;gt; Import Appliance and make sure that your appliance imports correctly.  GNS3 will provide guidance if there&amp;rsquo;s a formatting error.  Looking at the JSON above, you can imagine that a common mistake is unmatched brackets!&lt;/p&gt;
&lt;p&gt;If the GNS3a file loads, test it by creating an instance.  You need to test at least any new versions you added.  Make sure the appliance boots without error and that expected interfaces are available.&lt;/p&gt;
&lt;h2 id=&#34;submit-a-pull-request&#34;&gt;Submit a Pull Request&lt;/h2&gt;
&lt;p&gt;Once the pieces are working, submit the appliance to the community by cloning the GNS3-registry on Github and adding in your file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/GNS3/gns3-registry.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve &lt;em&gt;already&lt;/em&gt; cloned it, make sure that your branch is up to date.  &lt;em&gt;Upstream&lt;/em&gt; is the original source (in this case the GNS3 copy).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git fetch upstream  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Two Python programs are included in the repo.  Run them both on your copy before continuing.  These are QA processes that look for issues before you submit.  They &lt;em&gt;will&lt;/em&gt; take a little time to run.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip3 install -r requirements.txt   &lt;span style=&#34;color:#75715e&#34;&gt;# this does __pip3 install jsonschma__ and __pip3 install pycurl__  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 check.py  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 check_url.py  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next push your local copy to your github copy.  In Github terms, &lt;em&gt;origin&lt;/em&gt; is your copy on Github, and &lt;em&gt;master&lt;/em&gt; is the local copy.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Updated Security Onion&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -f origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have an up to date local copy of the gns3-registry that includes our updated gns3a appliance and we&amp;rsquo;ve updated our fork on Github.  Next, we offer our update to the project via a &lt;em&gt;Pull Request&lt;/em&gt;.  You are going to be one of the cool kids!
&lt;img src=&#34;https://nextpertise.net/PullRequest.png#center&#34; alt=&#34;Pull Request&#34;&gt;
Go to the gns3-registry repository on Github and select the Pull Requests tab and click the big green &lt;strong&gt;New pull request&lt;/strong&gt; button. Under Compare, select the link to &lt;em&gt;compare across forks&lt;/em&gt; (since your copy is a fork) and select your fork.  It should show you the changes to files so take a moment to digest that and make sure this PR is doing what you want.  Finally, submit the Pull Request.  Github will email you when there&amp;rsquo;s an update to the request.  If the GNS3 team has a question, they&amp;rsquo;ll submit a comment on the PR and leave it open for you to resolve.  Otherwise, it will get merged in and all the other GNS3 users will be able to enjoy your hard work!&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using SSH Part 4 - Port Forwarding</title>
      <link>https://nextpertise.net/200830_using_ssh4/</link>
      <pubDate>Sun, 30 Aug 2020 15:12:24 -0400</pubDate>
      
      <guid>https://nextpertise.net/200830_using_ssh4/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/SSH-Tunnel.png#floatright&#34; alt=&#34;SSH Tunnel&#34;&gt;&lt;strong&gt;Problem&lt;/strong&gt;: We want to access an internal web page that is behind a firewall.  We have SSH access to a server behind the firewall, and &lt;em&gt;that&lt;/em&gt; server can see the intranet.&lt;/p&gt;
&lt;p&gt;SSH has a solution for this type of problem - tunneling.  Most people use SSH as a telnet replacement &amp;ndash; as just a way to get a terminal session.  SSH is capable of much more than mere terminal access.  There are several ways to accomplish out goal, so let&amp;rsquo;s sort through them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This article demonstrates an obscure and useful way to use a tool, but raises two important points.  First, don&amp;rsquo;t take any part of this to be an example of good design.  I&amp;rsquo;ve constructed a case that allows demonstrating a technique.  Second, using the tool this way may short-circuit your organizations&amp;rsquo; security design and so security folks may want to mitigate against allowing this use.&lt;/p&gt;
&lt;h2 id=&#34;option-1---ssh-from-the-client&#34;&gt;Option 1 - SSH from the client&lt;/h2&gt;
&lt;p&gt;For this to work, the intermediate host (10.0.0.22 in this case) needs to allow itself to pass ports.  Open the &lt;strong&gt;sshd_config&lt;/strong&gt; file and set GatewayPorts to &lt;em&gt;yes&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# edit line to remove remark and change to yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GatewayPorts yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, ssh from the external device to the intermediate device and link a local port to an address and port reachable from the ssh target.  In the example below, we connect into 2.2.2.2 (&amp;ldquo;server&amp;rdquo;) and then we map &lt;em&gt;local (on the external device)&lt;/em&gt; port 8080 to a target reachable from the server - webserver port 80.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -L 8080:10.0.0.80:80 2.2.2.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -L maps a local port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 8080:10.0.0.80:80 ties port 8080 to a remote destination of 10.0.0.80:80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2.2.2.2 is the ssh target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After running this command, you&amp;rsquo;ll be asked to log into the ssh server normally.  Once logged in, open a web browser on the external client to http://localhost:8080 and the remote internal webpage will be visible.&lt;/p&gt;
&lt;h2 id=&#34;option-2---ssh-from-the-inside-reverse-tunnel&#34;&gt;Option 2 - SSH from the inside (Reverse Tunnel)&lt;/h2&gt;
&lt;p&gt;Another option is to make a port available to a remote computer.  In this case, we start ssh from the server and connect to the remote client (which we&amp;rsquo;ll imagine is me.myself.com).  Again, the command prompts us to login to the remote machine.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -R 8080:10.0.0.80:80 me.myself.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point the remote user can open a browser to http://localhost:8080 and see the internal page.  In fact, the firewall may allow ssh traffic to originate from the webserver.  In that case the reverse tunnel could be established from the webserver without having to use an intermediate host.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -R 8080:localhost:80 me.myself.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;option-3---http-from-the-outside&#34;&gt;Option 3 - HTTP from the outside&lt;/h2&gt;
&lt;p&gt;The final scenario to consider is to allow the server to listen on a port and forward traffic to the intranet server.  Obviously this would require the firewall configuration to allow some port in addition to tcp/22 (SSH) into the server.  In this case, we&amp;rsquo;ll ask the server to listen on port 8001 and forward that traffic to the internal web server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -R 8001:10.0.0.80:80 localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The client can now browse to http://2.2.2.2:8001 to see the webpage.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;SSH port forwarding and reverse SSH connections are powerful tools that can circumvent network policy.  Being familiar with this use may be helpful in troubleshooting, and may be important to you when considering how ssh servers are deployed.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DNS Services</title>
      <link>https://nextpertise.net/200826_dnsservices/</link>
      <pubDate>Wed, 26 Aug 2020 12:01:51 -0400</pubDate>
      
      <guid>https://nextpertise.net/200826_dnsservices/</guid>
      <description>&lt;p&gt;This post is to continue the conversation started in &lt;a href=&#34;https://nextpertise.net/posts/200805_reasonablysecurebrowsing&#34;&gt;Reasonably Secure Browsing&lt;/a&gt; with some options for home DNS setting that help protect you and your family.  Like that post, this is intended for non-industry friends.  My goal is to have a set of references for the people I care about, but who don&amp;rsquo;t share my love of technology.  For the gurus out there, understand that this leaves out a lot of details for the sake of clarity for the target audience.&lt;/p&gt;
&lt;p&gt;The first post covered browser settings that balanced security, privacy concerns, and convenience.  Another way to improve your security is use an alternative DNS provider.  DNS (Domain Name System) is an under-the-hood service that connects a name like &amp;ldquo;amazon.com&amp;rdquo; with a number like 176.32.103.205.  Think about your mobile phone.  We rarely memorize peoples telephone numbers anymore, we just call &amp;ldquo;Brent&amp;rdquo; or choose the picture that matches the person we want to call.  The phone translates that into a telephone number.  DNS is a centralized process that translates a name to a number to make the internet more &amp;ldquo;human friendly&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Why should you care?  Three reasons - speed, security, and privacy.  DNS is typically set up by your Internet provider.  Sometimes these implementations are the sources of problems, so changing the default DNS will give you a more stable (and sometimes faster) experience.  Anyone &amp;ldquo;listening&amp;rdquo; to your traffic can easily make a list of where you visit by tracking DNS requests.  This could be someone snooping on a shared wifi at the coffee shop, or it could be your ISP (in fact, ISPs sometimes redirect your traffic to internet locations they control for their own benefit).&lt;/p&gt;
&lt;p&gt;There are a set of alternative DNS providers that provide free services that are unfiltered and private.  I recommend that you consider one of these.  They&amp;rsquo;re all good, but I&amp;rsquo;ve listed them in the order of my preference.&lt;/p&gt;
&lt;p&gt;To enable, go into your router and change the DNS setting to the IP provided (the exact instructions vary by router).  At home, this is a reasonable step to protect you and your family.  If you travel, these providers also support a variety of options to encrypt your request, including DNS over HTTPS (DoH).  I recommend using DoH within Firefox for devices that leave the house.&lt;/p&gt;
&lt;p&gt;Firefox can encrypt your DNS traffic from &amp;ldquo;snoopers&amp;rdquo;.  Go to the menu button and choose &lt;em&gt;preferences&lt;/em&gt; and then &lt;em&gt;Network Settings&lt;/em&gt;.  Click &lt;em&gt;Enable DNS over HTTPS&lt;/em&gt; and then choose a provider or select &amp;ldquo;Custom&amp;rdquo; and type in the IP address (included below).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://d15ni2z53ptwz9.cloudfront.net/opendns-www/img/logo-opendns.png#floatright&#34; alt=&#34;OpenDNS&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;opendns-20867222222---best-for-home-use&#34;&gt;OpenDNS (208.67.222.222) - Best for home use&lt;/h2&gt;
&lt;p&gt;OpenDNS is a great choice.  By default, their free service is excellent.  It recognizes many cases where you&amp;rsquo;ve been directed to a malicious site, and keeps you out of trouble by blocking it.  OpenDNS is owned by Cisco, and it benefits from the huge investments they&amp;rsquo;ve made in Internet security.  It also blocks adult content by default.  You can create an account and customize your home&amp;rsquo;s experience - for instance, do you want to block Gambling or Tobacco advertising?  These settings are tied to your home IP, so your laptop goes back to the &amp;ldquo;default&amp;rdquo; when not at home.  Especially for public places, like church wifi, or for a home with children this allows you to control what portion of the Internet is available to users.&lt;/p&gt;
&lt;h2 id=&#34;cloudflare-unfiltered-1111-malware-blocking-1112-malware-and-adult-content-1113&#34;&gt;Cloudflare (unfiltered 1.1.1.1, malware blocking 1.1.1.2, malware and adult content 1.1.1.3)&lt;/h2&gt;
&lt;p&gt;Cloudflare is very easy to setup.  Use the IP address that matches your use case.  These settings can carry over when you are away from home if you change them on your device.  There&amp;rsquo;s also an app that provides this service no matter where you are (just for mobile with Windows and Mac coming soon).  Cloudflare has good settings for most cases, is easy to setup, and has the mobile apps, but lacks the customization of OpenDNS.&lt;/p&gt;
&lt;h2 id=&#34;quad9-9999&#34;&gt;Quad9 (9.9.9.9)&lt;/h2&gt;
&lt;p&gt;Quad9 provides a service that is very similar to Cloudflare 1.1.1.2 - just set the DNS and forget it and it provides DNS with malicious sites blocked.  My experience with Quad9 has been largely indistinguishable from Cloudflare or OpenDNS with default settings, when testing blocking or response speed.  However, Quad9 doesn&amp;rsquo;t have the customization of OpenDNS or the apps that Cloudflare has.&lt;/p&gt;
&lt;h2 id=&#34;google-8888&#34;&gt;Google (8.8.8.8)&lt;/h2&gt;
&lt;p&gt;This has been a popular alternative for the geek set for a long time.  It&amp;rsquo;s easy to remember and it provides an &amp;ldquo;unfiltered&amp;rdquo; response.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Using one of these services helps to protect your home.  I use OpenDNS at home and have customized it to filter out a range of categories.  It doesn&amp;rsquo;t block everything on the Internet, but it addresses some of the obvious sites and it helps prevent &amp;ldquo;oops&amp;rdquo; experiences.  It seems to help with advertising too.  I use Cloudflare on my office network and it does a great job as well.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve benefitted from the &lt;a href=&#34;https://nextpertise.net/posts/200805_reasonablysecurebrowsing&#34;&gt;Reasonably Secure Browsing&lt;/a&gt; discussion, this is another &amp;ldquo;reasonable&amp;rdquo; step that you can take to improve your families Internet experience.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Alternate GNS3 Symbols</title>
      <link>https://nextpertise.net/200821_gns3symbols/</link>
      <pubDate>Fri, 21 Aug 2020 13:18:28 -0400</pubDate>
      
      <guid>https://nextpertise.net/200821_gns3symbols/</guid>
      <description>&lt;p&gt;GNS3 is a graphical network simulation tool.  Imagine something like Visio that let you place network devices and draw connections, then boot them up and interact with them.  The screenshot above is a simulation I ran that used five Cisco CSR routers to demonstrate BGP for a class.  The devices typically run in KVM or Docker, but can use VMWare or Virtualbox.  This article assumes that you are familiar with the project.
&lt;img src=&#34;https://nextpertise.net/GNS3Lab.png#center&#34; alt=&#34;GNS3 Screen Capture&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found GNS3 to be an invaluable tool.  I used it to do labs while writing books years ago.  I&amp;rsquo;ve used it to teach networking and security to the people who work with me, and to do labs to teach myself.  I&amp;rsquo;ve also used it to simulate an environment and walk through a change process to practice, verify steps, and perfect configuration updates.&lt;/p&gt;
&lt;p&gt;GNS3 originally had one set of symbols that could be used for the various virtual machines.  The switches labeled &amp;ldquo;Home&amp;rdquo; and &amp;ldquo;Remote&amp;rdquo; in the screenshot are in this style.  The GNS3 team added a family of symbols labeled &amp;ldquo;Affinity&amp;rdquo; (the CSRs use this type of symbol) which is very clean and modern.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/untangle2.png#floatright&#34; alt=&#34;Untangle&#34;&gt;
&lt;img src=&#34;https://nextpertise.net/vyos.png#floatright&#34; alt=&#34;VyOS&#34;&gt;
The Affinity symbols work very well for most of my labs, but sometimes I need to differentiate between a &lt;em&gt;Cisco&lt;/em&gt; router and &lt;em&gt;VyOS&lt;/em&gt;.  Sometimes you just need to call out a particular device.  In fact, one of the symbols in my library is a big red X that I used to denote a server in a special project.  For this reason, I created a library of symbols using vendor/project logos.  The link for that project is in the reference section.  Here are two sample icons I created.&lt;/p&gt;
&lt;p&gt;Per the specifications posted in the GNS3 Registry project, symbols should be SVG less than 70 pixels tall.  I&amp;rsquo;ve found that PNG with transparent background also looks good.  I typically use the scaling feature in GIMP (&lt;em&gt;Image&amp;gt;Scale Image&lt;/em&gt;) to adjust image size.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to use these symbols, clone my repository.  In GNS3, you can update the device template (and thus all future devices) by right clicking in the device selection window, choosing &lt;em&gt;Configure Template&lt;/em&gt;, and then browsing for the Symbol.  Alternatively, you can use a symbol for one instance by right clicking on the VM in the topology and choosing &lt;em&gt;Change Symbol&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I add to the repository periodically and I&amp;rsquo;d love to have contributions from you.  You can also submit them to the GNS3 project as a pull request on the &lt;em&gt;GNS3 Registry&lt;/em&gt; project.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Team Documentation Using GitHub and Pandoc</title>
      <link>https://nextpertise.net/200818_pandoc/</link>
      <pubDate>Tue, 18 Aug 2020 13:56:30 -0400</pubDate>
      
      <guid>https://nextpertise.net/200818_pandoc/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://thumbs.gfycat.com/GargantuanScaryAnura-max-1mb.gif#floatleft&#34; alt=&#34;Dean Wormer&#34;&gt;
Building team documentation is a critical part of IT.  After all, you can&amp;rsquo;t manage what you don&amp;rsquo;t know about.  You can&amp;rsquo;t follow policies you don&amp;rsquo;t know about.  It&amp;rsquo;s common in IT that documentation is divided between shared files and updated copies on individual laptops.  The problem is that it&amp;rsquo;s difficult for any one person to collect all the most recent files.  I&amp;rsquo;ve learned a lot about Git in the last few years and I wanted to explore whether it could be an answer.&lt;/p&gt;
&lt;p&gt;Various attempts have been made to resolve this versioning issue.  One common approach is to ask everyone to contribute their individual documents to a shared folder.  This has the advantage that everyone can be a contributor and the files are accessible and easy to update.  However, different team members may update the file at different times and in different ways and there&amp;rsquo;s no clear editorial process to bring everything back together.  A second approach is to have a strict editorial process &amp;ndash; maybe a dedicated person who &amp;ldquo;checks in&amp;rdquo; so the boss can &amp;ldquo;approve&amp;rdquo;.  There&amp;rsquo;s typically a drop box for proposed documents and then a locked-down directory with a PDF for the final version.  This process can take a while, can occupy a person, and is discouraging to contributors.&lt;/p&gt;
&lt;p&gt;Using Git has a lot of advantages.  Everyone can have an up-to-date copy using &lt;strong&gt;git clone&lt;/strong&gt; and &lt;strong&gt;git fetch&lt;/strong&gt;.  Team members can edit documents and submit them as Pull Requests (PRs).  There&amp;rsquo;s a built in process for the repo owner to accept or reject those changes.  GitHub already has an issues process that would make it easy to note deficiencies and discrepancies.  Finally, Github repos can be marked private, are available even when internal systems are down, and maintain historical versions.&lt;/p&gt;
&lt;p&gt;Having a repository of Word files would be useful, but formatting can be maddening.  All those files will use different fonts, sizes, margins, colors, headings . . . sigh.  Another problem is that you&amp;rsquo;ll have a directory full of files with names like &lt;strong&gt;ITPROC1.docx&lt;/strong&gt;.  As an administrator, I would like to have one place where I can easily browse through documentation and be confident that I&amp;rsquo;m up to date!&lt;/p&gt;
&lt;p&gt;My proposal is to use Markdown files for documentation.  They&amp;rsquo;re easy to create and reasonably readable in a text editor.  As pushes or PRs occur, these files can be combined into a PDF using &lt;strong&gt;pandoc&lt;/strong&gt;.  I&amp;rsquo;ve built a demonstration of this in the referenced Github repository.  There&amp;rsquo;s a Continuous Integration (CI) process built out of Github Actions.  Setting that up adds a &lt;em&gt;.github/workflows/name.yaml&lt;/em&gt; file to your repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be careful!&lt;/strong&gt;  &lt;em&gt;I originally built my repository locally and pushed it to Github, then used the Github actions &amp;ldquo;wizard&amp;rdquo; to setup the CI process.  That builds an initial configuration file for you and puts it into your repository.  The next time I pushed, this directory and file were wiped out!  The result was that the CI process didn&amp;rsquo;t run and it took me a while to understand what I had done.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my YAML file to handle the CI process.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;CI  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;on&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;push&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;branches&lt;/span&gt;: [ &lt;span style=&#34;color:#ae81ff&#34;&gt;master ]  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;pull_request&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;branches&lt;/span&gt;: [ &lt;span style=&#34;color:#ae81ff&#34;&gt;master ]  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jobs&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-latest  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;\- uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/checkout@v2  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;\- run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;echo &amp;#34;::set-env name=FILELIST::$(printf &amp;#39;%s &amp;#39; *.md)&amp;#34;  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;\- uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;docker://pandoc/latex:2.9  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;args&lt;/span&gt;: --&lt;span style=&#34;color:#ae81ff&#34;&gt;toc --output=output/result.pdf ${{env.FILELIST}}  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;\- uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/upload-artifact@master  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;output  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;path&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;output  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/githubartifact.png#floatright&#34; alt=&#34;Artifact&#34;&gt;
This process will pull all the md files into a PDF, ordering them alphabetically.  It will then add a table of contents to the front, based on headings found in the files.  I&amp;rsquo;ve cribbed this together using the pandoc example on github (referenced below).&lt;/p&gt;
&lt;p&gt;The result is a zip file named &lt;em&gt;output&lt;/em&gt; that will show up under Actions.  The latest run should be at the top of the screen, and clicking the link should show you the Artifacts produced.  Note that if there are problems with the CI process, you can review those by looking at the &lt;em&gt;build&lt;/em&gt; section.  You could add to the CI process to have the output file emailed to you or stored in a convenient place.  For instance, you could send the PDF directly to your Kindle!  I&amp;rsquo;ve chosen not to bother with that since this is a public repository.  Another idea would be to have this process output HTML files that could be placed on a local web server.  Pandoc can handle PDF, HTML, EPUB, and a lot of other formats.&lt;/p&gt;
&lt;p&gt;My repository is public and you are welcome to clone it and play with this process.  The markdown files currently in place are filled with Lorem Ipsum nonsense but they give you a sense of how it might look as a finished PDF.  I&amp;rsquo;d like to build in an automatic way to add a cover page.  The Pandoc documentation also references using a CSS file to dictate formatting when outputting to EPUB, so I&amp;rsquo;d like to see if I could get that supported in PDF.  PRs are welcome if you have any ideas!&lt;/p&gt;
&lt;p&gt;What do you think?  Would this be a good way for your IT group to maintain documentation?  I&amp;rsquo;d welcome your comments in the section below!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Most Commonly Used Linux Commands</title>
      <link>https://nextpertise.net/200817_mostcommonlinuxcommand/</link>
      <pubDate>Mon, 17 Aug 2020 12:47:16 -0400</pubDate>
      
      <guid>https://nextpertise.net/200817_mostcommonlinuxcommand/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve seen some articles recently on &amp;ldquo;Linux commands frequently used by admins&amp;rdquo;  or &amp;ldquo;15 commonly used Linux commands&amp;rdquo;, which got me thinking . . . what commands do I use most frequently?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;history&lt;/strong&gt; shows us a list of recent commands starting with a sequence number (example below).  But I just want the command!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; brent@MintyTwenty:__~$ history__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  mkdir git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  cd git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;  git clone https://github.com/brentstewart/Mint-install.git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    . . .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Piping this output into &lt;strong&gt;awk&lt;/strong&gt; allows me to filter this down to the first word.  &lt;strong&gt;Awk&lt;/strong&gt; can pull a field out; in this case the sequence number is field 1 and the command is field 2.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;  brent@MintyTwenty:~$ __history | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mkdir  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    git  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Getting closer!  I want a frequence count of which commands are used, so let&amp;rsquo;s pipe this to &lt;strong&gt;uniq -c&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; brent@MintyTwenty:~$ __history | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | uniq -c__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; mkdir  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; cd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; sudo  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; exit  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ls  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; cd  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; git  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; cd   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ls  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that it&amp;rsquo;s showing &lt;strong&gt;cd&lt;/strong&gt; counted in multiple groups.  I &lt;em&gt;think&lt;/em&gt; this is because of the way &lt;strong&gt;uniq&lt;/strong&gt; is grouping, so let&amp;rsquo;s help it out by piping that output to sort before asking &lt;strong&gt;uniq&lt;/strong&gt; to group and count.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@MintyTwenty:~$ __history | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | sort | uniq -c__  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      3 alias  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      4 awk  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      4 ./basic.sh  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      1 cat  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     31 cd  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      3 chmod  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      . . .  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point it is easy to find that my top commands are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;history&lt;/strong&gt; (probably from working through this example)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;git&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cd&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ls&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sudo&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>JAMStack</title>
      <link>https://nextpertise.net/200817_jamstack/</link>
      <pubDate>Mon, 17 Aug 2020 08:25:02 -0400</pubDate>
      
      <guid>https://nextpertise.net/200817_jamstack/</guid>
      <description>&lt;p&gt;I wrote a few weeks ago about setting up this site using Hugo and [Render.  It&amp;rsquo;s become clear since then that what I &amp;ldquo;discovered&amp;rdquo; was a developed concept aimed at solving big problems in web development and that my use case was the simplest use.  Some of you were no doubt well ahead of me, but couldn&amp;rsquo;t tell me because I didn&amp;rsquo;t have a comment system on the blog until this week.
Hugo and Render are one iteration of a concept called the JAMStack.&lt;/p&gt;
&lt;h3 id=&#34;you-should-consider-jamstack&#34;&gt;You should consider JAMStack&lt;/h3&gt;
&lt;p&gt;LAMP is a particular implementation of a web server.  By comparison, JAMStack is a loose collection of ideas about how to assemble the pieces needed to serve a webpage.  I have a diatribe on the &amp;ldquo;loose but enlightening concept&amp;rdquo; to &amp;ldquo;marketecture babble&amp;rdquo; cycle, but I won&amp;rsquo;t bore you with it.  Suffice to say that JAMStack is still early in the process and thus still valuable.&lt;/p&gt;
&lt;p&gt;With JAMStack we are removing the ediface of a database/content management system/webserver stack.  The old model stored content in a database and built HTML on the fly.  It was difficult on many levels - building, updating, and securing the pieces, maintaining capacity and availability, and difficult for content creators to view their finished page.&lt;/p&gt;
&lt;p&gt;JAMStack, as originally defined, is JavaScript, APIs, and Markup.  For Nextpertise, this is Hugo+Markup, 3rd Party APIs, and GitHub+Render.  Content is easily created and edited, then pushed straight to a Content Distribution Network (CDN) which provides fast response everywhere in the world.  I don&amp;rsquo;t have to build, license, or grow servers.  I have a local copy of Nextpertise in a local Git repository and can build as much as I want with very little effort.&lt;br&gt;
&lt;img src=&#34;https://nextpertise.net/JAMstack.png#floatright&#34; alt=&#34;JAMStack&#34;&gt;&lt;/p&gt;
&lt;p&gt;HTML is a markup language, but it&amp;rsquo;s complicated and it entangles site design into the content.  Markdown is a simplified markup language that is human-readable.  I write content using VSCodium as a markdown file.  Hugo then compiles this markdown file against a template (in the case of this page, the &lt;em&gt;single.html&lt;/em&gt; file in the &lt;em&gt;themes/layouts/_default&lt;/em&gt; directory).  In the VSCodium terminal, I&amp;rsquo;m running &lt;strong&gt;Hugo server -D&lt;/strong&gt; and a browser is automatically updating a view of this page as I save.  When complete, I can run &lt;strong&gt;hugo server&lt;/strong&gt; and it will output my entire site as a set of html files in the &lt;em&gt;public&lt;/em&gt; directory.  Hugo and VSCodium are open source and well supported by their communities, but if you want to use something different there are too many choices for me to list.  I hear good things about Jekyll, Gatsby, and Eleventy, for instance.&lt;/p&gt;
&lt;p&gt;Once the site is updated, I push the local copy to Github.  Git provides a backup and handles version control.  It also handles permissions and tracks who makes changes, so I can invite collaborators over time.  Finally, Git provides the Continuous Integration piece.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t actually compile HTML locally.  Hugo shows it on the fly for development, but keeping a local public directory and dragging file to a host can create a problem with old file versions still present.  Better to compile a clean copy with each push, and GitHub handles that for me using a continuous integration (CI) process.  When I push a change to Github, a process automatically kicks off to compile the HTML and pass it to Render for distribution.&lt;/p&gt;
&lt;p&gt;Speaking of CDNs - I love working with Render.  I chose them after inadequate research and thought they were entirely unique.  It turns out that there are a number of ways to host static sites.  I wrote about S3: good, but doesn&amp;rsquo;t have a way to auto-deploy from Github.  I&amp;rsquo;ve heard good things about CloudFlare, Firebase, and GCP as well, but none of them have the CI integration.  If that&amp;rsquo;s a major factor for you, also look at GitHub pages and Netlify.  Of those options, I want to call out Netlify as providing a lot of support and documentation to the larger community.&lt;/p&gt;
&lt;p&gt;Everything I&amp;rsquo;ve discussed so far is around static content.  Great for a blog, but serious sites require user feedback for things like purchases and comments.  In the case of Nextpertise, adding a comment option looked like it was going to require standing up an EC2 instance and deploying a service that I could embed in the page.  But I really don&amp;rsquo;t want to build and secure a server and I especially don&amp;rsquo;t want to &lt;em&gt;pay&lt;/em&gt; for one.  This is where JAMStack gets into the API part.&lt;/p&gt;
&lt;p&gt;There are services to which I can subscribe that will provide a tenanted commenting capability for my site.  The biggest of these is Disqus.  Disqus appears to be a great choice and reasonable plans are available.  In the end, I used &lt;em&gt;utteranc.es&lt;/em&gt;, which is a bit of code that leverages Github APIs to store comments in Github issues.  I&amp;rsquo;m not building, I&amp;rsquo;m consuming.  The JAMStack model is to use APIs (like &lt;em&gt;utteranc.es&lt;/em&gt;) instead of incorporating that logic and - when you reflect on it - it&amp;rsquo;s a Unix-like philosophy of &lt;em&gt;doing one thing well&lt;/em&gt; and coupling those things at a higher level.  The philosophy I&amp;rsquo;ll take is to use third party APIs when possible, then to develop a Lambda if needed, then to stand up a server if I have to.  I&amp;rsquo;ve seen third party apis for maps, weather, jokes, and even shopping carts.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re working our way backward thorough the JAM.  Javascript would be added to help with interactivity, but at this point I don&amp;rsquo;t have a use case on my site.  So, mid-August Nextpertise is no javascript, utteranc.es API for commenting, and Hugo&amp;gt;Git&amp;gt;Render for the static site.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m continuing to read on this and I want to be careful not to present myself as an expert.  That said, I&amp;rsquo;m so enthusiastic about what I see that I wanted to share what I&amp;rsquo;ve learned with you.  I&amp;rsquo;ll check back on this topic as I have a more developed picture.  I&amp;rsquo;d also welcome your comments and suggestions!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using SSH - Part 3 (File Shares)</title>
      <link>https://nextpertise.net/200813_using_ssh3/</link>
      <pubDate>Thu, 13 Aug 2020 11:15:42 -0400</pubDate>
      
      <guid>https://nextpertise.net/200813_using_ssh3/</guid>
      <description>&lt;p&gt;One of the basic things you want to do on a network is share files.  At one point, everyone had a Windows PC and this involved shared directories and Network Neighborhood.  It had a lot of issues, but it worked.  However, today we have a variety of clients and CIFS isn&amp;rsquo;t an easy (or appropriate) fit for all of them.  This article focuses on home users, but enterprise users face some of the same challenges.  There are a lot of ways you &lt;em&gt;could&lt;/em&gt; do this; I&amp;rsquo;m going to share how I&amp;rsquo;m currently doing it.  My environment includes several versions of Linux, Windows 10, a Mac, Chromebooks, and Android Phones.&lt;/p&gt;
&lt;p&gt;I should start by saying that I&amp;rsquo;m &lt;em&gt;not&lt;/em&gt; using Microsoft sharing &amp;ndash; what has been variously termed SMB (Server Message Blocks) or CIFS (Common Internet File System).  My experience with SAMBA (SMB on Linux) has been uneven and I&amp;rsquo;ve never wanted to invest the time.  Your mileage may vary, but trying to sort out access and permissions and deal with the impact of software updates was a drag.&lt;/p&gt;
&lt;h2 id=&#34;sftp-filezillafilezillapngfloatright&#34;&gt;SFTP &lt;img src=&#34;https://nextpertise.net/Filezilla.png#floatright&#34; alt=&#34;Filezilla&#34;&gt;&lt;/h2&gt;
&lt;p&gt;SFTP is a Secure File Transfer Protocol built on top of SSH, and the two are usually bundled together since they are complementary.  One of the easiest ways to use SFTP to transfer files on all platforms is to use &lt;em&gt;Filezilla&lt;/em&gt;.  Filezilla presents a left/right here/there file manager that allows easy drag and drop between locations.  It works most places SSH works.  Login using your SSH credentials and set the port to 22.  If you use Filezilla often, the first button on the left is the Site Manager and remembers common destinations.  Filezilla works, but there&amp;rsquo;s no way to open a file in an application from the other disk.  It must be copied locally and this creates multiple file versions and is onerous to use.  So - Filezilla if nothing else works.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/caja.png#floatleft&#34; alt=&#34;Caja&#34;&gt;Linux file managers like &lt;em&gt;Caja&lt;/em&gt; and Finder on the Mac allow you to attach to an arbitrary destination in an ad-hoc fashion (Windows does not).  For Linux and Mac, just use existing SSH credentials.  This method also supports FTP, CIFS, and WebDav.  I don&amp;rsquo;t recommend FTP because it&amp;rsquo;s not secure and it&amp;rsquo;s a very old protocol and can be difficult to handle on firewalls.  WebDav is slow and involves some Apache setup.  It can be secure, but most folks setting up a quick file share won&amp;rsquo;t take the time to make it so.  I recommend SSH/SFTP.  File managers generally allow bookmarking, but don&amp;rsquo;t automatically reconnect.  I&amp;rsquo;ll walk through a technique that builds the connection at startup later in the article.&lt;/p&gt;
&lt;p&gt;On Android, I&amp;rsquo;m using &lt;em&gt;Cx File Explorer&lt;/em&gt;.  This application allows me to connect to SFTP resources and bookmark them.  Cx integrates with the rest of Android, so I can do things like type an email and use Cx to attach a file from the server.  Cx has the same requirements SSH does - a network path to the server and credentials. For me, a common use is to grab a PDF from the server and transfer them to my Kindle.&lt;/p&gt;
&lt;h2 id=&#34;aside---nfs&#34;&gt;Aside - NFS&lt;/h2&gt;
&lt;p&gt;Network File System (NFS) is a dream for devices that support it.  It lacks the ad hoc browsing you might do on a Windows network, but at home I want all the files on the servers and if I have to do horizontal file sharing I can figure it out.  Setting up NFS on the server involves getting the NFS server, setting up the &lt;em&gt;/etc/fstab&lt;/em&gt; configuration file, and publishing the share using &lt;strong&gt;exportfs&lt;/strong&gt;.  The example below publishes my user directory from the server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install nfs-kernel-server nfs-common
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/exports
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add lines similar to this one
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/brent 192.168.1.0/255.255.255.0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;rw,anonuid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1000,anongid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1000,sync&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;save file and . . .&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exportfs -avf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On the client, I&amp;rsquo;ll map this share to a folder so it sits in my directory tree.  In this case, I want my server user directory to fit under my local user directory as the &lt;em&gt;server&lt;/em&gt; sub-directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/server
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;add lines similar to this one&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.1.1:/home/brent /home/brent/server nfs default &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;save file&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mount ~/server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should just work, but you may need to use &lt;strong&gt;mount&lt;/strong&gt; to kick it in the rear.  Because this is setup in your &lt;em&gt;fstab&lt;/em&gt; file, it will automatically reconnect when you restart.  My personal workflow is to save all my work products to the server because that&amp;rsquo;s what is being backed up.  I use the local folders for scratch files, downloads, etc.  I like to try new things and end up re-installing my OS on my desktop about three times a year.  I can throw my Ventoy USB stick in the PC, pick a distro, and be back up with no lost data in minutes!&lt;/p&gt;
&lt;p&gt;NFS works great for Linux to Linux filesharing.  I didn&amp;rsquo;t have great success with Windows.  There is a process that includes using &lt;em&gt;Services for NFS&lt;/em&gt;, but I won&amp;rsquo;t even link to it.  It was difficult to get working and didn&amp;rsquo;t &amp;ldquo;just work&amp;rdquo; in the way that I wanted for my wife&amp;rsquo;s PC.  I haven&amp;rsquo;t seen a way to use this with Android and haven&amp;rsquo;t attempted with Chrome.  On the Mac, this works fine and is supported by Finder.  The procedure is just:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;showmount -e 192.168.1.1 &lt;span style=&#34;color:#75715e&#34;&gt;#view available shares&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mkdir /server-files &lt;span style=&#34;color:#75715e&#34;&gt;#depending on where you put it, you may not need sudo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo mount -o rw -t nfs 192.168.1.1:/home/brent /server-files__
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NFS can be secure.  NFSv4 encrypts traffic in-transit and v2/3 allow you to limit promiscuous connections using a mask.  In the enterprise or if your traffic crosses a public network you &lt;em&gt;really&lt;/em&gt; need to use v4.
&lt;img src=&#34;https://raw.githubusercontent.com/billziss-gh/sshfs-win/master/cap.gif#floatsmallright&#34; alt=&#34;SSHFS Win&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;sshfs&#34;&gt;SSHFS&lt;/h2&gt;
&lt;p&gt;SSHFS is a file system using SFTP.  Since SFTP is built on top of SSH, SSHFS inherits all the goodness of SSH.  SSHFS  works for everything I&amp;rsquo;ve tested so far - I haven&amp;rsquo;t gotten to the Chromebooks yet, but I &lt;em&gt;have&lt;/em&gt; used it in Windows, Mac, Linux, Haiku, BSD, and others.  SSHFS requires installing the sshfs package and installing the SSH server daemon.  File permissions are communicated based on how you login.&lt;/p&gt;
&lt;p&gt;On Linux, the command to mount a directory using SSHFS looks like this (the server is 192.168.1.1).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install sshfs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/server &lt;span style=&#34;color:#75715e&#34;&gt;#if it doesn&amp;#39;t already exist_  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sshfs -o allow_other,default_permissions brent@192.168.1.1:/home/brent /home/brent/server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can add this to fstab if you want it to be automatic.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# add this line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sshfs#brent@192.168.1.1:/home/brent /home/brent/server fuse.sshfs _netdev,idmap&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;user,uid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1001,gid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1002,allow_other,default_permissions &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For Windows, I&amp;rsquo;m using a stack of WinFsp, SSHFS-Win, and SSHFS-Win-Manager (links in notes).  Here&amp;rsquo;s the procedure:&lt;img src=&#34;https://nextpertise.net/SSHFS-Win-Manager.png#floatleft&#34; alt=&#34;SSHFS-WIn-Manager&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;em&gt;WinFsp&lt;/em&gt; from Github - there&amp;rsquo;s an MSI attached to the latest release (I tested with winfsp-1.7.20172.msi)&lt;/li&gt;
&lt;li&gt;Install &lt;em&gt;SSHFS-Win&lt;/em&gt; from Github - again using an MSI (I tested with SSHFS-Win-3.5.20024-x64.msi).  At this point you can map drives using the UNC \sshfs\user@server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/SSHFS-Win-Manager-Add.png#floatright&#34; alt=&#34;SSH-Win-Manager Adding a Conneciton&#34;&gt;&lt;/p&gt;
&lt;p&gt;This is aimed at the family members who &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; want to futz around with computers all day, so install &lt;em&gt;SSHFS-Win Manager&lt;/em&gt; from Github (I tested with sshfs-win-manager-setup-v1.0.1.exe).  Once installed, click &amp;ldquo;add connection&amp;rdquo;.  The connection information is standard SSH information.  To attach my remote user directory to my local one as in the earlier example, I would specify a Remote path of &lt;em&gt;/home/brent&lt;/em&gt; and a Local Path of &lt;em&gt;/home/brent/server&lt;/em&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using SSH - Part 2 (Authentication)</title>
      <link>https://nextpertise.net/200812_using_ssh2/</link>
      <pubDate>Wed, 12 Aug 2020 11:36:12 -0400</pubDate>
      
      <guid>https://nextpertise.net/200812_using_ssh2/</guid>
      <description>&lt;p&gt;This aricle makes up part two of the series on SSH.  If you&amp;rsquo;re interested in the basics or how to setup a banner, refer to the first article.  As with the first article, I&amp;rsquo;ve tested all of this on Ubuntu Linux and exact commands may vary as you get farther from there.&lt;/p&gt;
&lt;h2 id=&#34;secure-authentication-with-passwords&#34;&gt;Secure Authentication with Passwords&lt;/h2&gt;
&lt;p&gt;By default, SSH authenticates users via a password.  Passwords are transmitted in a secure manner, but can be prone to brute force guessing attacks.&lt;/p&gt;
&lt;p&gt;One way to secure the ssh interface is to limit the devices allowed to access your server.  This can be done at different places - on your network firewall, in the OS firewall, or in the ssh process.   SSH uses TCP port 22, so blocking that at the firewall is one way to mitigate against maliciousness.  Since this article is about using SSH, we&amp;rsquo;ll focus on the latter.  Go into sshd_config and add a line for AllowUsers.  The example below allows anyone to login from the 192.168.1.0/24 network. Remember to restart the ssh service after changing sshd_config: &lt;strong&gt;sudo systemctl restart ssh&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/sshd_config  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allowUsers &lt;span style=&#34;color:#ae81ff&#34;&gt;\*&lt;/span&gt;@192.168.1.*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Blocking source addresses only works up to a point.  Bad actors from within can still attack, and outside actors can use another host as a jump server (SSH to there, then start a new SSH session from the inside box).  Picking a good password helps make brute-force attacks take longer, but we need to prevent opportunities to work through every combination of letters.  Fail2ban is a service that blocks IP addresses that exhibit suspicious behavior.  Install it using &lt;strong&gt;sudo apt install fail2ban&lt;/strong&gt;.  Below is a script that will setup fail2ban to block IPs that fail three consecutive login attempts.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo setup fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable fail2ban
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/[sshd]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;enabled = true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;port = 22
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;filter = sshd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;logpath = /var/log/auth.log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;maxretry = 3&amp;#34;&lt;/span&gt; &amp;gt;  /etc/fail2ban/jail.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;authentication-with-keys&#34;&gt;Authentication with keys&lt;/h2&gt;
&lt;p&gt;Another way to login is using keys.  A key pair - public and private - can be generated on a client and authenticates the client to the server.  Since the keys are stored in the &lt;em&gt;user&lt;/em&gt; account, they also in theory are associated with identity.  There are two advantages of using keys.  First, it can eliminate remembering and typing a knuckle-busting password and supports automation.  Second, keys are more secure than passwords &lt;em&gt;on the assumption that the key file is secure&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To use public-key authentication, you first need to generate a key pair using the command &lt;strong&gt;ssh-keygen&lt;/strong&gt;.  You can optionally enter a passphrase to use to unlock the key.  By default, the public key is saved as &lt;em&gt;~/.ssh/id_rsa&lt;/em&gt; and the private key as &lt;em&gt;~/.ssh/id_rsa.pub&lt;/em&gt;.  This process is shown below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@inspiron:~$ ssh-keygen
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generating public/private rsa key pair.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter file in which to save the key &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;/home/brent/.ssh/id_rsa&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter passphrase &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;empty &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; no passphrase&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter same passphrase again:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your identification has been saved in /home/brent/.ssh/id_rsa  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your public key has been saved in /home/brent/.ssh/id_rsa.pub  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The key fingerprint is:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SHA256:A5RBWIxVGMCAQbzAfenno9hlwQAeafZgnCPJCylrnz8 brent@inspiron  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The key&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;s randomart image is:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+---&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;RSA 3072&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;----+  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|*&lt;span style=&#34;color:#f92672&#34;&gt;====&lt;/span&gt;OO*.        |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|**.@&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;+          |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|+.B.* +          |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|.+   o &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;         |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|. . . o S        |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   o   &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; .       |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    + + .        |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   . G           |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      .          |  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+----&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;SHA256&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;-----+  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@inspiron:~$   
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I don&amp;rsquo;t want to publish my keys to the world, so I just re-ran &lt;strong&gt;ssh-keygen&lt;/strong&gt; and accepted the prompt to overwrite the old set.&lt;/p&gt;
&lt;p&gt;Once a key pair is generated, the public key needs to be copied to the host that you want to login to.  To do this, you need password access to the host and this process doesn&amp;rsquo;t disable password access.  Unless you opt to turn that off, you still need to secure the password access using ACLs and fail2ban as previously discussed.  That said, ssh includes a utility to push your public key to a target device - &lt;strong&gt;ssh-copy-id&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@MintyTwenty:~$ ssh-copy-id brent@192.168.1.1   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;s&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, to filter out any that are already installed  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/bin/ssh-copy-id: INFO: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; key&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;s&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; remain to be installed -- &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; you are prompted now it is to install the new keys  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@192.168.1.1&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;s password:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Number of key&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;s&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; added: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now try logging into the machine, with:   &amp;ldquo;ssh &amp;lsquo;&lt;a href=&#34;mailto:brent@192.168.1.1&#34;&gt;brent@192.168.1.1&lt;/a&gt;&amp;rsquo;&amp;rdquo;  and check to make sure that only the key(s) you wanted were added.&lt;/p&gt;
&lt;p&gt;Now I should be able to just type &lt;strong&gt;ssh brent@192.168.1.1&lt;/strong&gt; and be attached to the server without a password prompt!  Easier administration and easier to script.&lt;/p&gt;
&lt;h2 id=&#34;authentication-with-totp&#34;&gt;Authentication with TOTP&lt;/h2&gt;
&lt;p&gt;TOTP is for the &lt;em&gt;really&lt;/em&gt; paranoid and for those uber-geeks that want to impress their friends.  Digital Ocean has a really nice write up on this, and that was my primary source for learning.  I&amp;rsquo;ve referenced it in the notes.  Their procedure is written for Ubuntu 16.04 but I&amp;rsquo;ve personally used it up through 20.04 without a problem.&lt;/p&gt;
&lt;p&gt;Ideally authentication involves something you &lt;em&gt;know&lt;/em&gt; and something you &lt;em&gt;have&lt;/em&gt;.  Time-based One Time Passwords are six-digit codes that change periodically.  Hopefully, you already use this to secure critical online resources like your email.  TOTP utilities generate a 3D barcode that can be read by the camera on a phone, and use that to set a unique nugget that can be combined with the time to give random number strings.  Google authenticator is the &amp;ldquo;go-to&amp;rdquo; app on the phone for entering and holding these authenticators.  I use &lt;em&gt;Enpass&lt;/em&gt;, which does a similarly good job.&lt;/p&gt;
&lt;p&gt;Before you begin, you&amp;rsquo;ll need the authenticator app loaded on your phone and you&amp;rsquo;ll need to be physically in front of the server.  On the server, install the authenticator module and initiate the settings.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install libpam-google-authenticator  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;google-authenticator -t -d -f -r &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; -R &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt; -W   &lt;span style=&#34;color:#75715e&#34;&gt;# NOTE: using cmd w/o flags will walk you through prompts  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;strong&gt;google-authenticator&lt;/strong&gt; command will show you a 3D barcode and your first code.  Scan that in on your phone and verify the code.  The output will also include five &amp;ldquo;emergency scratch codes&amp;rdquo;.  These would be used if you lose your phone.  Write them down somewhere for emergencies before continuing.&lt;/p&gt;
&lt;p&gt;Next, add a line to &lt;em&gt;/etc/pam.d/sshd&lt;/em&gt; for authentication and edit a line in &lt;em&gt;sshd_config&lt;/em&gt; for Challenges.  Restart the service and you&amp;rsquo;ll be ready to test.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/pam.d/sshd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#_add this line, then close the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;auth required pam_google_authenticator.so nullok
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/.ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#_find and change this line, then close the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ChallengeResponseAuthentication yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#_restart sshd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl restart sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point, try connecting to this server using ssh.  It should &lt;em&gt;either&lt;/em&gt; use a key or prompt you for your password and then for the current TOTP code.  If you want it to require TOTP when using a key, you&amp;rsquo;ll need to edit sshd_config and restart the process again.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/.ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#_add this line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AuthenticationMethods publickey,password publickey,keyboard-interactive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;recommendations&#34;&gt;Recommendations&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve presented a lot of ideas here, so I want to conclude by giving you my recommendations for personal machines.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install SSH server by default&lt;/li&gt;
&lt;li&gt;Use a banner in .bashrc to make clear which device you are currently logged into&lt;/li&gt;
&lt;li&gt;Limit SSH to local IPs unless there&amp;rsquo;s a specific requirement otherwise.  If you can&amp;rsquo;t limit by IP, use TOTP.&lt;/li&gt;
&lt;li&gt;Use fail2ban&lt;/li&gt;
&lt;li&gt;Use keys.  Don&amp;rsquo;t try to use the same keys on all devices, just generate new ones every time you re-install or get a new PC.  At least for me, this cuts down on the risk of keys falling into outside hands.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Using SSH - Part 1 (Basics and Banners)</title>
      <link>https://nextpertise.net/200811_using_ssh1/</link>
      <pubDate>Tue, 11 Aug 2020 12:36:12 -0400</pubDate>
      
      <guid>https://nextpertise.net/200811_using_ssh1/</guid>
      <description>&lt;p&gt;SSH is a pretty well known protocol that&amp;rsquo;s used for a lot of different things.  Most of us are familiar with the basics and a trick or two.  This article is to try to consolidate a lot of the uses I have for SSH and share them.  The article is a quick review of basic terminal access and banners.  This is the first in a series, so more advanced topics are covered in succeeding posts.&lt;/p&gt;
&lt;h2 id=&#34;the-basics&#34;&gt;The Basics&lt;/h2&gt;
&lt;p&gt;SSH is included in modern operating systems.  Apparently it can now also be installed on Windows (I&amp;rsquo;ve included a link).  If you use Windows, the standard client suggested is PuTTY (I really like Solar-PuTTY as well). I have not used Windows as a client or server in my testing, so hopefully my comments will be helpful but I suspect server setup is going to be different.&lt;/p&gt;
&lt;p&gt;My walk through assumes you are using a command-line client.  Note that the ssh &lt;em&gt;client&lt;/em&gt; is typically installed in the *nix world.  If you want your box to be the server then you&amp;rsquo;ll need to add it via &lt;strong&gt;sudo apt install openssh-server&lt;/strong&gt; (Debian/Ubuntu).&lt;/p&gt;
&lt;p&gt;Most of us encounter SSH as a secure replacement for telnet.  SSH allows us to connect to a remote terminal from the command line.  Assuming that I wanted to connect to my firewall by it&amp;rsquo;s IP address and that there was an account named &amp;ldquo;brent&amp;rdquo; there, I can connect using _&lt;em&gt;ssh &lt;em&gt;username&lt;/em&gt;@&lt;em&gt;Destination&lt;/em&gt;&lt;/em&gt;.  If this is the first time you&amp;rsquo;ve connected, you&amp;rsquo;ll be asked to confirm the fingerprint.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@MintyTwenty:~$ ssh brent@192.168.24.230  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The authenticity of host &amp;#39;192.168.24.230 (192.168.24.230)&amp;#39; can&amp;#39;t be established.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ECDSA key fingerprint is SHA256:1XYZ12MBd5Sb345ABOBhoKx42D+STU56szGR/d3LkGs.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Are you sure you want to continue connecting (yes/no/[fingerprint])? yes  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Warning: Permanently added &amp;#39;192.168.24.230&amp;#39; (ECDSA) to the list of known hosts.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@192.168.24.230&amp;#39;s password:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@inspiron:~$  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The fingerprint is to protect against a man-in-the-middle attack, where your traffic is being re-directed to a malicious third party.  Before you type in (and reveal) your password, best to make sure that this is a trusted server!  So, where do we find the fingerprint to match it to?  The easiest way to get it is to go to your server and use ssh to connect to itself: &lt;strong&gt;ssh &lt;em&gt;username&lt;/em&gt;@127.0.0.1&lt;/strong&gt;.  This will show the local fingerprint.  If someone has already used this trick and accepted the fingerprint, you can delete ~/.ssh/knownhosts (&lt;em&gt;not recommended&lt;/em&gt;) or use ssh-keygen to examine the local public key.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brent@MintyTwenty:~$ __ssh-keygen -lf .ssh/id_rsa.pub  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4096 SHA256:cjyCsHXYZ12dESNo+12AB/oGGaxY1JHSTU%1p3Aeouw brent@X (RSA)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;banners&#34;&gt;Banners&lt;/h2&gt;
&lt;p&gt;SSH banners are specified in the ssh daemon configuration (&lt;em&gt;/etc/sshd_config&lt;/em&gt;),  To specify a banner, find the line reads &amp;ldquo;#banner none&amp;rdquo; and edit it to specify a file.  The contents of this file will be displayed &lt;em&gt;before&lt;/em&gt; the password prompt.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/sshd_config  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;banner /etc/banner.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/neofetch.png#floatsmallright&#34; alt=&#34;neofetch&#34;&gt;&lt;/p&gt;
&lt;p&gt;After authentication the prompt displays the server hostname.  You can display a banner &lt;em&gt;after&lt;/em&gt; authentication by editing &lt;em&gt;~/.bashrc&lt;/em&gt;.  This has a side benefit - the terminal, when connected to locally or remotely, processes &lt;em&gt;~/.bashrc&lt;/em&gt; before it produces a prompt.  Go to the end of that file and add whatever you like - that output will be displayed before a prompt is produced.  I&amp;rsquo;ve listed some cool ideas to build a dynamic banner below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;neofetech&lt;/strong&gt; is a popular script that summarizes system information.  There&amp;rsquo;s a ppa available to add this from apt.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo add-apt-repository ppa:dawidd0811/neofetch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install neofetch  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;neofetch&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /home/brent/.bashrc  &lt;span style=&#34;color:#75715e&#34;&gt;# Add the command to the end of .bashrc  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/figlet.png#floatright&#34; alt=&#34;figlet&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Figlet&lt;/strong&gt; - draws letters in ASCII for a nice banner and any command can be piped through it (echo &amp;ldquo;for example&amp;rdquo; | figlet).  It&amp;rsquo;s available in the standard Ubuntu repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Curl&lt;/strong&gt; - pull in data from the web.  Try &lt;strong&gt;curl v2.wttr.in/Hickory+NC&lt;/strong&gt;.  A more practical example might be:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl wttr.in/Hickory+NC?format&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# check out the github page for lots more options&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server stats&lt;/strong&gt; - display information about the server such as IP (&lt;strong&gt;hostname -I)&lt;/strong&gt; or temperature (&lt;strong&gt;sensors&lt;/strong&gt;).  This snippet will display just the main temperature.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;sensors | grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id 0:&amp;#34;&lt;/span&gt; | cut -c16-23&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;#sensors displays a lot of data.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#75715e&#34;&gt;# Grep just grabs the one line, and cut pulls temp out.  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CPU Temp:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;data&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Part two of this series will cover secure authentication options.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reasonably Secure Browsing</title>
      <link>https://nextpertise.net/200805_reasonablysecurebrowsing/</link>
      <pubDate>Wed, 05 Aug 2020 11:23:41 -0400</pubDate>
      
      <guid>https://nextpertise.net/200805_reasonablysecurebrowsing/</guid>
      <description>&lt;p&gt;Most of my articles are aimed at helping me remember how I did something &lt;em&gt;cool&lt;/em&gt; years later, and helping other people who share my interest and want to solve similar problems.  This one is a little different.  When I speak to non-technical folks - at church, other parents, or within my family - I&amp;rsquo;m disappointed with the lack of understanding about computer security.  I was going to say &amp;ldquo;surprised&amp;rdquo;, but sadly I&amp;rsquo;m not.  This article tries to fix that by introducing this audience to concepts in Secure Browsing.&lt;/p&gt;
&lt;p&gt;I get that we can&amp;rsquo;t all be aware of &lt;strong&gt;everything&lt;/strong&gt;.  For instance, I&amp;rsquo;m not really interested in cars.  Still, if you are participating in an area (driving a car or browsing the web), then there&amp;rsquo;s a basic level of awareness that is needed and that you should aim for.  So this post is written for the non-technical in order to provide that grounding.  I&amp;rsquo;ll try to keep this up to date (pay attention to the posting date!) and I&amp;rsquo;ll start pointing people who ask those questions to this resource.
&lt;img src=&#34;https://upload.wikimedia.org/wikipedia/en/0/09/Timmcgee.jpg#floatleft&#34; alt=&#34;Tim McGee from NCIS&#34;&gt;
I need to define &amp;ldquo;reasonable&amp;rdquo; before I get started.  Internet paranoia comes in three flavors - fear of malicious actors, fear of giant companies assembling dossiers to feed into marketing, and Orwellian fears about nation-states.  All three are reasonable things to be concerned about but this post only addresses the first.  Hiding from the NSA is beyond the ability of most people - even if they unplug.  Hiding from creepy companies is possible, but requires foregoing a lot of services that most of us are loathe to do without.  However, there are small steps that you can take that will give you a good degree of protection against maliciousness.  Reasonable means simple steps picking up bad code or leaking sensitive personal information.&lt;/p&gt;
&lt;p&gt;Finally, what makes me think I&amp;rsquo;m an expert?  Well, I have a Master&amp;rsquo;s in Information Security and I&amp;rsquo;ve worked in IT operations and security for many, many years.  I&amp;rsquo;m no Tim McGee, but I get by.&lt;/p&gt;
&lt;h2 id=&#34;general-safe-browsing-advice&#34;&gt;General safe-browsing advice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;If possible, run Linux&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Setup your home to use OpenDNS or CloudFlare Family DNS servers&lt;/li&gt;
&lt;li&gt;Check for browser updates regularly, and apply them.  Keep plugins up to date as well.&lt;/li&gt;
&lt;li&gt;Use Anti-Virus.&lt;/li&gt;
&lt;li&gt;Don’t &lt;strong&gt;ever&lt;/strong&gt; click on links in email.&lt;/li&gt;
&lt;li&gt;Use a secure password, and don’t re-use passwords between sites.&lt;/li&gt;
&lt;li&gt;Do not save passwords within the browser. Use a password safe and subscribe to &lt;strong&gt;Have I been Pwned?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use SSL – Sites that use “HTTPS:” instead of “HTTP” are encrypting your traffic.&lt;/li&gt;
&lt;li&gt;Have a solution to monitor your bank accounts and credit reports.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;general-browser-checklist&#34;&gt;General Browser checklist&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Do not save passwords in the browser.  Use a password safe.&lt;/li&gt;
&lt;li&gt;Do not use autofill.  Sites use hidden fields to send more than you think.&lt;/li&gt;
&lt;li&gt;Have the browser ask you where to save files.  This alerts you to files being downloaded and allows you to cancel or put them in a folder for latter consideration.&lt;/li&gt;
&lt;li&gt;Enable click-to-play for plugins.  This will speed up the browser and allow you to decide when to use useful but potentially dangerous plugins like JavaScript, Flash, and Silverlight.&lt;/li&gt;
&lt;li&gt;Do not accept third-party cookies except by exception.  Clear all cookies after each session.&lt;/li&gt;
&lt;li&gt;Use Do Not Track.  This is more aimed at commercial privacy, and depends on the server honoring the request, but why not?&lt;/li&gt;
&lt;li&gt;Be cautious using extensions, however there are a few that are suggested:
&lt;ul&gt;
&lt;li&gt;AdBlock Plus&lt;/li&gt;
&lt;li&gt;HTTPS Everywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Refer to the following sections for specific help with your browser.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;chromehttpswwwmozillaorgmediaprotocolimglogosfirefoxbrowserlogo-lg-high-resfbc7ffbb50fdpngfloatright-chrome&#34;&gt;&lt;img src=&#34;https://www.mozilla.org/media/protocol/img/logos/firefox/browser/logo-lg-high-res.fbc7ffbb50fd.png#floatright&#34; alt=&#34;Chrome&#34;&gt; Chrome&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Settings are found under the “stacked dots” icon on the right.&lt;/li&gt;
&lt;li&gt;Under “set up sync”
&lt;ul&gt;
&lt;li&gt;Choose “encrypt all synced data with your sync password”.&lt;/li&gt;
&lt;li&gt;Uncheck Autofill and Passwords.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Select advanced options&lt;/li&gt;
&lt;li&gt;Under Privacy, check “protect you and your device from dangerous sites” and “send Do Not Track”.&lt;/li&gt;
&lt;li&gt;Under Passwords and Forms, uncheck both options (do not autofill or remember passwords).&lt;/li&gt;
&lt;li&gt;Under Downloads, check “Ask where to save each file before downloading”.&lt;/li&gt;
&lt;li&gt;Under Plugins, select “Let me choose when to run plugin content”.&lt;/li&gt;
&lt;li&gt;Under Cookies, block third-party cookies.&lt;/li&gt;
&lt;li&gt;Add recommended Extensions and remove un-needed ones.
&lt;ul&gt;
&lt;li&gt;AdBlock Plus&lt;/li&gt;
&lt;li&gt;HTTPS Everywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;firefoxhttpsp1hiclipartcompreview4981015635mozilla-sleek-icons-firefox-256x256-mozilla-firefox-logo-png-clipartjpgfloatright-firefox&#34;&gt;&lt;img src=&#34;https://p1.hiclipart.com/preview/498/1015/635/mozilla-sleek-icons-firefox-256x256-mozilla-firefox-logo-png-clipart.jpg#floatright&#34; alt=&#34;Firefox&#34;&gt; Firefox&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Options are found under the “hamburger” icon on the right.  In the drop down menu, select preferences.&lt;/li&gt;
&lt;li&gt;Go to &lt;em&gt;Files and Applications&lt;/em&gt; and select “Always ask me where to save files.”&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Network Settings&lt;/em&gt; select the settings button.  Choose &lt;strong&gt;enable DNS over HTTPS&lt;/strong&gt; and set it to Cloudflare.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Privacy &amp;amp; Security&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Select the Standard Tracking Protection option and “Always apply Do Not Track”&lt;/li&gt;
&lt;li&gt;Set third-party cookies to delete when Firefox is closed.&lt;/li&gt;
&lt;li&gt;Under Logins and Passwods, disable &amp;ldquo;ask to save&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Under Forms and Autofill, disable Autofill&lt;/li&gt;
&lt;li&gt;Under Permissions, check &amp;ldquo;Warn me when sites try to install an add-on&amp;rdquo; and &amp;ldquo;Block pop-up windows&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Disable Firefox data collection.&lt;/li&gt;
&lt;li&gt;Under Security, choose to Block dangerous and deceptive content, block dangerous downloads, and warn about unwanted software.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Back to the hamburger menu and select &lt;em&gt;Add Ons&lt;/em&gt;.  Remove any extensions you don&amp;rsquo;t need and add these two.
&lt;ul&gt;
&lt;li&gt;AdBlock Plus&lt;/li&gt;
&lt;li&gt;HTTPS Everywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;internet-explorer&#34;&gt;Internet Explorer&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Don’t use Internet Explorer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;other-browsers---&#34;&gt;Other browsers . . .&lt;/h2&gt;
&lt;p&gt;There are some other browsers that are marketed as &amp;ldquo;secure&amp;rdquo;.  Examples include Avast, AVG, and Comodo.  My experience is that these are just custom versions of Chrome.  It&amp;rsquo;s difficult to keep up with all the customizations these different groups make, but generally I find that they are based on an older version of Chromium and aren&amp;rsquo;t always transparent about what changes they are making.  They tend to be updated less often and sometimes behave in unexpected ways because of the changes.  I do not recommend these today, but I&amp;rsquo;m open to the idea.&lt;/p&gt;
&lt;p&gt;Another set of browsers attempt to compete more directly with Firefox and Chrome.  These include names like Brave and Opera.  I have a good opinion of both these options, but they are more common with power users and not really in scope of this guide.  Safari is used on Macs and is quite good.  I&amp;rsquo;ll try to add it in at a later date.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Linux Home Cloud Backup</title>
      <link>https://nextpertise.net/200804_homebackup/</link>
      <pubDate>Tue, 04 Aug 2020 09:12:52 -0400</pubDate>
      
      <guid>https://nextpertise.net/200804_homebackup/</guid>
      <description>&lt;p&gt;At one point, I was taught to divide tasks by priority A, B, C.  As I&amp;rsquo;ve gotten older, I&amp;rsquo;ve converted that scale into &amp;ldquo;things that will immediately get me fired or divorced&amp;rdquo;, &amp;ldquo;things that will eventually get me fired or divorced&amp;rdquo;, and &amp;ldquo;things I&amp;rsquo;d like to do if I have time&amp;rdquo;.  One of the &amp;ldquo;A&amp;rdquo; tasks on this scale is making sure that we don&amp;rsquo;t lose our family digital pictures!&lt;/p&gt;
&lt;p&gt;Our home file server is an Ubuntu VM.  Over the years, I&amp;rsquo;ve used a variety of strategies to maintain personal backups.  Recently, I felt the time was right to move to cloud based backup - both for the convenience and the security of having things off-site.  I considered AWS S3, but Backblaze offers a similar and less-expensive service.  A former employer used Backblaze for laptop backups and I administered that system, and I always felt they did a good job and were reasonable to work with.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/BB_bucket_setup.png#floatright&#34; alt=&#34;Backblaze Dashboard&#34;&gt;  I settled on using Duplicati for the backkup software.  Duplicati runs on everything (Linux + various less secure OS), has a DEB, and is FOSS.  Duplicati has built in support for cloud backup, including Backblaze and S3.  I have a friend that uses Duplicati and it&amp;rsquo;s discussed on Jupiter Broadcasting, so I wanted to give it a try.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with Backblaze.  I setup an account and configured it for 2FA.  Then I created an ID and application key at the Backblaze dashboard and setup a bucket.  You can specify the bucket policy, and I recommend keeping older copies to protect against crypto-locking malware.  I setup my bucket to retain older copies for 180 days.&lt;/p&gt;
&lt;p&gt;Setting up Duplicati is as easy as installing the DEB and enabling the app to autostart.  My server runs Mate, so I opened the Control Center (alt&amp;ndash;f2, &amp;ldquo;mate-control-center&amp;rdquo;) and added Duplicati to the autoruns (at the bottom of the control center window).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Mate-autorun-Duplicati.png#floatleft&#34; alt=&#34;Mate Autorun&#34;&gt; Once running, Duplicati shows a menu-bar applet. The application is administered from a web page on port 8200.  This webpage can be accessible from other machines and I usually manage the backups from my desktop.  Duplicati has excellent documentation on their website, but I was able to get it up and running quickly without investing a lot of time.&lt;/p&gt;
&lt;p&gt;From the initial Duplicati page choose &amp;ldquo;Add backup&amp;rdquo; and a wizard will walk you through specifying the details.  Make sure you keep track of the passphrase used by the backup!  Here&amp;rsquo;s a quick rundown on the selections I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General - AES-256 Encryption.  Other options are no encryption and GNU Privacy Guard.  I don&amp;rsquo;t protect nuclear secrets, but I get itchy not encrypting data at rest, so I definitely don&amp;rsquo;t recommend that option.  I don&amp;rsquo;t know much about GNU PG, but AES-256 is considered a solid and well researched encryption so I used it.&lt;/li&gt;
&lt;li&gt;Backup destination - this is where you&amp;rsquo;ll plug in the ID and Key you generated at Backblaze earlier.&lt;/li&gt;
&lt;li&gt;Source data - gives you a file tree to select what you&amp;rsquo;d like to backup.  I&amp;rsquo;m cheap, so I separated out the non-private stuff into another directory (like installation ISOs) so I didn&amp;rsquo;t pay to back them up.&lt;/li&gt;
&lt;li&gt;Schedule - We&amp;rsquo;ll get into a discussion of RTO and RPO another time perhaps.  Basically, think about your cost to transfer files (with Backblaze, there is no incremental cost) and how much data you are willing to lose between backups.  I setup my schedule to run every night - with Backblaze there&amp;rsquo;s not really a reason &lt;em&gt;not to&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Options - Duplicati allows you to set the remote volume size.  I kept this at the recommended 50Mb.  Basically, it chunks your data so that it&amp;rsquo;s easier to restore and so that an adversary can&amp;rsquo;t identify individual file sizes, which could be a way that you&amp;rsquo;d leak information.  I also chose to keep all backups, again to protect against crypto-lockers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Duplicati_Wiz.png#floatright&#34; alt=&#34;Duplicati Wizard&#34;&gt; After all that, just let it run!  My biggest knock on the combination of Duplicati and Backblaze is that there&amp;rsquo;s not an easy way to confirm backups are happening.  Backblaze has a 10 day trial and I didn&amp;rsquo;t initially put in a credit card.  To be clear, kudos to them for letting you try it and being easy to work with.  But . . . I forgot and the trial ran out and my backups stopped for several days.  Worse, I was clueless.&lt;/p&gt;
&lt;p&gt;Duplicati has options to setup a confirmation email after backups, which I recommend.  You&amp;rsquo;ll know there&amp;rsquo;s a problem when you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; get an email.  Unless you are more clever than me, that&amp;rsquo;s suboptimal but it is something.  Backblaze doesn&amp;rsquo;t have an alerting option for things that don&amp;rsquo;t happen.  I&amp;rsquo;m thinking that I could setup a Lambda to check via API, then send an SNS, but that&amp;rsquo;s for another day.&lt;/p&gt;
&lt;p&gt;Overall, I&amp;rsquo;m please with the setup and the results I&amp;rsquo;m getting and would recommend either component to someone trying to solve a similar home problem.  I don&amp;rsquo;t see a reason this wouldn&amp;rsquo;t be good for a work environment, but I&amp;rsquo;ll need to use it for a while before I feel comfortable making that a recommendation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fun with Postscript</title>
      <link>https://nextpertise.net/200803_funwithpostscript/</link>
      <pubDate>Mon, 03 Aug 2020 16:59:30 -0400</pubDate>
      
      <guid>https://nextpertise.net/200803_funwithpostscript/</guid>
      <description>&lt;p&gt;I really enjoy being a computer professional.  I like the  creativity, problem solving, and the sense that things can be understood.  Sometimes this is directly applicable, sometimes it&amp;rsquo;s just &lt;em&gt;fun&lt;/em&gt;.  One example of the latter is Postscript.&lt;/p&gt;
&lt;p&gt;Most of you know Postscript only as a printer thing, but it&amp;rsquo;s actually a programming language.  Postscript builds a mathematical model of a page and then converts that to a bitmap for printing as a final step.  Postscript files always print at the best resolution available on the output device without having to be reformatted.&lt;/p&gt;
&lt;p&gt;Postscript uses a single stack and then pops off the required number of values to execute a command.  For instance, you might give it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1 2 add&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In college, I &amp;ldquo;discovered&amp;rdquo; postscript by printing a file for an Apple LaserWriter to an HP Laserjet. Since the Laserjet didn&amp;rsquo;t speak Postscript (they use PCL) it just dumped raw text onto a stack of paper. I was fascinated because I could kinda read it, so I researched it and bought three books and just started playing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Postscript Language: Tutorial and Cookbook by Adobe
Graphic Design with Postscript by Gerard Kunkel
Postscript by Example by Henry McGilton and Mary Campione&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At first, I wrote text files and dumped them to the LaserWriter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;copy myfile.ps &amp;gt; lpt1:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Later I started using early ghostscript to output to my dot matrix printer. I recently rediscoverd some of my files from the 1980&amp;rsquo;s and found that I could display them in Linux with modern Ghostscript.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a simple Postscript program I took from the Postscript Cookbook:
&lt;img src=&#34;https://nextpertise.net/CircleofBrent.png#floatright&#34; alt=&#34;Circle of Brent&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/Helvetica-Bold findfont  
        30 scalefont setfont  
        /oshow  %stack: {string}  
        {true charpath stroke} def  
    /circleofBrent  
        { 20 20 340  
            { gsave  
                rotate 0 0 moveto  
                (Brent) oshow  
                grestore  
            } for  
        } def  
    % --Begin Program --  
    250 400 translate  
    .5 setlinewidth  
    circleofBrent  
    0 0 moveto  
    (Brent Stewart) true charpath  
    gsave 1 setgray fill grestore  
    stroke  
    showpage  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without a lot of explanation, you get the sense of how postscript works.  There&amp;rsquo;s a routine to print my name and rotate the coordinate system in increments of 20 degrees.  That routine is looped through and then the final full name is printed at the end.  Instead of printing this page, in Linux I just typed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gs CircleofBrent.ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and the page is rendered in a window.  I discovered that you GIMP can directly load postscript files (!) and used that to create the logo and favicon for this site.  You can print the file to a postscript printer using lpr.  MFC9340CDW is a brother printer I use, and I opened system-config-printer to confirm the name.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lpr -P MFC9340CDW rays.ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ve built a repo with some examples.  I actually found some of my code from 30 years ago! PostScript is a simple enough language to quickly accomplish things with, but complicated enough to get some interesting results.  In fact, you can do things in the language that I&amp;rsquo;ve never seen translated to an app.  I hope this post will encourage you to give it a try and have some fun!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS S3 Review</title>
      <link>https://nextpertise.net/200728_s3review/</link>
      <pubDate>Tue, 28 Jul 2020 15:44:02 -0400</pubDate>
      
      <guid>https://nextpertise.net/200728_s3review/</guid>
      <description>&lt;p&gt;In a previous post, I described hosting this website on Render.  I mentioned that I am coming up to speed on AWS and it was my intention to host the site on S3 as well.  This post documents my experience.&lt;/p&gt;
&lt;h2 id=&#34;hugo&#34;&gt;Hugo&lt;/h2&gt;
&lt;p&gt;Render has a CI-step that builds the html from Hugo auto-magically.  AWS isn’t integrated with Github, so I needed to build the website.  This is pretty easy, just navigate to the directory and type “hugo”.  This produces a “public” directory that needs to be copied to your webserver.&lt;/p&gt;
&lt;p&gt;AWS allows you to specify an error page.  In Hugo, I setup a &lt;em&gt;404.html&lt;/em&gt; page under &lt;em&gt;theme/layouts&lt;/em&gt; and used the S3 Properties page to specify that URL for the error page.&lt;/p&gt;
&lt;h2 id=&#34;aws&#34;&gt;AWS&lt;/h2&gt;
&lt;p&gt;The short version of hosting a site on S3 is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an S3 bucket&lt;/li&gt;
&lt;li&gt;The bucket needs to be public, so set &amp;ldquo;Block all public access&amp;rdquo; to OFF.&lt;/li&gt;
&lt;li&gt;Navigate to S3, select the bucket and go to the Properties tab.  Under &amp;ldquo;Static Website Hosting&amp;rdquo; select &amp;ldquo;Use this bucket to host a website&amp;rdquo;.  You can also grab the URL from this screen.  This will look something like  &lt;a href=&#34;http://mybucket.s3-website-us-east-1.amazonaws.com&#34;&gt;http://mybucket.s3-website-us-east-1.amazonaws.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In your DNS, setup a CNAME for www to the bucket URL.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The above is pretty well documented at various places and it&amp;rsquo;s pretty easy.  So obviously, that&amp;rsquo;s not the way I did it.&lt;/p&gt;
&lt;p&gt;AWS has a feature called Cloud Formation that let&amp;rsquo;s you specify an environment in JSON or YAML.  This approach is called &lt;em&gt;Infrastructure as Code&lt;/em&gt;.  There are a lot of scenarios where IaC is useful.  It reduces the time and cost of setting up an environment, which could be useful if you wanted to quickly setup a dev environment or duplicate an environment for some other purpose.  This approach reduces errors because you can troubleshoot the setup script when you build it and then iteratively improve it.  It also allows for the environment to be specified and reviewed by security specialists, improving communication between operations and security and reducing risks.&lt;/p&gt;
&lt;p&gt;Cloud Formation is free to use.  I built a JSON &lt;a href=&#34;https://nextpertise.net/CloudFormation-Setup_Public_S3.json&#34;&gt;file&lt;/a&gt; that creates an S3 bucket, marks the bucket public, and then applies a security policy.  My template also outputs the URL back to you when it completes.  The Amazon online user guide has a lot of examples I used to understand the process, plus there is a template designer that let&amp;rsquo;s you draw out your target environment a la Visio and builds the JSON for you.  I didn&amp;rsquo;t use the designer to draw, but I pasted the file I developed into the designer and it was a good way to &amp;ldquo;debug&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Doing initial development of a Cloud Formation template meant running the process several times and fixing issues.  For me, most of these were formatting.  This took a little over an hour to iron out.  When everything was ready, I instantiated my S3 web bucket and I just needed to copy my Hugo public folder into the bucket.&lt;/p&gt;
&lt;p&gt;AWS has a &amp;ldquo;free tier&amp;rdquo; that&amp;rsquo;s offered during your first 12 months.  Five gigs of S3 space is included in this tier, so the initial cost isn&amp;rsquo;t bad and S3 isn&amp;rsquo;t expensive after that.  Whether you my example to use Cloud Formation or not, this is a cheap and effective way to get a static website setup.  Amazon provides a very durable and scalable environment, there&amp;rsquo;s a ton of tools available, and it&amp;rsquo;s easy to imagine growing from this initial setup to a dynamic site using K8s.&lt;/p&gt;
&lt;p&gt;That said, updating the html feels a little clunky after using Render and it&amp;rsquo;s integration with Github.  I&amp;rsquo;m going to leave the S3 version up for a while and try some improvements.  I&amp;rsquo;d like to build a command line script to run the Cloud Formation process, run Hugo to compile the site, and then transfer files.  That seems doable and it would make this a lot easier to maintain.  AWS also has a CodeCommit repository that looks like Github from a distance.  It would be interesting to explore using CodeCommit for the site as well.&lt;/p&gt;
&lt;p&gt;For now, I&amp;rsquo;m very pleased with the Render workflow and I&amp;rsquo;ve decided to leave the &amp;ldquo;official&amp;rdquo; copy of the site there.&lt;/p&gt;
&lt;p&gt;As always, I&amp;rsquo;m interested in your experiences and suggestions!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Render</title>
      <link>https://nextpertise.net/200724_render/</link>
      <pubDate>Fri, 24 Jul 2020 08:21:27 -0400</pubDate>
      
      <guid>https://nextpertise.net/200724_render/</guid>
      <description>&lt;h3 id=&#34;tldr-you-should-take-a-look-at-rendercom&#34;&gt;TLDR: you should take a look at Render.com&lt;/h3&gt;
&lt;p&gt;I wrote in a previous post that I decided to build my site using Hugo, a decision I&amp;rsquo;m still really tickled with.  My initial draw to a Static Site Generator was to host my site in S3.  There&amp;rsquo;s a lot of attraction there - creating a public S3 bucket is easy, it&amp;rsquo;s low-cost, there&amp;rsquo;s no server to maintain, and the data is replicated within region between Availability Zones.  From a security perspective, S3 is easy to secure and the bucket is isolated.&lt;/p&gt;
&lt;p&gt;I have experience with the major cloud providers and my high-level opinion is that AWS is the most mature, has the most complete set of products, and is the easiest to deal with.  Plus, I&amp;rsquo;m working my way through the AWS certs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/render.png#floatright&#34; alt=&#34;Render Logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;In coming up to speed on Hugo, I heard about a site called Render.  The salient points were that Render offered free static-site hosting and would pull your site from Git.  The Git integration was attractive - I had already decided to put the theme there and now I could just put the entire site there.  I decided to try Render.&lt;/p&gt;
&lt;p&gt;At the time of this writing, I&amp;rsquo;ve had a Render account for two days.  Signup was easy and didn&amp;rsquo;t require a credit card.  They support federation with Github, so I used that option and that may have made things easier later.&lt;/p&gt;
&lt;p&gt;Forcing me to give a card when I signup for something free always makes me feel like I&amp;rsquo;m being suckered into something.  In fact, I had an experience with Azure where I signed up for a &amp;ldquo;free&amp;rdquo; tier and ended up getting a big bill a couple months later so I have empirical reasons to be wary.&lt;/p&gt;
&lt;p&gt;I was super-impressed with the Git integration.  I went to Github and created a new &amp;ldquo;Nextpertise&amp;rdquo; project, then went to my Hugo directory and made it a repository and sync&amp;rsquo;d it to Github.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git init  
    $ git add .  
    $ git commit -m &amp;quot;Initial commit&amp;quot;  
    $ git remote add origin https://github.com/brentstewart/nextpertise.git  
    $ git push -f origin master  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hugo takes your markdown content and compiles it against templates to generate a public directory of html files that can be copied to a web server.  When you are ready to deploy, just run &amp;ldquo;hugo&amp;rdquo; with no options.  The caveat here is that Hugo doesn&amp;rsquo;t clear out old content first, and will just copy the new build on top of the old.  Best practice then is to delete the public directory before regenerating.  So before setting up Render, I generated the public directory and sync&amp;rsquo;d my repo to Github.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nextpertise.net/Render_setup.png#floatsmallright&#34; alt=&#34;Render Setup&#34;&gt;&lt;/p&gt;
&lt;p&gt;From Render, I selected New &amp;ldquo;Web Service&amp;rdquo; and selected the repository I wanted to use.  Render asked for the web content directory (the &amp;ldquo;Publish directory&amp;rdquo;)  and the build command - here&amp;rsquo;s where I realized I messed up.  I went back and removed my &lt;strong&gt;public&lt;/strong&gt; directory and resync&amp;rsquo;d to Github, then used  &lt;strong&gt;hugo&lt;/strong&gt; as my build command.&lt;/p&gt;
&lt;p&gt;By default, Render published my site to &lt;strong&gt;nextpertise.onrender.com&lt;/strong&gt;, but adding a custom domain is super-easy.  The setup screen provides instructions on setting up your DNS and tests to confirm that this step is complete.  The Nextpertise DNS is at Network Solutions, so it was easy enough to add the required records and the changes replicated overnight and were working this morning.  Render automatically assigns certs and makes the site available via https (I literally did nothing to enable this feature, it &lt;em&gt;just worked&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Render can redirect traffic to unknown pages.  I setup a rule to redirect this traffic to 404.html.  In Hugo, I created a 404.html file under &lt;em&gt;theme/layouts&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;When I finish this update, I&amp;rsquo;ll commit my local changes and push to Github.  Then I need to go to Render and click Manual Deploy.  Render will pull the changes, build the site using Hugo, and the new site will be online!  Render supports a build api hook, so I may look into using Githubs CI to trigger a Render deploy.  For now, I&amp;rsquo;m focused on getting enough content onto the site to make it interesting and cleaning up the look.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot of the pull and build.
&lt;img src=&#34;https://nextpertise.net/Render_deploy.png#floatright&#34; alt=&#34;Render build&#34;&gt;&lt;/p&gt;
&lt;p&gt;Render deployed my site to Oregon - I wasn&amp;rsquo;t given an option, but that seems reasonable for a free service.  They mention that &amp;ldquo;lightning-fast CDN&amp;rdquo; is included and accessing the site from the eastern US does seem reasonably quick.  &lt;em&gt;If one of my friends in India reads this, could you provide some feedback on what it&amp;rsquo;s like for you?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really impressed with Render and - based on two days of playing - definitely recommend you take a look.  I still intend to deploy to S3, for comparison and to get some experience with S3, so I&amp;rsquo;ll write about that in the future.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Building this site using Hugo</title>
      <link>https://nextpertise.net/200720_building_site_with_hugo/</link>
      <pubDate>Mon, 20 Jul 2020 11:38:07 -0400</pubDate>
      
      <guid>https://nextpertise.net/200720_building_site_with_hugo/</guid>
      <description>&lt;p&gt;This site was built using Hugo, which is a static site generator.  Hugo allows me to create templates and then write my content in markdown.  This makes it easy to update the site without having to fiddle with HTML.  It also makes updating the look and feel easy, because I can update the template and regenerate the site.&lt;/p&gt;
&lt;h2 id=&#34;hugohttpsd33wubrfki0l68cloudfrontnetc38c7334cc3f23585738e40334284fddcaf03d5e2e17cimageshugo-logo-widesvgfloatleft&#34;&gt;&lt;img src=&#34;https://d33wubrfki0l68.cloudfront.net/c38c7334cc3f23585738e40334284fddcaf03d5e/2e17c/images/hugo-logo-wide.svg#floatleft&#34; alt=&#34;Hugo&#34;&gt;&lt;/h2&gt;
&lt;p&gt;Hugo is found in most distributions - for Ubuntu I installed it with &amp;ldquo;apt install hugo&amp;rdquo;.  I&amp;rsquo;ve found that running the local Hugo dev server (&amp;ldquo;hugo server -D&amp;rdquo;) and working with the files in VSCodium is a super easy way to develop.&lt;/p&gt;
&lt;p&gt;Mike Dane at Giraffe Academy has done an excellent series of videos that walk through Hugo.  Rather than repeat his work, I will tell you a little about my site.&lt;/p&gt;
&lt;p&gt;Hugo supports multiple taxonomies, but for now I&amp;rsquo;ve focused on using tags.  I&amp;rsquo;ve defined some parameters in my front matter for a github link, Youtube link, and other references.  If I populate those parameters, they automatically display on the single template.  I used an HTML Grid for the list pages and set it to scale based on window width to produce a nice responsive behavior.  Hugo supports using themes and there are some great options, but I&amp;rsquo;ve chosen to build my own theme (&amp;ldquo;next&amp;rdquo;) because I wanted to understand the process.  You&amp;rsquo;re welcome to clone the theme.  Better yet, tell me what I did wrong!&lt;/p&gt;
&lt;p&gt;This website is maintained on GitHub.  If you like the theme, clone the submodule.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
