diff --git a/404.html b/404.html new file mode 100644 index 0000000..481806b --- /dev/null +++ b/404.html @@ -0,0 +1,27 @@ +404 Page not found +
+

404 Page not found

This is not the page you're looking for <(-_-)> .

\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..fcf15f9 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +miguelvf.dev \ No newline at end of file diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000..86c3adb Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png new file mode 100644 index 0000000..4b44a84 Binary files /dev/null and b/android-chrome-512x512.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..86dbfe0 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/badges/AnimalCrossingButton.gif b/badges/AnimalCrossingButton.gif new file mode 100644 index 0000000..0002b50 Binary files /dev/null and b/badges/AnimalCrossingButton.gif differ diff --git a/badges/StardewValleyButton.gif b/badges/StardewValleyButton.gif new file mode 100644 index 0000000..7b2ffe7 Binary files /dev/null and b/badges/StardewValleyButton.gif differ diff --git a/badges/any-browser.gif b/badges/any-browser.gif new file mode 100644 index 0000000..6741d4e Binary files /dev/null and b/badges/any-browser.gif differ diff --git a/badges/bob.gif b/badges/bob.gif new file mode 100644 index 0000000..90b6dd5 Binary files /dev/null and b/badges/bob.gif differ diff --git a/badges/bookmark.gif b/badges/bookmark.gif new file mode 100644 index 0000000..e200a15 Binary files /dev/null and b/badges/bookmark.gif differ diff --git a/badges/debian.gif b/badges/debian.gif new file mode 100644 index 0000000..1f617c8 Binary files /dev/null and b/badges/debian.gif differ diff --git a/badges/geo14.gif b/badges/geo14.gif new file mode 100644 index 0000000..adbcc11 Binary files /dev/null and b/badges/geo14.gif differ diff --git a/badges/got_html.gif b/badges/got_html.gif new file mode 100644 index 0000000..f713730 Binary files /dev/null and b/badges/got_html.gif differ diff --git a/badges/neocities.gif b/badges/neocities.gif new file mode 100644 index 0000000..4030bbb Binary files /dev/null and b/badges/neocities.gif differ diff --git a/badges/neocities_alt.gif b/badges/neocities_alt.gif new file mode 100644 index 0000000..c8e8ea4 Binary files /dev/null and b/badges/neocities_alt.gif differ diff --git a/badges/phonechump.gif b/badges/phonechump.gif new file mode 100644 index 0000000..67e5420 Binary files /dev/null and b/badges/phonechump.gif differ diff --git a/badges/sign_guestbook1.gif b/badges/sign_guestbook1.gif new file mode 100644 index 0000000..43bafae Binary files /dev/null and b/badges/sign_guestbook1.gif differ diff --git a/badges/siliconvalley.gif b/badges/siliconvalley.gif new file mode 100644 index 0000000..dbb7278 Binary files /dev/null and b/badges/siliconvalley.gif differ diff --git a/badges/sun.gif b/badges/sun.gif new file mode 100644 index 0000000..674e32a Binary files /dev/null and b/badges/sun.gif differ diff --git a/badges/vim.gif b/badges/vim.gif new file mode 100644 index 0000000..84baf9a Binary files /dev/null and b/badges/vim.gif differ diff --git a/badges/win95.gif b/badges/win95.gif new file mode 100644 index 0000000..3928850 Binary files /dev/null and b/badges/win95.gif differ diff --git a/badges/www.gif b/badges/www.gif new file mode 100644 index 0000000..fc348eb Binary files /dev/null and b/badges/www.gif differ diff --git a/blog/c-makefile/index.html b/blog/c-makefile/index.html new file mode 100644 index 0000000..f1c4f9f --- /dev/null +++ b/blog/c-makefile/index.html @@ -0,0 +1,97 @@ +Crafting a Robust and Maintainable C Makefile +
+

Crafting a Robust and Maintainable C Makefile

I’m pretty pedantic about the quality of my code, and I like to keep my projects +organized and maintainable. One of the tools that I use to achieve this is +GNU Make, which is a powerful build system +that can be used to automate the process of compiling and linking C programs. In +this post, I will show you how to create a simple and robust Makefile template +that can be used in your C projects.

First, create a new file called Makefile in the root directory of your +project. Let’s start by defining the name of the program that we will be +building.

# The name of the program to build.
+TARGET := example
+

Complier

The first thing we need to do is define the compiler and shell that we will be +using. In this example, we will be using gcc and /bin/bash, respectively. We +will also define the compiler flags that we will be using.

# The compiler executable.
+CC := gcc
+# The compiler flags.
+CFLAGS := -Wall -Wextra -Werror -pedantic -std=c99
+# The linker executable.
+LD := gcc
+# The linker flags.
+LDFLAGS := -Wall -Wextra -Werror -pedantic -std=c99
+# The shell executable.
+SHELL := /bin/bash
+

Testing and Debugging

Next, we will define some variables that will be used for testing and debugging +our project. We will define the name of the test executable, the name of the +debug executable, and provide some flags that will be used by the memory checker +and debugger.

# The memory checker executable.
+MEMCHECK := valgrind
+# The memory checker flags.
+MEMCHECK_FLAGS := --leak-check=full --show-leak-kinds=all --track-origins=yes
+# The debugger executable.
+DEBUGGER := gdb
+# The debugger flags.
+DEBUGGER_FLAGS :=
+
+# The name of the test input file
+TEST_INPUT :=
+# The name of the test output file
+TEST_OUTPUT :=
+# The name of the reference executable
+REF_EXE :=
+# The name of the reference output file
+REF_OUTPUT :=
+

Directories

One of the cool things about make is we can set varibles to be the output of +shell commands by using the := operator. This way, we can define variables +that refer to directories related to the root directory of the project. We are +going to work under the assumption that the project has the following directory +structure:

.project/ # root directory of the project
+├── include/ # header files
+├── lib/ # external libraries
+├── obj/ # object files
+├── src/ # source files
+└── target/ # build artifacts
+    ├── debug/ # debug build
+    └── release/ # release build
+

To achieve this, we can define the following variables:

# top directory of project
+TOP_DIR := $(shell pwd)
+# directory to locate source files
+SRC_DIR := $(TOP_DIR)/src
+# directory to locate header files
+INC_DIR := $(TOP_DIR)/include
+# directory to locate external libraries files
+LIB_DIR := $(TOP_DIR)/lib
+# directory to locate object files
+OBJ_DIR := $(TOP_DIR)/obj
+# directory to place build artifacts
+BUILD_DIR := $(TOP_DIR)/target/release/
+

Targets

Now that we have defined all the necessary variables, we can start defining the +targets that will be used to build our project. The first target that we will +define is the all target, which will build the program.

# The default target.
+.PHONY: all
+all: $(BUILD_DIR)/$(TARGET)
+
\ No newline at end of file diff --git a/blog/dotfiles/ssh/index.html b/blog/dotfiles/ssh/index.html new file mode 100644 index 0000000..42be128 --- /dev/null +++ b/blog/dotfiles/ssh/index.html @@ -0,0 +1,109 @@ +Using Secure Shell (ssh) and Key-Based Authentication +
+

Using Secure Shell (ssh) and Key-Based Authentication

Installation

An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have +it installed, run the following command:

ssh -V
+

If ssh is not installed on your machine, you can install it by running the +following command:

sudo apt-get install openssh-client openssh-server
+

Usage

Once ssh is installed on your machine, you can connect to remote servers and +interface with them via the commands line. To connect to the server, use the +following command:

ssh <username>@<server_ip>
+exit # to exit the server
+

SSH Key-Based Authentication Setup

Normally, connecting to a server via ssh requires you to enter your password. +This is called password-based authentication.

However, you can set up SSH key-based authentication so that you do not have to +enter your password every time you connect to a server.

To set up SSH key-based authentication, follow the steps below.

  1. Generate a new ssh key (we will generate an RSA SSH key pair with a key size +of 4096 bits)

    Note Do not change the default name or location of the key. Using a +passphrase is optional but not recommended.

    # If the host was previously used for ssh and the host key has changed, remove the old host key
    +ssh-keygen -f "~/.ssh/known_hosts" -R "<server_ip>"
    +# Generate a new ssh key
    +ssh-keygen -t rsa -b 4096
    +
  2. Copy the public key to the server
    # Ssh into the server
    +ssh <username>@<server_ip>
    +# Create ssh directory
    +mkdir ~/.ssh
    +cd ~/.ssh
    +# exit server
    +exit
    +
    On your local machine execute the following commands:
    scp ~/.ssh/id_rsa.pub <username>@<server_ip>:~/.ssh/authorized_keys
    +
  3. Change the permissions of the ssh directory and its contents to prevent other +users from accessing your keys +sh # Ssh into the server ssh <username>@<server_ip> # Restrict read, write, and execute permissions to the `~/.ssh` directory to only the owner (`username`) chmod 700 ~/.ssh/ # Restrict read and write permissions to the contents of the `authorized_keys` directory to only the owner (`username`) chmod 600 ~/.ssh/authorized_keys # exit server exit After completing the steps above, you should be able to connect to the server +without entering your password.

Enabling SSH Key-Based Authentication Only

Since SSH key-based authentication is more convenient and more secure than +password-based authentication, we will restrict the server to only use SSH +key-based authentication.

To do this, we will edit the server’s SSH configuration file. This file is +located at /etc/ssh/sshd_config.

Warning Password-based authentication and challenge-response +authentication will be disabled. If you do not have password-based +authentication already configured, +you will not be able to connect to the server.

Method 1 - Configuration via ssh-copy-id

To configure the server to only use SSH key-based authentication via +ssh-copy-id, follow the steps below.

# Copy the public key to the server
+ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<server_ip>
+# Ssh into the server
+ssh <username>@<server_ip>
+# exit server
+exit
+

Method 2 - Manual Configuration

To manually configure the server to only use SSH key-based authentication, run +the following commands:

Warning the location of the SSH configuration file is assumed to be +located at /etc/ssh/sshd_config. If this is not the case, you will need to +modify the commands below to reflect the location of the SSH configuration +file. You can find the location of the SSH configuration file by executing a +script I wrote found in my dotfiles’s > +/scripts folder

# make find_sshd_config executable
+chmod +x find_sshd_config.sh
+./find_sshd_config.sh
+
# Ssh into the server
+ssh <username>@<ip>
+# /etc/ssh/sshd_config = ssh config of server
+# Disable password-based authentication
+sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
+# Disable challenge-response authentication
+sudo sed -i 's/^#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
+# Enable public key authentication on the server
+sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
+# Restart the server's SSH service to apply the new configuration
+if [[ $(ps -p 1 -o comm=) == "systemd" ]]; then
+  ## On systemd-based systems
+  echo "System is systemd-based. Restarting sshd."
+  sudo systemctl restart sshd
+else
+  ## On SysV init systems
+  echo "System is SysV init-based. Restarting ssh."
+  sudo service ssh restart
+fi
+echo "SSH configuration completed. Disconnecting from server."
+# exit server
+exit # exit server
+

Securely Storing SSH Keys and Auth Tokens on the Internet

Storing your SSH keys and authentication tokens on the internet might seem like +a bad idea, but if they are properly secured, storing them in a public GitHub +repository can be a convenient and secure way to sync your SSH keys and +authentication tokens across multiple machines. Luckily for us, ansible-vault’s +encryption engine is based on the AES-256 cipher, which is a symmetric cipher +that is quantum resistant. This ensures that sensitive information remains +protected, even in a public repository.

Encrypting Files Via Ansible-Vault

To encrypt files, including your SSH keys and authentication tokens on the +internet, run the following command:

# Encrypt files using ansible-vault
+ansible-vault encrypt <path_to_file>
+

Enter an encryption key when prompted.

Decrypting Files Via Ansible-Vault

To decrypt files, run the following command:

# Decrypt files using ansible-vault
+ansible-vault decrypt <path_to_file>
+

Enter the encryption key when prompted.

\ No newline at end of file diff --git a/blog/dotfiles/tmux/index.html b/blog/dotfiles/tmux/index.html new file mode 100644 index 0000000..7494598 --- /dev/null +++ b/blog/dotfiles/tmux/index.html @@ -0,0 +1,34 @@ +An Easy Guide to Using Tmux +
+

An Easy Guide to Using Tmux

Tmux

Usage

Install tmux

sudo apt install tmux
+

Install tpm (Tmux Plugin Manager)

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
+

Reload TMUX environment so TPM is sourced:

# type this in terminal if tmux is already running
+tmux source $XDG_CONFIG_HOME/tmux/tmux.conf
+

Keybinds

To enter commands into tmux, you must enter a specific keybind, which is called +the prefix key, followed by the command. My prefix key is ctrl + +space.

To refresh tmux and install new plugins, type prefix + I +(capital i, as in Install)

Window Management Commands

Command KeybindCommand Description
prefix + ccreate new window and switch to it
prefix + #switch to window #
prefix + nswitch to next window
prefix + pswitch to previous window
prefix + :swap window with next window
prefix + ;swap window with previous window
prefix + &kill window and all panes in it

Pane Management Commands

Command KeybindCommand Description
prefix + %split a pane horizontally into two panes
prefix + "split a pane vertically into two panes
prefix + {swap pane with previous pane
prefix + }swap pane with next pane
prefix + h / switch to pane on the left
prefix + j / switch to pane below
prefix + k / switch to pane above
prefix + l / switch to pane on the right
prefix + q + #switch active pane to pane #
prefix + zzoom in/out of pane to take up full window
prefix + !break pane into a new window
prefix + xkill pane

Miscellaneous Commands

Command KeybindCommand Description
vstart selection in copy mode
yyank (copy) selection to system clipboard
ctrl + vtoggle between rectangular and line selection mode
prefix + rrefresh tmux configuration
\ No newline at end of file diff --git a/blog/hdl-best-practices/index.html b/blog/hdl-best-practices/index.html new file mode 100644 index 0000000..43cc22f --- /dev/null +++ b/blog/hdl-best-practices/index.html @@ -0,0 +1,76 @@ +SystemVerilog Best Practices +
+

SystemVerilog Best Practices

When I was a beginner at programming, I would often find myself struggling with +the implementation of for loops. The amount of times I would need to iterate +through an array, dictionary, iterable, or any given data structure would always +be one more or one less than I anticipated. As a result, I became quite familiar +with the following error message:

IndexError: list index out of range
+

I recently discovered this problem I dealt with had a name: the off-by-one +error. An off-by-one error is a +type of error that occurs when an loop is iterated one more or one less than +intended. Off-by-one errors are typically caused by a mistake in the either +initial value of the loop variable or in the end condition of the loop. +Mathematically this can be represented by

$$ +n \pm 1 +$$

  • where $n$ represents the number of times intended to loop

There two types of off-by-one errors: undershooting and overshooting. +Undershooting occurs when the loop iterates one less time than intended, while +overshooting occurs when the loop iterates one more time than intended. Let’s +look at an example of each case, where $n$ represents the amount of times we +intend to loop and $i$ represents the current iteration:

// Case Study A
+for (int i = 1; i < n; i++) {
+  /* Body of the loop */
+}
+

Case A is an example of undershooting, and it will be executed $(n - 1)$ times. +In Case A, $i$ is defined to be one more than intended, which can be proven with +experimentation. For example, if $n$ was defined to be $10$ (and each value of +$i$ was printed), then the following numbers would be the resulting output:

$$1, 2, 3, 4, 5, 6, 7, 8, 9$$

This is because, at that point where $i$ becomes $10$, the conditional statement +$i < n$ becomes false and the loop subsequently terminates one iteration less +than intended. This scenario can be fixed by changing the initial value of $i$ +to be $0$ instead of $1$. A good example of overshooting is with the following +brain teaser:

  • If you build a straight fence 30 feet long with posts spaced 3 feet apart, how +many posts do you need?
    • (The common answer is one less than the correct answer)
// Case Study B
+for (int i = 0; i <= n; i++) {
+  /* Body of the loop */
+}
+

Case B is an example of overshooting, amd it will be executed $(n + 1)$ times. +In Case B, $i$ is defined to be one less than intended, which can also be proven +with experimentation. Following our previous thought experiment, the following +would be the resulting output:

$$0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \text{error}$$

This is because, at that point where $i$ becomes $10$, the conditional statement +$i \leq n$ still remains true, resulting in the loop iterating one more than +intended. This scenario can be fixed by changing the initial value of $i$ to be +$1$ instead of $0$. A good example of overshooting is with the following brain +teaser:

  • If you have n posts, how many sections are there between them?
    • (The common answer is one more than the correct answer)

Note that a for loop is simply a special case of a while loop where the number +of iterations to be done is already known, whereas a while loop has an +indefinite number of iterations. This means that an off-by-one error can occur +in while loops, although it is less common, as while loop definitions are based +around the output of logical expressions, whereas for loop definitions are based +around the repetition of an iterable object. One of the correct ways to write +the loop is:

for (int i = 0; i < n; i++) {
+  /* Body of the loop */
+}
+

If you found this post interesting, I would recommend the following as further +reading to learn more about off-by-one errors:

\ No newline at end of file diff --git a/blog/impossible-list/index.html b/blog/impossible-list/index.html new file mode 100644 index 0000000..4d489b5 --- /dev/null +++ b/blog/impossible-list/index.html @@ -0,0 +1,46 @@ +My Impossible List +
+

My Impossible List

We choose to go to the Moon. We choose to go to the Moon in this decade and do +the other things, not because they are easy, but because they are hard; +because that goal will serve to organize and measure the best of our energies +and skills, because that challenge is one that we are willing to accept, one +we are unwilling to postpone… And, therefore, as we set sail we ask God’s +blessing on the most hazardous and dangerous and greatest adventure on which +man has ever embarked.
John F. Kennedy1

This page was last edited on August 14, 2023

The impossible list traces its origins to its creator, +Joel Runyon. It’s essentially an +aspirational catalog of personal challenges, goals, and experiences that push +the boundaries of what an individual believes they can achieve.

The impossible list is not a bucket list, but very is similar to one. The bucket +list has this stigma attached to it which is that if the creator of it does not +complete it, they have “failed” themselves. I would not like to self impose this +pressure onto myself, but have a dynamic long-term roadmap for myself, that +changes and evolves along with me.

I will attempt to update this list regularly, in the case where I complete +something or have something to add, with the later being most likely.

😃 Life Goals

  • Read 100 books
  • Improve a Person’s Life
  • Give a TEDx Talk
  • Give a lecture at a scientific/professional conference
  • Give a lecture at a university
  • Work out 5 days a week regularly
  • Complete my Reading List
  • Complete my TV/Movies Watch List

🏋️ Fitness/Health Goals

  • Do 100 push-ups in a single set
  • Do 20 pull-ups in a single set

💼 Professional Goals

  • Work Remotely
  • Work at MANGA
  • Work at a startup +(June 19, 2023 - DeepWater Exploration)
  • Found a startup
  • Start a newsletter/YouTube channel
    • Gain 100 subscribers
    • Gain 250 subscribers
    • Gain 500 subscribers
    • Gain 1,000 subscribers
  • Write a book
  • Write 100 blog posts

🎨 Creative Goals

📚 Intellectual Goals

  • Learn to play the guitar/piano
  • Learn a foreign language
  • Learn a martial art
  • Learn another language
  • Learn Quantum Mechanics
  • Learn Quantum Computing
  • Write/Coauthor a scientific paper

If you are someone who can help me make one of these a reality, please get in +touch with me. I would love to hear from you.


  1. The above quote is excerpted from former President John F. Kennedy’s +Address at Rice University on the Nation’s Space Effort, +on September 12, 1962 ↩︎

\ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..bc8a792 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,30 @@ +¡Hola mundo! +
+

¡Hola mundo!

This is an archive of my journey to explore and conquer the inner workings of +computers, from the subatomic particles in transistors to the cool stuff we do +with processors, operating systems, and web browsers. Occasionaly, I’ll also +give my two cents on philosophy. All opinions are my own.

My Impossible List

My attempt to live forever or die trying, by doing what I want to do with my life. Do the things I want to do, see the places I want to see, meet the people I want to meet, and live the life I want to live.
\ No newline at end of file diff --git a/blog/index.xml b/blog/index.xml new file mode 100644 index 0000000..8127acd --- /dev/null +++ b/blog/index.xml @@ -0,0 +1,14 @@ +¡Hola mundo! on Miguel Villa Floranhttps://miguelvf.dev/blog/Recent content in ¡Hola mundo! on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000An Easy Guide to Using Tmuxhttps://miguelvf.dev/blog/dotfiles/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/tmux/Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install)Crafting a Robust and Maintainable C Makefilehttps://miguelvf.dev/blog/c-makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/c-makefile/I&rsquo;m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects.Using Secure Shell (ssh) and Key-Based Authenticationhttps://miguelvf.dev/blog/dotfiles/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/ssh/Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line.The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it.Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again.My Impossible Listhttps://miguelvf.dev/blog/impossible-list/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/blog/impossible-list/We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone&hellip; And, therefore, as we set sail we ask God&rsquo;s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked.Off-By-One Errors and How to Avoid Themhttps://miguelvf.dev/blog/off-by-one/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/off-by-one/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error.SystemVerilog Best Practiceshttps://miguelvf.dev/blog/hdl-best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/hdl-best-practices/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error.Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/blog/markdown-syntax/index.html b/blog/markdown-syntax/index.html new file mode 100644 index 0000000..1869193 --- /dev/null +++ b/blog/markdown-syntax/index.html @@ -0,0 +1,78 @@ +Markdown Syntax Guide +
+

