<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: J. R. Swab</title>
    <description>The latest articles on DEV Community by J. R. Swab (@jrswab).</description>
    <link>https://dev.to/jrswab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F246116%2F740dfda4-64fa-47e7-8fd9-0d5ddeaec9e9.jpg</url>
      <title>DEV Community: J. R. Swab</title>
      <link>https://dev.to/jrswab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jrswab"/>
    <language>en</language>
    <item>
      <title>How to Stop Babysitting Your AI Agents</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:50:00 +0000</pubDate>
      <link>https://dev.to/jrswab/how-to-stop-babysitting-your-ai-agents-4376</link>
      <guid>https://dev.to/jrswab/how-to-stop-babysitting-your-ai-agents-4376</guid>
      <description>&lt;p&gt;Every time I need an LLM to do something, the ritual is the same. Open a chat window. Type a prompt. Read the response. Decide if it's good enough. Repeat tomorrow. That's not automation that's a new job I didn't apply for.&lt;/p&gt;

&lt;p&gt;The frustrating part isn't the AI. The frustrating part is that I'm the scheduler, the context manager, and the output parser all at once. I'm writing the same prompt variations over and over because nothing persists. I'm watching a spinner because there's no way to fire and forget. The tool is supposed to be doing the work.&lt;/p&gt;

&lt;p&gt;So I built a 12MB binary to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unix already solved this
&lt;/h2&gt;

&lt;p&gt;You don't open a chat window to run &lt;code&gt;grep&lt;/code&gt;. You pipe input in, get output out, and chain it with something else. Small tools, one job each, composable by design.&lt;/p&gt;

&lt;p&gt;The Unix philosophy isn't clever it's right.. and it's been right for fifty years.&lt;/p&gt;

&lt;p&gt;AI agents should work the same way. One job. Clean input/output. Plugs into your existing workflows. The problem is that most AI tooling goes the opposite direction. Massive context windows, general-purpose sessions, chat interfaces bolted onto automation primitives. The chat interface made sense when we were exploring what LLMs could do.&lt;/p&gt;

&lt;p&gt;It's time to stop treating every task like an open-ended conversation.&lt;/p&gt;

&lt;p&gt;This is where Axe comes in. Axe is a CLI that runs single-purpose LLM agents defined in plain text config files. You define an agent, give it a job, and run it from wherever you'd run any other command.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it actually looks like
&lt;/h2&gt;

&lt;p&gt;Here's a PR reviewer that runs before every commit via a git hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--cached&lt;/span&gt; | axe run pr-reviewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stdin is always accepted. Output goes to stdout. That's it. No setup wizard, no subscription tier, no "connect your workspace." The git hook already exists. Axe just sits in the pipe.&lt;/p&gt;

&lt;p&gt;Or say you want nightly log analysis. Drop this in a cron job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /var/log/app/error.log | axe run log-analyzer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debug info goes to stderr so it doesn't pollute your pipeline. Clean findings go to stdout. Wire it into whatever monitoring you already have like email, Slack, or a file.&lt;/p&gt;

&lt;p&gt;Axe doesn't care.&lt;/p&gt;

&lt;p&gt;The part I find most useful is chaining agents. A parent agent can delegate to sub-agents for focused subtasks. Each sub-agent runs with its own isolated context window and returns only the result. The previous agent never sees the sub-agent's internal reasoning, intermediate files, working memory, or even its output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Under the hood (briefly)
&lt;/h2&gt;

&lt;p&gt;Agent config is TOML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pr-reviewer"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Reviews git diffs for issues"&lt;/span&gt;
&lt;span class="py"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"anthropic/claude-sonnet-4-20250514"&lt;/span&gt;

&lt;span class="nn"&gt;[params]&lt;/span&gt;
&lt;span class="py"&gt;temperature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;

&lt;span class="nn"&gt;[memory]&lt;/span&gt;
&lt;span class="py"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;last_n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent's instructions live in a &lt;code&gt;SKILL.md&lt;/code&gt; file next to the config. Plain markdown. Human-readable, version-controllable, greppable. No database, no embeddings, no proprietary format. If you want to know what an agent does, you open the file. If you want to change what it does, you edit the file. That's the whole interface.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--dry-run&lt;/code&gt; flag shows the full resolved context, system prompt, skill file contents, any piped stdin, model parameters, without calling the LLM. Useful for debugging. Also useful if you want to estimate token cost before committing to a run. I use it more than I expected to.&lt;/p&gt;

&lt;p&gt;Agents can also remember across runs. Memory is plain markdown: each run appends a timestamped entry to a file sitting next to the config. No database, no schema migration. If something looks wrong, you open the file and edit it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it's not
&lt;/h2&gt;

&lt;p&gt;Not a framework. Not a platform. Not a chat window. Not a SaaS dashboard with an "Agents" tab and a usage graph you'll check twice before forgetting it exists.&lt;/p&gt;

&lt;p&gt;Axe aims for minimal dependencies. It's a single binary, no daemon running in the background, no runtime to install. It just runs wherever you drop it. Licensed as Apache 2.0 and free forever, pull requests welcome.&lt;/p&gt;

&lt;p&gt;Axe is the executor, not the scheduler. Use cron, git hooks, &lt;code&gt;entr&lt;/code&gt;, &lt;code&gt;fswatch&lt;/code&gt;, whatever you already have. Axe doesn't want to own your workflow. It wants to run one agent, cleanly, and get out of the way.&lt;/p&gt;

&lt;p&gt;If you want agents to feel like infrastructure instead of products you have to babysit, that's what this is for.&lt;/p&gt;




&lt;p&gt;The repo is at &lt;a href="https://github.com/jrswab/axe" rel="noopener noreferrer"&gt;github.com/jrswab/axe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go try it. Build something weird with it like a commit message writer, a nightly changelog summarizer, whatever you keep doing manually.&lt;/p&gt;

&lt;p&gt;If it saves you from being the scheduler, the context manager, and the output parser all at once. That's the whole point.&lt;/p&gt;

</description>
      <category>llmagents</category>
      <category>cli</category>
      <category>devtools</category>
      <category>go</category>
    </item>
    <item>
      <title>Bridging CLI and Note-Taking</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Sat, 30 Nov 2024 04:11:32 +0000</pubDate>
      <link>https://dev.to/jrswab/bridging-cli-and-note-taking-92p</link>
      <guid>https://dev.to/jrswab/bridging-cli-and-note-taking-92p</guid>
      <description>&lt;p&gt;As developers, we spend countless hours in the terminal. It's our primary interface for everything from git operations to server management. But what happens when you need to quickly jot down a thought or make a note while deep in a coding session?&lt;/p&gt;

&lt;p&gt;For me, this meant an annoying context switch. I use Logseq as my primary note-taking and knowledge management system, but every time I needed to make a quick note, I had to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take my hands off the keyboard&lt;/li&gt;
&lt;li&gt;Reach for the mouse&lt;/li&gt;
&lt;li&gt;Switch windows to Logseq&lt;/li&gt;
&lt;li&gt;Navigate to today's journal&lt;/li&gt;
&lt;li&gt;Make my note&lt;/li&gt;
&lt;li&gt;Switch back to the terminal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These micro-interruptions add up. They break flow, waste time, and worst of all, sometimes discourage me from taking notes at all. As a developer who values both efficient workflows and comprehensive note-taking, this friction point needed a solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter lsq
&lt;/h2&gt;

