<?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: Topher2014</title>
    <description>The latest articles on DEV Community by Topher2014 (@topher2014).</description>
    <link>https://dev.to/topher2014</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%2F1026519%2Fdb365c75-7d3a-4f1b-bc8c-d18845ea6d08.png</url>
      <title>DEV Community: Topher2014</title>
      <link>https://dev.to/topher2014</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/topher2014"/>
    <language>en</language>
    <item>
      <title>Agile Software Development</title>
      <dc:creator>Topher2014</dc:creator>
      <pubDate>Mon, 24 Apr 2023 04:57:25 +0000</pubDate>
      <link>https://dev.to/topher2014/agile-software-development-28ld</link>
      <guid>https://dev.to/topher2014/agile-software-development-28ld</guid>
      <description>&lt;p&gt;Agile software development is a methodology that is rapidly gaining popularity in the software development industry. It's an approach that emphasizes collaboration, flexibility, and rapid iteration, with a focus on delivering high-quality software products quickly and efficiently.&lt;/p&gt;

&lt;p&gt;In this blog post, we'll take a closer look at the principles of agile development, the benefits of using this methodology, and some best practices to keep in mind when implementing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;p&gt;Agile software development is a methodology that values iterative and incremental development, flexibility, and collaboration. It emphasizes working software over comprehensive documentation, responding to change over following a plan, and customer collaboration over contract negotiation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does it look like in practice?
&lt;/h2&gt;

&lt;p&gt;Sprints: The development process is broken down into smaller, more manageable chunks called sprints. Each sprint typically lasts one to four weeks, and at the end of each sprint, a working piece of software is delivered.&lt;/p&gt;

&lt;p&gt;Daily Stand-ups: Teams hold daily stand-up meetings where they review progress, identify any obstacles or challenges, and plan for the day ahead.&lt;/p&gt;

&lt;p&gt;Backlog: The product backlog is a prioritized list of features or requirements for the software. At the start of each sprint, the team selects the items they will work on during the sprint from the backlog.&lt;/p&gt;

&lt;p&gt;User Stories: User stories are short descriptions of a feature or requirement, written from the perspective of the end-user. User stories help ensure that the software is being developed with the user in mind.&lt;/p&gt;

&lt;p&gt;Continuous Integration: Continuous integration is the practice of regularly merging code changes into a shared repository, allowing the team to catch and fix issues early.&lt;/p&gt;

&lt;p&gt;Retrospectives: At the end of each sprint, the team holds a retrospective meeting to review what went well, what didn't go well, and identify areas for improvement.&lt;/p&gt;

&lt;p&gt;Test-Driven Development: Test-driven development involves writing tests before writing the code. This helps ensure that the code is working as intended and reduces the risk of introducing bugs.&lt;/p&gt;

&lt;p&gt;Agile Project Management Tools: Agile software development is often supported by project management tools, such as JIRA or Trello, which help teams manage the backlog, track progress, and collaborate more effectively.&lt;/p&gt;

&lt;p&gt;The principles of agile software development were first laid out in the Agile Manifesto, a document created by a group of software developers in 2001. The Agile Manifesto consists of four core values and twelve principles, which are...&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Core Values, according the authors
&lt;/h2&gt;

&lt;p&gt;Individuals and interactions over processes and tools&lt;/p&gt;

&lt;p&gt;Working software over comprehensive documentation&lt;/p&gt;

&lt;p&gt;Customer collaboration over contract negotiation&lt;/p&gt;

&lt;p&gt;Responding to change over following a plan&lt;/p&gt;

&lt;h2&gt;
  
  
  The Twelve Principles, according to the authors
&lt;/h2&gt;

&lt;p&gt;Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.&lt;br&gt;
Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.&lt;br&gt;
Deliver working software frequently, with a preference for the shorter timescale.&lt;br&gt;
Business people and developers must work together daily throughout the project.&lt;br&gt;
Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.&lt;br&gt;
The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.&lt;br&gt;
Working software is the primary measure of progress.&lt;br&gt;
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.&lt;br&gt;
Continuous attention to technical excellence and good design enhances agility.&lt;br&gt;
Simplicity--the art of maximizing the amount of work not done--is essential.&lt;br&gt;
The best architectures, requirements, and designs emerge from self-organizing teams.&lt;br&gt;
At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&lt;br&gt;
Benefits of Agile Software Development&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefites of Agile Software Development
&lt;/h2&gt;

&lt;p&gt;Faster time to market: Agile development allows teams to deliver working software in shorter timeframes, which can help companies bring products to market faster.&lt;/p&gt;

&lt;p&gt;Increased flexibility: Agile development is designed to be flexible and responsive to changing requirements and market conditions. This can help teams adapt quickly to new challenges and opportunities.&lt;/p&gt;

&lt;p&gt;Improved collaboration: Agile development emphasizes teamwork, communication, and collaboration, which can help improve team morale and productivity.&lt;/p&gt;

&lt;p&gt;Better quality: Agile development includes frequent testing and quality checks, which can help identify and address issues early in the development process.&lt;/p&gt;