Markdown Syntax Guide

This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.

Headings

The following HTML <h1><h6> elements represent six levels of section +headings. <h1> is the highest section level while <h6> is the lowest.

H1

H2

H3

H4

H5
H6

Paragraph

Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, +voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma +dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as +cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin +porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? +Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit +ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda +veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore +eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata +tiustia prat.

Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne +sapicia is sinveli squiatum, core et que aut hariosam ex eat.

Blockquotes

The blockquote element represents content that is quoted from another source, +optionally with a citation which must be within a footer or cite element, +and optionally with in-line changes such as annotations and abbreviations.

Blockquote without attribution

Tiam, ad mint andaepu dandae nostion secatur sequo quae. Note that you can +use Markdown syntax within a blockquote.

Blockquote with attribution

Don’t communicate by sharing memory, share memory by communicating.
— +Rob Pike1

Tables

Tables aren’t part of the core Markdown spec, but Hugo supports supports them +out-of-the-box.

NameAge
Bob27
Alice23

Inline Markdown within tables

ItalicsBoldCode
italicsboldcode

Code Blocks

Code block with backticks

<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <title>Example HTML5 Document</title>
+  </head>
+  <body>
+    <p>Test</p>
+  </body>
+</html>
+

Code block indented with four spaces

<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>Example HTML5 Document</title>
+</head>
+<body>
+  <p>Test</p>
+</body>
+</html>
+

Code block with Hugo’s internal highlight shortcode

<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>Example HTML5 Document</title>
+</head>
+<body>
+  <p>Test</p>
+</body>
+</html>

List Types

Ordered List

  1. First item
  2. Second item
  3. Third item

Unordered List

  • List item
  • Another item
  • And another item

Nested list

  • Fruit
    • Apple
    • Orange
    • Banana
  • Dairy
    • Milk
    • Cheese

Other Elements — abbr, sub, sup, kbd, mark

GIF is a bitmap image format.

H2O

Xn + Yn = Zn

Press CTRL+ALT+Delete to end the +session.

Most salamanders are nocturnal, and hunt for insects, worms, and +other small creatures.


  1. The above quote is excerpted from Rob Pike’s +talk during Gopherfest, +November 18, 2015. ↩︎

\ No newline at end of file diff --git a/blog/migrate-from-jekyl/index.html b/blog/migrate-from-jekyl/index.html new file mode 100644 index 0000000..753fe4f --- /dev/null +++ b/blog/migrate-from-jekyl/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/blog/markdown-syntax/ + \ No newline at end of file diff --git a/blog/off-by-one/index.html b/blog/off-by-one/index.html new file mode 100644 index 0000000..0f37669 --- /dev/null +++ b/blog/off-by-one/index.html @@ -0,0 +1,76 @@ +Off-By-One Errors and How to Avoid Them +
+

Off-By-One Errors and How to Avoid Them

When I was a beginner at programming, I would often find myself struggling with +the implementation of for loops. The amount of times I would need to iterate +through an array, dictionary, iterable, or any given data structure would always +be one more or one less than I anticipated. As a result, I became quite familiar +with the following error message:

IndexError: list index out of range
+

I recently discovered this problem I dealt with had a name: the off-by-one +error. An off-by-one error is a +type of error that occurs when an loop is iterated one more or one less than +intended. Off-by-one errors are typically caused by a mistake in the either +initial value of the loop variable or in the end condition of the loop. +Mathematically this can be represented by

$$ +n \pm 1 +$$

  • where $n$ represents the number of times intended to loop

There two types of off-by-one errors: undershooting and overshooting. +Undershooting occurs when the loop iterates one less time than intended, while +overshooting occurs when the loop iterates one more time than intended. Let’s +look at an example of each case, where $n$ represents the amount of times we +intend to loop and $i$ represents the current iteration:

// Case Study A
+for (int i = 1; i < n; i++) {
+  /* Body of the loop */
+}
+

Case A is an example of undershooting, and it will be executed $(n - 1)$ times. +In Case A, $i$ is defined to be one more than intended, which can be proven with +experimentation. For example, if $n$ was defined to be $10$ (and each value of +$i$ was printed), then the following numbers would be the resulting output:

$$1, 2, 3, 4, 5, 6, 7, 8, 9$$

This is because, at that point where $i$ becomes $10$, the conditional statement +$i < n$ becomes false and the loop subsequently terminates one iteration less +than intended. This scenario can be fixed by changing the initial value of $i$ +to be $0$ instead of $1$. A good example of overshooting is with the following +brain teaser:

  • If you build a straight fence 30 feet long with posts spaced 3 feet apart, how +many posts do you need?
    • (The common answer is one less than the correct answer)
// Case Study B
+for (int i = 0; i <= n; i++) {
+  /* Body of the loop */
+}
+

Case B is an example of overshooting, amd it will be executed $(n + 1)$ times. +In Case B, $i$ is defined to be one less than intended, which can also be proven +with experimentation. Following our previous thought experiment, the following +would be the resulting output:

$$0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \text{error}$$

This is because, at that point where $i$ becomes $10$, the conditional statement +$i \leq n$ still remains true, resulting in the loop iterating one more than +intended. This scenario can be fixed by changing the initial value of $i$ to be +$1$ instead of $0$. A good example of overshooting is with the following brain +teaser:

  • If you have n posts, how many sections are there between them?
    • (The common answer is one more than the correct answer)

Note that a for loop is simply a special case of a while loop where the number +of iterations to be done is already known, whereas a while loop has an +indefinite number of iterations. This means that an off-by-one error can occur +in while loops, although it is less common, as while loop definitions are based +around the output of logical expressions, whereas for loop definitions are based +around the repetition of an iterable object. One of the correct ways to write +the loop is:

for (int i = 0; i < n; i++) {
+  /* Body of the loop */
+}
+

If you found this post interesting, I would recommend the following as further +reading to learn more about off-by-one errors:

\ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 0000000..1a03ca9 --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/blog/ + \ No newline at end of file diff --git a/blog/sphinx-github-actions-docs-guide/index.html b/blog/sphinx-github-actions-docs-guide/index.html new file mode 100644 index 0000000..d527783 --- /dev/null +++ b/blog/sphinx-github-actions-docs-guide/index.html @@ -0,0 +1,164 @@ +Documentation with Sphinx and GitHub Actions the Right Way +
+

Documentation with Sphinx and GitHub Actions the Right Way

One of the things I value the most when it comes to when it comes to writing +software I publish is its maintainability, from the obscure and simple bash +scripts to the large and complex programing pillars packed with passion that are +placed in my programming portfolio.

For most people, this is limited to writing consise comments in the codebases +with the hope that they work once and never need to be touched again. This +approach

falls flat

the big picture, as in what

modules do on their own and what are the consequences of its execution with +respect to the entire codebase

most important aspects of any software project is its documentation.

.
+├── .github/
+│   └── workflows/
+│       └── sphinx-pipeline.yml
+├── source/
+│   ├── _static/
+│   │   ├── css/
+│   │   ├── favicons/
+│   │   ├── img/
+│   │   └── pdf/
+│   ├── conf.py
+│   └── index.rst
+├── .gitignore
+├── Make.bat
+├── Makefile
+└── requirements.txt
+
name: CI/CD Pipeline for Sphinx
+# Controls when the workflow will run
+on:
+  push:
+    branches: [main]
+  pull_request:
+    branches: [main]
+  workflow_dispatch:
+
+# The sequence of runs in this workflow:
+jobs:
+  deploy:
+    name: Build and Deploy Documentation
+    runs-on: ubuntu-latest
+    steps:
+      - run: lsb_release -a
+      - run: uname -a
+      - name: Check out Repository Code
+        uses: actions/checkout@v4
+      - name: Setup Python
+        uses: actions/setup-python@v4
+        with:
+          python-version: "3.10"
+
+      # pip caching
+      - name: Locate pip's cache
+        id: pip-cache
+        run: echo "::set-output name=dir::$(pip cache dir)"
+
+      - name: Cache dependencies
+        uses: actions/cache@v3
+        with:
+          path: ${{ steps.pip-cache.outputs.dir }}
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          restore-keys: |
+            ${{ runner.os }}-pip-            
+
+      # Install runtime dependencies
+      - name: Upgrade pip
+        run: pip install --upgrade pip
+      - name: Install dependencies
+        run: pip install -r requirements.txt
+
+      # Build sphinx source files
+      - name: Build sphinx files
+        run: make html
+
+      # Publish build files
+      - name: Deploy to GitHub Pages
+        uses: peaceiris/actions-gh-pages@v3
+        if: github.ref == 'refs/heads/main'
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          publish_dir: ./build/html
+
+      # Upload for introspection, useful for pull requests and debugging
+      - uses: actions/upload-artifact@v3
+        with:
+          name: generated-site
+          path: public/
+
# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Sphinx documentation
+build/
+
+# Environments
+.env
+.venv
+
# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+SOURCEDIR     = source
+BUILDDIR      = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+github:
+	@make html
+	@cp -a build/html/. ./docs
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+  # Maintain dependencies for GitHub Actions
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "daily"
+
+  # Maintain dependencies for pipenv
+  - package-ecosystem: "pip" # See documentation for possible values
+    directory: "/" # Location of package manifests
+    schedule:
+      interval: "daily"
+
\ No newline at end of file diff --git a/blog/uses/index.html b/blog/uses/index.html new file mode 100644 index 0000000..aa9f651 --- /dev/null +++ b/blog/uses/index.html @@ -0,0 +1,90 @@ +The Things I Use +
+

The Things I Use

Getting closer to how your environment actualy works will only expand your +mind
Michael B. Paulson, otherwise known as +ThePrimeagen

This page was last edited on March 29, 2024

My former college roomate and good friend, +Hayden Buscher, recently made a +post about the things he +uses to stay productive. Giving credit where its due, I thought it was a great +idea, so I decided to give my own spin on it.

This list is the fruits of my due diligence and research into finding the right +tools for my use cases. I hope it helps you find the right tools for you.

Hardware

Computer

The laptop I use is a is a Gigabyte AERO 16 OLED creator laptop, which features +a Intel 12th Gen i7 Processor, and a NVIDIA GeForce RTX 3070 Ti Graphics Card. I +love the anodized alumnium finish on the chasis, its sturdy, aesthetically +pleasing, and easy to clean. The OLED screen is gorgeous, I have become spolied +by such beautiful screens and stuggle looking at normal High Definition LED +screens. People passing by or in class will look at my screen and compliment it +(that’s how you know its good, who in their right mind would do that). As with +all OLED screens, scren burn is a real and legitmate concern I struggle with at +times, but it is a skill issue I have solved by autohiding my dock and with +screen savers, and in dire situations this +video. The keyboard is a joy to type on, and the trackpad is smooth and +responsive, but both get dirty quickly. The dongle provided by Gigabyte was +filmsy, and cheaply made, so I replaced it with a USB-C hub from Amazon. The +battery lasts about 3-4 hours on a full charge, which is fine for my use cases, +but I wish it lasted longer. I’ve had this laptop for about a year now, and I’m +very happy with it and would recommend it to anyone looking for a new laptop.

Mobile Devices

My phone isn’t anything special, so I’m not going to talk about it. I use a iPad +of the 10.2" variety (9th generation). I use it for reading and taking notes in +class. Honestly, this felt like a missing piece of my workflow, and I’m glad I +got it. With a paper-type screen protector, I get the feel of writing on paper, +the clarity and beauty of a digital screen, and the syncing and backup of the +cloud on a screen the size of a notebook. I use a knockoff Apple Pencil, and it +works fine. For note taking, I use the app +Goodnotes with the lifetime subcription.

Software

Operating System

Wow, what an easy and not at all controversial topic to answer… Welp, here we +go. I technically dual boot Windows 11 (ew) and +Ubuntu 22.04.2 LTS, also known as Jammy +Jellyfish, but so much of my time is spent on Ubuntu that I’m just going to talk +about that. My only gripes with it are the graphics drivers for my Nvidia GPU, +but this is resolved by the proprietary drivers from Nvidia provided by Ubuntu.

I’ve come to notice that when it comes to the tools I use (especially when it +comes to software), usage time and maintainance/stability are inversely +proportional to the customizability the tool provides. The more customization is +provided in software, the more time is spent configuring and mataining it, and +in worst-case scenarios, the more unstable it becomes. Because of this, less +time is spend actually using it.

My operating system is a tool, and as all good tools should, the distro I use +should be one that leverages this relationship, so I can manage how the software +is used, and not how it works. This is why I am probably not ever going to be an +Arch Linux user. Its very impressive how quickly Arch Linux packages maintainers +innovate and release changes, and pacman is a great package manager, but I do +not have the time nor the patience to maintain my broken system when I forget to +update after a week.

On the other end of the spectrum, Ubuntu works out of the box, but its quite +bloated with software I will never use or need. I used to be a bit of a distro +hopper, but like an old pair of jeans, I always come back to Ubuntu for its ease +of use and stability. For the most part, it just works.

One distro that has caught my eye and I’ve been meaning to try is Debian, +specifically Debian 12 (Bookworm) . Its +seems to hit the sweet spot of stability and customizability between Arch and +Ubuntu, and I’ve heard great things about from Hayden and +Noah Oveson.

Window Manager

I’m not a fan of the default GNOME desktop environment, I’m a tiling window +enjoyer. I like to have full control over my windows, so I use the +i3 window manager. However, I plan on switching to dwm in +the future, as I’ve heard it is more stable and faster than i3.

Coding Font

I cannot stress how elgalant and beautiful the font +MonoLisa is. I use it for everything, from my code +editor to my terminal. MonoLisa definately lives up to its branding of “font +follows function”. Being a monospaced font, each of the characters are the same +width and its ligatures, which is the combination of two or more characters into +a single character, provide a great reading experience and look cool. I patch +MonoLisa into a Nerd Font by using this custom +patching script. I +highly recommend it.

\ No newline at end of file diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 0000000..b82dfc5 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #282828 + + + diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..ea0c814 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,27 @@ +Categories +
+

Categories

syntax

themes

\ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 0000000..f9c2be1 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Categories on Miguel Villa Floranhttps://miguelvf.dev/categories/Recent content in Categories on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000syntaxhttps://miguelvf.dev/categories/syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/categories/syntax/themeshttps://miguelvf.dev/categories/themes/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/categories/themes/ \ No newline at end of file diff --git a/categories/page/1/index.html b/categories/page/1/index.html new file mode 100644 index 0000000..a5e5a99 --- /dev/null +++ b/categories/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/categories/ + \ No newline at end of file diff --git a/categories/syntax/index.html b/categories/syntax/index.html new file mode 100644 index 0000000..f04ea55 --- /dev/null +++ b/categories/syntax/index.html @@ -0,0 +1,27 @@ +syntax +
+

syntax

\ No newline at end of file diff --git a/categories/syntax/index.xml b/categories/syntax/index.xml new file mode 100644 index 0000000..a1f1b7d --- /dev/null +++ b/categories/syntax/index.xml @@ -0,0 +1,3 @@ +syntax on Miguel Villa Floranhttps://miguelvf.dev/categories/syntax/Recent content in syntax on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/categories/syntax/page/1/index.html b/categories/syntax/page/1/index.html new file mode 100644 index 0000000..555209f --- /dev/null +++ b/categories/syntax/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/categories/syntax/ + \ No newline at end of file diff --git a/categories/themes/index.html b/categories/themes/index.html new file mode 100644 index 0000000..c30a1b5 --- /dev/null +++ b/categories/themes/index.html @@ -0,0 +1,27 @@ +themes +
+

themes

\ No newline at end of file diff --git a/categories/themes/index.xml b/categories/themes/index.xml new file mode 100644 index 0000000..ec4d153 --- /dev/null +++ b/categories/themes/index.xml @@ -0,0 +1,3 @@ +themes on Miguel Villa Floranhttps://miguelvf.dev/categories/themes/Recent content in themes on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/categories/themes/page/1/index.html b/categories/themes/page/1/index.html new file mode 100644 index 0000000..349c1e7 --- /dev/null +++ b/categories/themes/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/categories/themes/ + \ No newline at end of file diff --git a/css/.gitkeep b/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/css/non-critical.4553bb6f9f80671f2f764cf84c6a2bc29895c01ba0b2876c742e4205f0249c4156f6a7663a77f67087227cd19b8dfc445723a657f9e1deb0578a76ae1d44705b.css b/css/non-critical.4553bb6f9f80671f2f764cf84c6a2bc29895c01ba0b2876c742e4205f0249c4156f6a7663a77f67087227cd19b8dfc445723a657f9e1deb0578a76ae1d44705b.css new file mode 100644 index 0000000..bb429fe --- /dev/null +++ b/css/non-critical.4553bb6f9f80671f2f764cf84c6a2bc29895c01ba0b2876c742e4205f0249c4156f6a7663a77f67087227cd19b8dfc445723a657f9e1deb0578a76ae1d44705b.css @@ -0,0 +1,3 @@ +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{opacity:0;position:absolute;right:.2em;top:.3em;transition:opacity .3s ease-in-out;z-index:10}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{background:#f5f2f0;background:hsla(0,0%,88%,.2);border-radius:.5em;box-shadow:0 2px 0 0 rgba(0,0,0,.2);color:#bbb;font-size:.8em;padding:0 .5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;-webkit-text-decoration:none;text-decoration:none}pre[class*=language-].line-numbers{counter-reset:linenumber;padding-left:3.8em;position:relative}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{border-right:1px solid #999;font-size:100%;left:-3.8em;letter-spacing:-1px;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:3em}.line-numbers-rows>span{counter-increment:linenumber;display:block}.line-numbers-rows>span:before{color:#999;content:counter(linenumber);display:block;padding-right:.8em;text-align:right}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none}.command-line-prompt>span:before{content:" ";display:block;opacity:.7;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7}pre.diff-highlight>code .token.deleted:not(.prefix),pre>code.diff-highlight .token.deleted:not(.prefix){background-color:rgba(255,0,0,.1);color:inherit;display:block}pre.diff-highlight>code .token.inserted:not(.prefix),pre>code.diff-highlight .token.inserted:not(.prefix){background-color:rgba(0,255,128,.1);color:inherit;display:block}code,code[class*=language-],kbd,pre[class*=language-]{font-family:var(--font-monospace)} + +/*! MIT License | github.com/schnerring/hugo-theme-gruvbox */.Docker{--color:#1d63ed;background-color:#1d63ed!important;background-color:var(--color)!important;color:#fff!important}.Docker{font-weight:700!important}.GitHub.Actions{--color:#2088ff;background-color:#2088ff!important;background-color:var(--color)!important;color:#fff!important}.GitHub.Actions{font-weight:700!important}.LaTeX{font-weight:700!important}.LaTeX{--color:teal;background-color:teal!important;background-color:var(--color)!important}.LTSpice,.LaTeX{color:#fff!important}.LTSpice{--color:#910029;background-color:#910029!important;background-color:var(--color)!important}.LTSpice{font-weight:700!important}.Rust{font-weight:700!important}.Rust{color:#000!important;--color:#dea584;background-color:#dea584!important;background-color:var(--color)!important}.WebAssembly{--color:#232671;background-color:#232671!important;background-color:var(--color)!important;color:#fff!important}.WebAssembly{font-weight:700!important}footer{align-items:center;color:var(--fg3);display:flex;font-family:var(--font-monospace);font-size:.8rem;justify-content:center;padding-bottom:.5rem;padding-top:2rem;text-align:center}.pagination{display:flex;margin-top:2rem}.pagination__button{color:var(--primary-alt);font-family:var(--font-monospace);font-size:1.125rem}.pagination__button:hover{color:var(--primary)}.pagination__button--next{margin-left:auto} \ No newline at end of file diff --git a/cursors/gracefuldice.gif b/cursors/gracefuldice.gif new file mode 100644 index 0000000..38816d6 Binary files /dev/null and b/cursors/gracefuldice.gif differ diff --git a/cursors/marshmallonyuug.gif b/cursors/marshmallonyuug.gif new file mode 100644 index 0000000..9ef79d8 Binary files /dev/null and b/cursors/marshmallonyuug.gif differ diff --git a/cursors/skulldice.gif b/cursors/skulldice.gif new file mode 100644 index 0000000..4694187 Binary files /dev/null and b/cursors/skulldice.gif differ diff --git a/cv/index.html b/cv/index.html new file mode 100644 index 0000000..8e84744 --- /dev/null +++ b/cv/index.html @@ -0,0 +1,47 @@ +CV +
+

