<?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: Gaveen Prabhasara</title>
    <description>The latest articles on DEV Community by Gaveen Prabhasara (@gaveen).</description>
    <link>https://dev.to/gaveen</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%2F96190%2F73d212e9-20ea-4a05-9ba2-ef8f77c4c7be.png</url>
      <title>DEV Community: Gaveen Prabhasara</title>
      <link>https://dev.to/gaveen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaveen"/>
    <language>en</language>
    <item>
      <title>Understanding the Linux Boot Sequence</title>
      <dc:creator>Gaveen Prabhasara</dc:creator>
      <pubDate>Sat, 21 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/gaveen/understanding-the-linux-boot-sequence-53p3</link>
      <guid>https://dev.to/gaveen/understanding-the-linux-boot-sequence-53p3</guid>
      <description>&lt;p&gt;In my previous post on the Asura Linux blog, I introduced Asura Linux as an Open Source project to experiment with different ways of building and running modern general-purpose Linux systems—and to share what we learn along the way. I explained why the Asura Linux Project exists and what I was thinking about the immediate future. If you haven't seen it, &lt;a href="https://blog.asuralinux.org/2023/10/hello-world/"&gt;please have a look&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In my excitement about introducing the project, I promised to publish the second blog post about the Linux boot process shortly. If you are following &lt;a href="https://hachyderm.io/@gaveen"&gt;me&lt;/a&gt; (or &lt;a href="https://fosstodon.org/@asuralinux"&gt;Asura Linux&lt;/a&gt;) on the fediverse, you may have seen a couple of updates since then. In summary, I suffered from multiple back-to-back health issues related to a viral flu. Whenever I wasn't in bed, I still had to catch up with work, even though I was in no condition to work. Since I'm finally feeling close enough to normal, let's begin without further ado.&lt;/p&gt;




&lt;p&gt;When I started using Linux, I didn't feel I grasped what was going on with my computer until I could make sense of the long swaths of text that flew by during the boot time. While most of the latter part of the boot sequence showed me the statuses of starting system services, I could see there were different stages to the boot sequence.&lt;/p&gt;

&lt;p&gt;The boot sequence is the first user experience (UX) when interacting with a computer. It starts by powering up the hardware, giving the firmware the control, which ultimately hands over the boot process to the software in the computer before a user can interact with their productive work. From both technical and UX perspectives, the boot sequence marks a good starting point to discuss running Linux.&lt;/p&gt;

&lt;p&gt;This post discusses the Linux boot sequence specifics under three scenarios: the past, present, and future. Therefore, let's start by understanding the overall generic process along with a few key concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Generic Boot Sequence
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Power On&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The computer motherboard and the rest of the essential electronics are powered up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firmware Initialization&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The firmware (usually stored in a chip) starts running.&lt;/li&gt;
&lt;li&gt;The firmware makes sure the essential hardware components are functional.

&lt;ul&gt;
&lt;li&gt;If there are errors, they are indicated (e.g., via sounds, lights, and messages)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The firmware then tries to read a bootable device based on the configured boot order.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading the Boot Device&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A boot device (usually a specific section) is read.&lt;/li&gt;
&lt;li&gt;This location contains either a bootloader or further instructions to locate one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootloader&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A bootloader is a program configured to know how to locate and load an Operating System (OS).&lt;/li&gt;
&lt;li&gt;Sometimes, a bootloader can point to another bootloader instead of an OS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading the Operating System&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The final-stage bootloader program loads the essential parts of the OS into the memory, adhering to any special instructions given.&lt;/li&gt;
&lt;li&gt;It also locates and makes the file systems available for the OS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System Initialization&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The OS usually hands the rest of the boot sequence to a supervisor program that knows how to start and manage software processes.&lt;/li&gt;
&lt;li&gt;The supervisor program then starts/stops systems and application services as configured.&lt;/li&gt;
&lt;li&gt;Finally, the user sees a login prompt when the login service is ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The boot sequence can be considered done when the 'init' system completes starting/stopping necessary background services and finally provides the user with a login prompt.&lt;/p&gt;

&lt;p&gt;Usually, the essential parts of an OS loaded in step 4 include the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kernel&lt;/li&gt;
&lt;li&gt;Initial RAM File System&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;em&gt;Kernel&lt;/em&gt; is the core part of the OS that communicates with the hardware and provides management functions of resources such as tasks, I/O, and memory. Therefore, the kernel is a bare minimum requirement to boot a Linux system. For the convenience of the boot process, it is usually included in a compressed image file that knows how to uncompress and load itself into the system memory. The kernel image file usually carries a name starting with &lt;code&gt;vmlinuz-&lt;/code&gt; and is located in the &lt;code&gt;/boot&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Initial RAM File System&lt;/em&gt; (&lt;code&gt;initramfs&lt;/code&gt; or &lt;code&gt;initrd&lt;/code&gt;) is an archive file that contains the minimum operating environment necessary to successfully mount the root file system, and further boot instructions. It is also located usually in the &lt;code&gt;/boot&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;Next, let's dive into the three scenarios we mentioned above now that we know the stages of the Linux boot sequence. We'll skim over the generic stages and fill in the details relevant to the specifics of each scenario.&lt;/p&gt;




&lt;h2&gt;
  
  
  Boot Process in the Past (BIOS, SysV Init)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Firmware Initialization (BIOS)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Most older computers (and even current ones for compatibility reasons) support a type of firmware known as BIOS.

&lt;ul&gt;
&lt;li&gt;BIOS stands for Basic Input/Output System.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The BIOS firmware has a self-diagnostic state known as Power-on Self-test (POST).

&lt;ul&gt;
&lt;li&gt;POST is responsible for verifying the integrity of BIOS and initializing a few essential system components such as CPU, RAM, and I/O controllers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After initialization, BIOS looks for a bootable device based on the boot order specified in its settings (e.g., floppy disk, hard disk, CD-ROM).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading the Boot Device&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The BIOS-based systems usually support a disk partitioning scheme known as MBR.&lt;/li&gt;
&lt;li&gt;A bootable device is formatted to have a Master Boot Record (MBR), the first 512 bytes of a drive reserved for specific information such as the Partition Table of the particular disk and a few boot instructions.&lt;/li&gt;
&lt;li&gt;The limited space in the Master Boot Record (MBR) is usually insufficient to hold all the instructions to locate and boot an operating system. Therefore, the burden of continuing the boot process is passed to a secondary-stage bootloader stored elsewhere on a disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootloader&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Many bootloader programs such as GRUB/GRUB2 and LILO can boot a BIOS-based Linux system.&lt;/li&gt;
&lt;li&gt;When the final-stage bootloader is ready, its configuration looks for a few specific files on the disk needed to boot an operating system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading the Operating System&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The kernel and the initial RAM disk images are loaded into the memory.&lt;/li&gt;
&lt;li&gt;The tools and the environment included in the initial RAM file system are then used to mount the root file system of the computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System Initialization&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Many Unix-like systems historically support a version of SysV init (and later a spiritual successor named Upstart), configurable using init scripts.&lt;/li&gt;
&lt;li&gt;The init system manages the initialization of user-space services, mounting other file systems, setting up networking, and more.&lt;/li&gt;
&lt;li&gt;SysV init also had a concept of run levels that were presets of configurations for different cases (e.g., single-user mode, multi-user mode, multi-user mode with networking, multi-user mode with networking and GUI, etc.).&lt;/li&gt;
&lt;li&gt;Finally, the user sees a login prompt when the login service is ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A setup like this continues to work, still supported by many current Linux distros and computer hardware. However, as expected from an area of technology as active as general-purpose computing, there are multiple new alternatives with broader features.&lt;/p&gt;