&lt;p&gt;Higher customer satisfaction: Agile development places a strong emphasis on customer collaboration and feedback, which can help ensure that the final product meets customer needs and expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Here are some best practices to keep in mind when implementing agile software development:&lt;/p&gt;

&lt;p&gt;Start with a clear plan: While agile development is flexible and adaptable, it's still important to have a clear plan in place before you start. This can help ensure that everyone is on the same page and working towards the same goals.&lt;/p&gt;

&lt;p&gt;Emphasize communication: Communication is key to agile development. Make sure your team members are communicating regularly and effectively, and that you have a process in place for managing communication.&lt;/p&gt;

&lt;p&gt;Focus on delivering working software: One of the core principles of agile development is delivering working software frequently. Make sure you're prioritizing this goal and adjusting&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Effective Ways to Procrastinate</title>
      <dc:creator>Topher2014</dc:creator>
      <pubDate>Sun, 23 Apr 2023 00:03:05 +0000</pubDate>
      <link>https://dev.to/topher2014/effective-ways-to-procrastinate-28pj</link>
      <guid>https://dev.to/topher2014/effective-ways-to-procrastinate-28pj</guid>
      <description>&lt;p&gt;Have you ever found yourself coding and thought, "I'm just being too efficient right now"? Well, you're in luck. Today I'll be covering some of my favorite ways to procrastinate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;First I'll cover some of my favorite resources for procrastinating, starting with Reddit. &lt;br&gt;
Next time you find yourself getting too much work done, go ahead and jump on over to reddit.com. You'll find all kinds of wonderfully useless subreddits that cater to all tastes. I will warn you, however, that some subreddits can actually provide some useful information. It will be up to you to avoid these.&lt;/p&gt;