CV

Experience

CEO/President
2013-12-01 +- +2014-12-01
Pied Piper + +Awesome compression company
Palo Alto, CA

Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.

  • Build an algorithm for artist to detect if their music was violating copy right infringement laws
  • Successfully won Techcrunch Disrupt
  • Optimized an algorithm that holds the current world record for Weisman Scores

Education

Information Technology (Bachelor)
2011-06-01 +- +2014-01-01

4.0

  • DB1101 - Basic SQL
  • CS2011 - Java Introduction

Volunteering

Teacher
2012-01-01 +- +2013-01-01

Global movement of free coding clubs for young people.

  • Awarded 'Teacher of the Month'

Awards

Digital Compression Pioneer Award
2014-11-01
Techcrunch

There is no spoon.

Certificates

Publications

Innovative middle-out compression algorithm that changes the way we store data.

Skills

  • Web Development (Master)

    HTML, CSS, Javascript

  • Compression (Master)

    Mpeg, MP4, GIF

Languages

  • English — +Native speaker

Interests

  • Wildlife — +Ferrets, Unicorns

References

It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company.

— Erlich Bachman

Projects

Team lead, Designer
2016-08-24 +- +2016-08-24
Miss Direction +(application) + +A mapping engine that misguides you
Smoogle
  • Won award at AIHacks 2016
  • Built by all women team of newbie programmers
  • Using modern technologies such as GoogleMaps, Chrome Extension and Javascript

GoogleMaps, Chrome Extension, Javascript

\ No newline at end of file diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000..31669e1 Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000..dd631f3 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..d6b7a35 Binary files /dev/null and b/favicon.ico differ diff --git a/fonts/fira-code-latin-300.woff b/fonts/fira-code-latin-300.woff new file mode 100644 index 0000000..140a94a Binary files /dev/null and b/fonts/fira-code-latin-300.woff differ diff --git a/fonts/fira-code-latin-300.woff2 b/fonts/fira-code-latin-300.woff2 new file mode 100644 index 0000000..86eaa9c Binary files /dev/null and b/fonts/fira-code-latin-300.woff2 differ diff --git a/fonts/fira-code-latin-400.woff b/fonts/fira-code-latin-400.woff new file mode 100644 index 0000000..10a14ac Binary files /dev/null and b/fonts/fira-code-latin-400.woff differ diff --git a/fonts/fira-code-latin-400.woff2 b/fonts/fira-code-latin-400.woff2 new file mode 100644 index 0000000..99f05e3 Binary files /dev/null and b/fonts/fira-code-latin-400.woff2 differ diff --git a/fonts/fira-code-latin-500.woff b/fonts/fira-code-latin-500.woff new file mode 100644 index 0000000..b3a2364 Binary files /dev/null and b/fonts/fira-code-latin-500.woff differ diff --git a/fonts/fira-code-latin-500.woff2 b/fonts/fira-code-latin-500.woff2 new file mode 100644 index 0000000..76695cf Binary files /dev/null and b/fonts/fira-code-latin-500.woff2 differ diff --git a/fonts/fira-code-latin-600.woff b/fonts/fira-code-latin-600.woff new file mode 100644 index 0000000..837477e Binary files /dev/null and b/fonts/fira-code-latin-600.woff differ diff --git a/fonts/fira-code-latin-600.woff2 b/fonts/fira-code-latin-600.woff2 new file mode 100644 index 0000000..677b25a Binary files /dev/null and b/fonts/fira-code-latin-600.woff2 differ diff --git a/fonts/fira-code-latin-700.woff b/fonts/fira-code-latin-700.woff new file mode 100644 index 0000000..0925d24 Binary files /dev/null and b/fonts/fira-code-latin-700.woff differ diff --git a/fonts/fira-code-latin-700.woff2 b/fonts/fira-code-latin-700.woff2 new file mode 100644 index 0000000..b120bb1 Binary files /dev/null and b/fonts/fira-code-latin-700.woff2 differ diff --git a/fonts/roboto-slab-latin-100.woff b/fonts/roboto-slab-latin-100.woff new file mode 100644 index 0000000..4cc73bf Binary files /dev/null and b/fonts/roboto-slab-latin-100.woff differ diff --git a/fonts/roboto-slab-latin-100.woff2 b/fonts/roboto-slab-latin-100.woff2 new file mode 100644 index 0000000..cc7a1e9 Binary files /dev/null and b/fonts/roboto-slab-latin-100.woff2 differ diff --git a/fonts/roboto-slab-latin-200.woff b/fonts/roboto-slab-latin-200.woff new file mode 100644 index 0000000..e94017f Binary files /dev/null and b/fonts/roboto-slab-latin-200.woff differ diff --git a/fonts/roboto-slab-latin-200.woff2 b/fonts/roboto-slab-latin-200.woff2 new file mode 100644 index 0000000..e34ea98 Binary files /dev/null and b/fonts/roboto-slab-latin-200.woff2 differ diff --git a/fonts/roboto-slab-latin-300.woff b/fonts/roboto-slab-latin-300.woff new file mode 100644 index 0000000..349f305 Binary files /dev/null and b/fonts/roboto-slab-latin-300.woff differ diff --git a/fonts/roboto-slab-latin-300.woff2 b/fonts/roboto-slab-latin-300.woff2 new file mode 100644 index 0000000..3100e32 Binary files /dev/null and b/fonts/roboto-slab-latin-300.woff2 differ diff --git a/fonts/roboto-slab-latin-400.woff b/fonts/roboto-slab-latin-400.woff new file mode 100644 index 0000000..4ef4ab8 Binary files /dev/null and b/fonts/roboto-slab-latin-400.woff differ diff --git a/fonts/roboto-slab-latin-400.woff2 b/fonts/roboto-slab-latin-400.woff2 new file mode 100644 index 0000000..b135852 Binary files /dev/null and b/fonts/roboto-slab-latin-400.woff2 differ diff --git a/fonts/roboto-slab-latin-500.woff b/fonts/roboto-slab-latin-500.woff new file mode 100644 index 0000000..7b21a3e Binary files /dev/null and b/fonts/roboto-slab-latin-500.woff differ diff --git a/fonts/roboto-slab-latin-500.woff2 b/fonts/roboto-slab-latin-500.woff2 new file mode 100644 index 0000000..ec193de Binary files /dev/null and b/fonts/roboto-slab-latin-500.woff2 differ diff --git a/fonts/roboto-slab-latin-600.woff b/fonts/roboto-slab-latin-600.woff new file mode 100644 index 0000000..7c3774e Binary files /dev/null and b/fonts/roboto-slab-latin-600.woff differ diff --git a/fonts/roboto-slab-latin-600.woff2 b/fonts/roboto-slab-latin-600.woff2 new file mode 100644 index 0000000..1e20cbf Binary files /dev/null and b/fonts/roboto-slab-latin-600.woff2 differ diff --git a/fonts/roboto-slab-latin-700.woff b/fonts/roboto-slab-latin-700.woff new file mode 100644 index 0000000..a1dbdd7 Binary files /dev/null and b/fonts/roboto-slab-latin-700.woff differ diff --git a/fonts/roboto-slab-latin-700.woff2 b/fonts/roboto-slab-latin-700.woff2 new file mode 100644 index 0000000..9813ce2 Binary files /dev/null and b/fonts/roboto-slab-latin-700.woff2 differ diff --git a/fonts/roboto-slab-latin-800.woff b/fonts/roboto-slab-latin-800.woff new file mode 100644 index 0000000..89e8b52 Binary files /dev/null and b/fonts/roboto-slab-latin-800.woff differ diff --git a/fonts/roboto-slab-latin-800.woff2 b/fonts/roboto-slab-latin-800.woff2 new file mode 100644 index 0000000..48c5831 Binary files /dev/null and b/fonts/roboto-slab-latin-800.woff2 differ diff --git a/fonts/roboto-slab-latin-900.woff b/fonts/roboto-slab-latin-900.woff new file mode 100644 index 0000000..8800630 Binary files /dev/null and b/fonts/roboto-slab-latin-900.woff differ diff --git a/fonts/roboto-slab-latin-900.woff2 b/fonts/roboto-slab-latin-900.woff2 new file mode 100644 index 0000000..91ae157 Binary files /dev/null and b/fonts/roboto-slab-latin-900.woff2 differ diff --git a/hugo.png b/hugo.png new file mode 100644 index 0000000..50e23ce Binary files /dev/null and b/hugo.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..47a8c32 --- /dev/null +++ b/index.html @@ -0,0 +1,53 @@ +Home — Miguel Villa Floran +
+

Greetings, I’m Miguel 👋

I’m an engineer & entrepreneur focusing on applied robotics & embedded systems. +I’m also currently researching Large Language Models and building AI projects in +stealth. I also write occasionally about +philosophy and computers.

I’m a sophomore at Cal Poly studying Computer +Engineering. I am currently writing drivers and firmware for electric vehicles +at Cal Poly Racing. Here are some of the +projects I’ve work on at Cal Poly.

This past summer, I worked at DeepWater Exploration to ship +some streaming software, which outperformed +OBS, and drivers and firmware for their products which are used in various +applications spanning across academia, enterprise, and defense.

This upcoming summer I will be working at NVIDIA, +working on their internal platform used for end-to-end testing of their +products, from the modular down to the transistor level.

See more on my resume or contact me at +mavillaf@calpoly.edu.

Things I've Built

Low Supply Indicator
Low Supply Indicator

An undervoltage detection circuit with an optical indicator designed in LTSpice.

  • LaTeX
  • LTSpice
  • GitHub Actions
rustyNES
rustyNES

An NES emulator and implementation of the MOS Technology 6502 processor written in Rust.

  • Rust
  • Docker
  • WebAssembly
\ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 0000000..d80fda8 --- /dev/null +++ b/index.xml @@ -0,0 +1,15 @@ +Greetings, I'm Miguel 👋 on Miguel Villa Floranhttps://miguelvf.dev/Recent content in Greetings, I'm Miguel 👋 on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000An Easy Guide to Using Tmuxhttps://miguelvf.dev/blog/dotfiles/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/tmux/Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install)Crafting a Robust and Maintainable C Makefilehttps://miguelvf.dev/blog/c-makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/c-makefile/I&rsquo;m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects.Using Secure Shell (ssh) and Key-Based Authenticationhttps://miguelvf.dev/blog/dotfiles/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/ssh/Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line.The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it.Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again.My Impossible Listhttps://miguelvf.dev/blog/impossible-list/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/blog/impossible-list/We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone&hellip; And, therefore, as we set sail we ask God&rsquo;s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked.Off-By-One Errors and How to Avoid Themhttps://miguelvf.dev/blog/off-by-one/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/off-by-one/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error.SystemVerilog Best Practiceshttps://miguelvf.dev/blog/hdl-best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/hdl-best-practices/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error.Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p>CVhttps://miguelvf.dev/cv/Mon, 01 Jan 0001 00:00:00 +0000https://miguelvf.dev/cv/Experience# CEO/President 2013-12-01 - 2014-12-01 Pied Piper — Awesome compression company Palo Alto, CA Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression. +Build an algorithm for artist to detect if their music was violating copy right infringement laws Successfully won Techcrunch Disrupt Optimized an algorithm that holds the current world record for Weisman Scores Education# Information Technology (Bachelor) 2011-06-01 - 2014-01-01 University of Oklahoma 4. \ No newline at end of file diff --git a/js/.gitkeep b/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/js/flexsearch.9ff54c13033960190a52bc92b5b45d6afa5a1a44fdb15e65e4a2824c8b81637706c21ffd1726c4618b35997640b550bdb8b7fb91633136223436bf276cec1dc1.js b/js/flexsearch.9ff54c13033960190a52bc92b5b45d6afa5a1a44fdb15e65e4a2824c8b81637706c21ffd1726c4618b35997640b550bdb8b7fb91633136223436bf276cec1dc1.js new file mode 100644 index 0000000..a895db0 --- /dev/null +++ b/js/flexsearch.9ff54c13033960190a52bc92b5b45d6afa5a1a44fdb15e65e4a2824c8b81637706c21ffd1726c4618b35997640b550bdb8b7fb91633136223436bf276cec1dc1.js @@ -0,0 +1,100 @@ +(()=>{var oe=Object.create;var te=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ae=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var he=(e,i)=>()=>(i||e((i={exports:{}}).exports,i),i.exports);var ue=(e,i,n,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of re(i))!le.call(e,s)&&s!==n&&te(e,s,{get:()=>i[s],enumerable:!(o=se(i,s))||o.enumerable});return e};var ce=(e,i,n)=>(n=e!=null?oe(ae(e)):{},ue(i||!e||!e.__esModule?te(n,"default",{value:e,enumerable:!0}):n,e));var ie=he((exports,module)=>{(function _f(self){"use strict";try{module&&(self=module)}catch(e){}self._factory=_f;var t;function u(e){return typeof e!="undefined"?e:!0}function aa(e){let i=Array(e);for(let n=0;n=this.B&&($||!g[p])){var r=L(w,o,k),l="";switch(this.G){case"full":if(2r;h--)if(h-r>=this.B){var f=L(w,o,k,s,r);l=p.substring(r,h),M(this,g,l,f,e,n)}break}case"reverse":if(1=this.B&&M(this,g,l,L(w,o,k,s,h),e,n);l=""}case"forward":if(1=this.B&&M(this,g,l,r,e,n);break}default:if(this.C&&(r=Math.min(r/this.C(i,p,k)|0,w-1)),M(this,g,p,r,e,n),$&&1=this.B&&!s[p]){s[p]=1;let y=this.l&&p>r;M(this,m,y?r:p,L(l+(o/2>l?0:1),o,k,h-1,f-1),e,n,y?p:r)}}}}}this.m||(this.register[e]=1)}}return this};function L(e,i,n,o,s){return n&&1=this.B&&!n[w])if(this.s||r||this.map[w])f[$++]=w,n[w]=1;else return o;e=f,s=e.length}if(!s)return o;i||(i=100),h=this.depth&&1=o))));w++);if(g){if(r)return ta(f,o,0);i[i.length]=f;return}}return!n&&f}function ta(e,i,n){return e=e.length===1?e[0]:[].concat.apply([],e),n||e.length>i?e.slice(n,n+i):e}function ua(e,i,n,o){return n?(o=o&&i>n,e=(e=e[o?i:n])&&e[o?n:i]):e=e[i],e}t.contain=function(e){return!!this.register[e]},t.update=function(e,i){return this.remove(e).add(e,i)},t.remove=function(e,i){let n=this.register[e];if(n){if(this.m)for(let o=0,s;oi||n)&&(s=s.slice(n,n+i)),o&&(s=za.call(this,s)),{tag:e,result:s}}function za(e){let i=Array(e.length);for(let n=0,o;n{e.ctrlKey&&e.key==="/"?(e.preventDefault(),z.focus()):e.key==="Escape"&&(z.blur(),H.classList.add("search__suggestions--hidden"))});document.addEventListener("click",e=>{H.contains(e.target)||H.classList.add("search__suggestions--hidden")});document.addEventListener("keydown",e=>{if(H.classList.contains("search__suggestions--hidden"))return;let n=[...H.querySelectorAll("a")];if(n.length===0)return;let o=n.indexOf(document.activeElement);if(e.key==="ArrowDown"){e.preventDefault();let s=o+10?o-1:0,n[nextIndex].focus())});(function(){let e=new ne.Document({tokenize:"forward",cache:100,document:{id:"id",store:["href","title","description"],index:["title","description","content"]}});e.add({id:0,href:"/blog/dotfiles/tmux/",title:"An Easy Guide to Using Tmux",description:"A brief guide to setting up, configuring, and using Tmux for terminal multiplexing.",content:`Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install) +Window Management Commands# Command Keybind Command Description prefix + c create new window and switch to it prefix + # switch to window # prefix + n switch to next window prefix + p switch to previous window prefix + : swap window with next window prefix + ; swap window with previous window prefix + & kill window and all panes in it Pane Management Commands# Command Keybind Command Description prefix + % split a pane horizontally into two panes prefix + " split a pane vertically into two panes prefix + { swap pane with previous pane prefix + } swap pane with next pane prefix + h / \u2190 switch to pane on the left prefix + j / \u2193 switch to pane below prefix + k / \u2191 switch to pane above prefix + l / \u2192 switch to pane on the right prefix + q + # switch active pane to pane # prefix + z zoom in/out of pane to take up full window prefix + ! break pane into a new window prefix + x kill pane Miscellaneous Commands# Command Keybind Command Description v start selection in copy mode y yank (copy) selection to system clipboard ctrl + v toggle between rectangular and line selection mode prefix + r refresh tmux configuration `}).add({id:1,href:"/blog/c-makefile/",title:"Crafting a Robust and Maintainable C Makefile",description:"A brief guide to creating from scratch the Makefile template that is used in my C projects.",content:`I’m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects. +First, create a new file called Makefile in the root directory of your project. Let’s start by defining the name of the program that we will be building. +# The name of the program to build. TARGET := example Complier# The first thing we need to do is define the compiler and shell that we will be using. In this example, we will be using gcc and /bin/bash, respectively. We will also define the compiler flags that we will be using. +# The compiler executable. CC := gcc # The compiler flags. CFLAGS := -Wall -Wextra -Werror -pedantic -std=c99 # The linker executable. LD := gcc # The linker flags. LDFLAGS := -Wall -Wextra -Werror -pedantic -std=c99 # The shell executable. SHELL := /bin/bash Testing and Debugging# Next, we will define some variables that will be used for testing and debugging our project. We will define the name of the test executable, the name of the debug executable, and provide some flags that will be used by the memory checker and debugger. +# The memory checker executable. MEMCHECK := valgrind # The memory checker flags. MEMCHECK_FLAGS := --leak-check=full --show-leak-kinds=all --track-origins=yes # The debugger executable. DEBUGGER := gdb # The debugger flags. DEBUGGER_FLAGS := # The name of the test input file TEST_INPUT := # The name of the test output file TEST_OUTPUT := # The name of the reference executable REF_EXE := # The name of the reference output file REF_OUTPUT := Directories# One of the cool things about make is we can set varibles to be the output of shell commands by using the := operator. This way, we can define variables that refer to directories related to the root directory of the project. We are going to work under the assumption that the project has the following directory structure: +.project/ # root directory of the project \u251C\u2500\u2500 include/ # header files \u251C\u2500\u2500 lib/ # external libraries \u251C\u2500\u2500 obj/ # object files \u251C\u2500\u2500 src/ # source files \u2514\u2500\u2500 target/ # build artifacts \u251C\u2500\u2500 debug/ # debug build \u2514\u2500\u2500 release/ # release build To achieve this, we can define the following variables: +# top directory of project TOP_DIR := $(shell pwd) # directory to locate source files SRC_DIR := $(TOP_DIR)/src # directory to locate header files INC_DIR := $(TOP_DIR)/include # directory to locate external libraries files LIB_DIR := $(TOP_DIR)/lib # directory to locate object files OBJ_DIR := $(TOP_DIR)/obj # directory to place build artifacts BUILD_DIR := $(TOP_DIR)/target/release/ Targets# Now that we have defined all the necessary variables, we can start defining the targets that will be used to build our project. The first target that we will define is the all target, which will build the program. +# The default target. .PHONY: all all: $(BUILD_DIR)/$(TARGET) `}).add({id:2,href:"/blog/dotfiles/ssh/",title:"Using Secure Shell (ssh) and Key-Based Authentication",description:"A brief guide to setting up, configuring, and using ssh for secure remote access to servers.",content:`Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line. To connect to the server, use the following command: +ssh <username>@<server_ip> exit # to exit the server SSH Key-Based Authentication Setup# Normally, connecting to a server via ssh requires you to enter your password. This is called password-based authentication. +However, you can set up SSH key-based authentication so that you do not have to enter your password every time you connect to a server. +To set up SSH key-based authentication, follow the steps below. +Generate a new ssh key (we will generate an RSA SSH key pair with a key size of 4096 bits) Note Do not change the default name or location of the key. Using a passphrase is optional but not recommended. +# If the host was previously used for ssh and the host key has changed, remove the old host key ssh-keygen -f "~/.ssh/known_hosts" -R "<server_ip>" # Generate a new ssh key ssh-keygen -t rsa -b 4096 Copy the public key to the server # Ssh into the server ssh <username>@<server_ip> # Create ssh directory mkdir ~/.ssh cd ~/.ssh # exit server exit On your local machine execute the following commands: scp ~/.ssh/id_rsa.pub <username>@<server_ip>:~/.ssh/authorized_keys Change the permissions of the ssh directory and its contents to prevent other users from accessing your keys sh # Ssh into the server ssh <username>@<server_ip> # Restrict read, write, and execute permissions to the \`~/.ssh\` directory to only the owner (\`username\`) chmod 700 ~/.ssh/ # Restrict read and write permissions to the contents of the \`authorized_keys\` directory to only the owner (\`username\`) chmod 600 ~/.ssh/authorized_keys # exit server exit After completing the steps above, you should be able to connect to the server without entering your password. Enabling SSH Key-Based Authentication Only# Since SSH key-based authentication is more convenient and more secure than password-based authentication, we will restrict the server to only use SSH key-based authentication. +To do this, we will edit the server’s SSH configuration file. This file is located at /etc/ssh/sshd_config. +Warning Password-based authentication and challenge-response authentication will be disabled. If you do not have password-based authentication already configured, you will not be able to connect to the server. +Method 1 - Configuration via ssh-copy-id# To configure the server to only use SSH key-based authentication via ssh-copy-id, follow the steps below. +# Copy the public key to the server ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<server_ip> # Ssh into the server ssh <username>@<server_ip> # exit server exit Method 2 - Manual Configuration# To manually configure the server to only use SSH key-based authentication, run the following commands: +Warning the location of the SSH configuration file is assumed to be located at /etc/ssh/sshd_config. If this is not the case, you will need to modify the commands below to reflect the location of the SSH configuration file. You can find the location of the SSH configuration file by executing a script I wrote found in my dotfiles’s > /scripts folder +# make find_sshd_config executable chmod +x find_sshd_config.sh ./find_sshd_config.sh # Ssh into the server ssh <username>@<ip> # /etc/ssh/sshd_config = ssh config of server # Disable password-based authentication sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config # Disable challenge-response authentication sudo sed -i 's/^#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config # Enable public key authentication on the server sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config # Restart the server's SSH service to apply the new configuration if [[ $(ps -p 1 -o comm=) == "systemd" ]]; then ## On systemd-based systems echo "System is systemd-based. Restarting sshd." sudo systemctl restart sshd else ## On SysV init systems echo "System is SysV init-based. Restarting ssh." sudo service ssh restart fi echo "SSH configuration completed. Disconnecting from server." # exit server exit # exit server Securely Storing SSH Keys and Auth Tokens on the Internet# Storing your SSH keys and authentication tokens on the internet might seem like a bad idea, but if they are properly secured, storing them in a public GitHub repository can be a convenient and secure way to sync your SSH keys and authentication tokens across multiple machines. Luckily for us, ansible-vault’s encryption engine is based on the AES-256 cipher, which is a symmetric cipher that is quantum resistant. This ensures that sensitive information remains protected, even in a public repository. +Encrypting Files Via Ansible-Vault# To encrypt files, including your SSH keys and authentication tokens on the internet, run the following command: +# Encrypt files using ansible-vault ansible-vault encrypt <path_to_file> Enter an encryption key when prompted. +Decrypting Files Via Ansible-Vault# To decrypt files, run the following command: +# Decrypt files using ansible-vault ansible-vault decrypt <path_to_file> Enter the encryption key when prompted. +`}).add({id:3,href:"/blog/uses/",title:"The Things I Use",description:"The wonderful world of things I use to make my life easier.",content:` Getting closer to how your environment actualy works will only expand your mind \u2014 Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. +This list is the fruits of my due diligence and research into finding the right tools for my use cases. I hope it helps you find the right tools for you. +Hardware# Computer# The laptop I use is a is a Gigabyte AERO 16 OLED creator laptop, which features a Intel 12th Gen i7 Processor, and a NVIDIA GeForce RTX 3070 Ti Graphics Card. I love the anodized alumnium finish on the chasis, its sturdy, aesthetically pleasing, and easy to clean. The OLED screen is gorgeous, I have become spolied by such beautiful screens and stuggle looking at normal High Definition LED screens. People passing by or in class will look at my screen and compliment it (that’s how you know its good, who in their right mind would do that). As with all OLED screens, scren burn is a real and legitmate concern I struggle with at times, but it is a skill issue I have solved by autohiding my dock and with screen savers, and in dire situations this video. The keyboard is a joy to type on, and the trackpad is smooth and responsive, but both get dirty quickly. The dongle provided by Gigabyte was filmsy, and cheaply made, so I replaced it with a USB-C hub from Amazon. The battery lasts about 3-4 hours on a full charge, which is fine for my use cases, but I wish it lasted longer. I’ve had this laptop for about a year now, and I’m very happy with it and would recommend it to anyone looking for a new laptop. +Mobile Devices# My phone isn’t anything special, so I’m not going to talk about it. I use a iPad of the 10.2" variety (9th generation). I use it for reading and taking notes in class. Honestly, this felt like a missing piece of my workflow, and I’m glad I got it. With a paper-type screen protector, I get the feel of writing on paper, the clarity and beauty of a digital screen, and the syncing and backup of the cloud on a screen the size of a notebook. I use a knockoff Apple Pencil, and it works fine. For note taking, I use the app Goodnotes with the lifetime subcription. +Software# Operating System# Wow, what an easy and not at all controversial topic to answer… Welp, here we go. I technically dual boot Windows 11 (ew) and Ubuntu 22.04.2 LTS, also known as Jammy Jellyfish, but so much of my time is spent on Ubuntu that I’m just going to talk about that. My only gripes with it are the graphics drivers for my Nvidia GPU, but this is resolved by the proprietary drivers from Nvidia provided by Ubuntu. +I’ve come to notice that when it comes to the tools I use (especially when it comes to software), usage time and maintainance/stability are inversely proportional to the customizability the tool provides. The more customization is provided in software, the more time is spent configuring and mataining it, and in worst-case scenarios, the more unstable it becomes. Because of this, less time is spend actually using it. +My operating system is a tool, and as all good tools should, the distro I use should be one that leverages this relationship, so I can manage how the software is used, and not how it works. This is why I am probably not ever going to be an Arch Linux user. Its very impressive how quickly Arch Linux packages maintainers innovate and release changes, and pacman is a great package manager, but I do not have the time nor the patience to maintain my broken system when I forget to update after a week. +On the other end of the spectrum, Ubuntu works out of the box, but its quite bloated with software I will never use or need. I used to be a bit of a distro hopper, but like an old pair of jeans, I always come back to Ubuntu for its ease of use and stability. For the most part, it just works. +One distro that has caught my eye and I’ve been meaning to try is Debian, specifically Debian 12 (Bookworm) . Its seems to hit the sweet spot of stability and customizability between Arch and Ubuntu, and I’ve heard great things about from Hayden and Noah Oveson. +Window Manager# I’m not a fan of the default GNOME desktop environment, I’m a tiling window enjoyer. I like to have full control over my windows, so I use the i3 window manager. However, I plan on switching to dwm in the future, as I’ve heard it is more stable and faster than i3. +Coding Font# I cannot stress how elgalant and beautiful the font MonoLisa is. I use it for everything, from my code editor to my terminal. MonoLisa definately lives up to its branding of “font follows function”. Being a monospaced font, each of the characters are the same width and its ligatures, which is the combination of two or more characters into a single character, provide a great reading experience and look cool. I patch MonoLisa into a Nerd Font by using this custom patching script. I highly recommend it. +`}).add({id:4,href:"/blog/sphinx-github-actions-docs-guide/",title:"Documentation with Sphinx and GitHub Actions the Right Way",description:"A brief guide to setting up Sphinx and GitHub Actions to automatically build and deploy your code documentation to GitHub Pages.",content:`One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again. This approach +falls flat +the big picture, as in what +modules do on their own and what are the consequences of its execution with respect to the entire codebase +most important aspects of any software project is its documentation. +. \u251C\u2500\u2500 .github/ \u2502 \u2514\u2500\u2500 workflows/ \u2502 \u2514\u2500\u2500 sphinx-pipeline.yml \u251C\u2500\u2500 source/ \u2502 \u251C\u2500\u2500 _static/ \u2502 \u2502 \u251C\u2500\u2500 css/ \u2502 \u2502 \u251C\u2500\u2500 favicons/ \u2502 \u2502 \u251C\u2500\u2500 img/ \u2502 \u2502 \u2514\u2500\u2500 pdf/ \u2502 \u251C\u2500\u2500 conf.py \u2502 \u2514\u2500\u2500 index.rst \u251C\u2500\u2500 .gitignore \u251C\u2500\u2500 Make.bat \u251C\u2500\u2500 Makefile \u2514\u2500\u2500 requirements.txt name: CI/CD Pipeline for Sphinx # Controls when the workflow will run on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: # The sequence of runs in this workflow: jobs: deploy: name: Build and Deploy Documentation runs-on: ubuntu-latest steps: - run: lsb_release -a - run: uname -a - name: Check out Repository Code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: python-version: "3.10" # pip caching - name: Locate pip's cache id: pip-cache run: echo "::set-output name=dir::$(pip cache dir)" - name: Cache dependencies uses: actions/cache@v3 with: path: \${{ steps.pip-cache.outputs.dir }} key: \${{ runner.os }}-pip-\${{ hashFiles('**/requirements.txt') }} restore-keys: | \${{ runner.os }}-pip- # Install runtime dependencies - name: Upgrade pip run: pip install --upgrade pip - name: Install dependencies run: pip install -r requirements.txt # Build sphinx source files - name: Build sphinx files run: make html # Publish build files - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 if: github.ref == 'refs/heads/main' with: github_token: \${{ secrets.GITHUB_TOKEN }} publish_dir: ./build/html # Upload for introspection, useful for pull requests and debugging - uses: actions/upload-artifact@v3 with: name: generated-site path: public/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Sphinx documentation build/ # Environments .env .venv # Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile github: @make html @cp -a build/html/. ./docs # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) # To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" # Maintain dependencies for pipenv - package-ecosystem: "pip" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" `}).add({id:5,href:"/blog/impossible-list/",title:"My Impossible List",description:"My attempt to live forever or die trying, by doing what I want to do with my life. Do the things I want to do, see the places I want to see, meet the people I want to meet, and live the life I want to live.",content:` We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone… And, therefore, as we set sail we ask God’s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked. +\u2014 John F. Kennedy1 +This page was last edited on August 14, 2023 +The impossible list traces its origins to its creator, Joel Runyon. It’s essentially an aspirational catalog of personal challenges, goals, and experiences that push the boundaries of what an individual believes they can achieve. +The impossible list is not a bucket list, but very is similar to one. The bucket list has this stigma attached to it which is that if the creator of it does not complete it, they have “failed” themselves. I would not like to self impose this pressure onto myself, but have a dynamic long-term roadmap for myself, that changes and evolves along with me. +I will attempt to update this list regularly, in the case where I complete something or have something to add, with the later being most likely. +\u{1F603} Life Goals# Read 100 books Improve a Person’s Life Give a TEDx Talk Give a lecture at a scientific/professional conference Give a lecture at a university Work out 5 days a week regularly Complete my Reading List Complete my TV/Movies Watch List \u{1F3CB}\uFE0F Fitness/Health Goals# Do 100 push-ups in a single set Do 20 pull-ups in a single set \u{1F4BC} Professional Goals# Work Remotely Work at MANGA Work at a startup (June 19, 2023 - DeepWater Exploration) Found a startup Start a newsletter/YouTube channel Gain 100 subscribers Gain 250 subscribers Gain 500 subscribers Gain 1,000 subscribers Write a book Write 100 blog posts \u{1F3A8} Creative Goals# Write a script for a movie/short film (Jan 5, 2022 - A Reminiscent Gift) Work in a movie/short film as a film editor Direct a movie/short film \u{1F4DA} Intellectual Goals# Learn to play the guitar/piano Learn a foreign language Learn a martial art Learn another language Learn Quantum Mechanics Learn Quantum Computing Write/Coauthor a scientific paper If you are someone who can help me make one of these a reality, please get in touch with me. I would love to hear from you. +The above quote is excerpted from former President John F. Kennedy’s Address at Rice University on the Nation’s Space Effort, on September 12, 1962 ↩︎ +`}).add({id:6,href:"/blog/off-by-one/",title:"Off-By-One Errors and How to Avoid Them",description:"How to never overshoot or undershoot for loops again.",content:`When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. An off-by-one error is a type of error that occurs when an loop is iterated one more or one less than intended. Off-by-one errors are typically caused by a mistake in the either initial value of the loop variable or in the end condition of the loop. Mathematically this can be represented by +$$ n \\pm 1 $$ +where $n$ represents the number of times intended to loop There two types of off-by-one errors: undershooting and overshooting. Undershooting occurs when the loop iterates one less time than intended, while overshooting occurs when the loop iterates one more time than intended. Let’s look at an example of each case, where $n$ represents the amount of times we intend to loop and $i$ represents the current iteration: +// Case Study A for (int i = 1; i < n; i++) { /* Body of the loop */ } Case A is an example of undershooting, and it will be executed $(n - 1)$ times. In Case A, $i$ is defined to be one more than intended, which can be proven with experimentation. For example, if $n$ was defined to be $10$ (and each value of $i$ was printed), then the following numbers would be the resulting output: +$$1, 2, 3, 4, 5, 6, 7, 8, 9$$ +This is because, at that point where $i$ becomes $10$, the conditional statement $i < n$ becomes false and the loop subsequently terminates one iteration less than intended. This scenario can be fixed by changing the initial value of $i$ to be $0$ instead of $1$. A good example of overshooting is with the following brain teaser: +If you build a straight fence 30 feet long with posts spaced 3 feet apart, how many posts do you need? (The common answer is one less than the correct answer) // Case Study B for (int i = 0; i <= n; i++) { /* Body of the loop */ } Case B is an example of overshooting, amd it will be executed $(n + 1)$ times. In Case B, $i$ is defined to be one less than intended, which can also be proven with experimentation. Following our previous thought experiment, the following would be the resulting output: +$$0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \\text{error}$$ +This is because, at that point where $i$ becomes $10$, the conditional statement $i \\leq n$ still remains true, resulting in the loop iterating one more than intended. This scenario can be fixed by changing the initial value of $i$ to be $1$ instead of $0$. A good example of overshooting is with the following brain teaser: +If you have n posts, how many sections are there between them? (The common answer is one more than the correct answer) Note that a for loop is simply a special case of a while loop where the number of iterations to be done is already known, whereas a while loop has an indefinite number of iterations. This means that an off-by-one error can occur in while loops, although it is less common, as while loop definitions are based around the output of logical expressions, whereas for loop definitions are based around the repetition of an iterable object. One of the correct ways to write the loop is: +for (int i = 0; i < n; i++) { /* Body of the loop */ } If you found this post interesting, I would recommend the following as further reading to learn more about off-by-one errors: +Wikipedia article `}).add({id:7,href:"/blog/hdl-best-practices/",title:"SystemVerilog Best Practices",description:"A collection of some best practices for SystemVerilog design and verification.",content:`When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. An off-by-one error is a type of error that occurs when an loop is iterated one more or one less than intended. Off-by-one errors are typically caused by a mistake in the either initial value of the loop variable or in the end condition of the loop. Mathematically this can be represented by +$$ n \\pm 1 $$ +where $n$ represents the number of times intended to loop There two types of off-by-one errors: undershooting and overshooting. Undershooting occurs when the loop iterates one less time than intended, while overshooting occurs when the loop iterates one more time than intended. Let’s look at an example of each case, where $n$ represents the amount of times we intend to loop and $i$ represents the current iteration: +// Case Study A for (int i = 1; i < n; i++) { /* Body of the loop */ } Case A is an example of undershooting, and it will be executed $(n - 1)$ times. In Case A, $i$ is defined to be one more than intended, which can be proven with experimentation. For example, if $n$ was defined to be $10$ (and each value of $i$ was printed), then the following numbers would be the resulting output: +$$1, 2, 3, 4, 5, 6, 7, 8, 9$$ +This is because, at that point where $i$ becomes $10$, the conditional statement $i < n$ becomes false and the loop subsequently terminates one iteration less than intended. This scenario can be fixed by changing the initial value of $i$ to be $0$ instead of $1$. A good example of overshooting is with the following brain teaser: +If you build a straight fence 30 feet long with posts spaced 3 feet apart, how many posts do you need? (The common answer is one less than the correct answer) // Case Study B for (int i = 0; i <= n; i++) { /* Body of the loop */ } Case B is an example of overshooting, amd it will be executed $(n + 1)$ times. In Case B, $i$ is defined to be one less than intended, which can also be proven with experimentation. Following our previous thought experiment, the following would be the resulting output: +$$0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \\text{error}$$ +This is because, at that point where $i$ becomes $10$, the conditional statement $i \\leq n$ still remains true, resulting in the loop iterating one more than intended. This scenario can be fixed by changing the initial value of $i$ to be $1$ instead of $0$. A good example of overshooting is with the following brain teaser: +If you have n posts, how many sections are there between them? (The common answer is one more than the correct answer) Note that a for loop is simply a special case of a while loop where the number of iterations to be done is already known, whereas a while loop has an indefinite number of iterations. This means that an off-by-one error can occur in while loops, although it is less common, as while loop definitions are based around the output of logical expressions, whereas for loop definitions are based around the repetition of an iterable object. One of the correct ways to write the loop is: +for (int i = 0; i < n; i++) { /* Body of the loop */ } If you found this post interesting, I would recommend the following as further reading to learn more about off-by-one errors: +Wikipedia article `}).add({id:8,href:"/blog/markdown-syntax/",title:"Markdown Syntax Guide",description:"Sample article showcasing basic Markdown syntax and formatting for HTML elements.",content:`This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme. +Headings# The following HTML <h1>\u2014<h6> elements represent six levels of section headings. <h1> is the highest section level while <h6> is the lowest. +H1# H2# H3# H4# H5# H6# Paragraph# Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat. +Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat. +Blockquotes# The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations. +Blockquote without attribution# Tiam, ad mint andaepu dandae nostion secatur sequo quae. Note that you can use Markdown syntax within a blockquote. +Blockquote with attribution# Don’t communicate by sharing memory, share memory by communicating. +\u2014 Rob Pike1 +Tables# Tables aren’t part of the core Markdown spec, but Hugo supports supports them out-of-the-box. +Name Age Bob 27 Alice 23 Inline Markdown within tables# Italics Bold Code italics bold code Code Blocks# Code block with backticks# <!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Example HTML5 Document</title> </head> <body> <p>Test</p> </body> </html> Code block indented with four spaces# <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Example HTML5 Document</title> </head> <body> <p>Test</p> </body> </html> Code block with Hugo’s internal highlight shortcode# <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Example HTML5 Document</title> </head> <body> <p>Test</p> </body> </html> List Types# Ordered List# First item Second item Third item Unordered List# List item Another item And another item Nested list# Fruit Apple Orange Banana Dairy Milk Cheese Other Elements \u2014 abbr, sub, sup, kbd, mark# GIF is a bitmap image format. +H2O +Xn + Yn = Zn +Press CTRL+ALT+Delete to end the session. +Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures. +The above quote is excerpted from Rob Pike’s talk during Gopherfest, November 18, 2015. ↩︎ +`}),z.addEventListener("input",function(){let n=this.value,o=e.search(n,5,{enrich:!0}),s=new Map;for(let r of o.flatMap(l=>l.result))s.has(r.href)||s.set(r.doc.href,r.doc);if(H.innerHTML="",H.classList.remove("search__suggestions--hidden"),s.size===0&&n){let r=document.createElement("div");r.innerHTML=`No results for "${n}"`,r.classList.add("search__no-results"),H.appendChild(r);return}for(let[r,l]of s){let h=document.createElement("a");h.href=r,h.classList.add("search__suggestion-item"),H.appendChild(h);let f=document.createElement("div");f.textContent=l.title,f.classList.add("search__suggestion-title"),h.appendChild(f);let m=document.createElement("div");if(m.textContent=l.description,m.classList.add("search__suggestion-description"),h.appendChild(m),H.childElementCount===5)break}})})();})(); +//! Source: https://github.com/h-enk/doks/blob/master/assets/js/index.js +/*! Source: https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3 */ +//! Source: https://discourse.gohugo.io/t/range-length-or-last-element/3803/2 diff --git a/js/load-site.js b/js/load-site.js new file mode 100644 index 0000000..f09c5a7 --- /dev/null +++ b/js/load-site.js @@ -0,0 +1,27 @@ +(()=>{var S=Object.create;var m=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var O=(r,o)=>()=>(o||r((o={exports:{}}).exports,o),o.exports);var B=(r,o,h,l)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of T(o))!E.call(r,i)&&i!==h&&m(r,i,{get:()=>o[i],enumerable:!(l=P(o,i))||l.enumerable});return r};var L=(r,o,h)=>(h=r!=null?S(w(r)):{},B(o||!r||!r.__esModule?m(h,"default",{value:r,enumerable:!0}):h,r));var C=O((y,f)=>{(function(r,o){typeof y=="object"&&typeof f!="undefined"?f.exports=o():typeof define=="function"&&define.amd?define(o):(r||self).Typed=o()})(y,function(){function r(){return r=Object.assign?Object.assign.bind():function(i){for(var e=1;e0&&(t.strPos=t.currentElContent.length-1,t.strings.unshift(t.currentElContent)),t.sequence=[],t.strings)t.sequence[c]=c;t.arrayPos=0,t.stopNum=0,t.loop=t.options.loop,t.loopCount=t.options.loopCount,t.curLoop=0,t.shuffle=t.options.shuffle,t.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},t.typingComplete=!1,t.autoInsertCss=t.options.autoInsertCss,t.autoInsertCss&&(this.appendCursorAnimationCss(t),this.appendFadeOutAnimationCss(t))},e.getCurrentElContent=function(t){return t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:t.contentType==="html"?t.el.innerHTML:t.el.textContent},e.appendCursorAnimationCss=function(t){var s="data-typed-js-cursor-css";if(t.showCursor&&!document.querySelector("["+s+"]")){var n=document.createElement("style");n.setAttribute(s,"true"),n.innerHTML=` + .typed-cursor{ + opacity: 1; + } + .typed-cursor.typed-cursor--blink{ + animation: typedjsBlink 0.7s infinite; + -webkit-animation: typedjsBlink 0.7s infinite; + animation: typedjsBlink 0.7s infinite; + } + @keyframes typedjsBlink{ + 50% { opacity: 0.0; } + } + @-webkit-keyframes typedjsBlink{ + 0% { opacity: 1; } + 50% { opacity: 0.0; } + 100% { opacity: 1; } + } + `,document.body.appendChild(n)}},e.appendFadeOutAnimationCss=function(t){var s="data-typed-fadeout-js-css";if(t.fadeOut&&!document.querySelector("["+s+"]")){var n=document.createElement("style");n.setAttribute(s,"true"),n.innerHTML=` + .typed-fade-out{ + opacity: 0; + transition: opacity .25s; + } + .typed-cursor.typed-cursor--blink.typed-fade-out{ + -webkit-animation: 0; + animation: 0; + } + `,document.body.appendChild(n)}},i}()),l=new(function(){function i(){}var e=i.prototype;return e.typeHtmlChars=function(t,s,n){if(n.contentType!=="html")return s;var u=t.substring(s).charAt(0);if(u==="<"||u==="&"){var a;for(a=u==="<"?">":";";t.substring(s+1).charAt(0)!==a&&!(1+ ++s>t.length););s++}return s},e.backSpaceHtmlChars=function(t,s,n){if(n.contentType!=="html")return s;var u=t.substring(s).charAt(0);if(u===">"||u===";"){var a;for(a=u===">"?"<":"&";t.substring(s-1).charAt(0)!==a&&!(--s<0););s--}return s},i}());return function(){function i(t,s){h.load(this,s,t),this.begin()}var e=i.prototype;return e.toggle=function(){this.pause.status?this.start():this.stop()},e.stop=function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))},e.start=function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))},e.destroy=function(){this.reset(!1),this.options.onDestroy(this)},e.reset=function(t){t===void 0&&(t=!0),clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())},e.begin=function(){var t=this;this.options.onBegin(this),this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){t.strPos===0?t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos):t.backspace(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)},e.typewrite=function(t,s){var n=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var u=this.humanizer(this.typeSpeed),a=1;this.pause.status!==!0?this.timeout=setTimeout(function(){s=l.typeHtmlChars(t,s,n);var p=0,c=t.substring(s);if(c.charAt(0)==="^"&&/^\^\d+/.test(c)){var d=1;d+=(c=/\d+/.exec(c)[0]).length,p=parseInt(c),n.temporaryPause=!0,n.options.onTypingPaused(n.arrayPos,n),t=t.substring(0,s)+t.substring(s+d),n.toggleBlinking(!0)}if(c.charAt(0)==="`"){for(;t.substring(s+a).charAt(0)!=="`"&&(a++,!(s+a>t.length)););var g=t.substring(0,s),v=t.substring(g.length+1,s+a),k=t.substring(s+a+1);t=g+v+k,a--}n.timeout=setTimeout(function(){n.toggleBlinking(!1),s>=t.length?n.doneTyping(t,s):n.keepTyping(t,s,a),n.temporaryPause&&(n.temporaryPause=!1,n.options.onTypingResumed(n.arrayPos,n))},p)},u):this.setPauseStatus(t,s,!0)},e.keepTyping=function(t,s,n){s===0&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this));var u=t.substring(0,s+=n);this.replaceText(u),this.typewrite(t,s)},e.doneTyping=function(t,s){var n=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),this.loop===!1||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){n.backspace(t,s)},this.backDelay))},e.backspace=function(t,s){var n=this;if(this.pause.status!==!0){if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var u=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){s=l.backSpaceHtmlChars(t,s,n);var a=t.substring(0,s);if(n.replaceText(a),n.smartBackspace){var p=n.strings[n.arrayPos+1];n.stopNum=p&&a===p.substring(0,s)?s:0}s>n.stopNum?(s--,n.backspace(t,s)):s<=n.stopNum&&(n.arrayPos++,n.arrayPos===n.strings.length?(n.arrayPos=0,n.options.onLastStringBackspaced(),n.shuffleStringsIfNeeded(),n.begin()):n.typewrite(n.strings[n.sequence[n.arrayPos]],s))},u)}else this.setPauseStatus(t,s,!1)},e.complete=function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0},e.setPauseStatus=function(t,s,n){this.pause.typewrite=n,this.pause.curString=t,this.pause.curStrPos=s},e.toggleBlinking=function(t){this.cursor&&(this.pause.status||this.cursorBlinking!==t&&(this.cursorBlinking=t,t?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))},e.humanizer=function(t){return Math.round(Math.random()*t/2)+t},e.shuffleStringsIfNeeded=function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))},e.initFadeOut=function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)},e.replaceText=function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:this.contentType==="html"?this.el.innerHTML=t:this.el.textContent=t},e.bindFocusEvents=function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(s){t.stop()}),this.el.addEventListener("blur",function(s){t.el.value&&t.el.value.length!==0||t.start()}))},e.insertCursor=function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.setAttribute("aria-hidden",!0),this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))},i}()})});var b=L(C()),I={strings:['> Miguel VF'],typeSpeed:75,backSpeed:50,smartBackspace:!0,showCursor:!0,cursorChar:"_",attr:null};window.addEventListener("load",function(){var r=new b.default(".typewriter",I);console.log("Site loaded")});})(); diff --git a/js/main.a9f648ca2d83a0a9a92fb9fd46d479861bcec71d0de31f6a9c51ec626d29dc0e757b01b8b1a6662ee3fbd7973a61628b83e5c6f4f6c498611ea02f9367859259.js b/js/main.a9f648ca2d83a0a9a92fb9fd46d479861bcec71d0de31f6a9c51ec626d29dc0e757b01b8b1a6662ee3fbd7973a61628b83e5c6f4f6c498611ea02f9367859259.js new file mode 100644 index 0000000..12d2014 --- /dev/null +++ b/js/main.a9f648ca2d83a0a9a92fb9fd46d479861bcec71d0de31f6a9c51ec626d29dc0e757b01b8b1a6662ee3fbd7973a61628b83e5c6f4f6c498611ea02f9367859259.js @@ -0,0 +1,23 @@ +(()=>{var re=Object.create;var Z=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var W=(s,d)=>()=>(d||s((d={exports:{}}).exports,d),d.exports);var oe=(s,d,m,A)=>{if(d&&typeof d=="object"||typeof d=="function")for(let o of ae(d))!se.call(s,o)&&o!==m&&Z(s,o,{get:()=>d[o],enumerable:!(A=ne(d,o))||A.enumerable});return s};var X=(s,d,m)=>(m=s!=null?re(ie(s)):{},oe(d||!s||!s.__esModule?Z(m,"default",{value:s,enumerable:!0}):m,s));var Y=W((ce,z)=>{var ue=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{};var h=function(s){var d=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,m=0,A={},o={manual:s.Prism&&s.Prism.manual,disableWorkerMessageHandler:s.Prism&&s.Prism.disableWorkerMessageHandler,util:{encode:function r(n){return n instanceof t?new t(n.type,r(n.content),n.alias):Array.isArray(n)?n.map(r):n.replace(/&/g,"&").replace(/"+p.content+""};function e(r,n,u,l){r.lastIndex=n;var p=r.exec(u);if(p&&l&&p[1]){var v=p[1].length;p.index+=v,p[0]=p[0].slice(v)}return p}function a(r,n,u,l,p,v){for(var S in u)if(!(!u.hasOwnProperty(S)||!u[S])){var f=u[S];f=Array.isArray(f)?f:[f];for(var k=0;k=v.reach);T+=E.value.length,E=E.next){var L=E.value;if(n.length>r.length)return;if(!(L instanceof t)){var I=1,F;if(U){if(F=e(q,T,r,N),!F||F.index>=r.length)break;var R=F.index,ee=F.index+F[0].length,$=T;for($+=E.value.length;R>=$;)E=E.next,$+=E.value.length;if($-=E.value.length,T=$,E.value instanceof t)continue;for(var C=E;C!==n.tail&&($v.reach&&(v.reach=B);var D=E.prev;M&&(D=g(n,D,M),T+=M.length),c(n,D,I);var te=new t(S,P?o.tokenize(O,P):O,J,O);if(E=g(n,D,te),j&&g(n,E,j),I>1){var G={cause:S+","+k,reach:B};a(r,n,u,E.prev,T,G),v&&G.reach>v.reach&&(v.reach=G.reach)}}}}}}function i(){var r={value:null,prev:null,next:null},n={value:null,prev:r,next:null};r.next=n,this.head=r,this.tail=n,this.length=0}function g(r,n,u){var l=n.next,p={value:u,prev:n,next:l};return n.next=p,l.prev=p,r.length++,p}function c(r,n,u){for(var l=n.next,p=0;p/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};h.languages.markup.tag.inside["attr-value"].inside.entity=h.languages.markup.entity;h.languages.markup.doctype.inside["internal-subset"].inside=h.languages.markup;h.hooks.add("wrap",function(s){s.type==="entity"&&(s.attributes.title=s.content.replace(/&/,"&"))});Object.defineProperty(h.languages.markup.tag,"addInlined",{value:function(d,m){var A={};A["language-"+m]={pattern:/(^$)/i,lookbehind:!0,inside:h.languages[m]},A.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:A}};o["language-"+m]={pattern:/[\s\S]+/,inside:h.languages[m]};var t={};t[d]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return d}),"i"),lookbehind:!0,greedy:!0,inside:o},h.languages.insertBefore("markup","cdata",t)}});Object.defineProperty(h.languages.markup.tag,"addAttribute",{value:function(s,d){h.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+s+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[d,"language-"+d],inside:h.languages[d]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});h.languages.html=h.languages.markup;h.languages.mathml=h.languages.markup;h.languages.svg=h.languages.markup;h.languages.xml=h.languages.extend("markup",{});h.languages.ssml=h.languages.xml;h.languages.atom=h.languages.xml;h.languages.rss=h.languages.xml;(function(s){var d=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+d.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+d.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+d.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+d.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:d,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var m=s.languages.markup;m&&(m.tag.addInlined("style","css"),m.tag.addAttribute("style","css"))})(h);h.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};h.languages.javascript=h.languages.extend("clike",{"class-name":[h.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});h.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;h.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:h.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:h.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:h.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:h.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:h.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});h.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:h.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});h.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});h.languages.markup&&(h.languages.markup.tag.addInlined("script","javascript"),h.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));h.languages.js=h.languages.javascript;(function(){if(typeof h=="undefined"||typeof document=="undefined")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var s="Loading\u2026",d=function(y,w){return"\u2716 Error "+y+" while fetching file: "+w},m="\u2716 Error: File does not exist or is empty",A={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},o="data-src-status",t="loading",e="loaded",a="failed",i="pre[data-src]:not(["+o+'="'+e+'"]):not(['+o+'="'+t+'"])';function g(y,w,x){var r=new XMLHttpRequest;r.open("GET",y,!0),r.onreadystatechange=function(){r.readyState==4&&(r.status<400&&r.responseText?w(r.responseText):r.status>=400?x(d(r.status,r.statusText)):x(m))},r.send(null)}function c(y){var w=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(y||"");if(w){var x=Number(w[1]),r=w[2],n=w[3];return r?n?[x,Number(n)]:[x,void 0]:[x,x]}}h.hooks.add("before-highlightall",function(y){y.selector+=", "+i}),h.hooks.add("before-sanity-check",function(y){var w=y.element;if(w.matches(i)){y.code="",w.setAttribute(o,t);var x=w.appendChild(document.createElement("CODE"));x.textContent=s;var r=w.getAttribute("data-src"),n=y.language;if(n==="none"){var u=(/\.(\w+)$/.exec(r)||[,"none"])[1];n=A[u]||u}h.util.setLanguage(x,n),h.util.setLanguage(w,n);var l=h.plugins.autoloader;l&&l.loadLanguages(n),g(r,function(p){w.setAttribute(o,e);var v=c(w.getAttribute("data-range"));if(v){var S=p.split(/\r\n?|\n/g),f=v[0],k=v[1]==null?S.length:v[1];f<0&&(f+=S.length),f=Math.max(0,Math.min(f-1,S.length)),k<0&&(k+=S.length),k=Math.max(0,Math.min(k,S.length)),p=S.slice(f,k).join(` +`),w.hasAttribute("data-start")||w.setAttribute("data-start",String(f+1))}x.textContent=p,h.highlightElement(x)},function(p){w.setAttribute(o,a),x.textContent=p})}}),h.plugins.fileHighlight={highlight:function(w){for(var x=(w||document).querySelectorAll(i),r=0,n;n=x[r++];)h.highlightElement(n)}};var b=!1;h.fileHighlight=function(){b||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),b=!0),h.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var K=W((de,H)=>{(function(){if(typeof Prism=="undefined")return;var s=Object.assign||function(t,e){for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a]);return t};function d(t){this.defaults=s({},t)}function m(t){return t.replace(/-(\w)/g,function(e,a){return a.toUpperCase()})}function A(t){for(var e=0,a=0;ae&&(g[b]=` +`+g[b],c=y)}a[i]=g.join("")}return a.join(` +`)}},typeof H!="undefined"&&H.exports&&(H.exports=d),Prism.plugins.NormalizeWhitespace=new d({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",function(t){var e=Prism.plugins.NormalizeWhitespace;if(!(t.settings&&t.settings["whitespace-normalization"]===!1)&&Prism.util.isActive(t.element,"whitespace-normalization",!0)){if((!t.element||!t.element.parentNode)&&t.code){t.code=e.normalize(t.code,t.settings);return}var a=t.element.parentNode;if(!(!t.code||!a||a.nodeName.toLowerCase()!=="pre")){t.settings==null&&(t.settings={});for(var i in o)if(Object.hasOwnProperty.call(o,i)){var g=o[i];if(a.hasAttribute("data-"+i))try{var c=JSON.parse(a.getAttribute("data-"+i)||"true");typeof c===g&&(t.settings[i]=c)}catch(l){}}for(var b=a.childNodes,y="",w="",x=!1,r=0;r/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity;Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup;Prism.hooks.add("wrap",function(s){s.type==="entity"&&(s.attributes.title=s.content.replace(/&/,"&"))});Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(d,m){var A={};A["language-"+m]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[m]},A.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:A}};o["language-"+m]={pattern:/[\s\S]+/,inside:Prism.languages[m]};var t={};t[d]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return d}),"i"),lookbehind:!0,greedy:!0,inside:o},Prism.languages.insertBefore("markup","cdata",t)}});Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(s,d){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+s+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[d,"language-"+d],inside:Prism.languages[d]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});Prism.languages.html=Prism.languages.markup;Prism.languages.mathml=Prism.languages.markup;Prism.languages.svg=Prism.languages.markup;Prism.languages.xml=Prism.languages.extend("markup",{});Prism.languages.ssml=Prism.languages.xml;Prism.languages.atom=Prism.languages.xml;Prism.languages.rss=Prism.languages.xml;(function(s){var d=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+d.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+d.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+d.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+d.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:d,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var m=s.languages.markup;m&&(m.tag.addInlined("style","css"),m.tag.addAttribute("style","css"))})(Prism);Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/});Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}});Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}});Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/});delete Prism.languages.c.boolean;(function(s){var d=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,m=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return d.source});s.languages.cpp=s.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return d.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:d,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),s.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return m})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),s.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s.languages.cpp}}}}),s.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),s.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:s.languages.extend("cpp",{})}}),s.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},s.languages.cpp["base-clause"])})(Prism);Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(s){var d="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",m={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},A={bash:m,environment:{pattern:RegExp("\\$"+d),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+d),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};s.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+d),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:A},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:m}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:A},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:A.entity}}],environment:{pattern:RegExp("\\$?"+d),alias:"constant"},variable:A.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},m.inside=s.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],t=A.variable[1].inside,e=0;e",unchanged:" ",diff:"!"};Object.keys(d).forEach(function(m){var A=d[m],o=[];/^\w+$/.test(m)||o.push(/\w+/.exec(m)[0]),m==="diff"&&o.push("bold"),s.languages.diff[m]={pattern:RegExp("^(?:["+A+`].*(?:\r +?| +|(?![\\s\\S])))+`,"m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(m)[0]}}}}),Object.defineProperty(s.languages.diff,"PREFIXES",{value:d})})(Prism);(function(s){var d=/[*&][^\s[\]{},]+/,m=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,A="(?:"+m.source+"(?:[ ]+"+d.source+")?|"+d.source+"(?:[ ]+"+m.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),t=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function e(a,i){i=(i||"").replace(/m/g,"")+"m";var g=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return A}).replace(/<>/g,function(){return a});return RegExp(g,i)}s.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return A})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return A}).replace(/<>/g,function(){return"(?:"+o+"|"+t+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:e(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:e(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:e(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:e(t),lookbehind:!0,greedy:!0},number:{pattern:e(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:m,important:d,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},s.languages.yml=s.languages.yaml})(Prism);Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/};(function(s){var d=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function m(A){return A.replace(/__/g,function(){return d})}s.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(m(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(m(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}})(Prism);Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;var _e=X(K());(function(){if(typeof Prism=="undefined"||typeof document=="undefined")return;var s=[],d={},m=function(){};Prism.plugins.toolbar={};var A=Prism.plugins.toolbar.registerButton=function(e,a){var i;if(typeof a=="function"?i=a:i=function(g){var c;return typeof a.onClick=="function"?(c=document.createElement("button"),c.type="button",c.addEventListener("click",function(){a.onClick.call(this,g)})):typeof a.url=="string"?(c=document.createElement("a"),c.href=a.url):c=document.createElement("span"),a.className&&c.classList.add(a.className),c.textContent=a.text,c},e in d){console.warn('There is a button with the key "'+e+'" registered already.');return}s.push(d[e]=i)};function o(e){for(;e;){var a=e.getAttribute("data-toolbar-order");if(a!=null)return a=a.trim(),a.length?a.split(/\s*,\s*/g):[];e=e.parentElement}}var t=Prism.plugins.toolbar.hook=function(e){var a=e.element.parentNode;if(!(!a||!/pre/i.test(a.nodeName))&&!a.parentNode.classList.contains("code-toolbar")){var i=document.createElement("div");i.classList.add("code-toolbar"),a.parentNode.insertBefore(i,a),i.appendChild(a);var g=document.createElement("div");g.classList.add("toolbar");var c=s,b=o(e.element);b&&(c=b.map(function(y){return d[y]||m})),c.forEach(function(y){var w=y(e);if(w){var x=document.createElement("div");x.classList.add("toolbar-item"),x.appendChild(w),g.appendChild(x)}}),i.appendChild(g)}};A("label",function(e){var a=e.element.parentNode;if(!(!a||!/pre/i.test(a.nodeName))&&a.hasAttribute("data-label")){var i,g,c=a.getAttribute("data-label");try{g=document.querySelector("template#"+c)}catch(b){}return g?i=g.content:(a.hasAttribute("data-url")?(i=document.createElement("a"),i.href=a.getAttribute("data-url")):i=document.createElement("span"),i.textContent=c),i}}),Prism.hooks.add("complete",t)})();(function(){if(typeof Prism=="undefined"||typeof document=="undefined")return;if(!Prism.plugins.toolbar){console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.");return}function s(t,e){t.addEventListener("click",function(){m(e)})}function d(t){var e=document.createElement("textarea");e.value=t.getText(),e.style.top="0",e.style.left="0",e.style.position="fixed",document.body.appendChild(e),e.focus(),e.select();try{var a=document.execCommand("copy");setTimeout(function(){a?t.success():t.error()},1)}catch(i){setTimeout(function(){t.error(i)},1)}document.body.removeChild(e)}function m(t){navigator.clipboard?navigator.clipboard.writeText(t.getText()).then(t.success,function(){d(t)}):d(t)}function A(t){window.getSelection().selectAllChildren(t)}function o(t){var e={copy:"Copy","copy-error":"Press Ctrl+C to copy","copy-success":"Copied!","copy-timeout":5e3},a="data-prismjs-";for(var i in e){for(var g=a+i,c=t;c&&!c.hasAttribute(g);)c=c.parentElement;c&&(e[i]=c.getAttribute(g))}return e}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){var e=t.element,a=o(e),i=document.createElement("button");i.className="copy-to-clipboard-button",i.setAttribute("type","button");var g=document.createElement("span");return i.appendChild(g),b("copy"),s(i,{getText:function(){return e.textContent},success:function(){b("copy-success"),c()},error:function(){b("copy-error"),setTimeout(function(){A(e)},1),c()}}),i;function c(){setTimeout(function(){b("copy")},a["copy-timeout"])}function b(y){g.textContent=a[y],i.setAttribute("data-copy-state",y)}})})();(function(){if(typeof Prism=="undefined"||typeof document=="undefined")return;var s="line-numbers",d=/\n(?!$)/g,m=Prism.plugins.lineNumbers={getLine:function(e,a){if(!(e.tagName!=="PRE"||!e.classList.contains(s))){var i=e.querySelector(".line-numbers-rows");if(i){var g=parseInt(e.getAttribute("data-start"),10)||1,c=g+(i.children.length-1);ac&&(a=c);var b=a-g;return i.children[b]}}},resize:function(e){A([e])},assumeViewportIndependence:!0};function A(e){if(e=e.filter(function(i){var g=o(i),c=g["white-space"];return c==="pre-wrap"||c==="pre-line"}),e.length!=0){var a=e.map(function(i){var g=i.querySelector("code"),c=i.querySelector(".line-numbers-rows");if(!(!g||!c)){var b=i.querySelector(".line-numbers-sizer"),y=g.textContent.split(d);b||(b=document.createElement("span"),b.className="line-numbers-sizer",g.appendChild(b)),b.innerHTML="0",b.style.display="block";var w=b.getBoundingClientRect().height;return b.innerHTML="",{element:i,lines:y,lineHeights:[],oneLinerHeight:w,sizer:b}}}).filter(Boolean);a.forEach(function(i){var g=i.sizer,c=i.lines,b=i.lineHeights,y=i.oneLinerHeight;b[c.length-1]=void 0,c.forEach(function(w,x){if(w&&w.length>1){var r=g.appendChild(document.createElement("span"));r.style.display="block",r.textContent=w}else b[x]=y})}),a.forEach(function(i){for(var g=i.sizer,c=i.lineHeights,b=0,y=0;y");b=document.createElement("span"),b.setAttribute("aria-hidden","true"),b.className="line-numbers-rows",b.innerHTML=y,i.hasAttribute("data-start")&&(i.style.counterReset="linenumber "+(parseInt(i.getAttribute("data-start"),10)-1)),e.element.appendChild(b),A([i]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})})();(function(){if(typeof Prism=="undefined"||typeof document=="undefined")return;var s=/(?:^|\s)command-line(?:\s|$)/,d="command-line-prompt",m="".startsWith?function(e,a){return e.startsWith(a)}:function(e,a){return e.indexOf(a)===0},A="".endsWith?function(e,a){return e.endsWith(a)}:function(e,a){var i=e.length;return e.substring(i-a.length,i)===a};function o(e){var a=e.vars=e.vars||{};return"command-line"in a}function t(e){var a=e.vars=e.vars||{};return a["command-line"]=a["command-line"]||{}}Prism.hooks.add("before-highlight",function(e){var a=t(e);if(a.complete||!e.code){a.complete=!0;return}var i=e.element.parentElement;if(!i||!/pre/i.test(i.nodeName)||!s.test(i.className)&&!s.test(e.element.className)){a.complete=!0;return}var g=e.element.querySelector("."+d);g&&g.remove();var c=e.code.split(` +`);a.numberOfLines=c.length;var b=a.outputLines=[],y=i.getAttribute("data-output"),w=i.getAttribute("data-filter-output");if(y!==null)y.split(",").forEach(function(v){var S=v.split("-"),f=parseInt(S[0],10),k=S.length===2?parseInt(S[1],10):f;if(!isNaN(f)&&!isNaN(k)){f<1&&(f=1),k>c.length&&(k=c.length),f--,k--;for(var _=f;_<=k;_++)b[_]=c[_],c[_]=""}});else if(w)for(var x=0;x0&&u&&m(p,u)&&(c[l]=p.slice(u.length),r.add(l)))}e.code=c.join(` +`)}),Prism.hooks.add("before-insert",function(e){var a=t(e);if(!a.complete){for(var i=e.highlightedCode.split(` +`),g=a.outputLines||[],c=0,b=i.length;c'+Prism.util.encode(g[c])+"":i[c]=''+i[c]+"";e.highlightedCode=i.join(` +`)}}),Prism.hooks.add("complete",function(e){if(!o(e))return;var a=t(e);if(a.complete)return;var i=e.element.parentElement;s.test(e.element.className)&&(e.element.className=e.element.className.replace(s," ")),s.test(i.className)||(i.className+=" command-line");function g(P,N){return(i.getAttribute(P)||N).replace(/"/g,""")}var c="",b=a.numberOfLines||0,y=g("data-prompt",""),w;if(y!=="")w='';else{var x=g("data-user","user"),r=g("data-host","localhost");w=''}for(var n=a.continuationLineIndicies||new Set,u=g("data-continuation-prompt",">"),l='',p=0;p\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g,m=RegExp(/(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))/.source.replace(/__/g,function(){return d.source}),"gi"),A=!1;Prism.hooks.add("before-sanity-check",function(o){var t=o.language;s.test(t)&&!o.grammar&&(o.grammar=Prism.languages[t]=Prism.languages.diff)}),Prism.hooks.add("before-tokenize",function(o){!A&&!Prism.languages.diff&&!Prism.plugins.autoloader&&(A=!0,console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism's Autoloader plugin."));var t=o.language;s.test(t)&&!Prism.languages[t]&&(Prism.languages[t]=Prism.languages.diff)}),Prism.hooks.add("wrap",function(o){var t,e;if(o.language!=="diff"){var a=s.exec(o.language);if(!a)return;t=a[1],e=Prism.languages[t]}var i=Prism.languages.diff&&Prism.languages.diff.PREFIXES;if(i&&o.type in i){var g=o.content.replace(d,""),c=g.replace(/</g,"<").replace(/&/g,"&"),b=c.replace(/(^|[\r\n])./g,"$1"),y;e?y=Prism.highlight(b,e,t):y=Prism.util.encode(b);var w=new Prism.Token("prefix",i[o.type],[/\w+/.exec(o.type)[0]]),x=Prism.Token.stringify(w,o.language),r=[],n;for(m.lastIndex=0;n=m.exec(y);)r.push(x+n[0]);/(?:^|[\r\n]).$/.test(c)&&r.push(x),o.content=r.join(""),e&&o.classes.push("language-"+t)}})}})();V.default.highlightAll();})(); +/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + *) +*/ diff --git a/js/phonechump.gif b/js/phonechump.gif new file mode 100644 index 0000000..67e5420 Binary files /dev/null and b/js/phonechump.gif differ diff --git a/js/typed.js b/js/typed.js new file mode 100644 index 0000000..46d79ff --- /dev/null +++ b/js/typed.js @@ -0,0 +1,27 @@ +(()=>{var C=(c,a)=>()=>(a||c((a={exports:{}}).exports,a),a.exports);var v=C((l,f)=>{(function(c,a){typeof l=="object"&&typeof f!="undefined"?f.exports=a():typeof define=="function"&&define.amd?define(a):(c||self).Typed=a()})(l,function(){function c(){return c=Object.assign?Object.assign.bind():function(e){for(var i=1;i0&&(t.strPos=t.currentElContent.length-1,t.strings.unshift(t.currentElContent)),t.sequence=[],t.strings)t.sequence[p]=p;t.arrayPos=0,t.stopNum=0,t.loop=t.options.loop,t.loopCount=t.options.loopCount,t.curLoop=0,t.shuffle=t.options.shuffle,t.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},t.typingComplete=!1,t.autoInsertCss=t.options.autoInsertCss,t.autoInsertCss&&(this.appendCursorAnimationCss(t),this.appendFadeOutAnimationCss(t))},i.getCurrentElContent=function(t){return t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:t.contentType==="html"?t.el.innerHTML:t.el.textContent},i.appendCursorAnimationCss=function(t){var s="data-typed-js-cursor-css";if(t.showCursor&&!document.querySelector("["+s+"]")){var n=document.createElement("style");n.setAttribute(s,"true"),n.innerHTML=` + .typed-cursor{ + opacity: 1; + } + .typed-cursor.typed-cursor--blink{ + animation: typedjsBlink 0.7s infinite; + -webkit-animation: typedjsBlink 0.7s infinite; + animation: typedjsBlink 0.7s infinite; + } + @keyframes typedjsBlink{ + 50% { opacity: 0.0; } + } + @-webkit-keyframes typedjsBlink{ + 0% { opacity: 1; } + 50% { opacity: 0.0; } + 100% { opacity: 1; } + } + `,document.body.appendChild(n)}},i.appendFadeOutAnimationCss=function(t){var s="data-typed-fadeout-js-css";if(t.fadeOut&&!document.querySelector("["+s+"]")){var n=document.createElement("style");n.setAttribute(s,"true"),n.innerHTML=` + .typed-fade-out{ + opacity: 0; + transition: opacity .25s; + } + .typed-cursor.typed-cursor--blink.typed-fade-out{ + -webkit-animation: 0; + animation: 0; + } + `,document.body.appendChild(n)}},e}()),d=new(function(){function e(){}var i=e.prototype;return i.typeHtmlChars=function(t,s,n){if(n.contentType!=="html")return s;var o=t.substring(s).charAt(0);if(o==="<"||o==="&"){var r;for(r=o==="<"?">":";";t.substring(s+1).charAt(0)!==r&&!(1+ ++s>t.length););s++}return s},i.backSpaceHtmlChars=function(t,s,n){if(n.contentType!=="html")return s;var o=t.substring(s).charAt(0);if(o===">"||o===";"){var r;for(r=o===">"?"<":"&";t.substring(s-1).charAt(0)!==r&&!(--s<0););s--}return s},e}());return function(){function e(t,s){g.load(this,s,t),this.begin()}var i=e.prototype;return i.toggle=function(){this.pause.status?this.start():this.stop()},i.stop=function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))},i.start=function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))},i.destroy=function(){this.reset(!1),this.options.onDestroy(this)},i.reset=function(t){t===void 0&&(t=!0),clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())},i.begin=function(){var t=this;this.options.onBegin(this),this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){t.strPos===0?t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos):t.backspace(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)},i.typewrite=function(t,s){var n=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var o=this.humanizer(this.typeSpeed),r=1;this.pause.status!==!0?this.timeout=setTimeout(function(){s=d.typeHtmlChars(t,s,n);var u=0,p=t.substring(s);if(p.charAt(0)==="^"&&/^\^\d+/.test(p)){var h=1;h+=(p=/\d+/.exec(p)[0]).length,u=parseInt(p),n.temporaryPause=!0,n.options.onTypingPaused(n.arrayPos,n),t=t.substring(0,s)+t.substring(s+h),n.toggleBlinking(!0)}if(p.charAt(0)==="`"){for(;t.substring(s+r).charAt(0)!=="`"&&(r++,!(s+r>t.length)););var y=t.substring(0,s),m=t.substring(y.length+1,s+r),b=t.substring(s+r+1);t=y+m+b,r--}n.timeout=setTimeout(function(){n.toggleBlinking(!1),s>=t.length?n.doneTyping(t,s):n.keepTyping(t,s,r),n.temporaryPause&&(n.temporaryPause=!1,n.options.onTypingResumed(n.arrayPos,n))},u)},o):this.setPauseStatus(t,s,!0)},i.keepTyping=function(t,s,n){s===0&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this));var o=t.substring(0,s+=n);this.replaceText(o),this.typewrite(t,s)},i.doneTyping=function(t,s){var n=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),this.loop===!1||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){n.backspace(t,s)},this.backDelay))},i.backspace=function(t,s){var n=this;if(this.pause.status!==!0){if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var o=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){s=d.backSpaceHtmlChars(t,s,n);var r=t.substring(0,s);if(n.replaceText(r),n.smartBackspace){var u=n.strings[n.arrayPos+1];n.stopNum=u&&r===u.substring(0,s)?s:0}s>n.stopNum?(s--,n.backspace(t,s)):s<=n.stopNum&&(n.arrayPos++,n.arrayPos===n.strings.length?(n.arrayPos=0,n.options.onLastStringBackspaced(),n.shuffleStringsIfNeeded(),n.begin()):n.typewrite(n.strings[n.sequence[n.arrayPos]],s))},o)}else this.setPauseStatus(t,s,!1)},i.complete=function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0},i.setPauseStatus=function(t,s,n){this.pause.typewrite=n,this.pause.curString=t,this.pause.curStrPos=s},i.toggleBlinking=function(t){this.cursor&&(this.pause.status||this.cursorBlinking!==t&&(this.cursorBlinking=t,t?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))},i.humanizer=function(t){return Math.round(Math.random()*t/2)+t},i.shuffleStringsIfNeeded=function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))},i.initFadeOut=function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)},i.replaceText=function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:this.contentType==="html"?this.el.innerHTML=t:this.el.textContent=t},i.bindFocusEvents=function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(s){t.stop()}),this.el.addEventListener("blur",function(s){t.el.value&&t.el.value.length!==0||t.start()}))},i.insertCursor=function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.setAttribute("aria-hidden",!0),this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))},e}()})});v();})(); diff --git a/logos/calpoly-logo.png b/logos/calpoly-logo.png new file mode 100644 index 0000000..eb5d157 Binary files /dev/null and b/logos/calpoly-logo.png differ diff --git a/logos/calpoly-racing-logo.png b/logos/calpoly-racing-logo.png new file mode 100644 index 0000000..94bc14b Binary files /dev/null and b/logos/calpoly-racing-logo.png differ diff --git a/logos/dwe-logo.png b/logos/dwe-logo.png new file mode 100644 index 0000000..0fc8baa Binary files /dev/null and b/logos/dwe-logo.png differ diff --git a/logos/kaweees-circle.png b/logos/kaweees-circle.png new file mode 100644 index 0000000..73a5827 Binary files /dev/null and b/logos/kaweees-circle.png differ diff --git a/logos/kaweees.png b/logos/kaweees.png new file mode 100644 index 0000000..13afdb7 Binary files /dev/null and b/logos/kaweees.png differ diff --git a/logos/nvidia-logo.png b/logos/nvidia-logo.png new file mode 100644 index 0000000..58c68a5 Binary files /dev/null and b/logos/nvidia-logo.png differ diff --git a/logos/omegaup-logo.png b/logos/omegaup-logo.png new file mode 100644 index 0000000..79df7d8 Binary files /dev/null and b/logos/omegaup-logo.png differ diff --git a/logos/polysat-logo.png b/logos/polysat-logo.png new file mode 100644 index 0000000..1885a4e Binary files /dev/null and b/logos/polysat-logo.png differ diff --git a/logos/tux-pixel.png b/logos/tux-pixel.png new file mode 100644 index 0000000..a8c7ccc Binary files /dev/null and b/logos/tux-pixel.png differ diff --git a/logos/yugi.png b/logos/yugi.png new file mode 100644 index 0000000..e8506bf Binary files /dev/null and b/logos/yugi.png differ diff --git a/miguel-vf.png b/miguel-vf.png new file mode 100644 index 0000000..ddbab7c Binary files /dev/null and b/miguel-vf.png differ diff --git a/mstile-144x144.png b/mstile-144x144.png new file mode 100644 index 0000000..9db9087 Binary files /dev/null and b/mstile-144x144.png differ diff --git a/mstile-150x150.png b/mstile-150x150.png new file mode 100644 index 0000000..23c93c5 Binary files /dev/null and b/mstile-150x150.png differ diff --git a/mstile-310x150.png b/mstile-310x150.png new file mode 100644 index 0000000..0dc9f10 Binary files /dev/null and b/mstile-310x150.png differ diff --git a/mstile-310x310.png b/mstile-310x310.png new file mode 100644 index 0000000..ca4489a Binary files /dev/null and b/mstile-310x310.png differ diff --git a/mstile-70x70.png b/mstile-70x70.png new file mode 100644 index 0000000..4443c7d Binary files /dev/null and b/mstile-70x70.png differ diff --git a/posts/impossible-list/index.html b/posts/impossible-list/index.html new file mode 100644 index 0000000..b011dad --- /dev/null +++ b/posts/impossible-list/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/blog/off-by-one/ + \ No newline at end of file diff --git a/posts/sphinx-github-actions/index.html b/posts/sphinx-github-actions/index.html new file mode 100644 index 0000000..f168393 --- /dev/null +++ b/posts/sphinx-github-actions/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/ + \ No newline at end of file diff --git a/posts/uses/index.html b/posts/uses/index.html new file mode 100644 index 0000000..c2aa2ce --- /dev/null +++ b/posts/uses/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/blog/uses/ + \ No newline at end of file diff --git a/prism-themes/prism-gruvbox-dark.min.54aecc64074623a4f9898544dcbdab9e804f1560ef0b38f4cf8e10fcaaf72264e798cb407c601aca6ecd833ec4eb93d66535581f18d45ba202cf848b70dbc332.css b/prism-themes/prism-gruvbox-dark.min.54aecc64074623a4f9898544dcbdab9e804f1560ef0b38f4cf8e10fcaaf72264e798cb407c601aca6ecd833ec4eb93d66535581f18d45ba202cf848b70dbc332.css new file mode 100644 index 0000000..85461d3 --- /dev/null +++ b/prism-themes/prism-gruvbox-dark.min.54aecc64074623a4f9898544dcbdab9e804f1560ef0b38f4cf8e10fcaaf72264e798cb407c601aca6ecd833ec4eb93d66535581f18d45ba202cf848b70dbc332.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ebdbb2;font-family:Consolas,Monaco,andale mono,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{color:#fbf1c7;background:#7c6f64}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{color:#fbf1c7;background:#7c6f64}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#1d2021}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em}.token.comment,.token.prolog,.token.cdata{color:#a89984}.token.delimiter,.token.boolean,.token.keyword,.token.selector,.token.important,.token.atrule{color:#fb4934}.token.operator,.token.punctuation,.token.attr-name{color:#a89984}.token.tag,.token.tag .punctuation,.token.doctype,.token.builtin{color:#fabd2f}.token.entity,.token.number,.token.symbol{color:#d3869b}.token.property,.token.constant,.token.variable{color:#fb4934}.token.string,.token.char{color:#b8bb26}.token.attr-value,.token.attr-value .punctuation{color:#a89984}.token.url{color:#b8bb26;text-decoration:underline}.token.function{color:#fabd2f}.token.regex{background:#b8bb26}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.inserted{background:#a89984}.token.deleted{background:#fb4934} \ No newline at end of file diff --git a/prism-themes/prism-gruvbox-light.min.42a221741efe997fcc94187c39d63c555560678789ac9ca856c74a5f0ddb2aa6c50d38b2ffbecc7a99038cbbd2efa99746e862267f781c559e0cfec10b88a5fc.css b/prism-themes/prism-gruvbox-light.min.42a221741efe997fcc94187c39d63c555560678789ac9ca856c74a5f0ddb2aa6c50d38b2ffbecc7a99038cbbd2efa99746e862267f781c559e0cfec10b88a5fc.css new file mode 100644 index 0000000..7076081 --- /dev/null +++ b/prism-themes/prism-gruvbox-light.min.42a221741efe997fcc94187c39d63c555560678789ac9ca856c74a5f0ddb2aa6c50d38b2ffbecc7a99038cbbd2efa99746e862267f781c559e0cfec10b88a5fc.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#3c3836;font-family:Consolas,Monaco,andale mono,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{color:#282828;background:#a89984}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{color:#282828;background:#a89984}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f9f5d7}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em}.token.comment,.token.prolog,.token.cdata{color:#7c6f64}.token.delimiter,.token.boolean,.token.keyword,.token.selector,.token.important,.token.atrule{color:#9d0006}.token.operator,.token.punctuation,.token.attr-name{color:#7c6f64}.token.tag,.token.tag .punctuation,.token.doctype,.token.builtin{color:#b57614}.token.entity,.token.number,.token.symbol{color:#8f3f71}.token.property,.token.constant,.token.variable{color:#9d0006}.token.string,.token.char{color:#797403}.token.attr-value,.token.attr-value .punctuation{color:#7c6f64}.token.url{color:#797403;text-decoration:underline}.token.function{color:#b57614}.token.regex{background:#797403}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.inserted{background:#7c6f64}.token.deleted{background:#9d0006} \ No newline at end of file diff --git a/projects/supply-indicator.png b/projects/supply-indicator.png new file mode 100644 index 0000000..49b8444 Binary files /dev/null and b/projects/supply-indicator.png differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..ebb1e6b --- /dev/null +++ b/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://miguelvf.dev/sitemap.xml \ No newline at end of file diff --git a/safari-pinned-tab.svg b/safari-pinned-tab.svg new file mode 100644 index 0000000..8ddf64a --- /dev/null +++ b/safari-pinned-tab.svg @@ -0,0 +1,15 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/series/index.html b/series/index.html new file mode 100644 index 0000000..232e8e0 --- /dev/null +++ b/series/index.html @@ -0,0 +1,27 @@ +Series +
+