&lt;p&gt;I created &lt;code&gt;lsq&lt;/code&gt;, a minimal command-line tool that lets you create Logseq journal entries directly from your terminal. At its most basic, it's just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single command opens today's journal in your preferred editor ($EDITOR). No window switching, no mouse required. Just quick, efficient note-taking without leaving your terminal workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;lsq&lt;/code&gt;, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks your Logseq configuration&lt;/li&gt;
&lt;li&gt;Creates today's journal file if it doesn't exist&lt;/li&gt;
&lt;li&gt;Opens it in your preferred editor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By default, it uses the standard Logseq directory structure (&lt;code&gt;~/Logseq&lt;/code&gt;) and reads your &lt;code&gt;config.edn&lt;/code&gt; file for format preferences (Markdown or Org mode).&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Basic Editor Integration
&lt;/h2&gt;

&lt;p&gt;While solving the basic problem, I realized there were Logseq-specific features that would be useful to have in the terminal. This led to adding a Terminal User Interface (TUI) mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsq &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TUI provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct journal page editing&lt;/li&gt;
&lt;li&gt;TODO state cycling with keyboard shortcuts&lt;/li&gt;
&lt;li&gt;Priority state management&lt;/li&gt;
&lt;li&gt;Immediate save capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real World Impact
&lt;/h2&gt;

&lt;p&gt;This simple tool has significantly improved my daily workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more context switching for quick notes&lt;/li&gt;
&lt;li&gt;Faster capture of ideas while coding&lt;/li&gt;
&lt;li&gt;Easier tracking of terminal commands I want to remember&lt;/li&gt;
&lt;li&gt;Seamless integration with my existing terminal workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;The project is still evolving. As my first TUI application, it's quite basic but functional. I'm actively working on improvements and would love community input on which features to prioritize.&lt;/p&gt;

&lt;p&gt;Some ideas under consideration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block reference support&lt;/li&gt;
&lt;li&gt;Tag autocompletion&lt;/li&gt;
&lt;li&gt;Page linking capabilities&lt;/li&gt;
&lt;li&gt;Block property handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;If you're interested in streamlining your terminal-to-notes workflow, you can install lsq with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/jrswab/lsq@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project is open source and available at &lt;a href="https://github.com/jrswab/lsq" rel="noopener noreferrer"&gt;github.com/jrswab/lsq&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share Your Thoughts
&lt;/h2&gt;

&lt;p&gt;What terminal-to-note-taking friction points do you face? How do you handle quick note-taking while working in the terminal? I'd love to hear your thoughts and ideas for improving lsq.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>cli</category>
      <category>logseq</category>
      <category>go</category>
    </item>
    <item>
      <title>Is VScode Truly Open Source?</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Fri, 22 Nov 2019 12:34:21 +0000</pubDate>
      <link>https://dev.to/jrswab/is-vscode-truly-open-source-3p2l</link>
      <guid>https://dev.to/jrswab/is-vscode-truly-open-source-3p2l</guid>
      <description>&lt;p&gt;For years I only wrote code in a terminal via Neovim but chose to give VSCode a spin and I found I really like it. However, it's not as open source as I originally thought.&lt;/p&gt;

&lt;p&gt;After a bit of digging I learned that the download from their website is not open source but the code hosted on Github is open source. This is like Google's Chrome verses Chromium but with the same name so it's expected to get confused.&lt;/p&gt;

&lt;p&gt;For some context this &lt;a href="https://github.com/Microsoft/vscode/issues/60#issuecomment-161792005" rel="noopener noreferrer"&gt;Github issue comment&lt;/a&gt; explains the difference:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;When we [Microsoft] build Visual Studio Code, we do exactly this. We clone the vscode repository, we lay down a customized product.json that has Microsoft specific functionality (telemetry, gallery, logo, etc.), and then produce a build that we release under our license.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When you clone and build from the vscode repo, none of these endpoints are configured in the default product.json. Therefore, you generate a "clean" build, without the Microsoft customizations, which is by default licensed under the MIT license.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So as an open source junkie I proceeded to download the source code from the Github page to build from source when I came across another repo. This repo is called &lt;a href="https://github.com/VSCodium/vscodium" rel="noopener noreferrer"&gt;"VSCodium"&lt;/a&gt; as a play with the Chrome/Chromium branding. This repo strips out all telemetry and removes all branding to keep their binaries 100% open source (MIT to be exact).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This repo exists so that you don't have to download+build from source. The build scripts in this repo clone Microsoft's vscode repo, run the build commands, and upload the resulting binaries to GitHub releases. These binaries are licensed under the MIT license. Telemetry is disabled.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VSCodium_&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;After a bit of coding with VSCodium it seems to run exactly as expected. The first test was if it could still download extensions because there is no better way to code than with Vim keybindings. It worked as expected!&lt;/p&gt;

&lt;p&gt;If you run Arch or Manjaro you can use the &lt;a href="https://aur.archlinux.org/packages/vscodium-bin/" rel="noopener noreferrer"&gt;AUR&lt;/a&gt; to install this truely open source variant of VSCode; just search for &lt;code&gt;vscodium-bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For other system head over to the &lt;a href="https://github.com/VSCodium/vscodium#download-install" rel="noopener noreferrer"&gt;Github Readme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>opensource</category>
      <category>ide</category>
    </item>
    <item>
      <title>Three Reasons You Need to Learn to Program</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Mon, 11 Nov 2019 16:10:45 +0000</pubDate>
      <link>https://dev.to/jrswab/three-reasons-you-need-to-learn-to-program-292m</link>
      <guid>https://dev.to/jrswab/three-reasons-you-need-to-learn-to-program-292m</guid>
      <description>&lt;p&gt;Basic understanding of computer logic is more needed today than ever before, and this trend will only continue for the foreseeable future. Our world is more and more technological and the less we know about how computers and programs work the more we are put at the mercy of the creators.&lt;/p&gt;

&lt;p&gt;We need to stop being consumers and start to have at least a basic understanding of computer programming across all ages.&lt;/p&gt;

&lt;p&gt;The majority of my programming is for fun. I do have the ability to create some useful apps for my team at work, but that is a secondary function I serve.&lt;/p&gt;

&lt;p&gt;Even though I am not a paid software engineer, I love to sit down and solve some problems with code. Just keeping that skill share reaps many more benefits than having a niche at work or showing off to my friends and family.&lt;/p&gt;

&lt;h2&gt;
  
  
  Increased Problem Solving
&lt;/h2&gt;

&lt;p&gt;When we learn fundamental programming concepts, we are able to exercise the part of our brain that solves problems. Have a repetitive task at work? Computers are great at this and can perform these tasks much faster than us humans.&lt;/p&gt;

&lt;p&gt;Taking the time to create an extension or small script to automate the stuff that is boring allows our brains to practice solving problems. Plus we cut back on all the mind-numbing tasks we have to do.&lt;/p&gt;

&lt;p&gt;Maybe I'm just lazy, but this is one of the best parts of programming.&lt;/p&gt;