&lt;p&gt;One such alternative is &lt;code&gt;UEFI&lt;/code&gt;. It's a more modern alternative to BIOS developed by an industry consortium. UEFI is increasingly becoming the preferred firmware mode, even when BIOS is available as a fallback.&lt;/p&gt;

&lt;p&gt;On the Linux side, &lt;code&gt;systemd&lt;/code&gt; has been mass adopted as the default init system by most Linux distributions roughly over the past decade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Boot Process in the Present (UEFI, systemd)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Firmware Initialization (UEFI)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Most newer computers support a type of firmware known as UEFI.

&lt;ul&gt;
&lt;li&gt;UEFI stands for Unified Extensible Firmware Interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Instead of a POST stage, UEFI has what is known as the "SEC" (Security) phase and the "PEI" (Pre-EFI Initialization) phase. Once these two stages are completed, the boot process is handed over to the DXE (Driver eXecution Environment) phase and BDS (Boot Device Selection) phase, which makes sure the system's hardware is in a functional state and attempts to locate and boot from the boot device. &lt;/li&gt;
&lt;li&gt;UEFI looks for a valid EFI system partition based on the boot order to boot from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading the Boot Device&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;UEFI-based systems usually support a disk partitioning scheme known as GUID Partition Table (GPT). However, they also support MBR partitioned disks via the Compatibility Support Module (CSM).&lt;/li&gt;
&lt;li&gt;The EFI System Partition (ESP) is a small FAT32 partition with a specific directory structure that contains executable EFI binaries (e.g., bootloader), boot configuration, UEFI drivers, and kernel images. The EFI partition can be shared by multiple operating systems when dual-booting.&lt;/li&gt;
&lt;li&gt;The bootloader for a UEFI system is usually an executable EFI program signed by the respective OS vendor. This is where Linux diverges from the other OSs.

&lt;ul&gt;
&lt;li&gt;Unlike Windows or macOS, Linux doesn't have a single vendor. This means Linux distributions may have different signing processes for the components used during the boot. To overcome this ideological difference, the Linux community came up with what's known as a 'shim'.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;shim&lt;/code&gt; is a pre-compiled, pre-signed EFI program that Linux distributions can use to handle the Secure Boot process. Instead of loading the operating system, the shim loads another bootloader (e.g., GRUB2) preferred by the distro.&lt;/li&gt;
&lt;li&gt;Instead of relying on the UEFI firmware to validate GRUB2's signature, the shim verifies it using the trusted Machine Owner Keys (MOKs) generated during the installation. Then, the shim executes the signed bootloader (e.g., GRUB2) executable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootloader&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;GRUB2 bootloader then loads the Linux kernel.&lt;/li&gt;
&lt;li&gt;As with the bootloader, the kernel (and its modules) must also be signed for the Secure Boot to work. The shim can verify the kernel's signature before allowing it to execute, using its list of Machine Owner Keys (MOKs).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading the Operating System&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The kernel and the initial RAM disk images are loaded into the memory.&lt;/li&gt;
&lt;li&gt;The tools and the environment included in the initial RAM file system are then used to mount the root file system of the computer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System Initialization&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The first userspace&lt;sup id="fnref1"&gt;1&lt;/sup&gt; program (i.e., &lt;code&gt;systemd&lt;/code&gt;) is started once the root file system is mounted.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;systemd&lt;/code&gt; service takes over, initializing userspace services and eventually leading to a login prompt or graphical interface.&lt;/li&gt;
&lt;li&gt;Finally, the user sees a login prompt when the login service is ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this setup is an improvement over the past scenario, there's still room for improvement. For example, most Linux distros have to rely on the &lt;code&gt;shim&lt;/code&gt; for Secure Boot, which then has to cryptographically verify several things using keys generated locally on each computer.&lt;/p&gt;




&lt;p&gt;Now that we are caught up to the current status of the Linux process, I want to draw you a picture of a conceptual future boot process. However, we need to understand a few additional concepts to get there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Kernel Image (UKI)
&lt;/h3&gt;

&lt;p&gt;In the previous scenarios, we discussed separate kernel and initramfs images. At the core of our future scenario is what is known as a &lt;em&gt;Unified Kernel Image&lt;/em&gt; (&lt;code&gt;UKI&lt;/code&gt;). A UKI is a Linux kernel image, an initramfs, and a few other optional components rolled into a single UEFI program that can be loaded by the UEFI firmware or a bootloader. Since a UKI contains everything needed to boot an OS, our boot sequence and the amount of cryptographic verification we need to do become simpler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trusted Platform Module (TPM) and Platform Configuration Registers (PCRs)
&lt;/h3&gt;

&lt;p&gt;Another feature in most modern computers is the Trusted Platform Module (TPM) chip. It can either be a discrete or an integrated hardware component that's likely already included in your computer. The TPM provides a way to generate cryptographic keys, securely store secrets, and validate hardware and software states. &lt;/p&gt;

&lt;p&gt;The Platform Configuration Registers (PCRs) are a set of registers within the TPM chip. They can be used to store measurements (e.g., hash values) of software and hardware states, which can then be used to verify the system integrity. There are usually at least 24 PCRs owned by the firmware (i.e., UEFI). These PCRs remain sealed and can be unsealed under specific conditions during specific stages of the boot process to ensure a Secure Boot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discoverable Partitions
&lt;/h3&gt;

&lt;p&gt;If we start to go through our generic boot sequence, you might notice we still need to read the disks to locate our UKI. The Discoverable Partitions Specification (DPS)&lt;sup id="fnref2"&gt;2&lt;/sup&gt; by the UAPI Group provides a mechanism to use the Universally Unique Identifiers (UUIDs) of a GPT-partitioned disk (or a disk image) to enable automatic discovery of the disk partitions and their intended mount points.&lt;/p&gt;

&lt;p&gt;In addition, a block-level verification mechanism such as &lt;code&gt;dm-verity&lt;/code&gt; can be used to verify the integrity of the disk partitions/images during the boot process.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Potential Future Boot Process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Firmware Initialization (UEFI)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootloading&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The disk partitions are automatically discovered based on the GPT partition UUIDs.&lt;/li&gt;
&lt;li&gt;The EFI System Partition (ESP) is read, and the UKI is started to be loaded.&lt;/li&gt;
&lt;li&gt;The UKI signed by the respective Linux distro is verified and loaded.&lt;/li&gt;
&lt;li&gt;The root file system is discovered, integrity verified, and mounted.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System Initialization&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The first userspace program (i.e., &lt;code&gt;systemd&lt;/code&gt;) is started and takes over, initializing userspace services and eventually leading to a login prompt or graphical interface.&lt;/li&gt;
&lt;li&gt;Finally, the user sees a login prompt when the login service is ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm sure you'd agree this new scenario seems like an improvement over what we've seen earlier. What we briefly talked about is mostly a hypothetical scenario. However, some distros such as GNOME OS and carbonOS have already started to implement parts of the specifications necessary to realize it.&lt;/p&gt;

&lt;p&gt;This scenario and much more beyond is detailed in the blog post "&lt;a href="https://0pointer.net/blog/brave-new-trusted-boot-world.html"&gt;Brave New Trusted Boot World&lt;/a&gt;" by Lennart Poettering. Subsequently, the points in his blog post have become part of the collaboration scope of the &lt;a href="https://github.com/uapi-group"&gt;UAPI Group&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Initially, I wanted to include more details into our future scenario. For example, I wanted to discuss how the System Extensions (UAPI Group) specification enables powerful constructs for building Linux systems. Ultimately, I decided against further delaying an already delayed post. But I'm sure we'll get into a detailed post about System and Configuration Extension somewhere down the line.&lt;/p&gt;