Series

\ No newline at end of file diff --git a/series/index.xml b/series/index.xml new file mode 100644 index 0000000..1f7f3e0 --- /dev/null +++ b/series/index.xml @@ -0,0 +1 @@ +Series on Miguel Villa Floranhttps://miguelvf.dev/series/Recent content in Series on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Themes Guidehttps://miguelvf.dev/series/themes-guide/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/series/themes-guide/ \ No newline at end of file diff --git a/series/page/1/index.html b/series/page/1/index.html new file mode 100644 index 0000000..b657700 --- /dev/null +++ b/series/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/series/ + \ No newline at end of file diff --git a/series/themes-guide/index.html b/series/themes-guide/index.html new file mode 100644 index 0000000..0ec937a --- /dev/null +++ b/series/themes-guide/index.html @@ -0,0 +1,27 @@ +Themes Guide +
+

Themes Guide

\ No newline at end of file diff --git a/series/themes-guide/index.xml b/series/themes-guide/index.xml new file mode 100644 index 0000000..a2550d1 --- /dev/null +++ b/series/themes-guide/index.xml @@ -0,0 +1,3 @@ +Themes Guide on Miguel Villa Floranhttps://miguelvf.dev/series/themes-guide/Recent content in Themes Guide on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/series/themes-guide/page/1/index.html b/series/themes-guide/page/1/index.html new file mode 100644 index 0000000..2a17aac --- /dev/null +++ b/series/themes-guide/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/series/themes-guide/ + \ No newline at end of file diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..26228d2 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "hugo-theme-gruvbox", + "short_name": "hugo-theme-gruvbox", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#282828", + "background_color": "#282828", + "display": "standalone" +} diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..b2e716d --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://miguelvf.dev/blog/2024-03-30T00:00:00+00:00https://miguelvf.dev/blog/dotfiles/tmux/2024-03-30T00:00:00+00:00https://miguelvf.dev/tags/developer-tools/2024-03-30T00:00:00+00:00https://miguelvf.dev/tags/dotfiles/2024-03-30T00:00:00+00:00https://miguelvf.dev/2024-03-30T00:00:00+00:00https://miguelvf.dev/tags/2024-03-30T00:00:00+00:00https://miguelvf.dev/tags/tmux/2024-03-30T00:00:00+00:00https://miguelvf.dev/tags/build-system/2024-03-29T00:00:00+00:00https://miguelvf.dev/tags/c/2024-03-29T00:00:00+00:00https://miguelvf.dev/blog/c-makefile/2024-03-29T00:00:00+00:00https://miguelvf.dev/tags/makefile/2024-03-29T00:00:00+00:00https://miguelvf.dev/tags/ssh/2024-03-24T00:00:00+00:00https://miguelvf.dev/blog/dotfiles/ssh/2024-03-24T00:00:00+00:00https://miguelvf.dev/tags/hardware/2023-08-27T00:00:00+00:00https://miguelvf.dev/tags/software/2023-08-27T00:00:00+00:00https://miguelvf.dev/blog/uses/2023-08-27T00:00:00+00:00https://miguelvf.dev/tags/tools/2023-08-27T00:00:00+00:00https://miguelvf.dev/tags/uses/2023-08-27T00:00:00+00:00https://miguelvf.dev/tags/documentation/2023-08-09T00:00:00+00:00https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/2023-08-09T00:00:00+00:00https://miguelvf.dev/tags/github-actions/2023-08-09T00:00:00+00:00https://miguelvf.dev/tags/github-pages/2023-08-09T00:00:00+00:00https://miguelvf.dev/tags/sphinx/2023-08-09T00:00:00+00:00https://miguelvf.dev/tags/ambitions/2022-09-15T00:00:00+00:00https://miguelvf.dev/tags/dreams/2022-09-15T00:00:00+00:00https://miguelvf.dev/tags/goals/2022-09-15T00:00:00+00:00https://miguelvf.dev/blog/impossible-list/2022-09-15T00:00:00+00:00https://miguelvf.dev/tags/algorithms/2022-04-23T00:00:00+00:00https://miguelvf.dev/tags/best-practices/2022-04-23T00:00:00+00:00https://miguelvf.dev/tags/computer-science/2022-04-23T00:00:00+00:00https://miguelvf.dev/tags/hdl/2022-04-23T00:00:00+00:00https://miguelvf.dev/blog/off-by-one/2022-04-23T00:00:00+00:00https://miguelvf.dev/tags/programming/2022-04-23T00:00:00+00:00https://miguelvf.dev/tags/systemverilog/2022-04-23T00:00:00+00:00https://miguelvf.dev/blog/hdl-best-practices/2022-04-23T00:00:00+00:00https://miguelvf.dev/categories/2019-03-11T00:00:00+00:00https://miguelvf.dev/tags/css/2019-03-11T00:00:00+00:00https://miguelvf.dev/tags/html/2019-03-11T00:00:00+00:00https://miguelvf.dev/tags/hugo-basic-example/2019-03-11T00:00:00+00:00https://miguelvf.dev/tags/markdown/2019-03-11T00:00:00+00:00https://miguelvf.dev/blog/markdown-syntax/2019-03-11T00:00:00+00:00https://miguelvf.dev/series/2019-03-11T00:00:00+00:00https://miguelvf.dev/categories/syntax/2019-03-11T00:00:00+00:00https://miguelvf.dev/categories/themes/2019-03-11T00:00:00+00:00https://miguelvf.dev/series/themes-guide/2019-03-11T00:00:00+00:00https://miguelvf.dev/cv/ \ No newline at end of file diff --git a/tags/algorithms/index.html b/tags/algorithms/index.html new file mode 100644 index 0000000..c130c0e --- /dev/null +++ b/tags/algorithms/index.html @@ -0,0 +1,27 @@ +algorithms +
+