&lt;p&gt;The more tasks I automate, the more I look for other ways to simplify my everyday computer tasks. Looking for problems to solve and then finding a way to resolve that pain point with a script not only saves time in the long run but also strengthens the mental muscle.&lt;/p&gt;

&lt;p&gt;The more time we spend exercising the problem-solving part of our brain the more likely we are to solve more significant challenges in our personal lives and in business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mental Engagement
&lt;/h2&gt;

&lt;p&gt;The mind is a muscle, and the more we make it work, the sharper it becomes. This allows us to think deeper but also has effects on our long-term mental health.&lt;/p&gt;

&lt;p&gt;The more we engage our mental muscle, the better we function at work or school, the more satisfying our relationship with friends, family, and co-workers become, and we tend to gain higher self-esteem overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adds Interest to a Resume
&lt;/h2&gt;

&lt;p&gt;Even if you have no intention to become a software engineer (I don't blame you) having programming experience in Python or JavaScript to solve a problem in work or personal life looks great on a resume.&lt;/p&gt;

&lt;p&gt;It can show a future employer that you take time on your own to learn and improve yourself. You may be the only one they see with any programming experience, and that could be the tipping point between an interview or not. It's all about being unique and sticking out in a crowd of overqualified people.&lt;/p&gt;

</description>
      <category>education</category>
      <category>learn</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How To Create a Linked List Using Golang</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Mon, 04 Nov 2019 13:19:49 +0000</pubDate>
      <link>https://dev.to/jrswab/how-to-create-a-linked-list-using-golang-1326</link>
      <guid>https://dev.to/jrswab/how-to-create-a-linked-list-using-golang-1326</guid>
      <description>&lt;p&gt;Lately I started to practice my data structures to get a better grasp of programming. Today I chose to tackle the Linked List from scratch using Go. I have not had to write a linked list in forever which made this a great mental exercise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linked List Code Breakdown:
&lt;/h2&gt;

&lt;p&gt;The first step I took was to create a struct. I know this struct needed to hold whatever data to store along with a link to the previous data. Here I set up the struct to hold an integer but this could be anything you want. The second is the link to the previous data and this has to be a pointer to an instance of the struct we just created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;digi&lt;/span&gt;     &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I followed that with a &lt;code&gt;push&lt;/code&gt; method attached to the list type we just created. This will allow us at add new data to the list without rewriting the code. It starts by creating a variable called &lt;code&gt;current&lt;/code&gt; of the list type we created. &lt;code&gt;current&lt;/code&gt; will hold the data we need to set as the next node in the list, including the integer passed in and the pointer to the list calling the method. Then the method returns the pointer of the newly created &lt;code&gt;current&lt;/code&gt; node.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since I plan on turning this into a stack challenge, I followed the &lt;code&gt;push&lt;/code&gt; method with a &lt;code&gt;pop&lt;/code&gt; method. All this does is remove the most recent addition to the linked list by setting the previous data to the the current.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I then follow up with &lt;code&gt;main()&lt;/code&gt; to execute the methods mentioned above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linked List in Golang:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;digi&lt;/span&gt;     &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// push adds another number to the stack&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// pop removes the top most member from the stack&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digi&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;
    &lt;span class="c"&gt;// Create parts 0-9 of the stack&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prevList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the code at the &lt;a href="https://play.golang.org/p/oTTBS6Q27Fc" rel="noopener noreferrer"&gt;Golang Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any tips on how I can make this linked list more efficient please let me know in the comments. Also feel free to ask any questions!&lt;/p&gt;

</description>
      <category>go</category>
      <category>datastructures</category>
      <category>howto</category>
      <category>code</category>
    </item>
    <item>
      <title>Peer-To-Peer: Our Only Hope.</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Mon, 28 Oct 2019 14:07:32 +0000</pubDate>
      <link>https://dev.to/jrswab/peer-to-peer-our-only-hope-2jnp</link>
      <guid>https://dev.to/jrswab/peer-to-peer-our-only-hope-2jnp</guid>
      <description>&lt;p&gt;Peer-to-peer has been around a long time and is decentralized in nature. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, this is decentralized without the need for a blockchain.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Cryptocurrencies and blockchains are awesome but not everything needs to use that technology to be decentralized. All cryptocurrencies are peer-to-peer but not all peer-to-peer decentralization has to be on a blockchain.&lt;/p&gt;

&lt;p&gt;Peer-to-peer is as it sounds. You connect to another user directly. There is no need for a central server to host, upload, download, or serve files. When there is no central server doing all the work, there is no one point of failure. This also eliminates the issue of central servers shutting you down because they don't like what you say or share. This is a huge step in keeping the internet steeped in free speech.&lt;/p&gt;

&lt;p&gt;In a peer-to-peer system a computer will divide a portion of the resources it has and give them to the network. This can include hard drive space, bandwidth, or processing power. These allocated resources are still the computer but, as with hard drive space, the predetermined amount is used to store information that can be called by other computers on the network. Doing this allows for more space, speed, or processing power to be used than a single computer on the network could hold alone.&lt;/p&gt;

&lt;p&gt;Due to this structure, each peer both supplies data and consumes data. With the most common model we use online today the server does all the supplying while the users on the web do all the consuming. This made the most sense in the early 2000's when the internet was growing and our personal computers were a fraction of what we have today.&lt;/p&gt;

&lt;p&gt;However, now that is not a big issue. Our computers are much more powerful than they were and our internet connections are much faster. The only reason we are still using the centralized model is due to a legacy mentality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5sd6w68tsw6d9g7ozqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5sd6w68tsw6d9g7ozqx.png" alt="Alt Text" width="640" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If there was one application that brought peer-to-peer networking out of the wood work it was Napster. Napster was a program that allowed people to connect to share music files. Shawn Fanning and Sean Parker founded Napster as a standalone file-sharing platform.&lt;/p&gt;

&lt;p&gt;Napster only operated in this manner for two years and a month ending in July of 2001. The reason Napster shut down, as far as I can tell, is because they had a company that could be attacked and they were attacked for copyright infringement to the tune of $36 million.&lt;/p&gt;

&lt;p&gt;Any part of a decentralized service that is centralized puts the entire ecosystem at risk. When this happens can we really call the service decentralized? I would say no but luckily most peer-to-peer applications and services made today focus on keeping everything decentralized.&lt;/p&gt;

&lt;p&gt;This is the lesson learned from Napster and as other services fail, we continue to learn more. This helps us make peer-to-peer systems like BitTorrent. The reason BitTorrent has not been shut down is that there is no central point to attack as in a company or server. The people that want to wipe BitTorrent off the planet like they did with Napster now have to go after ever single user.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That is magnitudes more difficult.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Applications Of The Peer-To-Peer Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mesh Networks
&lt;/h3&gt;

&lt;p&gt;We talked about mesh networking in a post in more depth so check that out for more information. Mesh networks are a peer-to-peer way of connecting to other computers and servers. It is a more decentralized form of the internet in that there is no internet service providers.&lt;/p&gt;

&lt;p&gt;We still need the ISPs to reach sites on the current web since there is not a worldwide mesh network, but that does not make it impossible. Every town and city could set up their own mesh network and tie into the next town to spread the reach. This kind of network makes it pretty much impossible for any entity to kick a person off the network.&lt;/p&gt;

&lt;h3&gt;
  
  
  File.Pizza
&lt;/h3&gt;

&lt;p&gt;File.Pizza is a quick and easy way to share a file with another person online. After loading up the website you can tell it what file you want to send and the site prepares a special unique link. This link allows the person to connect to you without a middle man like Dropbox or Google Drive.&lt;/p&gt;

&lt;p&gt;There is never any uploading to file.pizza only to the computer with the link you sent. If you are using Firefox there seems to be no limit to how big the file can be and the speed at which the other person gets the file is determined by your upload speed and their download speed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4awb9jl1w1xr6y7tedid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4awb9jl1w1xr6y7tedid.png" alt="Alt Text" width="709" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  YaCy
&lt;/h3&gt;

&lt;p&gt;YaCy is a peer-to-peer search engine. Sites like Google, Yahoo, Bing, and Duck Duck Go are all centralized search engines. When using a normal site to search the web you are connecting to their servers and getting information. This means they can track you and chose not to show you something as they see fit.&lt;/p&gt;

&lt;p&gt;With YaCy censorship can not happen. When you search with YaCy, you are connected directly to other uses to retrieve the results. It is good too! I was experimenting with it before making this post and I was impressed by what this system could find. I am talking more than just websites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dat &amp;amp; The Beaker Browser
&lt;/h3&gt;

&lt;p&gt;We also covered Dat and the Beaker browser in another post so check that out for more information. What these two do is work together to bring a more decentralized internet to our current model. Dat is the protocol that allows far peer-to-peer connections of any website created using Dat.&lt;/p&gt;

&lt;p&gt;The Beaker browser is to access these sites that use the Dat protocol. You don't have to know a site has a peer-to-peer version before you visit. When using the Beaker browser to surf the web if a site has a peer-to-peer version Beaker will let you know. Switching to the decentralized version is as easy as clicking a button.&lt;/p&gt;

</description>
      <category>internet</category>
      <category>decentralization</category>
      <category>network</category>
      <category>web</category>
    </item>
    <item>
      <title>Scripting Server Customization &amp; Setup</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Fri, 25 Oct 2019 14:40:14 +0000</pubDate>
      <link>https://dev.to/jrswab/scripting-server-customization-setup-5ema</link>
      <guid>https://dev.to/jrswab/scripting-server-customization-setup-5ema</guid>
      <description>&lt;p&gt;As you well know by now, I am a big nerd. The more I learn, the more I find myself moving away from large desktop environments and window managers to the terminal. The terminal is fast, efficient, and does not hog system resources.&lt;/p&gt;

&lt;p&gt;It is to a point now that if I can do it in the terminal then I do it in the terminal. Of course, some tasks are not well suited for a terminal. Just because I can read a webpage via the terminal does not mean it's the best tool for the job. The majority of websites use so much CSS and javascript that it becomes a nightmare to navigate through.&lt;/p&gt;

&lt;p&gt;That being said, most of my workflow can be more efficient in the terminal via a headless server. No need for a super expensive laptop, all I need is one that can connect to the server of my choice. After a bit of tweaking the environment is exactly as I like it to be. Every aspect down to the color scheme and keyboard layout.&lt;/p&gt;

&lt;p&gt;However, over time this simple tweaking has become a healthy chunk of my time to both set up and update. New servers need all the goods, and even with all the dotfiles in place at my Github account I still need to take time setting everything up. Installing packages and symlinking configuration files takes more time the more I use the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation Through Bash Scripting
&lt;/h2&gt;

&lt;p&gt;We covered Bash in a mini-series here a few months back, and since I only ever use Linux, I can use these types of scripts on all my machines. As you can see on my Github page, I already have dotfiles for my desktop and laptop (which will merge soon), but I don't have a repository for my server configuration.&lt;/p&gt;

&lt;p&gt;This is because I have only recently gotten into heavily customizing my terminal experience to improve my productivity. I guess we can say that forcing myself to learn Vim started off the journey in its current form since that got me into editing the &lt;code&gt;.vimrc&lt;/code&gt; file. Add in the move to i3wm for my desktop computer, and the ball is now rolling in full force.&lt;/p&gt;

&lt;p&gt;This bash script is still in the works, so there are only a few lines I am able to share with you, but I think it will get your gears turning. Having the mindset to automate as much of my computing life as possible saves me a lot of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parts of my script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; ~/.config/nvim/colors/ &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
   &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/.config/nvim/colors/
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I tell the script that if the directory ~/.config/nvim/colors/ does not exist then create the directory by running &lt;code&gt;mkdir ~/.config/nvim/colors/&lt;/code&gt;. Then I do it again for the &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
   &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; ~/.bashrc
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason why I have the script create these files and directories (and more as I flesh this out) is to make sure the needed information is there for the symlinks I automate at the end of the bash script. After this I have the script add two lines to the end of the &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias vim='nvim'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias tmux='tmux -2'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These lines may be replaced with a symlink to a completed &lt;code&gt;.bashrc&lt;/code&gt; file as I tweak the script because as I add more to the server's &lt;code&gt;.bashrc&lt;/code&gt; it could make the script a bit messy. The next section I have so far is to install git and pull down a Vim, plugin manager.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
git clone https://github.com/VundleVim/Vundle.vim.git ~/.config/nvim/bundle/Vundle.vim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I plan to have the script check the distribution of Linux before installing git so that I do not have to edit this file between servers running Ubuntu and Arch. Then we have the symlinks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; ~/dotfiles/vim/colors/molokai.vim ~/.config/nvim/colors/molokai.vim
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; ~/dotfiles/vimrc.main ~/.config/nvim/init.vim
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; ~/dotfiles/tmuxConfig.main ~/.tmux.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A symlink tells the computer to use the first file in each line and make the second file link back to the first. This is handy when customizing the configuration files for many programs. Instead of having to edit them every time by hand we can have a master copy to edit and tweak over time.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>terminal</category>
      <category>bash</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How To Make The Switch To Linux</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Mon, 21 Oct 2019 17:55:01 +0000</pubDate>
      <link>https://dev.to/jrswab/how-to-make-the-switch-to-linux-18go</link>
      <guid>https://dev.to/jrswab/how-to-make-the-switch-to-linux-18go</guid>
      <description>&lt;p&gt;So you know that Linux is a better system for privacy and security, has more customization features, and is lightweight compared to its other operating system candidates. The problem is that the leap of faith into Linux is a bit anxiety inducing since it can feel so much different than your current day-to-day system.&lt;/p&gt;

&lt;p&gt;There is also the fear of not having a program that can do some task you need on a daily basis. But I can assure you that there is an alternative to almost every application you will need on a regular basis, so you may not even need to worry. More of the name brand programs come out with Linux versions every year.&lt;/p&gt;

&lt;p&gt;Two of the "non-free" applications I use are Steam and Spotify. The reason for Steam is for the games I bought in the past that I'd still like to play. There is another gaming platform called &lt;a href="https://lutris.net/" rel="noopener noreferrer"&gt;Lutris&lt;/a&gt; that is open source, but I have yet to move my library over. As for Spotify, I pay for the family plan for my wife and I because we listen to a lot of music.&lt;/p&gt;

&lt;p&gt;There are many ways to get started with Linux and free yourself from the proprietary operating systems that may or may not spy on you, harvest your data, and force you to upgrade your computer every two years. I run a Lenovo X220 from 2011 with Manjaro Linux, and it is faster than my wife's 2015 MacBook Pro.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Use Linux?
&lt;/h1&gt;

&lt;p&gt;Linux has many versions or flavors that you may install. If one version does not operate the way you want, you can load up another. It also allows for a ton of customization so you can change the look and feel over time to fit your exact needs.&lt;/p&gt;

&lt;p&gt;On top of all the fancy graphical stuff, it is fast, efficient, and reliable. Even on my old computer, it operates better than some newer machines as I mentioned. Its reliability is far better than that of Windows and even MacOS. Once Linux is set and you have all the programs you need, you will find that it works day in and day out.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step One - Find Open Source Alternatives
&lt;/h1&gt;

&lt;p&gt;The first step in moving to Linux is not moving at all. You will have a more natural transition to Linux if you take the time now and look for open source alternatives to the programs you use already. At the very least check to see if they have a version for Linux.&lt;/p&gt;

&lt;p&gt;Doing so will allow you to be comfortable once you choose to make the full-time switch to Linux. Since you already use open source programs, you will be able to search for the exact application within your distributions' app centers or repositories. Knowing what programs do what right off the bat will help you stick with Linux.&lt;/p&gt;

&lt;p&gt;The best place to find open source alternatives for the apps you use on Windows or Mac is &lt;a href="https://alternativeto.net/" rel="noopener noreferrer"&gt;AlternativeTo.net&lt;/a&gt;. Just head over to the site, enter in a program you use such as Microsoft Office, and the site will display all other office suites. The best thing to do in our case is to select the option only to show open source or programs that run on Linux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://alternativeto.net/" rel="noopener noreferrer"&gt;AlternativeTo.net&lt;/a&gt; is my go-to site when I need a program for Linux, but I don't know the name. Say I have an app on my phone that changes the color of my screen at night for better sleep, but don't know of a Linux alternative. I head over to &lt;a href="https://alternativeto.net/" rel="noopener noreferrer"&gt;AlternativeTo.net&lt;/a&gt; and enter the app name, set to display Linux, and profit!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step Two - Dual Boot
&lt;/h2&gt;

&lt;p&gt;Once you have moved all of your programs to Linux-compatible versions, it's time to Dual Boot your current system with your choice of Linux. For new users, I recommend either &lt;a href="https://ubuntu-mate.org/" rel="noopener noreferrer"&gt;Ubuntu Mate&lt;/a&gt; or &lt;a href="https://linuxmint.com/" rel="noopener noreferrer"&gt;Linux Mint&lt;/a&gt; as they make it easy for new users moving from Windows.&lt;/p&gt;

&lt;p&gt;These versions of Linux have a familiar desktop environment to that of Windows, making it more intuitive to use than something like i3wm. Both use floating window managers and have start menus that Windows users will find comfortable. If you are moving from MacOS to Linux, you may like &lt;a href="https://elementary.io/" rel="noopener noreferrer"&gt;elementary OS&lt;/a&gt; and &lt;a href="https://www.deepin.org/en/" rel="noopener noreferrer"&gt;Deepin&lt;/a&gt; more.&lt;/p&gt;

&lt;p&gt;The beauty of giving your system the ability to dual boot is that you can switch back and forth between the two operating systems. This ability is great while you get used to Linux since you will be able to use your old OS for productivity while you learn your new system. Be efficient during the day and learn Linux at night!&lt;/p&gt;

&lt;p&gt;I am not able to get into how to dual boot your system in this post, but there are many guides online. Just search for &lt;code&gt;computer model dual boot Linux,&lt;/code&gt; and you are bound to find an in-depth tutorial. Make sure to read the instructions a few times before you dive in, so you have a good understanding of what to expect.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step Three - Wipe The Old Operating System
&lt;/h1&gt;

&lt;p&gt;Once you find yourself using Linux more than your old operating system, it's time to make the switch and go full Linux. You may find this step nerve-wracking since you will have to delete your old system, but it's not the end of the world. You can always buy a copy of your old system and use the provided key if you need.&lt;/p&gt;

&lt;p&gt;If you make it to this step, though, I am sure you will not go back to your old system and will continue to learn ways to make Linux better fit your life each day. Just follow the method as I outline here and you'll be all Linux within a year, maybe even less if you are ambitious.&lt;/p&gt;




&lt;p&gt;If you are an email kind of nerd you can &lt;a href="http://eepurl.com/dPznPz" rel="noopener noreferrer"&gt;sign up for mine here&lt;/a&gt;. You can always replay to any of my emails to start a conversation or ask me a question.&lt;br&gt;
You can donate to this site from &lt;a href="https://liberapay.com/jrswab/donate" rel="noopener noreferrer"&gt;my Liberapay account&lt;/a&gt; if you so choose.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>archlinux</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>I Removed Google From My Primary Device</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Thu, 17 Oct 2019 12:17:20 +0000</pubDate>
      <link>https://dev.to/jrswab/i-removed-google-from-my-primary-device-12e0</link>
      <guid>https://dev.to/jrswab/i-removed-google-from-my-primary-device-12e0</guid>
      <description>&lt;p&gt;I've been a big advocate of Google services for a long time. I always understood the standpoint that being free services they have the right to use the data I'm putting in. This is how they can make great products and keep them free.&lt;/p&gt;

&lt;p&gt;I'd also like to say before getting into this post that if you understand how Google uses your data and you are ok with that then keep using the services. They are the best on the web and on mobile devices currently.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So why did I run a version of android without Google services?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Honestly, I wanted to see if it was possible and if I would notice a difference. This post is my experience with the process and living a life 'de-Googled'.&lt;/p&gt;

&lt;h2&gt;
  
  
  Android
&lt;/h2&gt;

&lt;p&gt;I chose to go with LineageOS. They produce a very stripped down version of android that is functional for daily use. Do keep in mind that my daily use tolerance of buggieness might be higher than yours. LineageOS is only released on 'nightlies' for most devices which creases the chances of running into bugs.&lt;/p&gt;

&lt;p&gt;A nightly is when a computer compiles the days work into a release and it gets pushed out to devices. You don't have to update to every nightly and it's not actually recommended unless it fixed a burning issues with your current device. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Examples being broken camera or GPS gets fixed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've used nightlies back when the LineageOS crew was developing CyanogenMod and found those to be much more unstable then what is being called a nightly now. I have my device check once a week to see if a new nightly build has been pushed (often is the case) and then I download and install.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remember; do this at your own risk as things may break.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That all being said LineageOS worked great for me and well enough that it was be my daily driver. Do keep in mind that this experience varies from device to device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing LineageOS
&lt;/h3&gt;

&lt;p&gt;To install LineageOS or any other version of android. You need to unlock the bootloader, this is a bit time consuming and could break your device. So if you choose to do this make sure you read the directions through several times to make sure you have a good idea of what you are going to do before you even start.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The last thing you want is your phone or tablet to be an oversized paper weight.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm not going to get into the details of how to flash a rom to your android device since every one is different. LineageOS has step by step directions for many devices on the market today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apps
&lt;/h2&gt;

&lt;p&gt;So apps, the real part of the mobile device that people actually care about.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to get apps without Google Play
&lt;/h3&gt;

&lt;p&gt;First you need to allow your deivce to install 3rd party apps via apk. This can be easily searched online to find the exact steps to get to the settings for your specific device.&lt;/p&gt;

&lt;p&gt;Since I did not have any Google services on my device I couldn't just go to the play store to download an app. Luckly there are other options.&lt;/p&gt;

&lt;p&gt;fDroid is an open source repository of apps made for android. Some of the big names are there. Such as telegram, the chat app.&lt;/p&gt;

&lt;p&gt;Most of the apps we use have an alternative on fDroid. This does not mean you will find the exact app but will often find an app that is just as good and sometimes better.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about the apps that don't have an open source alternative?
&lt;/h3&gt;

&lt;p&gt;In fDroid there is an app called Yalp. This app allows you to connect to the play store without having to log in or have Google services installed. When you pick an app to download and install, it downloads the apk and installs it as if you downloaded an apk off the internet.&lt;/p&gt;

&lt;p&gt;In this app store mirror you will find everything you would in Google Play. It even lets you know if an app depends on Google Services (shown as GSF). However, just because an app says it needs GSF does not me it will not work. I have found many apps that say they need the Google services run just fine even though I don't have them installed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So what did they even need them for? It's an interesting question.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I am looking through Yalp I always try out an app that does not need GSF over one that does just for the increased chance that it will work wihout issue out of the gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  App Compatibility
&lt;/h3&gt;

&lt;p&gt;So lets get into the apps the say the need GSF and if they really do need them to run.&lt;br&gt;
These lists are by no means extensive.&lt;/p&gt;

&lt;h4&gt;
  
  
  Apps That Work
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Anchor&lt;/li&gt;
&lt;li&gt;Bitmoji&lt;/li&gt;
&lt;li&gt;Dropbox&lt;/li&gt;
&lt;li&gt;Fiverr&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;Jaxx&lt;/li&gt;
&lt;li&gt;JuiceSSH&lt;/li&gt;
&lt;li&gt;Keybase&lt;/li&gt;
&lt;li&gt;LastPass

&lt;ul&gt;
&lt;li&gt;I have found that the auto-fill feature for apps don't work&lt;/li&gt;
&lt;li&gt;I am still able to copy and paste and access my passwords.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Minds&lt;/li&gt;

&lt;li&gt;Proton Mail&lt;/li&gt;

&lt;li&gt;Reddit&lt;/li&gt;

&lt;li&gt;Spotify&lt;/li&gt;

&lt;li&gt;Starbucks&lt;/li&gt;

&lt;li&gt;Twitter&lt;/li&gt;

&lt;li&gt;Waze

&lt;ul&gt;
&lt;li&gt;I thought this was not working the first time I downloaded it but after trying it again it works just fine.&lt;/li&gt;
&lt;li&gt;If you download this and can't see the map start clicking things and opening settings it then it seem be fine.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Apps that won't work
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;All Google apps

&lt;ul&gt;
&lt;li&gt;I've tried a few and none of them even finish booting up.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Most games

&lt;ul&gt;
&lt;li&gt;I don't play many games on my phone since removing Google services and the one I wanted I was able to find on the amazon app store.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Keep this in mind since you may have a favorite game that you have paid for.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;That game will probably not run if it says it needs Google Play Services (GSF) in Yalp.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Snapchat&lt;/li&gt;

&lt;li&gt;Authy

&lt;ul&gt;
&lt;li&gt;This was a pain in the butt&lt;/li&gt;
&lt;li&gt;Before moving to a non-Google services device make sure to download 'andOTP', move all your 2FA's there, and back up the info to an external source.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  One Month In
&lt;/h2&gt;

&lt;p&gt;After a month's time and I didn't even notice that I running with Google Play services removed. The apps I needed to replace have great apps that fill their place from fDroid. For those that don't the Yalp store allows me to find a good alternative that often works just fine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I did not expect to be content without Google.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But, my tolerance for hacky and buggy systems is much higher than the average person so this might be why. But that being said it was still a surprise, I very much expected to have my android device completely unusable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should You Try?
&lt;/h2&gt;

&lt;p&gt;This is a fun question since I don't know your tolerance for hacking together systems or how angry you get when something doesn't work. However, if you have a strong urge to use Android without Google Services than do it. Learn how to unlock your device bootloader, root if you desire, and install fDroid from the apk.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why not at least try?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My curiosity is what made me to try this experiment and I consider it a success with an unexpected outcome. I don't miss the apps I can't use. The ones I do, I find my outlook on these apps a little different. (Something we won't get into now). It's also an odd sense of freedom. Call it placebo or whatever you will but that feeling of freedom was there in some form once everything was set up and running.&lt;/p&gt;

&lt;p&gt;It took about two days to get my device to a place where it was 90% usable in relation to what it was with Google Play services installed. After a week I did not even notice that Google services were not installed. It was so natural that I did not go back to a "Googled" phone until I bought a new device over a year after starting this experiment.&lt;/p&gt;

</description>
      <category>android</category>
      <category>google</category>
      <category>apps</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How To Stop Account Hijacking</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Wed, 16 Oct 2019 11:41:41 +0000</pubDate>
      <link>https://dev.to/jrswab/how-to-stop-account-hijacking-2doe</link>
      <guid>https://dev.to/jrswab/how-to-stop-account-hijacking-2doe</guid>
      <description>&lt;p&gt;With our lives becoming more internet dependent the risk of getting our information stolen increases. This then increases the demand for security, different passwords, and knowledge on how to create a great password. The two approaches that give us the most &lt;em&gt;bang for our buck&lt;/em&gt; is to use a password manager and use dice to generate the master password. These two steps will increase your security by allowing for every site to have its own password, alert you to phishing, and make it almost impossible to get your password stolen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Phishing?
&lt;/h2&gt;

&lt;p&gt;Phishing is when a malicious person sets up a site to look exactly like the one you use every day. Facebook is probably one of the most phished sites out there due to the enormous user base. These fake sites will use a name that is very close to the original to look like the correct URL at a glance.&lt;/p&gt;

&lt;p&gt;Common ways are to use a lower case "L" in place of a capital "I" in the English language, and there are many more for all languages. You may hear that all you need to do is make sure the green lock on your browser is there and you'll be on the correct site.&lt;/p&gt;

&lt;p&gt;This is only partly true since anyone can get an SSL certificate without much hassle but is an excellent first step. Never rely on the green lock as a foolproof way to know you are on the correct site but instead use it as one of many signals that you are where you wish to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Browser Extensions To Increase Security
&lt;/h2&gt;

&lt;p&gt;So we have another barrier protect us I want to give a few words of caution. Since apps like Bitwarden are online, there is always a chance that they get compromised and your information leaks into the ether.&lt;/p&gt;

&lt;p&gt;Always practice safe password techniques when creating master passwords and never use the same password twice. If you are using Bitwarden, there is no reason why you will have to remember more than one password anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Your Master Bitwarden Passphrase
&lt;/h3&gt;

&lt;p&gt;Calling it a passphrase is an important distinction. The term 'password' indicates a single word instead of multiple words. The longer a passphrase is, the better because with each new character you add more entropy. Entropy is what makes the passphrase hard to guess by both computers and people.&lt;/p&gt;

&lt;p&gt;The best method to form a passphrase is to use a system that has no ties to us. A passphrase that has our school name, birth month, and the name of our first pet may be long, but these days information is bought and sold. It does not take long for someone to learn such information about us.&lt;/p&gt;

&lt;h4&gt;
  
  
  Use Dice &amp;amp; A Diceware Word List
&lt;/h4&gt;

&lt;p&gt;A dice list is a list of thousands of words next to numbers. Search online for "EFF Diceware List" and download the file. To use this list to make a strong passphrase we take five dice and roll them. Write down the numbers and roll again. Do this five or six times.&lt;/p&gt;

&lt;p&gt;Now those numbers we wrote down correspond to words on the list. What we get is a passphrase that looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;directive-pushy-awaken-barcode-unnoticed-hurling-cavalier&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A string of random words that have no relation to us at all. Since it is words, it is easy for us to memorize, but due to its length, it is tough to guess. Make sure to use real dice and not an online generator because outside of nature we can never be sure if the outcomes are truly random.&lt;/p&gt;

&lt;h4&gt;
  
  
  Proof These Work
&lt;/h4&gt;

&lt;p&gt;If we can assume that an attacker can run one trillion guesses per second, how long will it take to guess the passphrase above?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;27,255,689 years!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's some good odds in our favor. But let's see how fast a passphrase with one less word is cracked (on average) at one trillion guesses per second.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3,505 Years&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;See how big a difference one word makes! Now keep in mind that we cannot be expected to remember a passphrase like this for every site we use because we need to use a different passphrase on every site. A password like this on every site is overboard and is why we use password managers such as Bitwarden.&lt;/p&gt;

</description>
      <category>security</category>
      <category>phishing</category>
      <category>passwords</category>
      <category>education</category>
    </item>
    <item>
      <title>I'm Rethinking RSS</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Mon, 14 Oct 2019 11:57:05 +0000</pubDate>
      <link>https://dev.to/jrswab/i-m-rethinking-rss-18o5</link>
      <guid>https://dev.to/jrswab/i-m-rethinking-rss-18o5</guid>
      <description>&lt;p&gt;After some thinking about the current state of social media and mass email lists, RSS came to mind, and it's actually a much better alternative for privacy. No data collection, no feed manipulation, no email newsletters. It's like someone from the future went to the past and gave us the answer to subscribing to creators without giving our away every detail about our lives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Little to no data collection
&lt;/h3&gt;

&lt;p&gt;As far as I'm aware there is no way to collect personal data through RSS feeds. You get an app (pick a good one like Feeder) and add each site's XML feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's it!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unless the app you use monitors your usage, asks for your name, or other personal information you can be pretty confident that your personal data is not stored and sold.&lt;/p&gt;

&lt;p&gt;I mentioned Feeder, this is the RSS app I use to 'subscribe' to blogs that I like to keep tabs on. It's a nice app with lots of settings to fit your needs. You can set it only to show articles you have not read or to display them all. The app also has a notification feature to alert you went a new post is released by any of the sites you follow.&lt;/p&gt;

&lt;p&gt;On top of all that it is FOSS (free and open source software)! Here is their "pitch" on F-Droid:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feeder is a fully free/libre feed reader. It supports all comment feed formats, including JSONFeed. It doesn't track you. It doesn't require any setup. It doesn't even need you to create an account! Just set up your feeds, or import them from your old reader via OPML, then get on with syncing and reading.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was unable to find the app in the Google Play Store so you will need to download F-Droid to install the APK.&lt;/p&gt;

&lt;h3&gt;
  
  
  No unwanted curation
&lt;/h3&gt;

&lt;p&gt;Twitter, Facebook, Instagram, and most of the top social feeds curate what you see to some extent. I don't like this. Curating a user's feed opens the door to abuse, censorship, and pushing posts that appeal to an agenda.&lt;/p&gt;

&lt;p&gt;Take back control of your most read sites by adding them to your RSS reader instead of only following them on social media. Major topics are much too easy to miss otherwise.&lt;/p&gt;

&lt;h3&gt;
  
  
  All updates in one place
&lt;/h3&gt;

&lt;p&gt;You don't need a bunch of apps or to sign up for a million email lists if you use a sites RSS/XML feed. I have an email list, and you may join if you like but we all know how crazy email lists get. I promise never to send a million emails to you if you sign up because I hate that just as much as the next guy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Centralized and decentralized
&lt;/h3&gt;

&lt;p&gt;RSS works in both centralized and decentralized platforms. I'm not sure why Steemit doesn't have a feed option outside of the on-site feed. Creating an RSS feed would make it easier for many people to consume the content of their contributors. It would be a simple feature to add and just needs a little JS, PHP, or Python to construct the feed for each user. (I know because I did just that back when Nebulus had user accounts.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Privacy Minded
&lt;/h3&gt;

&lt;p&gt;If you are security and privacy-focused like I am, don't rely on the major social networks to show you everything from everyone you followed. Also don't feel obligated to sign up for everyone's email list just because you like a single post. RSS feeds, created years ago, solve many issues with privacy that we see today.&lt;/p&gt;

&lt;p&gt;The big social networks tweak the data we see. Most email lists want our name and other data on top of our email address. Why bother with any of these when we can grab the XML data from a feed and see everything without compromising our privacy?&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Find a Hidden RSS Feed
&lt;/h2&gt;

&lt;p&gt;Many blogs run on WordPress and (unless turned off) have an XML page just itching for use. If you are on a site's homepage try typing "/feed.xml," "atom.xml", or "rss.xml" you may be surprised to find one even they don't advertise it.&lt;/p&gt;

&lt;p&gt;Another way is to use the Feeder app I mentioned above. In the app select "add feed" form the three dots in the top right. Then enter the URL of the site you want to add. Feeder will search the site for the proper XML file to attach. It's super easy!&lt;/p&gt;

</description>
      <category>rss</category>
      <category>privacy</category>
      <category>feeder</category>
      <category>data</category>
    </item>
    <item>
      <title>Experience Switching To The Dvorak Keyboard</title>
      <dc:creator>J. R. Swab</dc:creator>
      <pubDate>Fri, 11 Oct 2019 13:24:56 +0000</pubDate>
      <link>https://dev.to/jrswab/experience-switching-to-the-dvorak-keyboard-2b3b</link>
      <guid>https://dev.to/jrswab/experience-switching-to-the-dvorak-keyboard-2b3b</guid>
      <description>&lt;p&gt;Back in October of 2017, I chose to drop QWERTY cold turkey and force myself to learn how to type on the Dvorak Simplified Keyboard. I tried to accomplish this about a year prior but fell off when I could not type well in either style. I also was not typing a lot back then, so my practice was seldom and a hassle when I needed to type Dvorak.&lt;/p&gt;

&lt;p&gt;This is no fault of the keyboard, the failure was in my inability to discipline myself enough to learn the new layout at that time.&lt;/p&gt;

&lt;p&gt;Fast forward to October 2017 when I did all my daily blogging on STEEM. At this time the pain that QWERTY caused me during any extended typing session was getting out of control, and I chose to make the switch for good.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is The Dvorak Simplified Keyboard
&lt;/h2&gt;

&lt;p&gt;The simplified keyboard is an alternate keyboard layout introduced in 1936 by Dr. August Dvorak and Dr. William Dealey, who happened to be Dr. Dvorak's brother-in-law. This keyboard is now known as the Dvorak Keyboard and is available to use today on all major platforms.&lt;/p&gt;

&lt;p&gt;On this keyboard, the home row differs significantly from what you see on QWERTY. On the left side, you will find nothing but vowels and the right holds the most used consonants. On the top row are the letters used most often only to those on the home row, with the bottom row left for the rarely used keys. This works well since reaching our fingers to the bottom row puts the most strain on our joints.&lt;/p&gt;

&lt;p&gt;For comparison, thirty-two percent of all keystrokes on QWERTY happen on the home row, whereas on Dvorak, the number is seventy percent!&lt;/p&gt;

&lt;p&gt;This limits the amount of distance traveled by our fingers considerably. On QWERTY, the average office worker will move their fingers an average of sixteen miles! While using the Dvorak keyboard, it is only one mile of distance.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Or so I've read.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While the mileage measure is debatable, what is not is the fact the fingers move less on the Dvorak Keyboard and, in turn, reduces strain. Less pain is what I have experienced since making the switch from QWERTY. The only time I find I have pain is when using an awful keyboard like those found on MacBooks. Using my mechanical keyboard mapped to Dvorak gives me no pain at all no matter how much I type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's pretty awesome.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits Over QWERTY
&lt;/h2&gt;

&lt;p&gt;There are many claimed benefits of this old but new keyboard floating around on the internet. Everything from efficiency to comfort to speed increases. While your fingers are only ever going to go so fast, you may still see a slight uptick in your words per minute without as many errors. Even the world record holder for typing speed, Barbara Blackburn, uses the Dvorak Simplified Keyboard!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As of 2005, writer Barbara Blackburn was the fastest alphanumerical English language typist in the world, according to The Guinness Book of World Records. Using the Dvorak Simplified Keyboard, she maintained 150 wpm for 50 minutes, and 170 wpm for shorter periods. Her top speed was 212 wpm. - &lt;a href="https://en.wikipedia.org/wiki/Words_per_minute" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Efficient
&lt;/h3&gt;

&lt;p&gt;Since we are not moving our fingers as much on this keyboard, the efficiency can increase far past that of QWERTY. It's quite logical, and I really like this benefit. One of the most difficult movements for my hand is hitting the backspace, and I do that a lot. Not just because my spelling is trash but because I end up hitting the wrong keys or in the wrong order all the time on QWERTY. (but yes, my spelling is still trash)&lt;/p&gt;

&lt;h3&gt;
  
  
  Comfortable
&lt;/h3&gt;

&lt;p&gt;This keyboard aims to reduce finger strain while typing or at least that is what the biggest supporters claim. This makes sense since the letters were arranged by Dr. Dvorak to achieve minimal finger movement. So in theory that should reduce finger strain.&lt;/p&gt;

&lt;p&gt;In the past when I first learned the Dvorak Simplified Keyboard, I noticed this was true for me. I should have never went back to QWERTY. As I type this my fingers are getting sore and stiff from all the movement. This does not happen when I use Dvorak because my fingers don't have to travel as far as often.&lt;/p&gt;

&lt;p&gt;If you use Dvorak and then go back to QWERTY, you find it feels like your fingers are never on the keyboard but flying above it compared to the Dvorak Simplified Keyboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast
&lt;/h3&gt;

&lt;p&gt;As we mentioned above the world's fasted typer as defined by the Guinness Book Of World Records uses the Dvorak keyboard. So that must mean something right? Yes, it does but switching to Dvorak just for the speed is not a good option. Since you must re-train your muscle memory, your speed will be zero and seem that way for a long time.&lt;/p&gt;

&lt;p&gt;Think about it. You have been typing on a QWERTY keyboard for many years, decades even! There is no way you can increase your speed a ton by moving to Dvorak's keyboard. However, people do get faster &lt;em&gt;over time&lt;/em&gt;. One student posted in the subreddit that after two hundred days of using only the Dvorak keyboard, he is now past his QWERTY speeds. Still impressive since they probably started typing on QWERTY many years ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Switch
&lt;/h2&gt;

&lt;p&gt;After choosing to move to the Dvorak Simplified Keyboard, I soon found out how much of my typing was muscle memory ingrained into my fingers. After typing QWERTY for seventeen years, I was not typing letters and words, but instead expecting a series of muscle memories. Having this deep memory made moving a frustrating experience. The only reason I stuck with it this time was due to the pain in my fingers.&lt;/p&gt;

&lt;p&gt;The first two weeks of only typing in Dvorak were mentally painful. My mind became frustrated, knowing that if I just moved back to QWERTY, I would type so much faster. Layer that on top of all the mistakes and typos I made due to my mind wanting one thing and my fingers wanting another.&lt;/p&gt;

&lt;p&gt;During those first two weeks, I did a lot of typing tutors online meant to teach the user how to type. &lt;a href="https://keybr.com" rel="noopener noreferrer"&gt;Keybr.com&lt;/a&gt; was the most effective at showing me where the letters were. After I had the location down and formed some level of muscle memory, I moved to &lt;a href="http://learn.dvorak.nl/" rel="noopener noreferrer"&gt;learn.dvorak.nl&lt;/a&gt; to type words that I would most likely use in my average day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Aftermath
&lt;/h2&gt;

&lt;p&gt;After the initial two weeks, I was proficient enough to use Dvorak daily with minimal suffering. I was still slow on the keyboard, but, if I took my time, I made a few mistakes, and my hands had no pain. After about a month of forcing myself to use Dvorak, I was at a point where I had no desire to use QWERTY. My speed was still not matched to my old QWERTY speed, but it was bearable.&lt;/p&gt;

&lt;p&gt;At this point, (over a year using only Dvorak) my speed is back to where it was on QWERTY before the switch. I no longer type QWERTY except on my mobile device where it is entirely different muscle memory. There is also no need no move to Dvorak there since the letter spacing allows my thumbs to steer clear of each other. Sometimes I do switch to Dvorak on my mobile device but have yet to do so again after buying the OnePlus 6T.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I tend to be lazy in odd ways.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The only downside to going all in on Dvorak and leaving QWERTY in the dust is now I am unable to touch type QWERTY at old speed. That said, I never made it a point to keep my QWERTY speeds up or even care to save that ability. With today's technology, every device I will ever use can map any keyboard to Dvorak.&lt;/p&gt;

&lt;p&gt;A quick search online will bring up many testimonials of Dvorak users and how long it took them to match their old QWERTY speeds and even surpass them. Like &lt;a href="https://www.reddit.com/r/dvorak/comments/78e19t/dvorak_masterrace/" rel="noopener noreferrer"&gt;this example on /r/dvorak&lt;/a&gt; where the user hit their QWERTY speeds in about 200 days and continues to increase from there. To me, the Dvorak Simplified Keyboard is a keyboard for a lifetime much like Vim is an editor for a lifetime; we will always improve as we use these tools more and more.&lt;/p&gt;

&lt;p&gt;The Dvorak Simplified Keyboard. More &lt;em&gt;Efficient&lt;/em&gt;. More &lt;em&gt;Comfortable&lt;/em&gt;. &lt;em&gt;Faster&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>dvorak</category>
      <category>qwerty</category>
      <category>keyboards</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