&lt;p&gt;I still haven't decided what the next post will be about. Since I'm currently thinking about two topics, I think it might be one of them. These are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generating Unified Kernel Images (UKIs)&lt;/li&gt;
&lt;li&gt;alternative Privilege Escalation mechanisms (e.g., &lt;code&gt;sudo&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I won't go as far as to tempt the universe by indicating a timeline. But it shouldn't be too long. In the meantime, please message &lt;a href="https://fosstodon.org/@asuralinux"&gt;on fediverse&lt;/a&gt; or &lt;a href="//mailto:asuralinux@proton.me"&gt;by email&lt;/a&gt; while I wonder if I should enable comments.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;For safety and efficiency, operating systems are designed to run user programs in a separate area (user-space) so they can't directly interfere with or crash the core system functions (system-space). ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://uapi-group.org/specifications/specs/discoverable_partitions_specification/"&gt;The Discoverable Partitions Specification (DPS) - UAPI Group Specifications&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>uefi</category>
      <category>boot</category>
    </item>
    <item>
      <title>My Vim Story</title>
      <dc:creator>Gaveen Prabhasara</dc:creator>
      <pubDate>Mon, 09 Mar 2020 18:06:20 +0000</pubDate>
      <link>https://dev.to/gaveen/my-vim-story-594d</link>
      <guid>https://dev.to/gaveen/my-vim-story-594d</guid>
      <description>&lt;p&gt;Once you have used 'notepad.exe', you have used all text editors—they said. A text editor is a text editor is a text editor—they said. After the first few years of running Linux/Unix professionally, I kind of subconsciously agreed with this idea, eventhough I knew Vim—I thought I knew Vim. But when other people who actually knew how to use Vim used it, &lt;a href="https://en.wikipedia.org/wiki/Vim_(text_editor)"&gt;Vim&lt;/a&gt; still looked like magic.&lt;/p&gt;

&lt;p&gt;If you have worked in a command line at some point, I am sure you can appreciate the wisdom of learning how to use a text editing program properly. On Unix/Linux command lines, text is king. Therefore, learning how to manipulate text effectively goes a long way for your productivity. If you know how to open a file and edit its content, that enables you to configure your system too.&lt;/p&gt;

&lt;p&gt;The text editing program I prefer for these kind of work is Vim. It is also the text editor I can pretty much expect to find in any environment I log into—laptops and servers alike. Vim is available on multiple operating systems including Linux—which is my OS of choice.&lt;/p&gt;

&lt;p&gt;There are other text editors I occasionally use such as "&lt;a href="https://wiki.gnome.org/Apps/Gedit"&gt;gedit&lt;/a&gt;" and "&lt;a href="https://somas.pages.gitlab.gnome.org/apostrophe/"&gt;Apostrophe&lt;/a&gt;". But, most of the time, when I am typing something, writing code, or editing a configuration file, I am using vim.&lt;/p&gt;

&lt;p&gt;Like many before me, I started my text editor journey by running &lt;code&gt;vim&lt;/code&gt;, promptly feeling lost, then failing to exit vim, and finally resigning to reboot the computer instead. Thus, I initially became an &lt;code&gt;emacs&lt;/code&gt; user—primarily because &lt;code&gt;nano&lt;/code&gt; was not well-known at that point. Eventually, I learned the bare minimum of vim use, just enough to do basic text editing.&lt;/p&gt;

&lt;p&gt;What changed my mind about Vim was actually investing some time to learn it. Vim has a notorious learning curve. After years of already working on Linux, I only spent a decent amount of time to learn Vim and customize it to my liking somewhere around 2009. I can say without a doubt that I ended up liking Vim a lot—it definitely helped my productivity. It is powerful and versatile—and more importantly, did I mention I like it?&lt;/p&gt;

&lt;p&gt;Back in the day, my vim setup was a jumble of config files and a bunch of plugins dropped into a directory until it croaked reasonably the way I wanted. It was done out of necessity because vim did not have decent package management for plugins at that point. Later when &lt;a href="https://github.com/tpope/vim-pathogen"&gt;Pathogen&lt;/a&gt; came along, I jumped at the opportunity to organize vimfiles better. While Pathogen made it easier to organize vimfiles and manage plugins, it did not have a inbuilt way of tracking changes from multiple plugin sources over time.&lt;/p&gt;

&lt;p&gt;At this point I was already using &lt;a href="https://git-scm.com/"&gt;&lt;code&gt;git&lt;/code&gt;&lt;/a&gt; and I was familiar with the relatively new &lt;a href="https://git-scm.com/docs/gitsubmodules"&gt;&lt;code&gt;git submodules&lt;/code&gt;&lt;/a&gt; feature. I felt git submodules could be used to manage individual plugins effectively. I looked around to see if anyone had already thought of that. Eventhough I am pretty sure others may have thought about it—to the best of my knowledge—no one had publicly shared a similar setup at the time. So I did it using submodules—which was a humble brag for me. These past versions of my vim configuration files are no longer there. An &lt;a href="https://github.com/gaveen/gavim"&gt;archived, somewhat-later version&lt;/a&gt; is there in a git repo though.&lt;/p&gt;

&lt;p&gt;Since then, the most obvious change in how I maintain my vim set up had been the switch to &lt;code&gt;vim-plug&lt;/code&gt; for plugin management. The excellent vim-plug eliminated the need to juggle git submodules and made the whole process quite painless.&lt;/p&gt;

&lt;p&gt;The sections below will describe the vim configuration I am using. I will try to keep this post reasonably updated in future as well, in the hope it might be useful to someone—just like it helped me to read what others were doing.&lt;/p&gt;

&lt;p&gt;Few things to note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These should work with both regular &lt;code&gt;vim&lt;/code&gt; or &lt;a href="https://neovim.io/"&gt;&lt;code&gt;neovim&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When describing below, I have grouped some relevant sections together for convenience. They may be spread around in the actual &lt;code&gt;.vimrc&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Latest version of my vim configuration can be found in the &lt;a href="https://github.com/gaveen/vimfiles/blob/master/.vimrc"&gt;&lt;code&gt;.vimrc&lt;/code&gt; of the git repo&lt;/a&gt;, not this post.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A Few Useful Vim Concepts
&lt;/h2&gt;

&lt;p&gt;Before we begin, I would also like to quickly introduce you to a couple of key vim concepts I wish someone had explained to me much earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vim has multiple modes.&lt;/strong&gt; Vim is what you call a 'modal' editor, which simply means vim has a few modes to work with.&lt;/p&gt;

&lt;p&gt;As an analogy, think of a smartphone these days. There is a limited number of ways you can interact with it physically, but you have seemingly boundless amount of things you can do with it. For example, simple tap on the screen behaves differently based on which mode you are in. The singular touch input in this example can mean different interactions such as waking up the screen, unlocking, launching camera app, repositioning focal point, focusing on something, taking a photo, sharing a photo with someone, liking someone's photo in another app, etc. Based on the context (or mode, if you will), the same physical thing you do, can give different results.&lt;/p&gt;

&lt;p&gt;Vim is somewhat like that. There is an &lt;code&gt;Insert Mode&lt;/code&gt; where you can input text (i.g., typing) into the editor. There is a &lt;code&gt;Visual Mode&lt;/code&gt; where you can select a section of text so that you visually track which selection of text you are taking actions on (e.g., copy selected text). Then there is the &lt;code&gt;Normal Mode&lt;/code&gt; where you do everything else, such as moving around and manipulating text (e.g., cut, copy, paste, delete, etc.).&lt;/p&gt;

&lt;p&gt;You can learn more about these modes and how you can enter/exit them, you can check the &lt;a href="https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes"&gt;Vim Wikibook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editing with Vim is like programming your text&lt;/strong&gt;. Which is a roundabout way of saying that Vim has shortcut keys/key sequences. You can ask Vim to do simple actions or combine multiple instructions to do more complex actions, which can be intuitive once you learn the basics.&lt;/p&gt;

&lt;p&gt;Since you are limited to interacting with a software using inputs devices in your computer, there are bound to be limits to what you can input. Vim works around this by having shortcut keys or key sequences. Notice how I said key 'sequences' not 'combinations'? Vim usually have shortcuts defined in such a way that you can press keys followed by other keys rather than press all of at once.&lt;/p&gt;

&lt;p&gt;For example, pressing the letter &lt;code&gt;d&lt;/code&gt; within the &lt;code&gt;normal mode&lt;/code&gt; tells vim to 'delete' the next character. If you want to delete the next 5 character, the instruction becomes &lt;code&gt;5d&lt;/code&gt;. While &lt;code&gt;dw&lt;/code&gt; deletes the next word, and &lt;code&gt;3dw&lt;/code&gt; deletes the next 3 words; &lt;code&gt;dd&lt;/code&gt; deletes the entire current line of text. &lt;code&gt;7dd&lt;/code&gt; deletes 7 lines starting with the current. You get the idea.&lt;/p&gt;

&lt;p&gt;If we take this a little further, you can say things like "delete text up to the next occurrence of character &lt;code&gt;,&lt;/code&gt; by pressing &lt;code&gt;dt,&lt;/code&gt; in the &lt;code&gt;normal mode&lt;/code&gt; of course. These actions can be repeated by pressing &lt;code&gt;.&lt;/code&gt;, again while in &lt;code&gt;normal mode&lt;/code&gt;. Want to change the text instead of deleting it? Replace the 'd' with a 'c' (e.g., &lt;code&gt;ct,&lt;/code&gt;). Want to just select the text visually instead of both delete or change? Use 'v' instead of 'd' or 'c' (e.g., &lt;code&gt;vt,&lt;/code&gt;). You can also throw directionality into the mix by using &lt;code&gt;h, j, k, l&lt;/code&gt; as arrow key alternatives.&lt;/p&gt;

&lt;p&gt;The good thing is, you do not have to remember everything. You can build up the set of instructions with basic building blocks, entering one key press at a time. Sort of like conducting an orchestra, or like programming your text editing. Pretty neat, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can define your own shortcuts.&lt;/strong&gt; Vim allows you to define your own shortcuts in a couple of different ways, some of which you will see below.&lt;/p&gt;

&lt;p&gt;The key is that Vim allows you to prefix your keyboard shortcut sequences with a special key (called &lt;code&gt;leader&lt;/code&gt; key), so that your own shortcuts will not conflict with inbuilt vim shortcuts.&lt;/p&gt;

&lt;p&gt;Personally, I prefer to set shortcuts in what I think as "the vim way". To explain it a bit further, I prefer to set shortcuts that do not break default vim features, at least logically adjacent to their inbuilt counterparts if there are any, and do not hamper muscle memory in the long run. You can see for yourself if the configuration below adhere to this within reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vim &lt;code&gt;buffers&lt;/code&gt; are different editing spaces, whereas vim &lt;code&gt;tab pages&lt;/code&gt; are not.&lt;/strong&gt; 'Vim buffers' are not to be confused with 'vim tab pages' or 'vim windows'.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;buffer&lt;/code&gt; in Vim is an editing space in memory. You can have a file already opened there, or you can save to a file later, or you can discard it. You can have multiple buffers open in a Vim instance.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;window&lt;/code&gt; in Vim is a view into a buffer. You can have a single window with a single buffer, or you can have multiple views (e.g., as horizontal/vertical screen splits, as standalone windows) into the same buffer. For example, you can split your screen area into two windows and view two different locations of a file you have opened. Just remember, the "window" mentioned here is a vim window (i.e., usually visible as a full-screen or a split-screen area)—not necessarily a graphical window like you are used to.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;tab page&lt;/code&gt; in Vim is a way to organized vim windows. Which means each tab page can have multiple vim windows (e.g., split windows). Therefore, you can have the same buffer viewed in more than one tab page too.&lt;/p&gt;

&lt;p&gt;I know this can be confusing. You can see if the the following summary helps. Vim help &lt;a href="https://vimhelp.org/windows.txt.html#windows-intro"&gt;summarizes this as&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;code&gt;buffer&lt;/code&gt; is the in-memory text of a file. &lt;br&gt;&lt;br&gt;
 A &lt;code&gt;window&lt;/code&gt; is a viewport on a buffer. &lt;br&gt;&lt;br&gt;
 A &lt;code&gt;tab page&lt;/code&gt; is a collection of windows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Trying to use tab pages as different file editing spaces is a common mistake that can lead to confusing errors. If you are not sure about what to use, try &lt;code&gt;buffers&lt;/code&gt; first since they are the primitive you need as editing spaces and you view them anyway in 'windows'. If you think you need 'tab pages', you can introduce them into your workflow later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vim is extensible with plugins.&lt;/strong&gt; You can add features/functions not inbuilt by using plugins, which are programs written in &lt;code&gt;vimscript&lt;/code&gt; or other programming languages. You will see below which plugins I am using.&lt;/p&gt;

&lt;p&gt;To summarize these key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vim has multiple modes&lt;/li&gt;
&lt;li&gt;Editing with Vim is like programming your text&lt;/li&gt;
&lt;li&gt;You can define your own shortcuts&lt;/li&gt;
&lt;li&gt;Vim &lt;code&gt;buffers&lt;/code&gt; are different editing spaces, whereas vim &lt;code&gt;tab pages&lt;/code&gt; are not&lt;/li&gt;
&lt;li&gt;Vim is extensible with plugins
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Explaining My Configuration
&lt;/h2&gt;

&lt;p&gt;These are built around the default vim installation environment found in the Fedora-family of Linux distributions (i.e., including Fedora*, CentOS, and Red Hat Enterprise Linux) because those are my usual work environments.&lt;/p&gt;

&lt;p&gt;My .vimrc starts with some basic settings. &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;With the comments accompanying them, these should be pretty self-explanatory. Most of these so some basic convenience-oriented settings or improve visual cues.&lt;/p&gt;

&lt;p&gt;I should however mention the &lt;code&gt;set autowrite&lt;/code&gt;. According to the vim documentation, &lt;a href="https://vimhelp.org/options.txt.html#%27autowrite%27"&gt;&lt;code&gt;autowrite&lt;/code&gt;&lt;/a&gt; can save the file on certain actions, even if you had not explicitly asked to save (i.e., "write" in vim terminology).&lt;/p&gt;

&lt;p&gt;I like to avoid surprises like this as much as possible. However, &lt;code&gt;autowrite&lt;/code&gt; is one of these very few exceptions I have left because it makes up in convenience. For example, it avoids the annoying 'unsaved content warning' when switching between buffers. If you are not sure about this, you should probably avoid setting (i.e., enabling) it.  &lt;/p&gt;




&lt;p&gt;Next up is something that actually has an effect on the text you will be editing—how the &lt;code&gt;tab&lt;/code&gt; character/key is handled.&lt;/p&gt;

&lt;p&gt;I know how polarizing "Tabs vs Spaces" debate can be. Therefore, I will not get into it. I used to be in 'tabs' camp in the very beginning, but I switched to using spaces instead of tabs where I can, mainly for the purpose of getting a reasonably consistent visual experience across different environments.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I prefer to have 4 spaces per tab because most of the languages I work with these days (e.g., &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;) play nicely with that. The &lt;a href="https://vimhelp.org/options.txt.html#%27smarttab%27"&gt;&lt;code&gt;smarttab&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://vimhelp.org/options.txt.html#%27bs%27"&gt;&lt;code&gt;bs&lt;/code&gt;&lt;/a&gt; settings help with backspace among other things when you use spaces instead of tabs. If you do not set these, using backspace to delete all the expanded tab characters would become tedious.&lt;/p&gt;

&lt;p&gt;I also have set automatically enter spaces when I press the tab key with &lt;code&gt;set expandtab&lt;/code&gt;. This is another potential pitfall you should note. If you do not want to expand into spaces, then avoid setting &lt;a href="https://vimhelp.org/options.txt.html#%27expandtab%27"&gt;expandtab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then there are some tools (e.g., Python and Go) which do not always handle spaces well when they expect tabs. For those you need to set exceptions. I have set a few exceptions for tab handling later in the configuration.  &lt;/p&gt;





&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The comments here are pretty self explanatory. Something to remember is if you set &lt;a href="https://vimhelp.org/pattern.txt.html#%2Fignorecase"&gt;&lt;code&gt;ignorecase&lt;/code&gt;&lt;/a&gt;, case sensitivity is ignores across everywhere patters are used. This can lead to tricky situations when you use pattern search and replace type of actions. Therefore, I have left it disabled.  &lt;/p&gt;





&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Most of the settings here are on non-printable characters. Therefore, they do not have an effect on the text you are editing, only acts as visual cues while you are in the editor.&lt;/p&gt;

&lt;p&gt;The exception here is &lt;a href="https://vimhelp.org/options.txt.html#%27autoindent%27"&gt;&lt;code&gt;autoindent&lt;/code&gt;&lt;/a&gt;, which actually indents text automatically based on the indentation of the previous line. You can disable this by explicitly using &lt;code&gt;noautoindent&lt;/code&gt; (i.e., disable temporarily by entering &lt;code&gt;:set noautoindent&lt;/code&gt; in normal mode, or adding &lt;code&gt;set noautoindent&lt;/code&gt; to .vimrc).&lt;/p&gt;

&lt;p&gt;You do not need to use a mouse with vim—in fact, it is discouraged. But if you want to do useful things like scrolling at your speed while doing a visual inspection, and then click to go to somewhere, you can. While I love using vim, I also am not militant about being keyboard-only. There are times when adding a mouse into the mix—or more accurately, not rendering the mouse/touchpad useless—can be helpful when working with vim. This is why I enable mouse too.  &lt;/p&gt;




&lt;p&gt;Vim also has a GUI version, usually called &lt;code&gt;gvim&lt;/code&gt;. It comes with an interface similar usual GUI programs, complete with things like toolbars, menubars, scrollbars, etc.&lt;/p&gt;

&lt;p&gt;When I use gvim, I prefer to have a clean and simple windows, somewhat emulating what the terminal version looks like. If you prefer the GUI elements you can skip these settings.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Again, these settings a explained in the comments. &lt;/p&gt;

&lt;p&gt;Finding the name used by your preferred font and setting it permanently can be a little tricky. One easy way to do that is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, in normal mode of &lt;code&gt;gvim&lt;/code&gt;, give &lt;code&gt;:set guifont=*&lt;/code&gt; and hit enter. It will open the font selection dialog of your environment. The font you set this way is only temporary (i.e., until you close vim).&lt;/li&gt;
&lt;li&gt;Once you make the preferred selection of font and size, in normal mode, give &lt;code&gt;:set guifont&lt;/code&gt; and hit enter. It will show the used name of the font. You can use the name later in your .vimrc to set the font permanently. Note that you could use the escape character &lt;code&gt;\&lt;/code&gt; before special characters such as spaces in the font name.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the example above, I have added "Inconsolata-g" font in "Medium" typeface at the size "11" points. If you want to set any other monospace font like &lt;a href="http://mozilla.github.io/Fira/"&gt;Fira Mono&lt;/a&gt;, &lt;a href="https://adobe-fonts.github.io/source-code-pro/"&gt;Source Code Pro&lt;/a&gt;, &lt;a href="https://dejavu-fonts.github.io/"&gt;DejaVu Mono&lt;/a&gt;, &lt;a href="https://sourcefoundry.org/hack/"&gt;Hack&lt;/a&gt;, etc., you can do so with &lt;a href="https://vimhelp.org/options.txt.html#%27guifont%27"&gt;&lt;code&gt;guifont&lt;/code&gt;&lt;/a&gt;. If you use vim in a terminal instead of gvim, then the font is inherited through terminal settings.  &lt;/p&gt;




&lt;p&gt;Next comes a very important setting, eventhough it is just one line.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;As explained earlier, Vim lets you define your own shortcuts without risking conflicts with defaults, using a value called a "leader"—referred in .vimrc as &lt;code&gt;&amp;lt;leader&amp;gt;&lt;/code&gt;. By default, the leader key is set to "&lt;code&gt;\&lt;/code&gt;". Due to the ease of reach, I prefer to set the leader key to be "&lt;code&gt;,&lt;/code&gt;". Therefore, when you see something like &lt;code&gt;&amp;lt;leader&amp;gt;y&lt;/code&gt; it translated to &lt;code&gt;,y&lt;/code&gt; in my setup.&lt;/p&gt;

&lt;p&gt;Would this not conflict with inserting a comma?—you might wonder. There will be no conflict because you type in (i.e., insert) commas of your text in &lt;code&gt;insert mode&lt;/code&gt; while you invoke shortcuts in &lt;code&gt;normal mode&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Next is another interesting part—plugin management. Vim also has an inbuilt plugin manager since version 8. However, I have not looked enough into it. Since my current setup works really well, I did not have a need to change it either.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I use &lt;a href="https://github.com/junegunn/vim-plug"&gt;&lt;code&gt;vim-plug&lt;/code&gt;&lt;/a&gt; developed by Junegunn Choi, as the plugin manager. It is written in vim script, thus do not need external runtimes or complex manual installation steps. With 'vim-plug' installing and keeping plugins up-to-date is a breeze.&lt;/p&gt;

&lt;p&gt;Plugins are defined between the 'vim-plug' invocations of &lt;code&gt;call plug#begin()&lt;/code&gt; and &lt;code&gt;call plug#end()&lt;/code&gt;. I pass the parameter &lt;code&gt;'~/.vim/bundle'&lt;/code&gt; to &lt;code&gt;call plug#begin()&lt;/code&gt; so that it know where to install my plugins. In this case, the parameter is a directory called &lt;code&gt;bundle&lt;/code&gt; inside the main vim files directory &lt;code&gt;~/.vim&lt;/code&gt;. I have it there because it is a leftover from the days when I used a different plugin manager.&lt;/p&gt;

&lt;p&gt;I am not going to go one by one in this plugin list. However, as you can see above, I have grouped my plugins into a few areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Augment Vim behavior"&lt;/li&gt;
&lt;li&gt;"Augment UI elements"&lt;/li&gt;
&lt;li&gt;"Augment filetype handling and syntax highlighting"&lt;/li&gt;
&lt;li&gt;"Add utility"&lt;/li&gt;
&lt;li&gt;"Add colorschemes"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since all of my plugins are added via GitHub, you can find out more by visiting the relevant repository pages. To get the URL of each plugin repository page, append the name in the plugin definition after "&lt;code&gt;https://github.com/&lt;/code&gt;". For example, "easymotion/vim-easymotion" repository can be found at &lt;a href="https://github.com/easymotion/vim-easymotion"&gt;"https://github.com/easymotion/vim-easymotion"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some of the plugins here either need to be configured or can be configured. Some of the features enabled by these plugins, along with the shortcuts they introduce, are documented in the &lt;a href="https://github.com/gaveen/vimfiles/blob/master/README.md"&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt; file of &lt;a href="https://github.com/gaveen/vimfiles"&gt;the git repo&lt;/a&gt;.  &lt;/p&gt;





&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I am again not going to explain the above any further because they are pretty self-explanatory with the help of included comments.&lt;/p&gt;

&lt;p&gt;One thing to note is the section where I have included tab behaviour exceptions (e.g., for &lt;a href="https://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; and &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt;) as I mentioned earlier. Some other exceptions are handled automatically by file type plugins.  &lt;/p&gt;




&lt;p&gt;If you look closely as the sections of the same &lt;code&gt;.vimrc&lt;/code&gt; file I have been explaining so far, you will notice it has a syntax. As I mentioned earlier, Vim has an inbuilt scripting language. You can use this language to write custom functions which can make things easier for you by scripting them.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;In the above example, there is a function with the name of "&lt;code&gt;DiffWithSaved()&lt;/code&gt;" which combines inbuilt features of vim to find if there has been an changes since you last saved. If there are, it will present the differences between the last saved state and current state in a view similar to the Unix &lt;code&gt;diff&lt;/code&gt;. Finally, it can be invoked with a command named "&lt;code&gt;DiffSaved&lt;/code&gt;".&lt;/p&gt;

&lt;p&gt;I have defined a few more functions as well. Please note that &lt;code&gt;ToggleFullScreen()&lt;/code&gt; function has an external dependency, an external program named &lt;code&gt;wmctrl&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;While these functions define what to do, they are not automatically invoked. The way I have chosen to call them is via either shortcut keys or function keys.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;You can see that in the above, &lt;code&gt;DiffSaved&lt;/code&gt; and &lt;code&gt;QuickfixToggle()&lt;/code&gt; are configured to be invokes with &lt;code&gt;&amp;lt;leader&amp;gt;?&lt;/code&gt; and &lt;code&gt;&amp;lt;leader&amp;gt;q&lt;/code&gt; respectively. As per my configuration, this translated into pressing &lt;code&gt;,?&lt;/code&gt; and &lt;code&gt;,q&lt;/code&gt; respectively.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I have mapped some useful shortcuts to deal with cut/copy/paste with clipboard in &lt;code&gt;gvim&lt;/code&gt;. These complement the inbuilt &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;p&lt;/code&gt; for cut/copy/paste respectively, but for external clipboard (e.g., OS clipboard). I also have &lt;code&gt;&amp;lt;leader&amp;gt;v&lt;/code&gt; (i.e., &lt;code&gt;,v&lt;/code&gt;) to select the text that was pasted into vim, right after it was pasted.&lt;/p&gt;

&lt;p&gt;In addition to custom shortcut keys, I have also mapped some of the function keys (e.g., F1 - F12 keys in the keyboard) to do useful things.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;You might notice that the convention I use is: function key mappings only change editor environment, whereas anything that affect the actual text are mapped as shortcuts with a "leader" prefix.&lt;/p&gt;

&lt;p&gt;In the above, I have essentially remapped F1 key as another &lt;code&gt;ESC&lt;/code&gt; key to avoid potential accidental F1 key presses when reaching &lt;code&gt;ESC&lt;/code&gt;. F4 toggles spellchecking, F7 uses &lt;code&gt;junegunn/limelight.vim&lt;/code&gt; plugin, and F11 calls the above mentioned &lt;code&gt;ToggleFullScreen()&lt;/code&gt; function. The rest should be self-explanatory.&lt;/p&gt;

&lt;p&gt;I also have a shortcut for when you edit a file away, but forgot you needed &lt;code&gt;sudo&lt;/code&gt; privileges to save it. Instead of pulling your hair out and starting from scratch, there are things you can do. The following makes one of those things even more convenient to use (i.e., instead of using &lt;code&gt;:w&lt;/code&gt; to save, type &lt;code&gt;:w!!&lt;/code&gt; to save with 'sudo' privileges).&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;p&gt;I mentioned earlier that &lt;code&gt;buffers&lt;/code&gt; are the way to go when you need to keep multiple files open. The following section of the settings map a few shortcut keys to make switching between buffers faster.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;In addition, I have also configured the plugin &lt;a href="https://www.vim.org/scripts/script.php?script_id=1664"&gt;&lt;code&gt;buftabs&lt;/code&gt;&lt;/a&gt; here. It shows which files you have opened at the bottom of the vim window. You can not point and click it to switch between buffers, but rather provides a minimalist indication of opened buffers and statuses.  &lt;/p&gt;




&lt;p&gt;Finally, we have the exciting part—colorscheme! The first two lines &lt;code&gt;termguicolors&lt;/code&gt; and &lt;code&gt;background&lt;/code&gt; set two values explicitly rather than try to derive them from the environment.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;My &lt;code&gt;termguicolors&lt;/code&gt; setting explicitly says that the terminal you are using supports GUI colors. It does in my case because most of the time I use &lt;a href="https://gitlab.gnome.org/GNOME/gnome-terminal"&gt;GNOME Terminal&lt;/a&gt; which comes with &lt;a href="https://getfedora.org/"&gt;Fedora&lt;/a&gt;. If your terminal does not support GUI colors, then do not set this.&lt;/p&gt;

&lt;p&gt;My &lt;code&gt;background&lt;/code&gt; setting is to make my terminal background dark. Like many people who need to stare at a screen for a long time, I too prefer dark themes whenever I have the option. Some colorschemes select between dark and light versions based on this value, which is why I have made 'dark' explicit. If you prefer light, you can set it to 'light' too.&lt;/p&gt;

&lt;p&gt;If you do not need either of these two, then you should not set them because some colorschemes would look weird if you set the values different from what they are expecting or capable of handling.&lt;/p&gt;

&lt;p&gt;With those out of the way, I finally set a colorscheme. My colorscheme of choice have changed overtime. These days, I prefer a theme called "&lt;a href="https://github.com/rakr/vim-one"&gt;One&lt;/a&gt;" which has both a light and dark version (picked based one the &lt;code&gt;background&lt;/code&gt; setting).&lt;/p&gt;

&lt;p&gt;The end result should look something like &lt;a href="https://i.imgur.com/lETk5yt.png"&gt;this (screenshot on Imgur)&lt;/a&gt;.  &lt;/p&gt;




&lt;p&gt;That is about it for this post. Since it is already long, I did not try to include further details such as what the plugins do or which shortcuts they introduce. If you would like to hear about these details—or just wanted to give me your comments—please leave a comment, or let me know via &lt;a href="//mailto:gaveen@gaveen.me?Subject=[Comment]%20gaveen.me%20-%20My%20Vim%20Story"&gt;email&lt;/a&gt; or &lt;a href="https://twitter.com/gaveen/"&gt;@s/DMs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted at:&lt;/em&gt; &lt;a href="https://gaveen.me/2020/02/my-vim-story/"&gt;https://gaveen.me/2020/02/my-vim-story/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My updated vimfiles can be found at:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gaveen"&gt;
        gaveen
      &lt;/a&gt; / &lt;a href="https://github.com/gaveen/vimfiles"&gt;
        vimfiles
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      My Vimfiles
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1 id="user-content-vimfiles"&gt;&lt;a class="heading-link" href="https://github.com/gaveen/vimfiles#vimfiles"&gt;Vimfiles&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is my current &lt;a href="https://gaveen.me/2020/02/my-vim-story/" rel="nofollow"&gt;vimfiles&lt;/a&gt;. Plugins are managed with &lt;a href="https://github.com/junegunn/vim-plug"&gt;&lt;code&gt;vim-plug&lt;/code&gt;&lt;/a&gt;. These should work with vim/gvim and neovim.&lt;/p&gt;
&lt;p&gt;This is not intended as a distribution, as I may change it depending on the work I'm doing. Plus, I pretty much only use this under Linux. But, you are more than welcome to use my vim files to explore. I have tried to keep my &lt;code&gt;.vimrc&lt;/code&gt; file well commended for your convenience.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="user-content-how-to-use"&gt;&lt;a class="heading-link" href="https://github.com/gaveen/vimfiles#how-to-use"&gt;How to use&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you still want to use these vimfiles, this is how you can do so.&lt;/p&gt;
&lt;p&gt;First, you'll need to clone this repository. &lt;br&gt;
&lt;code&gt;$ git clone https://github.com/gaveen/vimfiles.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then, you could create symbolic links to the &lt;code&gt;.vim&lt;/code&gt; directory and &lt;code&gt;.vimrc&lt;/code&gt; file. Assuming the location where you cloned the repository is &lt;code&gt;~/Apps/vimfiles&lt;/code&gt;, you can do something like: &lt;br&gt;
&lt;code&gt;$ ln -s ~/Apps/vimfiles/.vim ~/.vim&lt;/code&gt; &lt;br&gt;
&lt;code&gt;$ ln -s ~/Apps/vimfiles/.vimrc ~/.vimrc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Finally, launch vim and install the plugins. (&lt;em&gt;Note:&lt;/em&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gaveen/vimfiles"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>vim</category>
      <category>linux</category>
    </item>
    <item>
      <title>I don't believe in Kubernetes</title>
      <dc:creator>Gaveen Prabhasara</dc:creator>
      <pubDate>Tue, 03 Dec 2019 00:00:12 +0000</pubDate>
      <link>https://dev.to/gaveen/i-don-t-believe-in-kubernetes-3gic</link>
      <guid>https://dev.to/gaveen/i-don-t-believe-in-kubernetes-3gic</guid>
      <description>&lt;p&gt;I have always been a believer in &lt;a href="https://azure.microsoft.com/en-us/overview/what-is-cloud-computing/"&gt;Cloud Computing&lt;/a&gt;. Even when big executives of the world were calling it a fad, I believed in the cloud—or its promise. It was not so much an achievement to be had—rather as with to so many other people in tech—it spoke to me from a place of understanding. We may not have called it "cloud", but when Amazon opened the gates of their Web Services to everyone, we saw good things we recognized with and we realized it was an opportunity to build things better.&lt;/p&gt;

&lt;p&gt;Cloud Computing was about getting good IT infrastructure accessible to the rest of us. Finally, we did not need to be a sizeable enterprise or have a small army of ops and devs just to have the necessary infrastructure in place. It was empowering, it was enabling. When cloud users could solve their problems conveniently, people interested in cloud infrastructure could enjoy building them—and in the process, change many professions and how the industry worked.&lt;/p&gt;




&lt;p&gt;After achieving the cloud, our mission should have been to make cloud computing accessible to more and more people. We dreamt of people having on-demand access to all the IT resources they want at an ever reducing cost, being able to use technology easily and conveniently to solve problems they needed solving. That, should have been our mission.&lt;/p&gt;

&lt;p&gt;Instead, here we are today left fixated on things like Kubernetes&lt;sup id="fnref1"&gt;1&lt;/sup&gt; and trying to emulate how giant companies—so called hyperscalers—like Google and Facebook operate their infrastructure. Instead of trying to get people closer to solving their problems, we are effectively erecting newer barriers in complexity.&lt;/p&gt;




&lt;p&gt;To be clear, I am not trying to diss &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;. I like Kubernetes—with certain caveats. It is a system with many components and—as with any complex system—comes with inherent operational complexities. It is an interesting system catering specific needs. It has its place. More accurately, Kubernetes is a tool for cloud builders, not cloud consumers.&lt;/p&gt;

&lt;p&gt;A problem with the current &lt;a href="https://www.cncf.io/"&gt;Cloud Native&lt;/a&gt; narrative is that a lot of companies (and in turn, a significant amount of eco system resources), who would otherwise be working with a consumer focus are busy with building tools for cloud builders—and then try to wrestle these into submission as cloud consumer technologies. You do not have to take my word for it—you can try deploying your next application to production on Kubernetes.&lt;/p&gt;

&lt;p&gt;What happened to bringing the best technology conveniences to the rest of us? Whatever happened to harnessing the power of IT so that it stops being an inhibitor and becomes the great enabling force that it can be? What happened to—may Cthulhu have mercy on my soul—powering "digital transformation"?&lt;/p&gt;




&lt;p&gt;When the most activity in tech is taking place on a tangent, it is refreshing to see ventures like &lt;a href="https://oxide.computer/"&gt;Oxide Computer Company&lt;/a&gt; daring to pause and ask fundamental questions again. In their case—at least from what I can gather at this point—they are tying to bring the advantages of hyperscale IT infrastructure because the hardware industry seem to have forgotten the rest of us in favor of the hyperscalers.&lt;/p&gt;

&lt;p&gt;As for me, I want modern, secure, cost-effective computing to be delivered to more and more people because our industry seem to have forgotten that along with the fixation on hyperscale. I do of course believe in the existence of Kubernetes. I just do not believe it is the thing that carries the mission forward—at least not in the current form. This definitely is something I would like to work on. It had always been my interest. At different times, in different places, in different forms—it had always been the mission.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;&lt;strong&gt;PSA&lt;/strong&gt;: Containers ≠ Docker ≠ Kubernetes ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>cloud</category>
    </item>
    <item>
      <title>The future of networking is software</title>
      <dc:creator>Gaveen Prabhasara</dc:creator>
      <pubDate>Wed, 02 Oct 2019 17:53:03 +0000</pubDate>
      <link>https://dev.to/gaveen/the-future-of-networking-is-software-3ddm</link>
      <guid>https://dev.to/gaveen/the-future-of-networking-is-software-3ddm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;: &lt;em&gt;The original post maybe edited since publishing here. Please check the original post if you're reading this much later after the published date.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I believe the future of networking is software. To be a little more specific on my thoughts, I believe the future of networking in the data center is software-based. Water is wet, and on that note, thank you for coming to my TED talk. And, quick PS: clouds are also hosted in data centers.&lt;/p&gt;

&lt;p&gt;While what I just mentioned maybe obvious to say—given how pretty much everything has its future in software—you would be surprised at the state of the networking industry if you came to it as an outsider. The cloud has already happened and compute has embraced it with both arms,... and legs, and tentacles, and whatever else you have available. Storage is also not too far behind. Cloud-scale storage technologies are becoming closer and closer to being commoditized&lt;sup id="fnref1"&gt;1&lt;/sup&gt;. Network—in a way—is the last frontier in the data center not yet fully subscribing to cloud ethos.&lt;/p&gt;

&lt;p&gt;Things are certainly changing—more on that later. But, networking vendors are still trying to sell you pricey switches, they are only just now getting serious about DevOps, and their idea of a software-defined network (SDN) is to run a bunch of software on top of their existing traditional network solution stack (i.e., &lt;a href="https://en.m.wikipedia.org/wiki/Application-specific_integrated_circuit"&gt;ASIC&lt;/a&gt;-driven expensive boxes + mostly-blackbox &lt;a href="https://en.m.wikipedia.org/wiki/Network_operating_system"&gt;NOS&lt;/a&gt;/firmware + ridiculous licensing + exorbitant professional services + consultancy that makes sure you stay with them).&lt;/p&gt;

&lt;p&gt;Forgive me for sounding cynical, I am not. I think things should be better though. To that end, let me share a few things and sort-of-predictions I believe of the future, at least at this point in time. However—fair disclaimer—I may have a vested interest in this game. Therefore, take whatever beyond this point as however you will.&lt;/p&gt;




&lt;p&gt;I believe the future of networking—at least, networking in the data center—is in software. Networking in general is gradually heading that way. Telco industry has learned from what happened with the "cloud fad", and are trying to move towards NFV&lt;sup id="fnref2"&gt;2&lt;/sup&gt;, SDN&lt;sup id="fnref3"&gt;3&lt;/sup&gt;, and SD-WAN&lt;sup id="fnref4"&gt;4&lt;/sup&gt; already. But let me focus on the data center (and in turn, cloud), which has been &lt;a href="https://gaveen.me/mind-the-air-gap"&gt;my work domain&lt;/a&gt; for a while.&lt;/p&gt;

&lt;p&gt;I believe that the enablers of this shift will be multi-fold. For example network virtualization&lt;sup id="fnref5"&gt;5&lt;/sup&gt; and network functions virtualization&lt;sup id="fnref2"&gt;2&lt;/sup&gt; are precursors, and they have already been here for a while. Also, network equipment supporting alternative NOSs have been here for a while. For example, some brand vendors like Mellanox and Dell EMC—as well as whitebox switch vendors—support multiple OSs such as generic Linux, Cumulus, Open Network Linux, SONiC, along their own OSs on their switches.&lt;/p&gt;

&lt;p&gt;I believe the next wave of convergence will incorporate networking into already converged compute and storage. For the lack of a better term—and in line with the buzzword-based naming (e.g., CI&lt;sup id="fnref6"&gt;6&lt;/sup&gt;/HCI&lt;sup id="fnref7"&gt;7&lt;/sup&gt;)—let us call it Fully-Converged Infrastructure (FCI). If and when this becomes a reality, it is likely that it will co-exist with existing types of infrastructure—similar to how HCI/CI still remain somewhat of niche markets. However, if this comes to pass with significant enough adoption, it will be a salient indicator that the balance has been tipped from hardware to software.&lt;/p&gt;

&lt;p&gt;In any case, I believe there will be a significant shift in direction from specialized hardware-based switch/network appliances to &lt;strong&gt;software-based networking on generic computing platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I am not sure how the gap will be bridged exactly. Perhaps, x86 server-based networking will become more powerful to catch up to ASIC/&lt;a href="https://en.m.wikipedia.org/wiki/Field-programmable_gate_array"&gt;FPGA&lt;/a&gt;-accelerated networking. Perhaps, network appliance hardware will become generic open platforms. Perhaps, ASICs and FPGAs will become increasingly generic till they become commodity components in generic computing. Perhaps, it will be somewhere in between.&lt;/p&gt;

&lt;p&gt;We already see some precursors in the evolution of the hardware aspect. For example, x86-based switches are now commonplace, while some ASICs are becoming more and more in the territory of generic platforms&lt;sup id="fnref8"&gt;8&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Software in the networking industry on the other hand, had been a little more nimble. While proprietary software stacks of traditional vendors have been evolving further, there also has been an interest to consolidate effort on the common components. For example, &lt;a href="https://www.lfnetworking.org/"&gt;Linux Foundation Networking&lt;/a&gt; and &lt;a href="https://www.opennetworking.org/"&gt;Open Networking Foundation&lt;/a&gt; has received contribution from even the bigger network vendors such as Cisco, Arista, Juniper, and Mellanox. This has resulted in the development or improvement of interesting open source technologies such as &lt;a href="https://www.dpdk.org/"&gt;DPDK&lt;/a&gt;, &lt;a href="https://www.opennetworking.org/p4/"&gt;P4&lt;/a&gt;, &lt;a href="https://fd.io/"&gt;VPP&lt;/a&gt;, &lt;a href="https://azure.github.io/SONiC/"&gt;SONiC&lt;/a&gt;, &lt;a href="https://www.opennetworking.org/stratum/"&gt;Stratum&lt;/a&gt;, etc. Open source-based as well as proprietary vendor OSs&lt;sup id="fnref9"&gt;9&lt;/sup&gt; also have been available in the market.&lt;/p&gt;

&lt;p&gt;The physical networking (e.g., fiber/copper infrastructure, optical transceivers, cables, connectors, etc.) components are likely to remain and continue to evolve in traditional / proprietary supply chains as they involve physical fabrication, manufacturing, and other logistics.&lt;/p&gt;

&lt;p&gt;But the non-physical side of networking space (e.g., which contains processing, forwarding, routing/switching decisions, protocols, virtual endpoints, segmentation / micro-segmentation, policy frameworks, telemetry / observability, etc.) will get much more interesting. I am not saying traditional networking equipment will become obsolete in a hurry. But I believe building networks with generic computing platforms that are at least akin to x86 servers of today—perhaps augmented with FPGAs or ASICs—will at least become a mainstream option to ops teams. These networking infastructure will largely be handled by the software they are running.&lt;/p&gt;

&lt;p&gt;With cloud computing&lt;sup id="fnref10"&gt;10&lt;/sup&gt; becoming a mainstay—along with all the shifts in thinking it brings—networking is due for a re-imagining. While the body of domain knowledge, standards, abstractions, and even expertise can be reused, I believe that the traditional thinking such as the ones that involve believing in different switch boxes for different places&lt;sup id="fnref11"&gt;11&lt;/sup&gt; in the network is—IMHO—antiquated and only serve to drive network vendor sales.&lt;/p&gt;

&lt;p&gt;Application-aware &lt;a href="https://en.wikipedia.org/wiki/OSI_model"&gt;Layer 4 - Layer 7&lt;/a&gt; software systems are already starting to do &lt;a href="https://www.infoq.com/podcasts/open-source-cilium-security/"&gt;pretty-cool things&lt;/a&gt;&lt;sup id="fnref12"&gt;12&lt;/sup&gt;. However, Layer 2 - Layer 3 networking that enables them—as well can further empower them—are yet to catch up to the future that is already dawning.&lt;/p&gt;

&lt;p&gt;And, I believe it is going to be awesome to build.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;e.g., &lt;a href="https://ceph.io/"&gt;Ceph&lt;/a&gt;, &lt;a href="https://min.io/"&gt;MinIO&lt;/a&gt;, etc. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://www.sdxcentral.com/networking/nfv/definitions/whats-network-functions-virtualization-nfv/"&gt;Network Functions Virtualization&lt;/a&gt; (e.g., OPNFV) ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://www.sdxcentral.com/networking/sdn/definitions/what-the-definition-of-software-defined-networking-sdn/"&gt;Software-Defined Networking&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;&lt;a href="https://www.sdxcentral.com/networking/sd-wan/definitions/software-defined-sdn-wan/"&gt;SD-WAN&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Network_virtualization"&gt;Network Virtualization&lt;/a&gt; (e.g., VMware NSX) ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Converged_infrastructure"&gt;Converged Infrastructure&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Hyper-converged_infrastructure"&gt;Hyperconverged Infrastructure&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn8"&gt;
&lt;p&gt;Competing vendors like Arista and Cisco use the same Broadcom ASIC silicon series (e.g., Tomahawk, Trident, Jericho) in some of their comparable switches. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn9"&gt;
&lt;p&gt;e.g., Cumulus Networks, Big Switch Networks, and Pluribus Networks ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn10"&gt;
&lt;p&gt;Cloud Computing and its inner aspects such as public/hybrid clouds, Cloud Native Infrastructure, etc. has become a mainstay in the industry, and continue to influence the thinking in adjacent areas of technology. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn11"&gt;
&lt;p&gt;Either talking in terms of older core/aggregation/access switch classification or the newer spine/leaf classification, is still hinged on the fact that these switches are usually built for different purposes with different limitations and capabilities. However, if everything is software, running on sufficient compute power, and necessary physical connectivity, there will not be much technical justification why one of your switches cannot be a core switch while another is orders of magnitude more expensive than the previous one.  ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn12"&gt;
&lt;p&gt;Layer 4 - 7 software options include cloud-native software such as &lt;a href="https://cilium.io/"&gt;Cilium&lt;/a&gt;, Service Mesh software (e.g., &lt;a href="https://www.envoyproxy.io/"&gt;Envoy&lt;/a&gt;/&lt;a href="https://istio.io/"&gt;Istio&lt;/a&gt;, and &lt;a href="https://linkerd.io/"&gt;Linkerd&lt;/a&gt;), etc. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>devops</category>
      <category>networking</category>
      <category>softwaredriven</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