algorithms

\ No newline at end of file diff --git a/tags/algorithms/index.xml b/tags/algorithms/index.xml new file mode 100644 index 0000000..4545b6b --- /dev/null +++ b/tags/algorithms/index.xml @@ -0,0 +1,2 @@ +algorithms on Miguel Villa Floranhttps://miguelvf.dev/tags/algorithms/Recent content in algorithms on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000Off-By-One Errors and How to Avoid Themhttps://miguelvf.dev/blog/off-by-one/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/off-by-one/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/algorithms/page/1/index.html b/tags/algorithms/page/1/index.html new file mode 100644 index 0000000..76dbf74 --- /dev/null +++ b/tags/algorithms/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/algorithms/ + \ No newline at end of file diff --git a/tags/ambitions/index.html b/tags/ambitions/index.html new file mode 100644 index 0000000..83aa228 --- /dev/null +++ b/tags/ambitions/index.html @@ -0,0 +1,27 @@ +ambitions +
+

ambitions

My Impossible List

My attempt to live forever or die trying, by doing what I want to do with my life. Do the things I want to do, see the places I want to see, meet the people I want to meet, and live the life I want to live.
\ No newline at end of file diff --git a/tags/ambitions/index.xml b/tags/ambitions/index.xml new file mode 100644 index 0000000..ed47716 --- /dev/null +++ b/tags/ambitions/index.xml @@ -0,0 +1 @@ +ambitions on Miguel Villa Floranhttps://miguelvf.dev/tags/ambitions/Recent content in ambitions on Miguel Villa FloranHugo -- gohugo.ioenThu, 15 Sep 2022 00:00:00 +0000My Impossible Listhttps://miguelvf.dev/blog/impossible-list/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/blog/impossible-list/We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone&hellip; And, therefore, as we set sail we ask God&rsquo;s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked. \ No newline at end of file diff --git a/tags/ambitions/page/1/index.html b/tags/ambitions/page/1/index.html new file mode 100644 index 0000000..53d46ec --- /dev/null +++ b/tags/ambitions/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/ambitions/ + \ No newline at end of file diff --git a/tags/best-practices/index.html b/tags/best-practices/index.html new file mode 100644 index 0000000..65caa87 --- /dev/null +++ b/tags/best-practices/index.html @@ -0,0 +1,27 @@ +best-practices +
+