&lt;p&gt;A recent addition to list of time-wasting resources (that I'm very excited to share with you), is &lt;a href="https://whackamole.onrender.com/highscores"&gt;https://whackamole.onrender.com/highscores&lt;/a&gt;. This is an excellent time-wasting game that was made by a coding friend of mine, Nick. I can't tell you how much time I've spent on this game instead of working on important projects.&lt;br&gt;
Another great resource for dawdling is Youtube. I'd suggest finding a mildly interesting video and really let Youtube's algorithm take over from there.&lt;/p&gt;

&lt;p&gt;My final resource for delaying important tasks is Quora. Quora is a tremendous resource for scrolling through user-asked and answered questions. The really great thing about Quora is that you'll often feel like you're learning while you're using it, but realize later that you didn't retain any of the information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategies
&lt;/h2&gt;

&lt;p&gt;Now that I've provided some resources, let's go over a few of my favorite strategies for really supercharging your procrastination. &lt;br&gt;
First, you're going to want to start with your schedule. Go ahead and divide your schedule up into 15 minute increments. At first this might seem ineffective, that you'll allow yourself a reasonable 15 minutes to take a break and then get back to work. The genius here, however, it that you can simply blow past that 15 minute mark by only a minute or so and think to yourself, "well, I might as well go for another 15 minutes." You can utilize this strategy for quite a while until the shame forces you back to work.&lt;br&gt;
In the same vein, you can divide your day up more effectively to lend itself to lag. Tell yourself you just need to warm up in the morning, then after lunch you can tell yourself you need a bit longer to get back in the groove. Before you know it, you'll realize it's already evening-time and you're both too tired too continue and you've also gotten absolutely nothing done all day.&lt;/p&gt;

&lt;p&gt;Next, you're going to want to bring your phone into the mix. One thing I've found terrible for my procrastination is divvying up my workspaces; putting time-wasting activities in their own workspace. My work efficiency was unfortunately greatly increased as a result. A great workaround was to incorporate my phone. Now, instead of needing to switch to my time-wasting workspace, I can just pull out my phone and scroll through one of the resources listed above. The great thing about this trick is that sometimes you genuinely do need to access your phone, such as using a password manager. This makes it quite easy to transfer from legitimate work to work postponement.&lt;br&gt;
My final strategy for effectively getting little done is to delve into some web-search rabbit-holes. Run across some code you don't fully understand or a frustrating bug? At this point I would follow the conventional wisdom to Google it. You may be tempted to simply find your answer and move on, but this isn't really the best way. The key here is to really allow yourself to get caught up in ancillary links and information that you don't really need. As with Quora, I find this method particularly effective in that I often find myself feeling like I'm learning useful information but come to find it's all been for naught and that I don't actually remember any of it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;These are just a few of my favorite procrastination hacks. Feel free to reach out if you'd like some more tips on how to successfully put off doing real work. And, as always, feel free to leave feedback in comments. I'm always on the lookout for more useful strategies for not getting anything done.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Improve Your Coding with ChatGPT</title>
      <dc:creator>Topher2014</dc:creator>
      <pubDate>Sat, 22 Apr 2023 23:26:09 +0000</pubDate>
      <link>https://dev.to/topher2014/improve-your-coding-with-chatgpt-47lg</link>
      <guid>https://dev.to/topher2014/improve-your-coding-with-chatgpt-47lg</guid>
      <description>&lt;p&gt;As a coder, it’s important to have access to tools that can help you improve your productivity and efficiency. One such tool is ChatGPT, a large language model trained by OpenAI. With its natural language processing capabilities, ChatGPT can be used as a coding assistant to help with a wide range of tasks. In this blog post, we’ll dive into some specific examples of how coders can use ChatGPT to streamline their workflow and become more effective at their jobs.&lt;/p&gt;

&lt;p&gt;Generating code snippets&lt;br&gt;
ChatGPT can generate code snippets for a wide range of programming languages. This is particularly useful when you’re working on a project in a language you’re not familiar with, or when you need to implement a feature that you haven’t worked with before. For example, if you’re working on a web application and you need to add a carousel to the homepage, you can ask ChatGPT for a code snippet for a carousel in JavaScript.&lt;/p&gt;

&lt;p&gt;Finding solutions to coding problems&lt;br&gt;
Coders often run into issues that they’re not sure how to solve. When this happens, ChatGPT can be a useful resource for finding solutions. For example, if you’re trying to integrate a third-party API into your application and you’re getting an error message that you don’t understand, you can ask ChatGPT for help. ChatGPT can provide you with information on what the error message means, and suggest potential solutions to the problem.&lt;/p&gt;

&lt;p&gt;Learning new programming concepts&lt;br&gt;
ChatGPT can also be used to learn new programming concepts. This is particularly useful when you’re just starting out with a new language or framework. For example, if you’re new to React and you’re not sure how to create a component, you can ask ChatGPT for an explanation. ChatGPT can provide you with a clear and concise explanation of how React components work, and provide you with code examples to help you get started.&lt;/p&gt;

&lt;p&gt;Collaborating with other coders&lt;br&gt;
ChatGPT can be a useful tool for collaborating with other coders. For example, if you’re working on a project with a remote team and you need to share code snippets, you can use ChatGPT to do so. ChatGPT can also be used to facilitate communication between team members, allowing everyone to stay on the same page and work more effectively together.&lt;/p&gt;

&lt;p&gt;Writing better code&lt;br&gt;
Finally, ChatGPT can be used to help you write better code. For example, if you’re writing a function and you’re not sure if it’s efficient, you can ask ChatGPT for advice. ChatGPT can provide you with information on best practices for writing efficient code, and suggest ways to optimize your function.&lt;/p&gt;

&lt;p&gt;In conclusion, ChatGPT can be a valuable tool for coders. It can help with everything from generating code snippets to finding solutions to coding problems, learning new programming concepts, collaborating with other coders, and writing better code. By incorporating ChatGPT into your workflow, you can become a more efficient and effective coder.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Terminal Tips &amp; Tricks</title>
      <dc:creator>Topher2014</dc:creator>
      <pubDate>Sun, 12 Mar 2023 05:37:31 +0000</pubDate>
      <link>https://dev.to/topher2014/terminal-tips-tricks-h9n</link>
      <guid>https://dev.to/topher2014/terminal-tips-tricks-h9n</guid>
      <description>&lt;p&gt;Hello there. Today I'll be going over some handy tricks for navigating the terminal. As with my &lt;a href="https://dev.to/topher2014/qmk-and-keyboards-3g2c"&gt;last blog post&lt;/a&gt; about keyboards and its software, QMK, this will not be an in depth technical post. A quick web search will provide endless pages of technical guides; this is meant to simply show some tricks that I've found useful and to inspire you to search out your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aliases
&lt;/h2&gt;

&lt;p&gt;The first trick I'm going to cover is aliases. If you only take one thing away from this post, let it be this. Aside from using tab completion when entering commands, I can't think of an easier feature to implement that will save more time, reduce more typing, and increase workflow efficiency than aliases do.&lt;br&gt;
Let's imagine a scenario. You're currently in a coding bootcamp, you're starting a new day of instruction at 8am, and you've just fired up a terminal window to work on your project. You need to get to your school folder, so you cd into Desktop, then cd into your school directory, then cd into the course directory, then cd into the project directory, then cd into the GitHub directory. Or, if you're really slick you just cd Desktop/School/Phase3/Project/GitHub, maybe even using tab completion to speed things up. But yeesh, that's still a lot of typing. Surely there's a better way? Well, there is!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop ~]$ Project 
[topher@TDesktop repo]$ pwd
/home/topher/Desktop/Flatiron/Phase3/Project/repo
[topher@TDesktop repo]$ 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is this black sorcery, you ask? Let's take a peek at my .bashrc file to find out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop ~]$ cat .bashrc 

alias Project='cd ~/Desktop/Flatiron/Phase3/Project/repo'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, I've created an alias so that I can simply enter "Project" instead of "cd ~/Desktop/Flatiron/Phase3/Project/repo".&lt;br&gt;
Let's take a more complete view of my .bashrc for some more examples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Command Aliases ###

# list 6 most recent files
alias lst='ls -lat | head -6'

# list all files, w/ color
alias ls='ls -la --color=auto'

# disk usage in human readable format, w/ max recursive depth of 1
alias du='du -hd1'

# tree w/ directories only
alias tree='tree -d'

# cd to last created directory
alias Ld='cd "$(\ls -1dt ./*/ | head -n 1)"'

# abbreviation for clear
alias c='clear'

# clear terminal buffer and list directory
alias cl='clear &amp;amp;&amp;amp; ls'

### Flatiron Folder Aliases ###

alias Flatiron='cd ~/Desktop/Flatiron'
#alias Phase3='cd ~/Desktop/Flatiron/Phase3'
alias Project='cd ~/Desktop/Flatiron/Phase3/Project/repo'

### Functions ###

# Git clone clipboard and cd into newly created folder
function Git(){
    git clone $1
    cd  "$(\ls -1dt ./*/ | head -n 1)"
}

# Everything above, but open VSCode after
function GitCode(){
    git clone $1
    cd  "$(\ls -1dt ./*/ | head -n 1)"
    code .
}

# Everything above, but install npm before opening VSCode
function GCN(){
    git clone $1
    cd  "$(\ls -1dt ./*/ | head -n 1)"
    npm install
    code .
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last one clones the GitHub repo, cds into the new repo, installs npm, then opens VSCode, and all you have to do is prepend GCN to the GitHub URL. Pretty neat, huh? If you'd like to run the command without the alias, simply prepend a backslash to the command, like so...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Temp]$ ls
total 8
drwxr-xr-x 2 topher topher 4096 Mar 11 19:45 .
drwxr-xr-x 7 topher topher 4096 Mar 11 19:45 ..
-rw-r--r-- 1 topher topher    0 Mar 11 19:45 ThisIsATempFile
[topher@TDesktop Temp]$ \ls
ThisIsATempFile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where to put the aliases will depend on your OS and shell. I use Linux with Bash, so I could put my aliases is a number of files, including .profile, bash_profile, or .bashrc. I feel it's best to put them in .bashrc. Google your OS and shell to confirm where is best to place the commands is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tree
&lt;/h2&gt;

&lt;p&gt;Another useful tool while navigating the terminal is tree (which you can see I've made an alias for in my .bashrc). Most people are used to using a GUI file explorer in either a desktop environment or window manager, so it can get a bit confusing sometimes orienting yourself when you're using the terminal. Tree is a great tool to help do this. Let's see an example. Imagine we're trying to move a file to a different directory. We're starting in Temp/, trying to move Temp/Demo1/Demo3/file3 to Temp/Demo2...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 16
drwxr-xr-x 4 topher topher 4096 Mar 11 20:20 .
drwxr-xr-x 9 topher topher 4096 Feb 25 19:32 ..
drwxr-xr-x 4 topher topher 4096 Mar 11 20:21 Demo1
drwxr-xr-x 2 topher topher 4096 Mar 11 20:21 Demo2
[topher@TDesktop Temp]$ ls Demo1/
total 16
drwxr-xr-x 4 topher topher 4096 Mar 11 20:21 .
drwxr-xr-x 4 topher topher 4096 Mar 11 20:20 ..
drwxr-xr-x 2 topher topher 4096 Mar 11 20:24 Demo3
drwxr-xr-x 2 topher topher 4096 Mar 11 20:24 Demo4
-rw-r--r-- 1 topher topher    0 Mar 11 20:20 file1
[topher@TDesktop Temp]$ ls Demo1/*
-rw-r--r-- 1 topher topher    0 Mar 11 20:20 Demo1/file1

Demo1/Demo3:
total 8
drwxr-xr-x 2 topher topher 4096 Mar 11 20:24 .
drwxr-xr-x 4 topher topher 4096 Mar 11 20:21 ..
-rw-r--r-- 1 topher topher    0 Mar 11 20:24 file3

Demo1/Demo4:
total 8
drwxr-xr-x 2 topher topher 4096 Mar 11 20:24 .
drwxr-xr-x 4 topher topher 4096 Mar 11 20:21 ..
-rw-r--r-- 1 topher topher    0 Mar 11 20:24 file4
[topher@TDesktop Temp]$ ls Demo2/
total 8
drwxr-xr-x 2 topher topher 4096 Mar 11 20:21 .
drwxr-xr-x 4 topher topher 4096 Mar 11 20:20 ..
-rw-r--r-- 1 topher topher    0 Mar 11 20:21 file2

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty difficult to visualize where in the file structure we are and are tying to get to, let alone to articulate. Let's see it again with tree (note the preceding backslash to negate the alias).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Temp]$ \tree
.
├── Demo1
│   ├── Demo3
│   │   └── file3
│   ├── Demo4
│   │   └── file4
│   └── file1
└── Demo2
    └── file2

5 directories, 4 files

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much easier to keep track of where we are and where everything is. It's also much easier to explain our file structure with this as a visual. Let's move that file and run tree again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Temp]$ mv Demo1/Demo3/file3 Demo2/
[topher@TDesktop Temp]$ \tree
.
├── Demo1
│   ├── Demo3
│   ├── Demo4
│   │   └── file4
│   └── file1
└── Demo2
    ├── file2
    └── file3

5 directories, 4 files

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool beans, huh?!&lt;br&gt;
Tree can also be a useful substitute or companion to pwd.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Temp]$ pwd
/home/topher/Desktop/Temp
[topher@TDesktop Temp]$ tree -L 1 ..
..
├── Documents
├── Downloads
├── Flatiron
├── Pictures
├── Purgatory
├── QMK
└── Temp

8 directories

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Take notice that since this time I did not prepend tree with a backslash, tree is using my alias that causes it to only display folders, not files. The proceeding "-L 1" is telling tree go one level deep, while ".." is telling tree to run on the previous folder, Desktop.&lt;br&gt;
Pwd and ls are essential tools, but tree can be really helpful to give a fuller picture.&lt;/p&gt;
&lt;h2&gt;
  
  
  Head and Tail
&lt;/h2&gt;

&lt;p&gt;You may have noticed that I used head in my .bashrc in my ls alias. This is one of my favorite command combinations. Imagine another scenario... Let's say you're online sailing the high seas, matey. You're using your favorite torrent or Usenet client (if you're a fellow buccaneer and haven't tried Usenet yet, I highly recommend it). You've got a couple of new files in your Downloads folder and would like to transfer them (you should have this automated, but just humor me). Lets use the ol' ls command to check out the Downloads folder...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Downloads]$ ls
total 8468004
drwxr-xr-x 14 topher topher      20480 Mar 11 18:10  .
drwxr-xr-x  9 topher topher       4096 Feb 25 19:32  ..
-rw-r--r--  1 topher topher 1954545664 Oct 30  2021  2021-10-30-raspios-bullseye-armhf-lite.img
-rw-r--r--  1 topher topher  485827056 Dec 17  2021  2021-10-30-raspios-bullseye-armhf-lite.zip
-rw-r--r--  1 topher topher     205388 Feb  7 18:11  3309965714262467221.jpg
-rw-r--r--  1 topher topher     112904 Jul 28  2022  4768872250852101121.jpg
-rw-r--r--  1 topher topher      18146 Dec 23 12:25  52116190237_64d77291d7_o.jpg
drwxrwxr-x  2 topher topher       4096 Feb 13  2022  578d2295a13a246c9a061143ced0ab22-f4509832c1b5acbe4d2d09c9c0560f3ba4ff33e6
-rw-rw-r--  1 topher topher       2240 Feb 13  2022  578d2295a13a246c9a061143ced0ab22-f4509832c1b5acbe4d2d09c9c0560f3ba4ff33e6.zip
-rw-r--r--  1 topher topher     145534 Jul 28  2022  6126558894253767245.jpg
-rw-r--r--  1 topher topher     496128 Aug 23  2022  alsa-lib-1.2.7.1-1-x86_64.pkg.tar.zst
-rw-r--r--  1 topher topher     496285 Aug 23  2022  alsa-lib-1.2.7.2-1-x86_64.pkg.tar.zst
-rw-r--r--  1 topher topher      61195 Aug 23  2022  alsa-ucm-conf-1.2.7.1-1-any.pkg.tar.zst
-rw-r--r--  1 topher topher      62057 Aug 23  2022  alsa-ucm-conf-1.2.7.2-1-any.pkg.tar.zst
-rw-r--r--  1 topher topher  846540800 Mar  4  2022  archlinux-2022.03.01-x86_64.iso
-rw-r--r--  1 topher topher      48034 Mar  1  2022  archlinux-2022.03.01-x86_64.iso.torrent
-rw-r--r--  1 topher topher      40957 Jan 26 11:14  August_Burns_Red_Rescue_and_Restore_WEB_2013_ENTiTLED_iNT.nzb
-rw-r--r--  1 topher topher    2204143 Jul 14  2022  b30953_397a700285664bcb81e53bd47175c744~mv2.png
-rw-r--r--  1 topher topher      29315 Apr 14  2022  BackupPasswords
-rw-r--r--  1 topher topher        159 Dec 13  2021  bash_profile
drwxr-xr-x  4 topher topher       4096 Nov 22 01:52  BillySkydive
drwxr-xr-x  2 topher topher       4096 Jul  8  2022  bin
-rw-r--r--  1 topher topher    3135669 Feb 17 09:05  Challenge-1-Bank-of-Flatiron-021023.zip
-rw-r--r--  1 topher topher       6440 Nov  8 20:49 'ch.protonvpn.net.udp(1).ovpn'
-rw-r--r--  1 topher topher       6445 Nov  8 20:49  ch.protonvpn.net.udp.ovpn
-rw-r--r--  1 topher topher      35375 Mar  8 14:42  ClockworkOrange.jpg
-rw-r--r--  1 topher topher   14954416 Mar  8 15:17  code-1.56.2-3-x86_64.pkg.tar.zst
-rw-r--r--  1 topher topher     834804 Jul  8  2022  code-challenge.bundle
-rw-r--r--  1 topher topher      27754 Mar 13  2022  download
-rw-r--r--  1 topher topher     121586 Apr 14  2022  Dropbox.zip
-rw-rw-r--  1 topher topher       6148 Feb 15  2022  DS_Store
-rw-r--r--  1 topher topher  143534080 Apr 12  2022  emby-server-synology7_4.6.7.0_x86_64.spk
-rw-r--r--  1 topher topher    4563318 Aug 15  2022  embyserver.txt
-rw-r--r--  1 topher topher  155330168 Aug 16  2022  emby-theater-flatpak_3.0.16_x86_64.flatpak
-rw-r--r--  1 topher topher  152959333 Aug 16  2022 'emby-theater-rpm_3.0.16_x86_64(1).rpm'
-rw-r--r--  1 topher topher  152959333 Aug 15  2022  emby-theater-rpm_3.0.16_x86_64.rpm
-rw-r--r--  1 topher topher     248611 Jan 14 14:37  epic_handshake_meme-e1534136962951.png
-rw-r--r--  1 topher topher       8467 Jul 10  2022 'es.protonvpn.net.udp(1).ovpn'
-rw-r--r--  1 topher topher       8447 Jul 10  2022 'es.protonvpn.net.udp(2).ovpn'
-rw-r--r--  1 topher topher       8497 Jul 10  2022  es.protonvpn.net.udp.ovpn
-rw-r--r--  1 topher topher       8769 Dec 21 11:14  example-code-challenge-2021-02-24.zip
drwxr-xr-x  3 topher topher       4096 Mar 10 18:46 'Experimental BDN9 Streamdeck'
-rw-r--r--  1 topher topher       8495 Mar 10 18:44 'Experimental BDN9 Streamdeck-20230311T024437Z-001.zip'
-rw-r--r--  1 topher topher     118590 Mar 10 21:20  ffdlSQBsKMtpYFd8h9IMAHbqE9c9GWrAZoa6m8Yb_GA.webp
-rw-r--r--  1 topher topher       1956 Mar 12  2022  firewallConfig.rsc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yikes. That's a lot of output, and that's only maybe 1/4 of my Downloads folder. That's pretty unsightly, not to mention some terminals won't have the buffer space to let you look through everything. Let's run ls again, but this time let's use head to only show a few files. I'm also going to add "-t" so that files are listed by modified date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Downloads]$ ls -t | head -4
total 8468004
drwxr-xr-x 14 topher topher      20480 Mar 11 18:10 .
-rw-r--r--  1 topher topher       9534 Mar 11 18:10 images.jpeg
-rw-r--r--  1 topher topher    1167107 Mar 10 22:08 Screenshot_20230310-220720~2.png

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aaaah, much better. You can see I've run ls with the -t flag. The "|" is a pipe, which I'll cover in the next and final section. Finally, we come to "head -4". In this particular use, head is shortening the output to four lines: the total, the "." representing the current directory, and then our two most recent files.&lt;br&gt;
Tail does the same thing, just for the final output instead of the first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Downloads]$ ls -t | tail -4
-rw-rw-r--  1 topher topher  100341760 Dec 23  2021 PlexMediaServer-1.25.2.5319-c43dc0277-x86_64_DSM7.spk
-rw-r--r--  1 topher topher  485827056 Dec 17  2021 2021-10-30-raspios-bullseye-armhf-lite.zip
-rw-r--r--  1 topher topher        159 Dec 13  2021 bash_profile
-rw-r--r--  1 topher topher 1954545664 Oct 30  2021 2021-10-30-raspios-bullseye-armhf-lite.img

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Head and tail can be a really handy tools when you're working with a lot files/output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipe
&lt;/h2&gt;

&lt;p&gt;As promised, this final section will cover pipe. I don't want to get too in the weeds with this one, because you absolutely can, but the important thing to know about pipes is that they &lt;br&gt;
redirect output to another destination. Here's a simple example using cat and sort...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[topher@TDesktop Demo1]$ cat file1 
g
o
f
u
c
k
y
o
u
r
s
e
l
f
,
s
a
m
:)
[topher@TDesktop Demo1]$ cat file1 | sort
,
:)
a
c
e
f
f
g
k
l
m
o
o
r
s
s
u
u
y

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, cat output the contents of file1 and was "piped" to sort, which sorted the contents. This may not seem super impressive, but it's very useful when you're chaining commands together or using scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;As I said, this post was not meant to be a super exhaustive technical read. The main point I want to get across is that if you find yourself wishing something were simpler or more automated while using the terminal, chances are you can achieve that. Hopefully I've sparked your imagination and you'll go search out some awesome terminal tricks of your own. And if you have any that you find useful, leave them in the comments!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>QMK and Keyboards!</title>
      <dc:creator>Topher2014</dc:creator>
      <pubDate>Sat, 11 Mar 2023 06:10:16 +0000</pubDate>
      <link>https://dev.to/topher2014/qmk-and-keyboards-3g2c</link>
      <guid>https://dev.to/topher2014/qmk-and-keyboards-3g2c</guid>
      <description>&lt;p&gt;Today I'll be introducing you to the wonderful world of mechanical keyboards, as well as the awesome keyboard software QMK. This is not meant to be an exhaustive technical tutorial, but rather an overview of some of the wonderful keyboards and paraphernalia that are out there for you to discover, though I will add some links to documentation at the bottom. I know what you must be thinking... "Topher, I already have a keyboard and it works just fine. And besides, keyboards are just a means to an end, a boring thing I have to use to type out words." Well, buckle up, boys and girls, and prepare to be dazzled.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hardware
&lt;/h2&gt;

&lt;p&gt;The first thing we'll cover are the keyboards themselves.&lt;br&gt;
Whether you want a big keyboard, like this (not my keyboard)...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--81_MHJzU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7wi7nqrcs7h8qedepku.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--81_MHJzU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7wi7nqrcs7h8qedepku.jpg" alt="Not my keyboard" width="880" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or a little keyboard, like these...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r_a4C5Pf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n72ds2ivxjn9rwfyh0kb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r_a4C5Pf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n72ds2ivxjn9rwfyh0kb.jpg" alt="Image description" width="880" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That last one is a split-board that provides better ergonomics, as the sides can be moved apart so your wrists are constantly bent while you're typing.&lt;/p&gt;

&lt;p&gt;You can make whatever you want.&lt;/p&gt;

&lt;p&gt;I know what you're thinking now... "Gee, Topher, I just don't have the time or skills to make something like that." Hogwash! You can put together a custom keyboard that is no harder to assemble than a Lego set. You just get a case, a pcb, some switches and keycaps, and plug everything in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SBh2XY-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rd2hse42n8dfim42cbp4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SBh2XY-B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rd2hse42n8dfim42cbp4.jpg" alt="Image description" width="880" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe, however, you'd like something a bit more challenging or custom. Well, you can do that too. Further to the other end of the difficulty spectrum, here's one with a handwired matrix/microcontroller, a brass plate designed in CAD, and a case milled from a piece of wood.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fKuPNkY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldi9jpk3vadu7x5rcylc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fKuPNkY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldi9jpk3vadu7x5rcylc.jpg" alt="Image description" width="880" height="1173"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LEfi5Js2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzt4umze82my1z4mdqkf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LEfi5Js2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzt4umze82my1z4mdqkf.jpg" alt="Image description" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vuwluGGK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zgqcopveaxqxyx1a8cxe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vuwluGGK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zgqcopveaxqxyx1a8cxe.jpg" alt="Image description" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g7xEiwUw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dp8kjyvi4f0skualhqf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g7xEiwUw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dp8kjyvi4f0skualhqf.png" alt="Image description" width="880" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keycaps in your favorite color and thickness, artisanal keycaps, switches with your preferred tactility and sound, piezo speakers, RGB lighting, rotary encoders... the list of customization you can achieve is endless.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Software
&lt;/h2&gt;

&lt;p&gt;Now that we've covered the keyboards, it's on to the really fun part... QMK!&lt;br&gt;
What is QMK, you ask? QMK is a powerful opensource keyboard firmware written in C with TONS of features. I'll cover the basics first, like keymap layouts, and then go over some of the more advanced and fun aspects. Using my keyboard as an example, you can see in the following code what my keymap looks like. The first part, the part commented out, is simply a visual representation of the layout. The section below that with the many "KC_" is the actual code. I'd also like to point out that these can be arranged however you'd like. Maybe you'd prefer the Alt key be where the Ctrl key is, and vice-versa. No problem, just move KC_LCTL to after KC_LALT! You can rearrange and reassign any and every key in just a few seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /* Qwerty
     * ,-----------------------------------------------------------------------------------.
     * | Tab |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * | Ins  | Ctrl | Alt  | GUI  |Lower | Shft |Space |Raise | Left |  Up  | Down |Right |
     * `-----------------------------------------------------------------------------------'
     */
    [_QWERTY] = LAYOUT_ortho_4x12(
            KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
            KC_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,
            MT(MOD_LSFT,KC_CAPS), KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, MT(MOD_RCTL,KC_ENT),
            KC_INS, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   MT(MOD_RSFT,KC_ENT),  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
            ),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ah, and now you're thinking, "But Topher, what about the rest of the keys? Where are the numbers? Where are the chars!? Won't you think of the chars?!" Well, that brings us to another common feature of QMK: &lt;/p&gt;

&lt;h2&gt;
  
  
  Layers
&lt;/h2&gt;

&lt;p&gt;I like to explain layers as being akin to the Shift key, whereas you don't have a separate key for "a" and "A", but rather you press Shift to capitalize the letter. Layers are very similar; one key can perform multiple functions simply with the addition of a second key. Here you can see my "lower" and "upper" layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /* Lower
     * ,-----------------------------------------------------------------------------------.
     * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &amp;amp;  |   *  |   (  |   )  | Del  |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      |FMTPNT| CUT  | COPY |CPYFMT|FNDHLT|      |      | Home | End  |      |      |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * | Sig  |      |      |      |      |      |      |      | Next | PgUp | PgDn | Play |
     * `-----------------------------------------------------------------------------------'
     */
    [_LOWER] = LAYOUT_ortho_4x12(
            KC_ESC, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR,    KC_ASTR,    KC_LPRN, KC_RPRN, KC_DEL,
            KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS,    KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE,
            MT(MOD_LSFT,KC_CAPS), _______, XPASTE, COPY, KC_LALT, _______, _______,  KC_PGDN, KC_PGUP, _______, _______, _______,  
            KC_PSCR, KC_LCTL, KC_LALT, KC_LGUI, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______  
            ),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /* Raise
     * ,-----------------------------------------------------------------------------------.
     * | Esc  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Del  |
     * |------+------+------+------+------+-------------+------+------+------+------+------|
     * |  `   |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
     * |------+------+------+------+------+------|------+------+------+------+------+------|
     * |      | SIG  | RENT | FVTAB|      |      |      |ISO # |ISO / | Home | End  |      |
     * |------+------+------+------+------+------+------+------+------+------+------+------|
     * |PrntSc|      |      |      |      |      |      |      | Next |PgDn  |PgUp  | Play |
     * `-----------------------------------------------------------------------------------'
     */
    [_RAISE] = LAYOUT_ortho_4x12(
            KC_TILD,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL,
            KC_GRV,  KC_F7,   KC_F8,   KC_F9,   KC_F10,   KC_F11,   KC_F12,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS,
            MT(MOD_LSFT,KC_CAPS), _______,  _______,  _______, _______,  _______,  _______,  KC_PGDN, KC_PGUP, _______, _______, _______,  
            KC_PSCR, KC_LCTL, KC_LALT, KC_LGUI, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______ 
            ),

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While I have my layers arranged with an "upper" and "lower" layer (with a further "adjust" layer when both those layers are activated), there are other layer schemes that work as well. One example would be to have your layers stacked, so that your highest layer is layer [3], then further layers on [2], [1], and [0]. &lt;br&gt;
If the idea of a small keyboard sounds frustrating, or the idea of multiple layers daunting, don't fret! You could have a fullsize keyboard, just like the one you have now (or bigger, if you'd like), but with the addition of a single layer that simply has a whole host of macros.&lt;br&gt;
This brings up another common and awesome feature of QMK: &lt;/p&gt;
&lt;h2&gt;
  
  
  Macros
&lt;/h2&gt;

&lt;p&gt;Macros allow all kinds of super useful functions and &lt;em&gt;can&lt;/em&gt; get really involved, but at their most basic macros allow you to instantly and automatically perform multiple keystrokes and functionalities with a single key combination. Let me give you a nifty example. Every programmer is familiar with copy/paste. Here's a macro that copies (Ctrl+c) on keydown and pastes (Ctrl+v) on keyup, meaning you simply hold the key to copy and then release the key when you want to paste.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   case CP:
        // keydown
        if (record-&amp;gt;event.pressed)
        {
            SEND_STRING(SS_LCTL("v"));
        }
        // keyup
        else
        {
            SEND_STRING(SS_LCTL("v"));
        }
        break;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At my last job, I had several macros that simply output text/signatures that I was often typing out, like so...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   case SIG:
        if (record-&amp;gt;event.pressed)
        {
            SEND_STRING("\n\n-Topher Ludlow\nTravel Coordinator\nEmergency Medical Services Authority\nCell: 916-621-****\n");
        }
        else
        {
        }
        break;
        case RENT:
        if (record-&amp;gt;event.pressed)
        {
            SEND_STRING("Send the rental agreement and return receipt to ****@emsa.ca.gov\n");
        }
        else
        {
        }
        break;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhaps, if you're a gamer, you'd like a macro that spams a single keypress. Really, any combination of keys you can think of can be achieved with a macro. &lt;br&gt;
Another feature of QMK are mod-tap keys. These keys allow one function when pressed, while allowing another when tapped. The classic example, which you may have noticed in my first layer, is Shift; tapping it turns caps-lock on, while holding it activates Shift. This keycode look like this: "MT(MOD_LSFT,KC_CAPS)". Another mod-tap key in layer activates Ctrl when held and Enter when tapped: "MT(MOD_RCTL,KC_ENT)".&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;What I've gone over really only begins to scratch the surface of what can be done with QMK. If you like RGB, you can load up any of the numerous existing patterns or completely write your own. If you'd like speakers attached to your keyboard, there's code to turn your keyboard into a... keyboard. Tired of QWERTY? Change your layout to DVORAK. Want to do stenography with your keyboard? Load up the steno protocol. The possibilities are endless, and if you want a feature that doesn't exist yet you can create it! The keyboard community, incidentally, is very welcoming and helpful.&lt;br&gt;
The following links are in order of "eye candy" to "technical", so if you've found any of this intriguing I encourage you to read on and learn more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/MechanicalKeyboards/"&gt;https://www.reddit.com/r/MechanicalKeyboards/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/olkb/"&gt;https://www.reddit.com/r/olkb/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.splitkb.com/introduction-to-qmk-features/"&gt;https://blog.splitkb.com/introduction-to-qmk-features/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/"&gt;https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.qmk.fm/#/"&gt;https://docs.qmk.fm/#/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