best-practices

\ No newline at end of file diff --git a/tags/best-practices/index.xml b/tags/best-practices/index.xml new file mode 100644 index 0000000..205e924 --- /dev/null +++ b/tags/best-practices/index.xml @@ -0,0 +1,2 @@ +best-practices on Miguel Villa Floranhttps://miguelvf.dev/tags/best-practices/Recent content in best-practices on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000SystemVerilog Best Practiceshttps://miguelvf.dev/blog/hdl-best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/hdl-best-practices/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/best-practices/page/1/index.html b/tags/best-practices/page/1/index.html new file mode 100644 index 0000000..6bca76b --- /dev/null +++ b/tags/best-practices/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/best-practices/ + \ No newline at end of file diff --git a/tags/build-system/index.html b/tags/build-system/index.html new file mode 100644 index 0000000..ff48be7 --- /dev/null +++ b/tags/build-system/index.html @@ -0,0 +1,27 @@ +build-system +
+

build-system

\ No newline at end of file diff --git a/tags/build-system/index.xml b/tags/build-system/index.xml new file mode 100644 index 0000000..6cc32ee --- /dev/null +++ b/tags/build-system/index.xml @@ -0,0 +1 @@ +build-system on Miguel Villa Floranhttps://miguelvf.dev/tags/build-system/Recent content in build-system on Miguel Villa FloranHugo -- gohugo.ioenFri, 29 Mar 2024 00:00:00 +0000Crafting a Robust and Maintainable C Makefilehttps://miguelvf.dev/blog/c-makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/c-makefile/I&rsquo;m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects. \ No newline at end of file diff --git a/tags/build-system/page/1/index.html b/tags/build-system/page/1/index.html new file mode 100644 index 0000000..c85e214 --- /dev/null +++ b/tags/build-system/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/build-system/ + \ No newline at end of file diff --git a/tags/c/index.html b/tags/c/index.html new file mode 100644 index 0000000..9e91c61 --- /dev/null +++ b/tags/c/index.html @@ -0,0 +1,27 @@ +c +
+

c

\ No newline at end of file diff --git a/tags/c/index.xml b/tags/c/index.xml new file mode 100644 index 0000000..8640a5e --- /dev/null +++ b/tags/c/index.xml @@ -0,0 +1 @@ +c on Miguel Villa Floranhttps://miguelvf.dev/tags/c/Recent content in c on Miguel Villa FloranHugo -- gohugo.ioenFri, 29 Mar 2024 00:00:00 +0000Crafting a Robust and Maintainable C Makefilehttps://miguelvf.dev/blog/c-makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/c-makefile/I&rsquo;m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects. \ No newline at end of file diff --git a/tags/c/page/1/index.html b/tags/c/page/1/index.html new file mode 100644 index 0000000..416f026 --- /dev/null +++ b/tags/c/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/c/ + \ No newline at end of file diff --git a/tags/computer-science/index.html b/tags/computer-science/index.html new file mode 100644 index 0000000..a99e826 --- /dev/null +++ b/tags/computer-science/index.html @@ -0,0 +1,27 @@ +computer-science +
+

computer-science

\ No newline at end of file diff --git a/tags/computer-science/index.xml b/tags/computer-science/index.xml new file mode 100644 index 0000000..72c4038 --- /dev/null +++ b/tags/computer-science/index.xml @@ -0,0 +1,2 @@ +computer-science on Miguel Villa Floranhttps://miguelvf.dev/tags/computer-science/Recent content in computer-science on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000Off-By-One Errors and How to Avoid Themhttps://miguelvf.dev/blog/off-by-one/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/off-by-one/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/computer-science/page/1/index.html b/tags/computer-science/page/1/index.html new file mode 100644 index 0000000..85cdc1d --- /dev/null +++ b/tags/computer-science/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/computer-science/ + \ No newline at end of file diff --git a/tags/css/index.html b/tags/css/index.html new file mode 100644 index 0000000..91672d0 --- /dev/null +++ b/tags/css/index.html @@ -0,0 +1,27 @@ +css +
+

css

\ No newline at end of file diff --git a/tags/css/index.xml b/tags/css/index.xml new file mode 100644 index 0000000..f51db2f --- /dev/null +++ b/tags/css/index.xml @@ -0,0 +1,3 @@ +css on Miguel Villa Floranhttps://miguelvf.dev/tags/css/Recent content in css on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/tags/css/page/1/index.html b/tags/css/page/1/index.html new file mode 100644 index 0000000..33e0b53 --- /dev/null +++ b/tags/css/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/css/ + \ No newline at end of file diff --git a/tags/developer-tools/index.html b/tags/developer-tools/index.html new file mode 100644 index 0000000..4c7ec05 --- /dev/null +++ b/tags/developer-tools/index.html @@ -0,0 +1,27 @@ +developer tools +
+

developer tools

\ No newline at end of file diff --git a/tags/developer-tools/index.xml b/tags/developer-tools/index.xml new file mode 100644 index 0000000..8b62693 --- /dev/null +++ b/tags/developer-tools/index.xml @@ -0,0 +1,7 @@ +developer tools on Miguel Villa Floranhttps://miguelvf.dev/tags/developer-tools/Recent content in developer tools on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000An Easy Guide to Using Tmuxhttps://miguelvf.dev/blog/dotfiles/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/tmux/Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install)Using Secure Shell (ssh) and Key-Based Authenticationhttps://miguelvf.dev/blog/dotfiles/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/ssh/Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line. \ No newline at end of file diff --git a/tags/developer-tools/page/1/index.html b/tags/developer-tools/page/1/index.html new file mode 100644 index 0000000..77dd6c7 --- /dev/null +++ b/tags/developer-tools/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/developer-tools/ + \ No newline at end of file diff --git a/tags/documentation/index.html b/tags/documentation/index.html new file mode 100644 index 0000000..aabda97 --- /dev/null +++ b/tags/documentation/index.html @@ -0,0 +1,27 @@ +Documentation +
+

Documentation

\ No newline at end of file diff --git a/tags/documentation/index.xml b/tags/documentation/index.xml new file mode 100644 index 0000000..e508e96 --- /dev/null +++ b/tags/documentation/index.xml @@ -0,0 +1,2 @@ +Documentation on Miguel Villa Floranhttps://miguelvf.dev/tags/documentation/Recent content in Documentation on Miguel Villa FloranHugo -- gohugo.ioenWed, 09 Aug 2023 00:00:00 +0000Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again. \ No newline at end of file diff --git a/tags/documentation/page/1/index.html b/tags/documentation/page/1/index.html new file mode 100644 index 0000000..756ddc5 --- /dev/null +++ b/tags/documentation/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/documentation/ + \ No newline at end of file diff --git a/tags/dotfiles/index.html b/tags/dotfiles/index.html new file mode 100644 index 0000000..35b529e --- /dev/null +++ b/tags/dotfiles/index.html @@ -0,0 +1,27 @@ +dotfiles +
+

dotfiles

\ No newline at end of file diff --git a/tags/dotfiles/index.xml b/tags/dotfiles/index.xml new file mode 100644 index 0000000..6cf7416 --- /dev/null +++ b/tags/dotfiles/index.xml @@ -0,0 +1,9 @@ +dotfiles on Miguel Villa Floranhttps://miguelvf.dev/tags/dotfiles/Recent content in dotfiles on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000An Easy Guide to Using Tmuxhttps://miguelvf.dev/blog/dotfiles/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/tmux/Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install)Using Secure Shell (ssh) and Key-Based Authenticationhttps://miguelvf.dev/blog/dotfiles/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/ssh/Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line.The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. \ No newline at end of file diff --git a/tags/dotfiles/page/1/index.html b/tags/dotfiles/page/1/index.html new file mode 100644 index 0000000..09de68e --- /dev/null +++ b/tags/dotfiles/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/dotfiles/ + \ No newline at end of file diff --git a/tags/dreams/index.html b/tags/dreams/index.html new file mode 100644 index 0000000..8ea9a40 --- /dev/null +++ b/tags/dreams/index.html @@ -0,0 +1,27 @@ +dreams +
+

dreams

My Impossible List

My attempt to live forever or die trying, by doing what I want to do with my life. Do the things I want to do, see the places I want to see, meet the people I want to meet, and live the life I want to live.
\ No newline at end of file diff --git a/tags/dreams/index.xml b/tags/dreams/index.xml new file mode 100644 index 0000000..786c181 --- /dev/null +++ b/tags/dreams/index.xml @@ -0,0 +1 @@ +dreams on Miguel Villa Floranhttps://miguelvf.dev/tags/dreams/Recent content in dreams on Miguel Villa FloranHugo -- gohugo.ioenThu, 15 Sep 2022 00:00:00 +0000My Impossible Listhttps://miguelvf.dev/blog/impossible-list/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/blog/impossible-list/We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone&hellip; And, therefore, as we set sail we ask God&rsquo;s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked. \ No newline at end of file diff --git a/tags/dreams/page/1/index.html b/tags/dreams/page/1/index.html new file mode 100644 index 0000000..c46e71c --- /dev/null +++ b/tags/dreams/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/dreams/ + \ No newline at end of file diff --git a/tags/github-actions/index.html b/tags/github-actions/index.html new file mode 100644 index 0000000..5a97934 --- /dev/null +++ b/tags/github-actions/index.html @@ -0,0 +1,27 @@ +GitHub Actions +
+

GitHub Actions

\ No newline at end of file diff --git a/tags/github-actions/index.xml b/tags/github-actions/index.xml new file mode 100644 index 0000000..b880b29 --- /dev/null +++ b/tags/github-actions/index.xml @@ -0,0 +1,2 @@ +GitHub Actions on Miguel Villa Floranhttps://miguelvf.dev/tags/github-actions/Recent content in GitHub Actions on Miguel Villa FloranHugo -- gohugo.ioenWed, 09 Aug 2023 00:00:00 +0000Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again. \ No newline at end of file diff --git a/tags/github-actions/page/1/index.html b/tags/github-actions/page/1/index.html new file mode 100644 index 0000000..ebc1bb5 --- /dev/null +++ b/tags/github-actions/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/github-actions/ + \ No newline at end of file diff --git a/tags/github-pages/index.html b/tags/github-pages/index.html new file mode 100644 index 0000000..649bdea --- /dev/null +++ b/tags/github-pages/index.html @@ -0,0 +1,27 @@ +GitHub Pages +
+

GitHub Pages

\ No newline at end of file diff --git a/tags/github-pages/index.xml b/tags/github-pages/index.xml new file mode 100644 index 0000000..3b1e503 --- /dev/null +++ b/tags/github-pages/index.xml @@ -0,0 +1,2 @@ +GitHub Pages on Miguel Villa Floranhttps://miguelvf.dev/tags/github-pages/Recent content in GitHub Pages on Miguel Villa FloranHugo -- gohugo.ioenWed, 09 Aug 2023 00:00:00 +0000Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again. \ No newline at end of file diff --git a/tags/github-pages/page/1/index.html b/tags/github-pages/page/1/index.html new file mode 100644 index 0000000..3da99ab --- /dev/null +++ b/tags/github-pages/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/github-pages/ + \ No newline at end of file diff --git a/tags/goals/index.html b/tags/goals/index.html new file mode 100644 index 0000000..f210062 --- /dev/null +++ b/tags/goals/index.html @@ -0,0 +1,27 @@ +goals +
+

goals

My Impossible List

My attempt to live forever or die trying, by doing what I want to do with my life. Do the things I want to do, see the places I want to see, meet the people I want to meet, and live the life I want to live.
\ No newline at end of file diff --git a/tags/goals/index.xml b/tags/goals/index.xml new file mode 100644 index 0000000..a9c5a1e --- /dev/null +++ b/tags/goals/index.xml @@ -0,0 +1 @@ +goals on Miguel Villa Floranhttps://miguelvf.dev/tags/goals/Recent content in goals on Miguel Villa FloranHugo -- gohugo.ioenThu, 15 Sep 2022 00:00:00 +0000My Impossible Listhttps://miguelvf.dev/blog/impossible-list/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/blog/impossible-list/We choose to go to the Moon. We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone&hellip; And, therefore, as we set sail we ask God&rsquo;s blessing on the most hazardous and dangerous and greatest adventure on which man has ever embarked. \ No newline at end of file diff --git a/tags/goals/page/1/index.html b/tags/goals/page/1/index.html new file mode 100644 index 0000000..e421fb4 --- /dev/null +++ b/tags/goals/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/goals/ + \ No newline at end of file diff --git a/tags/hardware/index.html b/tags/hardware/index.html new file mode 100644 index 0000000..4b1b0ef --- /dev/null +++ b/tags/hardware/index.html @@ -0,0 +1,27 @@ +hardware +
+

hardware

\ No newline at end of file diff --git a/tags/hardware/index.xml b/tags/hardware/index.xml new file mode 100644 index 0000000..39e9ea6 --- /dev/null +++ b/tags/hardware/index.xml @@ -0,0 +1,3 @@ +hardware on Miguel Villa Floranhttps://miguelvf.dev/tags/hardware/Recent content in hardware on Miguel Villa FloranHugo -- gohugo.ioenSun, 27 Aug 2023 00:00:00 +0000The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. \ No newline at end of file diff --git a/tags/hardware/page/1/index.html b/tags/hardware/page/1/index.html new file mode 100644 index 0000000..9f0aa4c --- /dev/null +++ b/tags/hardware/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/hardware/ + \ No newline at end of file diff --git a/tags/hdl/index.html b/tags/hdl/index.html new file mode 100644 index 0000000..8d9df2d --- /dev/null +++ b/tags/hdl/index.html @@ -0,0 +1,27 @@ +hdl +
+

hdl

\ No newline at end of file diff --git a/tags/hdl/index.xml b/tags/hdl/index.xml new file mode 100644 index 0000000..d75b871 --- /dev/null +++ b/tags/hdl/index.xml @@ -0,0 +1,2 @@ +hdl on Miguel Villa Floranhttps://miguelvf.dev/tags/hdl/Recent content in hdl on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000SystemVerilog Best Practiceshttps://miguelvf.dev/blog/hdl-best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/hdl-best-practices/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/hdl/page/1/index.html b/tags/hdl/page/1/index.html new file mode 100644 index 0000000..1a73582 --- /dev/null +++ b/tags/hdl/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/hdl/ + \ No newline at end of file diff --git a/tags/html/index.html b/tags/html/index.html new file mode 100644 index 0000000..247b721 --- /dev/null +++ b/tags/html/index.html @@ -0,0 +1,27 @@ +html +
+

html

\ No newline at end of file diff --git a/tags/html/index.xml b/tags/html/index.xml new file mode 100644 index 0000000..cdb6803 --- /dev/null +++ b/tags/html/index.xml @@ -0,0 +1,3 @@ +html on Miguel Villa Floranhttps://miguelvf.dev/tags/html/Recent content in html on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/tags/html/page/1/index.html b/tags/html/page/1/index.html new file mode 100644 index 0000000..5c240ba --- /dev/null +++ b/tags/html/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/html/ + \ No newline at end of file diff --git a/tags/hugo-basic-example/index.html b/tags/hugo-basic-example/index.html new file mode 100644 index 0000000..a74ca3b --- /dev/null +++ b/tags/hugo-basic-example/index.html @@ -0,0 +1,27 @@ +hugo-basic-example +
+

hugo-basic-example

\ No newline at end of file diff --git a/tags/hugo-basic-example/index.xml b/tags/hugo-basic-example/index.xml new file mode 100644 index 0000000..c3e0aa0 --- /dev/null +++ b/tags/hugo-basic-example/index.xml @@ -0,0 +1,3 @@ +hugo-basic-example on Miguel Villa Floranhttps://miguelvf.dev/tags/hugo-basic-example/Recent content in hugo-basic-example on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/tags/hugo-basic-example/page/1/index.html b/tags/hugo-basic-example/page/1/index.html new file mode 100644 index 0000000..6791fdd --- /dev/null +++ b/tags/hugo-basic-example/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/hugo-basic-example/ + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..8e6a0de --- /dev/null +++ b/tags/index.html @@ -0,0 +1,27 @@ +Tags +
+

Tags

dotfiles

tmux

c

makefile

ssh

hardware

software

tools

\ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 0000000..02d6dc2 --- /dev/null +++ b/tags/index.xml @@ -0,0 +1 @@ +Tags on Miguel Villa Floranhttps://miguelvf.dev/tags/Recent content in Tags on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000developer toolshttps://miguelvf.dev/tags/developer-tools/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/developer-tools/dotfileshttps://miguelvf.dev/tags/dotfiles/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/dotfiles/tmuxhttps://miguelvf.dev/tags/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/tmux/build-systemhttps://miguelvf.dev/tags/build-system/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/build-system/chttps://miguelvf.dev/tags/c/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/c/makefilehttps://miguelvf.dev/tags/makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/makefile/sshhttps://miguelvf.dev/tags/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/tags/ssh/hardwarehttps://miguelvf.dev/tags/hardware/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/hardware/softwarehttps://miguelvf.dev/tags/software/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/software/toolshttps://miguelvf.dev/tags/tools/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/tools/useshttps://miguelvf.dev/tags/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/uses/Documentationhttps://miguelvf.dev/tags/documentation/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/documentation/GitHub Actionshttps://miguelvf.dev/tags/github-actions/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/github-actions/GitHub Pageshttps://miguelvf.dev/tags/github-pages/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/github-pages/Sphinxhttps://miguelvf.dev/tags/sphinx/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/tags/sphinx/ambitionshttps://miguelvf.dev/tags/ambitions/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/tags/ambitions/dreamshttps://miguelvf.dev/tags/dreams/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/tags/dreams/goalshttps://miguelvf.dev/tags/goals/Thu, 15 Sep 2022 00:00:00 +0000https://miguelvf.dev/tags/goals/algorithmshttps://miguelvf.dev/tags/algorithms/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/algorithms/best-practiceshttps://miguelvf.dev/tags/best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/best-practices/computer-sciencehttps://miguelvf.dev/tags/computer-science/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/computer-science/hdlhttps://miguelvf.dev/tags/hdl/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/hdl/programminghttps://miguelvf.dev/tags/programming/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/programming/systemveriloghttps://miguelvf.dev/tags/systemverilog/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/tags/systemverilog/csshttps://miguelvf.dev/tags/css/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/tags/css/htmlhttps://miguelvf.dev/tags/html/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/tags/html/hugo-basic-examplehttps://miguelvf.dev/tags/hugo-basic-example/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/tags/hugo-basic-example/markdownhttps://miguelvf.dev/tags/markdown/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/tags/markdown/ \ No newline at end of file diff --git a/tags/makefile/index.html b/tags/makefile/index.html new file mode 100644 index 0000000..7dff07f --- /dev/null +++ b/tags/makefile/index.html @@ -0,0 +1,27 @@ +makefile +
+

makefile

\ No newline at end of file diff --git a/tags/makefile/index.xml b/tags/makefile/index.xml new file mode 100644 index 0000000..462ded1 --- /dev/null +++ b/tags/makefile/index.xml @@ -0,0 +1 @@ +makefile on Miguel Villa Floranhttps://miguelvf.dev/tags/makefile/Recent content in makefile on Miguel Villa FloranHugo -- gohugo.ioenFri, 29 Mar 2024 00:00:00 +0000Crafting a Robust and Maintainable C Makefilehttps://miguelvf.dev/blog/c-makefile/Fri, 29 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/c-makefile/I&rsquo;m pretty pedantic about the quality of my code, and I like to keep my projects organized and maintainable. One of the tools that I use to achieve this is GNU Make, which is a powerful build system that can be used to automate the process of compiling and linking C programs. In this post, I will show you how to create a simple and robust Makefile template that can be used in your C projects. \ No newline at end of file diff --git a/tags/makefile/page/1/index.html b/tags/makefile/page/1/index.html new file mode 100644 index 0000000..06e8ce4 --- /dev/null +++ b/tags/makefile/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/makefile/ + \ No newline at end of file diff --git a/tags/markdown/index.html b/tags/markdown/index.html new file mode 100644 index 0000000..8f8d689 --- /dev/null +++ b/tags/markdown/index.html @@ -0,0 +1,27 @@ +markdown +
+

markdown

\ No newline at end of file diff --git a/tags/markdown/index.xml b/tags/markdown/index.xml new file mode 100644 index 0000000..24ebfa5 --- /dev/null +++ b/tags/markdown/index.xml @@ -0,0 +1,3 @@ +markdown on Miguel Villa Floranhttps://miguelvf.dev/tags/markdown/Recent content in markdown on Miguel Villa FloranHugo -- gohugo.ioenMon, 11 Mar 2019 00:00:00 +0000Markdown Syntax Guidehttps://miguelvf.dev/blog/markdown-syntax/Mon, 11 Mar 2019 00:00:00 +0000https://miguelvf.dev/blog/markdown-syntax/<p>This article offers a sample of basic Markdown syntax that can be used in Hugo +content files, also it shows whether basic HTML elements are decorated with CSS +in a Hugo theme.</p> \ No newline at end of file diff --git a/tags/markdown/page/1/index.html b/tags/markdown/page/1/index.html new file mode 100644 index 0000000..f47bb12 --- /dev/null +++ b/tags/markdown/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/markdown/ + \ No newline at end of file diff --git a/tags/page/1/index.html b/tags/page/1/index.html new file mode 100644 index 0000000..901b6d1 --- /dev/null +++ b/tags/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/ + \ No newline at end of file diff --git a/tags/page/2/index.html b/tags/page/2/index.html new file mode 100644 index 0000000..1100e4c --- /dev/null +++ b/tags/page/2/index.html @@ -0,0 +1,29 @@ +Tags +
+

Tags

uses

Sphinx

dreams

goals

\ No newline at end of file diff --git a/tags/page/3/index.html b/tags/page/3/index.html new file mode 100644 index 0000000..05101f5 --- /dev/null +++ b/tags/page/3/index.html @@ -0,0 +1,28 @@ +Tags +
+

Tags

hdl

css

html

markdown

\ No newline at end of file diff --git a/tags/programming/index.html b/tags/programming/index.html new file mode 100644 index 0000000..a2c13b8 --- /dev/null +++ b/tags/programming/index.html @@ -0,0 +1,27 @@ +programming +
+

programming

\ No newline at end of file diff --git a/tags/programming/index.xml b/tags/programming/index.xml new file mode 100644 index 0000000..b45b252 --- /dev/null +++ b/tags/programming/index.xml @@ -0,0 +1,2 @@ +programming on Miguel Villa Floranhttps://miguelvf.dev/tags/programming/Recent content in programming on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000Off-By-One Errors and How to Avoid Themhttps://miguelvf.dev/blog/off-by-one/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/off-by-one/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/programming/page/1/index.html b/tags/programming/page/1/index.html new file mode 100644 index 0000000..45eb3c8 --- /dev/null +++ b/tags/programming/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/programming/ + \ No newline at end of file diff --git a/tags/software/index.html b/tags/software/index.html new file mode 100644 index 0000000..7c99dbe --- /dev/null +++ b/tags/software/index.html @@ -0,0 +1,27 @@ +software +
+

software

\ No newline at end of file diff --git a/tags/software/index.xml b/tags/software/index.xml new file mode 100644 index 0000000..6049655 --- /dev/null +++ b/tags/software/index.xml @@ -0,0 +1,3 @@ +software on Miguel Villa Floranhttps://miguelvf.dev/tags/software/Recent content in software on Miguel Villa FloranHugo -- gohugo.ioenSun, 27 Aug 2023 00:00:00 +0000The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. \ No newline at end of file diff --git a/tags/software/page/1/index.html b/tags/software/page/1/index.html new file mode 100644 index 0000000..9c6ef15 --- /dev/null +++ b/tags/software/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/software/ + \ No newline at end of file diff --git a/tags/sphinx/index.html b/tags/sphinx/index.html new file mode 100644 index 0000000..e500f0a --- /dev/null +++ b/tags/sphinx/index.html @@ -0,0 +1,27 @@ +Sphinx +
+

Sphinx

\ No newline at end of file diff --git a/tags/sphinx/index.xml b/tags/sphinx/index.xml new file mode 100644 index 0000000..6711635 --- /dev/null +++ b/tags/sphinx/index.xml @@ -0,0 +1,2 @@ +Sphinx on Miguel Villa Floranhttps://miguelvf.dev/tags/sphinx/Recent content in Sphinx on Miguel Villa FloranHugo -- gohugo.ioenWed, 09 Aug 2023 00:00:00 +0000Documentation with Sphinx and GitHub Actions the Right Wayhttps://miguelvf.dev/blog/sphinx-github-actions-docs-guide/Wed, 09 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/sphinx-github-actions-docs-guide/One of the things I value the most when it comes to when it comes to writing software I publish is its maintainability, from the obscure and simple bash scripts to the large and complex programing pillars packed with passion that are placed in my programming portfolio. +For most people, this is limited to writing consise comments in the codebases with the hope that they work once and never need to be touched again. \ No newline at end of file diff --git a/tags/sphinx/page/1/index.html b/tags/sphinx/page/1/index.html new file mode 100644 index 0000000..8787430 --- /dev/null +++ b/tags/sphinx/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/sphinx/ + \ No newline at end of file diff --git a/tags/ssh/index.html b/tags/ssh/index.html new file mode 100644 index 0000000..5caa53b --- /dev/null +++ b/tags/ssh/index.html @@ -0,0 +1,27 @@ +ssh +
+

ssh

\ No newline at end of file diff --git a/tags/ssh/index.xml b/tags/ssh/index.xml new file mode 100644 index 0000000..c278e9f --- /dev/null +++ b/tags/ssh/index.xml @@ -0,0 +1,3 @@ +ssh on Miguel Villa Floranhttps://miguelvf.dev/tags/ssh/Recent content in ssh on Miguel Villa FloranHugo -- gohugo.ioenSun, 24 Mar 2024 00:00:00 +0000Using Secure Shell (ssh) and Key-Based Authenticationhttps://miguelvf.dev/blog/dotfiles/ssh/Sun, 24 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/ssh/Installation# An ssh client is required to connect to remote servers. Fortunately, ssh is already installed on most Linux distributions and macOS. As of Windows 10, OpenSSH is included in Windows. To check whether you have it installed, run the following command: +ssh -V If ssh is not installed on your machine, you can install it by running the following command: +sudo apt-get install openssh-client openssh-server Usage# Once ssh is installed on your machine, you can connect to remote servers and interface with them via the commands line. \ No newline at end of file diff --git a/tags/ssh/page/1/index.html b/tags/ssh/page/1/index.html new file mode 100644 index 0000000..d0a19e2 --- /dev/null +++ b/tags/ssh/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/ssh/ + \ No newline at end of file diff --git a/tags/systemverilog/index.html b/tags/systemverilog/index.html new file mode 100644 index 0000000..e72a86c --- /dev/null +++ b/tags/systemverilog/index.html @@ -0,0 +1,27 @@ +systemverilog +
+

systemverilog

\ No newline at end of file diff --git a/tags/systemverilog/index.xml b/tags/systemverilog/index.xml new file mode 100644 index 0000000..10b2c8b --- /dev/null +++ b/tags/systemverilog/index.xml @@ -0,0 +1,2 @@ +systemverilog on Miguel Villa Floranhttps://miguelvf.dev/tags/systemverilog/Recent content in systemverilog on Miguel Villa FloranHugo -- gohugo.ioenSat, 23 Apr 2022 00:00:00 +0000SystemVerilog Best Practiceshttps://miguelvf.dev/blog/hdl-best-practices/Sat, 23 Apr 2022 00:00:00 +0000https://miguelvf.dev/blog/hdl-best-practices/When I was a beginner at programming, I would often find myself struggling with the implementation of for loops. The amount of times I would need to iterate through an array, dictionary, iterable, or any given data structure would always be one more or one less than I anticipated. As a result, I became quite familiar with the following error message: +IndexError: list index out of range I recently discovered this problem I dealt with had a name: the off-by-one error. \ No newline at end of file diff --git a/tags/systemverilog/page/1/index.html b/tags/systemverilog/page/1/index.html new file mode 100644 index 0000000..3e78b11 --- /dev/null +++ b/tags/systemverilog/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/systemverilog/ + \ No newline at end of file diff --git a/tags/tmux/index.html b/tags/tmux/index.html new file mode 100644 index 0000000..e145b28 --- /dev/null +++ b/tags/tmux/index.html @@ -0,0 +1,27 @@ +tmux +
+

tmux

\ No newline at end of file diff --git a/tags/tmux/index.xml b/tags/tmux/index.xml new file mode 100644 index 0000000..b380f27 --- /dev/null +++ b/tags/tmux/index.xml @@ -0,0 +1,5 @@ +tmux on Miguel Villa Floranhttps://miguelvf.dev/tags/tmux/Recent content in tmux on Miguel Villa FloranHugo -- gohugo.ioenSat, 30 Mar 2024 00:00:00 +0000An Easy Guide to Using Tmuxhttps://miguelvf.dev/blog/dotfiles/tmux/Sat, 30 Mar 2024 00:00:00 +0000https://miguelvf.dev/blog/dotfiles/tmux/Tmux# Usage# Install tmux +sudo apt install tmux Install tpm (Tmux Plugin Manager) +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Reload TMUX environment so TPM is sourced: +# type this in terminal if tmux is already running tmux source $XDG_CONFIG_HOME/tmux/tmux.conf Keybinds# To enter commands into tmux, you must enter a specific keybind, which is called the prefix key, followed by the command. My prefix key is ctrl + space. +To refresh tmux and install new plugins, type prefix + I (capital i, as in Install) \ No newline at end of file diff --git a/tags/tmux/page/1/index.html b/tags/tmux/page/1/index.html new file mode 100644 index 0000000..236559b --- /dev/null +++ b/tags/tmux/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/tmux/ + \ No newline at end of file diff --git a/tags/tools/index.html b/tags/tools/index.html new file mode 100644 index 0000000..a56a060 --- /dev/null +++ b/tags/tools/index.html @@ -0,0 +1,27 @@ +tools +
+

tools

\ No newline at end of file diff --git a/tags/tools/index.xml b/tags/tools/index.xml new file mode 100644 index 0000000..3ce7dec --- /dev/null +++ b/tags/tools/index.xml @@ -0,0 +1,3 @@ +tools on Miguel Villa Floranhttps://miguelvf.dev/tags/tools/Recent content in tools on Miguel Villa FloranHugo -- gohugo.ioenSun, 27 Aug 2023 00:00:00 +0000The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. \ No newline at end of file diff --git a/tags/tools/page/1/index.html b/tags/tools/page/1/index.html new file mode 100644 index 0000000..04ac8b8 --- /dev/null +++ b/tags/tools/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/tools/ + \ No newline at end of file diff --git a/tags/uses/index.html b/tags/uses/index.html new file mode 100644 index 0000000..00f8522 --- /dev/null +++ b/tags/uses/index.html @@ -0,0 +1,27 @@ +uses +
+

uses

\ No newline at end of file diff --git a/tags/uses/index.xml b/tags/uses/index.xml new file mode 100644 index 0000000..cbb6ff6 --- /dev/null +++ b/tags/uses/index.xml @@ -0,0 +1,3 @@ +uses on Miguel Villa Floranhttps://miguelvf.dev/tags/uses/Recent content in uses on Miguel Villa FloranHugo -- gohugo.ioenSun, 27 Aug 2023 00:00:00 +0000The Things I Usehttps://miguelvf.dev/blog/uses/Sun, 27 Aug 2023 00:00:00 +0000https://miguelvf.dev/blog/uses/Getting closer to how your environment actualy works will only expand your mind — Michael B. Paulson, otherwise known as ThePrimeagen +This page was last edited on March 29, 2024 +My former college roomate and good friend, Hayden Buscher, recently made a post about the things he uses to stay productive. Giving credit where its due, I thought it was a great idea, so I decided to give my own spin on it. \ No newline at end of file diff --git a/tags/uses/page/1/index.html b/tags/uses/page/1/index.html new file mode 100644 index 0000000..c99c08f --- /dev/null +++ b/tags/uses/page/1/index.html @@ -0,0 +1,2 @@ +https://miguelvf.dev/tags/uses/ + \ No newline at end of file