From ce7749abd0114d836d116ecbeb001d0a3827be3b Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Tue, 11 Nov 2025 21:25:46 -0600 Subject: fix grammar in 2021 posts --- content/blog/2021-01-01-seum.org | 14 +- content/blog/2021-01-04-fediverse.org | 85 +++--- content/blog/2021-01-07-ufw.org | 102 ++++--- content/blog/2021-02-19-macos.org | 183 ++++++------- content/blog/2021-03-19-clone-github-repos.org | 54 ++-- content/blog/2021-03-28-gemini-capsule.org | 136 +++++----- content/blog/2021-03-28-vaporwave-vs-outrun.org | 136 +++++----- content/blog/2021-03-30-vps-web-server.org | 331 +++++++++++------------ content/blog/2021-04-17-gemini-server.org | 71 +++-- content/blog/2021-04-23-php-comment-system.org | 177 ++++++------ content/blog/2021-04-28-photography.org | 86 +++--- content/blog/2021-05-30-changing-git-authors.org | 16 +- content/blog/2021-07-15-delete-gitlab-repos.org | 41 ++- content/blog/2021-08-25-audit-sampling.org | 199 +++++++------- content/blog/2021-10-09-apache-redirect.org | 31 +-- content/blog/2021-12-04-cisa.org | 298 ++++++++++---------- 16 files changed, 924 insertions(+), 1036 deletions(-) diff --git a/content/blog/2021-01-01-seum.org b/content/blog/2021-01-01-seum.org index 7c4eabb..83f871f 100644 --- a/content/blog/2021-01-01-seum.org +++ b/content/blog/2021-01-01-seum.org @@ -5,12 +5,9 @@ * Game Description -[[https://store.steampowered.com/app/457210/SEUM_Speedrunners_from_Hell/][SEUM: -Speedrunners from Hell]] is an incredibly fast-paced mashup of a puzzle -game and a free-running game. Created by [[https://pinestudio.co][Pine -Studio]] in early 2016 and first released as a -[[https://gamejolt.com/games/seum-speedrunners-from-hell-demo/154868][demo -on GameJolt]], this game was successfully green-lit on Steam and has +[[https://store.steampowered.com/app/457210/SEUM_Speedrunners_from_Hell/][SEUM: Speedrunners from Hell]] is an incredibly fast-paced mashup of a puzzle game +and a free-running game. Created by [[https://pinestudio.co][Pine Studio]] in early 2016 and first released +as a [[https://gamejolt.com/games/seum-speedrunners-from-hell-demo/154868][demo on GameJolt]], this game was successfully green-lit on Steam and has amassed a cult following on multiple consoles. Here's the game description straight from the developers: @@ -57,8 +54,9 @@ contains nine regular levels, one boss level, and one bonus level; although you don't technically need to beat all levels to advance to the next floor. # In-Game Screenshots -The main menu gives you plenty of options for tuning your system, -playing main levels, playing the DLC, or exploring the other game modes. +The main menu gives you plenty of options for tuning your system, playing main +levels, playing the downloadable content (DLC), or exploring the other game +modes. Once you enter a level, you can look around and strategize before starting. Clicking any button will start the menu, and you'll have to diff --git a/content/blog/2021-01-04-fediverse.org b/content/blog/2021-01-04-fediverse.org index 27cae98..f32ed66 100644 --- a/content/blog/2021-01-04-fediverse.org +++ b/content/blog/2021-01-04-fediverse.org @@ -5,53 +5,51 @@ * What is the Fediverse? -The fediverse is a federated universe of servers commonly used for -sharing content, like social media. So, instead of having to rely on a -single organization to run the server (e.g. Facebook), the fediverse is -a giant collection of servers across the world, owned by many people and -organizations. - -Take a look at this depiction of a federated network. Each server in -this photo is owned and run by different administrators/owners. -Federated networks are best explained as email servers: you have an -email account that exists on a server (e.g. Outlook), your friend has an -account on a different server (e.g. GMail), and another friend has an -account on a third server (e.g. ProtonMail). All three of you can talk -and communicate back and forth without having to be on the same server. -However, responsible email admins are there to set rules and control the +The fediverse is a federated universe of servers commonly used for sharing +content, like social media. So, instead of having to rely on a single +organization to run the server (e.g. Facebook), the fediverse is a giant +collection of servers across the world, owned by many people and organizations. + +Take a look at this depiction of a federated network. Each server in this photo +is owned and run by different administrators/owners. Federated networks are best +explained as email servers: you have an email account that exists on a server +(e.g. Outlook), your friend has an account on a different server (e.g. GMail), +and another friend has an account on a third server (e.g. ProtonMail). All three +of you can talk and communicate back and forth without having to be on the same +server. However, responsible email admins are there to set rules and control the traffic going in/out of the server. -The main objective of this architecture is to decentralize the control -within the internet connections. For example, if you run your own -Mastodon instance, you and your users can't be censored or impacted in -any way by authorities of another Mastodon instance. Some users have -praised these features due to recent criticism of popular social media -websites that may be over-censoring their users. +The main objective of this architecture is to decentralize the control within +the internet connections. For example, if you run your own Mastodon instance, +you and your users can't be censored or impacted in any way by authorities of +another Mastodon instance. Some users have praised these features due to recent +criticism of popular social media websites that may be over-censoring their +users. This strategy is great for making sure control of the social web isn't -controlled by a single organization, but it also has some downsides. If -I create a Mastodon instance and get a ton of users to sign up, I can -shut the server down at any time. That means you're at risk of losing -the content you've created unless you back it up, or the server backs it -up for you. Also, depending on the software used (e.g. Mastodon, -Pixelfed, etc.), censorship may still be an issue if the server admins -decide they want to censor their users. Now, censorship isn't always a -bad thing and can even benefit the community as a whole, but you'll want -to determine which servers align with your idea of proper censorship. - -However, these are risks that we take when we sign up for any online -platform. Whatever your reason is for trying out federated social -networks, they are part of the future of the internet. However, the -popularity of these services is still yet to be determined, especially -with the increased difficulty understanding and signing up for these -platforms. Perhaps increased regulation and litigation against current -social media sites will push more users into the fediverse. +controlled by a single organization, but it also has some downsides. If I create +a Mastodon instance and get a ton of users to sign up, I can shut the server +down at any time. That means you're at risk of losing the content you've created +unless you back it up, or the server backs it up for you. Also, depending on the +software used (e.g. Mastodon, Pixelfed, etc.), censorship may still be an issue +if the server admins decide they want to censor their users. Now, censorship +isn't always a bad thing and can even benefit the community as a whole, but +you'll want to determine which servers align with your idea of proper +censorship. + +However, these are risks that we take when we sign up for any online platform. +Whatever your reason is for trying out federated social networks, they are part +of the future of the internet. However, the popularity of these services is +still yet to be determined, especially with the increased difficulty +understanding and signing up for these platforms. Perhaps increased regulation +and litigation against current social media sites will push more users into the +fediverse. * Federated Alternatives to Popular Sites -The list below is a small guide that will show you federated -alternatives to current popular websites. There are many more out there, -so go and explore: you might just find the perfect home. +The list below is a small guide that will show you federated alternatives to +current popular websites. There are many more out there, so go and explore: you +might just find the perfect home. ** Reddit @@ -91,10 +89,9 @@ so go and explore: you might just find the perfect home. * Get Started -The best way to get started is to simply sign up and learn as you go. If -you're comfortable signing up through a Mastodon, Pleroma, or Friendica -server, here is [[https://fediverse.party/en/portal/servers][a list of -themed servers]] to choose from. If you're looking for something else, +The best way to get started is to simply sign up and learn as you go. If you're +comfortable signing up through a Mastodon, Pleroma, or Friendica server, here is +[[https://fediverse.party/en/portal/servers][a list of themed servers]] to choose from. If you're looking for something else, try a web search for a federated alternative to your favorite sites. Find a server that focuses on your passions and start there! diff --git a/content/blog/2021-01-07-ufw.org b/content/blog/2021-01-07-ufw.org index 78a85a0..9c853a6 100644 --- a/content/blog/2021-01-07-ufw.org +++ b/content/blog/2021-01-07-ufw.org @@ -5,22 +5,21 @@ * Uncomplicated Firewall -Uncomplicated Firewall, also known as ufw, is a convenient and -beginner-friendly way to enforce OS-level firewall rules. For those who -are hosting servers or any device that is accessible to the world (i.e., -by public IP or domain name), it's critical that a firewall is properly -implemented and active. - -Ufw is available by default in all Ubuntu installations after 8.04 LTS. -For other distributions, you can look to install ufw or check if there -are alternative firewalls installed already. There are usually -alternatives available, such as Fedora's =firewall= and the package -available on most distributions: =iptables=. Ufw is considered a -beginner-friendly front-end to iptables. - -[[https://gufw.org][Gufw]] is available as a graphical user interface -(GUI) application for users who are uncomfortable setting up a firewall -through a terminal. +Uncomplicated Firewall (UFW) is a convenient and beginner-friendly +way to enforce operating system (OS)-level firewall rules. For those who are +hosting servers or any device that is accessible to the world (i.e., by public +IP or domain name), it's critical that a firewall is properly implemented and +active. + +UFW is available by default in all Ubuntu installations after 8.04 LTS +(long-term support). For other distributions, you can look to install UFW or +check if there are alternative firewalls installed already. There are usually +alternatives available, such as Fedora's =firewall= and the package available on +most distributions: =iptables=. UFW is considered a beginner-friendly front-end +to iptables. + +[[https://gufw.org][Gufw]] is available as a graphical user interface (GUI) application for users who +are uncomfortable setting up a firewall through a terminal. * Getting Help @@ -33,20 +32,19 @@ sudo ufw --help * Set Default State -The proper way to run a firewall is to set a strict default state and -slowly open up ports that you want to allow. This helps prevent anything -malicious from slipping through the cracks. The following command -prevents all incoming traffic (other than the rules we specify later), -but you can also set this for outgoing connections, if necessary. +The proper way to run a firewall is to set a strict default state and slowly +open up ports that you want to allow. This helps prevent anything malicious from +slipping through the cracks. The following command prevents all incoming traffic +(other than the rules we specify later), but you can also set this for outgoing +connections, if necessary. #+begin_src sh sudo ufw default deny incoming #+end_src -You should also allow outgoing traffic if you want to allow the device -to communicate back to you or other parties. For example, media servers -like Plex need to be able to send out data related to streaming the -media. +You should also allow outgoing traffic if you want to allow the device to +communicate back to you or other parties. For example, media servers like Plex +need to be able to send out data related to streaming the media. #+begin_src sh sudo ufw default allow outgoing @@ -54,23 +52,23 @@ sudo ufw default allow outgoing * Adding Port Rules -Now that we've disabled all incoming traffic by default, we need to open -up some ports (or else no traffic would be able to come in). If you need -to be able to =ssh= into the machine, you'll need to open up port 22. +Now that we've disabled all incoming traffic by default, we need to open up some +ports (or else no traffic would be able to come in). If you need to be able to +=ssh= into the machine, you'll need to open up port 22. #+begin_src sh sudo ufw allow 22 #+end_src -You can also issue more restrictive rules. The following rule will allow -=ssh= connections only from machines on the local subnet. +You can also issue more restrictive rules. The following rule will allow =ssh= +(secure shell protocol) connections only from machines on the local subnet. #+begin_src sh sudo ufw allow proto tcp from 192.168.0.0/24 to any port 22 #+end_src -If you need to set a rule that isn't tcp, just append your connection -type to the end of the rule. +If you need to set a rule that isn't TCP (Transmission Control Protocol) just +append your connection type to the end of the rule. #+begin_src sh sudo ufw allow 1900/udp @@ -93,8 +91,7 @@ sudo reboot now * Checking Status -Now that the firewall is enabled, let's check and see what the rules -look like. +Now that the firewall is enabled, let's check and see what the rules look like. #+begin_src sh sudo ufw status numbered @@ -111,9 +108,9 @@ Status: active * Deleting Rules -If you need to delete a rule, you need to know the number associated -with that rule. Let's delete the first rule in the table above. You'll -be asked to confirm the deletion as part of this process. +If you need to delete a rule, you need to know the number associated with that +rule. Let's delete the first rule in the table above. You'll be asked to confirm +the deletion as part of this process. #+begin_src sh sudo ufw delete 1 @@ -121,11 +118,10 @@ sudo ufw delete 1 * Managing App Rules -Luckily, there's a convenient way for installed applications to create -files that ufw can easily implement so that you don't have to search and -find which ports your application requires. To see if your device has -any applications with pre-installed ufw rules, execute the following -command: +Luckily, there's a convenient way for installed applications to create files +that ufw can easily implement so that you don't have to search and find which +ports your application requires. To see if your device has any applications with +pre-installed UFW rules, execute the following command: #+begin_src sh sudo ufw app list @@ -142,8 +138,8 @@ Available applications: plexmediaserver-dlna #+end_src -If you want to get more information on a specific app rule, use the -=info= command. +If you want to get more information on a specific app rule, use the =info= +command. #+begin_src sh sudo ufw app info plexmediaserver-dlna @@ -161,8 +157,8 @@ Ports: 32469/tcp #+end_src -You can add or delete app rules the same way that you'd add or delete -specific port rules. +You can add or delete app rules the same way that you'd add or delete specific +port rules. #+begin_src sh sudo ufw allow plexmediaserver-dlna @@ -174,12 +170,12 @@ sudo ufw delete RULE|NUM * Creating App Rules -If you'd like to create you own app rule, you'll need to create a file -in the =/etc/ufw/applications.d= directory. Within the file you create, -you need to make sure the content is properly formatted. +If you'd like to create you own app rule, you'll need to create a file in the +=/etc/ufw/applications.d= directory. Within the file you create, you need to +make sure the content is properly formatted. -For example, here are the contents my =plexmediaserver= file, which -creates three distinct app rules for ufw: +For example, here are the contents my =plexmediaserver= file, which creates +three distinct app rules for ufw: #+begin_src config [plexmediaserver] @@ -198,8 +194,8 @@ description=The Plex Media Server (with additional DLNA capability) ports=32400/tcp|3005/tcp|5353/udp|8324/tcp|32410:32414/udp|1900/udp|32469/tcp #+end_src -So, if I wanted to create a custom app rule called "mycustomrule," I'd -create a file and add my content like this: +So, if I wanted to create a custom app rule called "mycustomrule," I'd create a +file and add my content like this: #+begin_src sh sudo nano /etc/ufw/applications.d/mycustomrule diff --git a/content/blog/2021-02-19-macos.org b/content/blog/2021-02-19-macos.org index a6e5cbd..46ac966 100644 --- a/content/blog/2021-02-19-macos.org +++ b/content/blog/2021-02-19-macos.org @@ -5,74 +5,69 @@ * Diving into macOS -After spending nearly 15 years working with Windows and 8 years on -Linux, I have experienced macOS for the first time. By chance, my spouse -happened to buy a new MacBook and gifted me their 2013 model. Of course, -I still consider my Linux desktop to be my daily driver and keep Windows -around for gaming needs, but over the past week I've found myself using -the MacBook more and more for things that don't require gaming specs or -advanced dev tools. +After spending nearly 15 years working with Windows and 8 years on Linux, I have +experienced macOS for the first time. By chance, my spouse happened to buy a new +MacBook and gifted me their 2013 model. Of course, I still consider my Linux +desktop to be my daily driver and keep Windows around for gaming needs, but over +the past week I've found myself using the MacBook more and more for things that +don't require gaming specs or advanced developer tools. * Initial Thoughts -Before I move on to the technical aspects of my set-up, I want to take -some time and express my thoughts on the overall OS. - -As expected, the initial computer setup is a breeze with Mac's guided -GUI installer. - -The desktop itself reminds me of GNOME more than anything else I've -seen: even Pantheon from [[https://elementary.io/][ElementaryOS]], which -people commonly refer to as the closest Linux distro to macOS. The -desktop toolbar is great and far surpasses the utility of the GNOME -toolbar due to the fact that the extensions and icons /actually work/. I -launch macOS and immediately see my shortcuts for Tresorit, Bitwarden, -and Mullvad pop up as the computer loads. - -Even further, the app dock is very useful and will be yet another -familiarity for GNOME users. I know many people like panels instead of -docks, but I've always found docks to have a more pleasing UI. However, -I had to disable the "Show recent applications in Dock" preference; I -can't stand items taking up precious screen space if I'm not currently -using them. On that same note, it's taking me some time to get use to -the fact that I have to manually quit an app or else it will still stay -open/active in the dock, even if I've closed out all windows for that -app (e.g. Firefox). - -Overall, I'm having a lot of fun and for users who spend a large -majority of their time performing basic tasks like web browsing, -writing, watching media, etc., macOS is a fantastic option. - -The rest of this post explains the technicalities of how I set up my CLI -environment to make me feel more at-home, similar to the environments I -set up on Fedora, Ubuntu, etc. +Before I move on to the technical aspects of my set-up, I want to take some time +and express my thoughts on the overall operating system (OS). + +As expected, the initial computer setup is a breeze with Mac's guided graphical +user interface (GUI) installer. + +The desktop itself reminds me of GNOME more than anything else I've seen: even +Pantheon from [[https://elementary.io/][ElementaryOS]], which people commonly refer to as the closest Linux +distro to macOS. The desktop toolbar is great and far surpasses the utility of +the GNOME toolbar due to the fact that the extensions and icons /actually work/. +I launch macOS and immediately see my shortcuts for Tresorit, Bitwarden, and +Mullvad pop up as the computer loads. + +Even further, the app dock is very useful and will be yet another familiarity +for GNOME users. I know many people like panels instead of docks, but I've +always found docks to have a more pleasing UI. However, I had to disable the +"Show recent applications in Dock" preference; I can't stand items taking up +precious screen space if I'm not currently using them. On that same note, it's +taking me some time to get use to the fact that I have to manually quit an app +or else it will still stay open/active in the dock, even if I've closed out all +windows for that app (e.g. Firefox). + +Overall, I'm having a lot of fun and for users who spend a large majority of +their time performing basic tasks like web browsing, writing, watching media, +etc., macOS is a fantastic option. + +The rest of this post explains the technicalities of how I set up my command +line interface (CLI) environment to make me feel more at-home, similar to the +environments I set up on Fedora, Ubuntu, etc. * Making it Feel Like Home -If you're someone who uses Linux primarily, no doubt your first thought -when booting macOS will be the same as mine was: "Where is the terminal -and how do I set up my favorite utilities?" +If you're someone who uses Linux primarily, no doubt your first thought when +booting macOS will be the same as mine was: "Where is the terminal and how do I +set up my favorite utilities?" -Luckily, macOS hasn't completely hidden away the development tools from -the average user. You can easily find the Terminal app in the Launchpad -area, but it's probably not what you're used to. I was surprised (and -happy) to see that the default shell is =zsh=, the shell I use on all of -my Linux distros. However, the commands are not the same - even the ones -you may think are native to the shell. Commands like =dir= do not exist, -so other native commands like =ls -la= or =pwd= are more useful here. +Luckily, macOS hasn't completely hidden away the development tools from the +average user. You can easily find the Terminal app in the Launchpad area, but +it's probably not what you're used to. I was surprised (and happy) to see that +the default shell is =zsh=, the shell I use on all of my Linux distros. However, +the commands are not the same - even the ones you may think are native to the +shell. Commands like =dir= do not exist, so other native commands like =ls -la= +or =pwd= are more useful here. -With only a few minutes of installing and tweaking a few packages, I was -able to recreate a terminal environment that I feel very comfortable -using. See the image below for a preview of the iTerm2 app with a split -view between my macOS desktop shell and an SSH session into my server. +With only a few minutes of installing and tweaking a few packages, I was able to +recreate a terminal environment that I feel very comfortable using. See the +image below for a preview of the iTerm2 app with a split view between my macOS +desktop shell and an SSH (secure shell protocol) session into my server. * Xcode -My first step was to search the web for any hints on how to get =zsh= -back up to the state I like, with extensions, themes, etc. My first step -was to install the CLI tools for -[[https://developer.apple.com/xcode/][Xcode]], Apple's suite of -development tools. +My first step was to search the web for any hints on how to get =zsh= back up to +the state I like, with extensions, themes, etc. My first step was to install the +CLI tools for [[https://developer.apple.com/xcode/][Xcode]], Apple's suite of development tools. #+begin_src sh sudo xcode-select -r @@ -84,25 +79,25 @@ sudo xcode-select --install * Homebrew -Next up is to install [[https://brew.sh][Homebrew]], a nifty package -manager for macOS. +Next up is to install [[https://brew.sh][Homebrew]], a nifty package manager for macOS. #+begin_src sh -/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +/bin/bash -c "$(curl -fsSL +https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" #+end_src I ran into a permission error when installing Homebrew: #+begin_src sh -Error: Failed to link all completions, docs and manpages: - Permission denied @ rb_file_s_symlink - (../../../Homebrew/completions/zsh/_brew, /usr/local/share/zsh/site-functions/_brew) -Failed during: /usr/local/bin/brew update --force --quiet +Error: Failed to link all completions, docs and manpages: Permission denied @ + rb_file_s_symlink - (../../../Homebrew/completions/zsh/_brew, + /usr/local/share/zsh/site-functions/_brew) Failed during: + /usr/local/bin/brew update --force --quiet #+end_src -I found that the following permission modification worked like a charm. -However, I noted that some users online discussed the fact that this -solution may not work if your system has multiple users who use -Homebrew. +I found that the following permission modification worked like a charm. However, +I noted that some users online discussed the fact that this solution may not +work if your system has multiple users who use Homebrew. #+begin_src sh sudo chown -R $(whoami) $(brew --prefix)/* @@ -120,16 +115,16 @@ brew cleanup * iTerm2 -Now that I've installed the basic utilities for development, I moved -onto installing iTerm2, a much better terminal than the default. +Now that I've installed the basic utilities for development, I moved onto +installing iTerm2, a much better terminal than the default. #+begin_src sh brew install --cask iterm2 #+end_src -I also used the =Make iTerm2 Default Term= and -=Install Shell Integration= options in the iTerm2 application menu to -make sure I don't run into any issues later on with different terminals. +I also used the =Make iTerm2 Default Term= and =Install Shell Integration= +options in the iTerm2 application menu to make sure I don't run into any issues +later on with different terminals. We will also install =zsh= so we can use it in iTerm2. @@ -139,54 +134,50 @@ brew install zsh * Oh-My-Zsh -I've shown the great aspects of [[https://ohmyz.sh][Oh My Zsh]] in other -blog posts, so I'll skip over that speech for now. Simply install it and -run an update. +I've shown the great aspects of [[https://ohmyz.sh][Oh My Zsh]] in other blog posts, so I'll skip over +that speech for now. Simply install it and run an update. #+begin_src sh -sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" +sh -c "$(curl -fsSL +https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" #+end_src #+begin_src sh omz update #+end_src -Finally, restart the iTerm2 application to ensure all changes go into -effect. +Finally, restart the iTerm2 application to ensure all changes go into effect. * Oh-My-Zsh Themes -Let's change the theme of the terminal to make it a little more -friendly. +Let's change the theme of the terminal to make it a little more friendly. #+begin_src sh open ~/.zshrc #+end_src -The third section of this file should contain a line like the code -below. Change that theme to -[[https://github.com/ohmyzsh/ohmyzsh/wiki/Themes][any theme you want]], -save the file, and exit. +The third section of this file should contain a line like the code below. Change +that theme to [[https://github.com/ohmyzsh/ohmyzsh/wiki/Themes][any theme you want]], save the file, and exit. #+begin_src sh ZSH_THEME="af-magic" #+end_src -After changing the =.zshrc= file, you'll need to close your terminal and -re-open it to see the changes. Optionally, just open a new tab if you're -using iTerm2, and you'll see the new shell config. +After changing the =.zshrc= file, you'll need to close your terminal and re-open +it to see the changes. Optionally, just open a new tab if you're using iTerm2, +and you'll see the new shell config. * Oh-My-Zsh Plugins Of course, my customization of =zsh= would not be complete without -[[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]]. -This will bring up commands you've run in the past as you type them. For -example, if you've run =ssh user@192.168.1.99= before, the terminal will -show this command as soon as you start typing it (e.g. =zsh u=), and you -can hit the right arrow to autocomplete the command. +[[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]]. This will bring up commands you've run in the past as you +type them. For example, if you've run =ssh user@192.168.1.99= before, the +terminal will show this command as soon as you start typing it (e.g. =zsh u=), +and you can hit the right arrow to autocomplete the command. #+begin_src sh -git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions +git clone https://github.com/zsh-users/zsh-autosuggestions +${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions #+end_src #+begin_src sh @@ -198,6 +189,6 @@ open ~/.zshrc plugins=(git zsh-autosuggestions) #+end_src -Remember: After changing the =.zshrc= file, you'll need to close your -terminal and re-open it to see the changes. Optionally, just open a new -tab if you're using iTerm2, and you'll see the new shell config. \ No newline at end of file +Remember: After changing the =.zshrc= file, you'll need to close your terminal +and re-open it to see the changes. Optionally, just open a new tab if you're +using iTerm2, and you'll see the new shell config. diff --git a/content/blog/2021-03-19-clone-github-repos.org b/content/blog/2021-03-19-clone-github-repos.org index 02b290f..399e4bc 100644 --- a/content/blog/2021-03-19-clone-github-repos.org +++ b/content/blog/2021-03-19-clone-github-repos.org @@ -5,14 +5,14 @@ * Cloning from GitHub -If you're like me and use a lot of different devices (and sometimes -decide to just wipe your device and start with a new OS), you probably -know the pain of cloning all your old code repositories down to your -local file system. +If you're like me and use a lot of different devices [and sometimes decide to +just wipe your device and start with a new operating system (OS)], you probably know +the pain of cloning all your old code repositories down to your local file +system. -If you're using GitHub, you can easily clone all of your code back down -in just seconds. First, create a bash script. I do so by opening a new -file in =nano=, but you can use =gedit=, =vim=, or something else: +If you're using GitHub, you can easily clone all of your code back down in just +seconds. First, create a bash script. I do so by opening a new file in =nano=, +but you can use =gedit=, =vim=, or something else: #+begin_src sh nano clone_github_repos.sh @@ -44,12 +44,12 @@ Now you can run the script and should see the cloning process begin. * Cloning from Sourcehut -I haven't fully figured out how to directly incorporate Sourcehut's -GraphQL API into a bash script yet, so this one will take two steps. +I haven't fully figured out how to directly incorporate Sourcehut's GraphQL +application programming interface (API) into a bash script yet, so this one will +take two steps. -First, log-in to Sourcehut and go to their -[[https://git.sr.ht/graphql][GraphQL playground for Git]]. Next, paste -the following query into the left box: +First, log-in to Sourcehut and go to their [[https://git.sr.ht/graphql][GraphQL playground for Git]]. Next, +paste the following query into the left box: #+begin_src sh query { @@ -65,10 +65,10 @@ query { } #+end_src -The output on the right side will give you an object of all your -repositories. Just grab that text and remove all the characters such as -quotation marks and curly brackets. You will need a single-line list of -space-separated values for the next step. +The output on the right side will give you an object of all your repositories. +Just grab that text and remove all the characters such as quotation marks and +curly brackets. You will need a single-line list of space-separated values for +the next step. Now let's create the bash script: @@ -76,12 +76,12 @@ Now let's create the bash script: nano clone_sourcehut_repos.sh #+end_src -Next, paste the following bash script in with the list of repositories -you obtained above and replace =your-username= with your username. +Next, paste the following bash script in with the list of repositories you +obtained above and replace =your-username= with your username. -Note that this uses the SSH-based Git cloning method -(e.g. =git@git...=), so you'll need to ensure you have set up Sourcehut -with your SSH key. +Note that this uses the secure shell protocol (SSH)-based Git cloning method +(e.g. =git@git...=), so you'll need to ensure you have set up Sourcehut with +your SSH key. #+begin_src sh repos=(repo1 repo2 repo3) @@ -108,17 +108,17 @@ Now you can run the script and should see the cloning process begin. * Moving Repositories to a New Host -Now that you have all of your code repositories cloned to your local -computer, you may want to change the remote host (e.g., moving from -GitHub to GitLab). To do this, let's create another bash script: +Now that you have all of your code repositories cloned to your local computer, +you may want to change the remote host (e.g., moving from GitHub to GitLab). To +do this, let's create another bash script: #+begin_src sh nano change_remote_urls.sh #+end_src -Past the following information and be sure to change the URL information -to whichever host you are moving to. For this example, I am looping -through all of my cloned GitHub directories and changing them to +Past the following information and be sure to change the URL (uniform resource +locator) information to whichever host you are moving to. For this example, I am +looping through all of my cloned GitHub directories and changing them to Sourcehut (e.g. == -> =git@git.sr.ht:~myusername=). #+begin_src sh diff --git a/content/blog/2021-03-28-gemini-capsule.org b/content/blog/2021-03-28-gemini-capsule.org index 954e2bc..2bd98d1 100644 --- a/content/blog/2021-03-28-gemini-capsule.org +++ b/content/blog/2021-03-28-gemini-capsule.org @@ -5,21 +5,17 @@ * What is Gemini? -[[https://gemini.circumlunar.space/][Gemini]] is an internet protocol -introduced in June 2019 as an alternative to HTTP(S) or Gopher. In -layman's terms, it's an alternative way to browse sites (called -capsules) that requires a special browser. Since Gemini is not -standardized as an internet standard, normal web browsers won't be able -to load a Gemini capsule. Instead, you'll need to use -[[https://gemini.circumlunar.space/clients.html][a Gemini-specific -browser]]. - -The content found within a Gemini page is called -[[https://gemini.circumlunar.space/docs/cheatsheet.gmi][Gemtext]] and is -/extremely/ basic (on purpose). Gemini only processes the text, no media -content like images. However, you're able to style 3 levels of headings, -regular text, links (which will display on their own line), quotes, and -an unordered list. +[[https://gemini.circumlunar.space/][Gemini]] is an internet protocol introduced in June 2019 as an alternative to the +Hypertext Transfer Protocol (HTTP) or Gopher. In layman's terms, it's an +alternative way to browse sites (called capsules) that requires a special +browser. Since Gemini is not standardized as an internet standard, normal web +browsers won't be able to load a Gemini capsule. Instead, you'll need to use [[https://gemini.circumlunar.space/clients.html][a +Gemini-specific browser]]. + +The content found within a Gemini page is called [[https://gemini.circumlunar.space/docs/cheatsheet.gmi][Gemtext]] and is /extremely/ +basic (on purpose). Gemini only processes the text, no media content like +images. However, you're able to style 3 levels of headings, regular text, links +(which will display on their own line), quotes, and an unordered list. Here's a complete listing of valid Gemtext: @@ -44,78 +40,72 @@ My List: *** Free Option -There are probably numerous websites that allow you to create your -personal Gemini capsule, but I'm going to focus on the two sites that I -have personally tested. The first option below, Midnight Pub, allows you -to create/edit any Gemini files you want in your account. This is -essentially a GUI option with a built-in text box for editing. The -second option below, Sourcehut, allows you to use a Git repository and -automatic build process to deploy your personal Gemini capsule every -time you push a commit. +There are probably numerous websites that allow you to create your personal +Gemini capsule, but I'm going to focus on the two sites that I have personally +tested. The first option below, Midnight Pub, allows you to create/edit any +Gemini files you want in your account. This is essentially a graphical option +with a built-in text box for editing. The second option below, Sourcehut, allows +you to use a Git repository and automatic build process to deploy your personal +Gemini capsule every time you push a commit. ** Midnight Pub - Beginner Friendly -[[https://midnight.pub/][Midnight Pub]] is a small, virtual community -meant to reflect the atmosphere of wandering into a small alley pub. The -site is built in Gemtext and has a server-side process to convert -Gemtext to HTML if someone loads the site in an HTTP(S) browser. +[[https://midnight.pub/][Midnight Pub]] is a small, virtual community meant to reflect the atmosphere of +wandering into a small alley pub. The site is built in Gemtext and has a +server-side process to convert Gemtext to HTML if someone loads the site in an +HTTP(S) browser. -To create an account, you'll need to email the owner of the website to -obtain a key. You can find their email on the Midnight Pub homepage. -Once registered, head to [[https://midnight.pub/account][your account]] -and select [[https://midnight.pub/site][manage site]]. This is the -screen where you can upload or create any files to be displayed on the -internet. +To create an account, you'll need to email the owner of the website to obtain a +key. You can find their email on the Midnight Pub homepage. Once registered, +head to [[https://midnight.pub/account][your account]] and select [[https://midnight.pub/site][manage site]]. This is the screen where you can +upload or create any files to be displayed on the internet. -For example, I've created both an HTML file and a Gemini file. Remember -that Gemini is automatically converted to HTML on the Pub, so you don't -need an HTML version. For example, I created an HTML version to add in -some extra styling. +For example, I've created both a Hypertext Markup Language (HTML) file and a +Gemini file. Remember that Gemini is automatically converted to HTML on the Pub, +so you don't need an HTML version. For example, I created an HTML version to add +in some extra styling. -All you need to do is create a page like =index.gmi= and use your Gemini -browser to head over to your-username.midnight.pub to see the result. +All you need to do is create a page like =index.gmi= and use your Gemini browser +to head over to your-username.midnight.pub to see the result. -That's all there is to it! Easy enough, right? Let's check out a more -advanced version in the next section. +That's all there is to it! Easy enough, right? Let's check out a more advanced +version in the next section. * Paid Option -As of 2021, Sourcehut has decided to require users to have a paid -account in order to utilize their automated build system. For now, paid -accounts can be as low as $2/month. +As of 2021, Sourcehut has decided to require users to have a paid account in +order to utilize their automated build system. For now, paid accounts can be as +low as $2/month. ** Sourcehut -[[https://sourcehut.org/][Sourcehut]] is a collection of software -development tools, but mostly surrounds their hosted Git repository -service. Simply put, it's a minimal and more private alternative to -services like GitHub. +[[https://sourcehut.org/][Sourcehut]] is a collection of software development tools, but mostly surrounds +their hosted Git repository service. Simply put, it's a minimal and more private +alternative to services like GitHub. -This walkthrough is more advanced and involves things like Git, SSH, the -command line. If you don't think you know enough to do this, check out -my walkthrough on creating a Gemini capsule for the Midnight Pub -instead. +This walkthrough is more advanced and involves things like Git, SSH, the command +line. If you don't think you know enough to do this, check out my walkthrough on +creating a Gemini capsule for the Midnight Pub instead. -The first thing you'll need to do is create an SSH key pair, if you -don't already have one on your system. Once created, grab the contents -of =id_rsa.pub= and add it to your Sourcehut account settings - this -will allow you to push and pull code changes without using a -username/password. +The first thing you'll need to do is create an SSH key pair, if you don't +already have one on your system. Once created, grab the contents of =id_rsa.pub= +and add it to your Sourcehut account settings - this will allow you to push and +pull code changes without using a username/password. #+begin_src sh ssh keygen #+end_src -Next up, let's create a repository with the proper name so that the -Sourcehut build system will know we want them to host a website for us. -Use the following format exactly: +Next up, let's create a repository with the proper name so that the Sourcehut +build system will know we want them to host a website for us. Use the following +format exactly: #+begin_src sh mkdir your-username.srht.site && cd your-username.srht.site #+end_src -Now that we've created the repo, let's initialize Git and add the proper -remote URL. +Now that we've created the repo, let's initialize Git and add the proper remote +URL. #+begin_src sh git init @@ -125,14 +115,14 @@ git init git remote add origin git@git.sr.ht:~your-username/your-username.srht.site #+end_src -Now that our repository is set up and configured, we will need to create -at least two files: +Now that our repository is set up and configured, we will need to create at +least two files: - =index.gmi= - =.build.yml= -For your =.build.yml= file, use the following content and be sure to -update the =site= line with your username! +For your =.build.yml= file, use the following content and be sure to update the +=site= line with your username! #+begin_src yaml image: alpine/latest @@ -147,11 +137,11 @@ tasks: acurl -f https://pages.sr.ht/publish/$site -Fcontent=@site.tar.gz -Fprotocol=GEMINI #+end_src -For the =index.gmi= file, put whatever you want in there and save it. -You could even just copy and paste the Gemtext cheatsheet. +For the =index.gmi= file, put whatever you want in there and save it. You could +even just copy and paste the Gemtext cheatsheet. -If you want to serve both HTML and Gemini files from this repository, -just add a second command to the =upload= section: +If you want to serve both HTML and Gemini files from this repository, just add a +second command to the =upload= section: #+begin_src yaml - upload: | @@ -165,9 +155,9 @@ Lastly, commit your changes and push them to the remote repo. git add .; git commit -m "initial commit"; git push --set-upstream origin HEAD #+end_src -If you've successfully created the files with the proper format, you'll -see the terminal print a message that lets you know where the automatic -build is taking place. For example, here's what the terminal tells me: +If you've successfully created the files with the proper format, you'll see the +terminal print a message that lets you know where the automatic build is taking +place. For example, here's what the terminal tells me: #+begin_src sh remote: Build started: diff --git a/content/blog/2021-03-28-vaporwave-vs-outrun.org b/content/blog/2021-03-28-vaporwave-vs-outrun.org index ef7f892..61074a7 100644 --- a/content/blog/2021-03-28-vaporwave-vs-outrun.org +++ b/content/blog/2021-03-28-vaporwave-vs-outrun.org @@ -5,15 +5,14 @@ * Overview -When it comes to an aesthetic that originated primarily online, there -tends to be a lot of confusion around what falls into each specific -genre. This post discusses Vaporwave and Outrun, which have become -almost synonymous in the minds of those online who aren't hardcore into -these genres of media. More specifically, Outrun is largely an unknown -term while all aesthetics in these two genres are usually attributed to -Vaporwave. For example, take a look at the image search results for -Vaporwave: the results include *a lot* of Outrun-themed images. You'll -find a similar trend almost everywhere. +When it comes to an aesthetic that originated primarily online, there tends to +be a lot of confusion around what falls into each specific genre. This post +discusses Vaporwave and Outrun, which have become almost synonymous in the minds +of those online who aren't hardcore into these genres of media. More +specifically, Outrun is largely an unknown term while all aesthetics in these +two genres are usually attributed to Vaporwave. For example, take a look at the +image search results for Vaporwave: the results include *a lot* of Outrun-themed +images. You'll find a similar trend almost everywhere. #+caption: Vaporwave Search Results [[https://img.cleberg.net/blog/20210328-vaporwave-vs-outrun/vaporwave-search-results.webp]] @@ -23,102 +22,91 @@ find a similar trend almost everywhere. #+caption: Macintosh Plus Album Cover [[https://img.cleberg.net/blog/20210328-vaporwave-vs-outrun/macintosh-plus.webp]] -Okay, so what is Vaporwave? I'm going to just copy-and-paste some -general info from the Wikipedia article on -[[https://en.wikipedia.org/wiki/Vaporwave][Vaporwave]], so that I'm not -repeating everything you can already search for online: +Okay, so what is Vaporwave? I'm going to just copy-and-paste some general info +from the Wikipedia article on [[https://en.wikipedia.org/wiki/Vaporwave][Vaporwave]], so that I'm not repeating everything +you can already search for online: #+begin_quote -Vaporwave is a microgenre of electronic music, a visual art style, and -an Internet meme that emerged in the early 2010s. It is defined partly -by its slowed-down, chopped and screwed samples of smooth jazz, -elevator, R&B, and lounge music from the 1980s and 1990s. The -surrounding subculture is sometimes associated with an ambiguous or -satirical take on consumer capitalism and pop culture, and tends to be -characterized by a nostalgic or surrealist engagement with the popular -entertainment, technology and advertising of previous decades. Visually, -it incorporates early Internet imagery, late 1990s web design, glitch -art, anime, 3D-rendered objects, and cyberpunk tropes in its cover -artwork and music videos. +Vaporwave is a microgenre of electronic music, a visual art style, and an +Internet meme that emerged in the early 2010s. It is defined partly by its +slowed-down, chopped and screwed samples of smooth jazz, elevator, R&B, and +lounge music from the 1980s and 1990s. The surrounding subculture is sometimes +associated with an ambiguous or satirical take on consumer capitalism and pop +culture, and tends to be characterized by a nostalgic or surrealist engagement +with the popular entertainment, technology and advertising of previous decades. +Visually, it incorporates early Internet imagery, late 1990s web design, glitch +art, anime, 3D-rendered objects, and cyberpunk tropes in its cover artwork and +music videos. #+end_quote -This is an excellent summary, and it helps address my point here: there -are specific aspects that make Vaporwave unique: +This is an excellent summary, and it helps address my point here: there are +specific aspects that make Vaporwave unique: ** Time Frame -The time frame for references, logos, etc. focuses mostly on the 1990s -in Vaporwave. You'll see old school Pepsi logos, Microsoft 95 screens, -tropical plants, classic marble sculptures, and many references from -Japan's influence in the 90s. +The time frame for references, logos, etc. focuses mostly on the 1990s in +Vaporwave. You'll see old school Pepsi logos, Microsoft 95 screens, tropical +plants, classic marble sculptures, and many references from Japan's influence in +the 90s. ** Art -The color scheme is generally a soft, light palette that uses pastel -colors. The backdrop will often be in a light-pink or teal blue. +The color scheme is generally a soft, light palette that uses pastel colors. The +backdrop will often be in a light-pink or teal blue. ** Music -The musical genre of Vaporwave incorporates soft tunes, lounge music, -and sound effects that will make the listener reminisce of the 90s. The -sounds of the genre are generally slower-paced and calming. The major -breakthrough artist for Vaporwave was -[[https://en.wikipedia.org/wiki/Vektroid][Macintosh Plus]], who released -the album -[[https://archive.org/details/MACINTOSHPLUS-FLORALSHOPPE_complete][Floral -Shoppe]] in 2011. Another more recent example is the artist -[[https://sadbert.bandcamp.com/][sadbert]], whose latest album -incorporates the upbeat tones of the 1999 Dilbert TV series. - -Notice that Vaporwave doesn't include things like racing cars, -futuristic technology, chrome, or the deep orange/purple color scheme. -Vaporwave is a focus on the idyllic state of the world when technology -was becoming common in households, a reality that we have already -experienced. Focus on the most aesthetically-pleasing parts of that past -is a large part of Vaporwave. +The musical genre of Vaporwave incorporates soft tunes, lounge music, and sound +effects that will make the listener reminisce of the 90s. The sounds of the +genre are generally slower-paced and calming. The major breakthrough artist for +Vaporwave was [[https://en.wikipedia.org/wiki/Vektroid][Macintosh Plus]], who released the album [[https://archive.org/details/MACINTOSHPLUS-FLORALSHOPPE_complete][Floral Shoppe]] in 2011. +Another more recent example is the artist [[https://sadbert.bandcamp.com/][sadbert]], whose latest album +incorporates the upbeat tones of the 1999 Dilbert television series. + +Notice that Vaporwave doesn't include things like racing cars, futuristic +technology, chrome, or the deep orange/purple color scheme. Vaporwave is a focus +on the idyllic state of the world when technology was becoming common in +households, a reality that we have already experienced. Focus on the most +aesthetically-pleasing parts of that past is a large part of Vaporwave. * Outrun #+caption: Outrun [[https://img.cleberg.net/blog/20210328-vaporwave-vs-outrun/outrun.webp]] -Now, let's get to Outrun. This one is a little trickier since the genre -has largely been lumped under the Vaporwave title for so long. However, -it stems from the [[https://en.wikipedia.org/wiki/Synthwave][Synthwave]] -music genre and is likely named after the 1986 racer game, +Now, let's get to Outrun. This one is a little trickier since the genre has +largely been lumped under the Vaporwave title for so long. However, it stems +from the [[https://en.wikipedia.org/wiki/Synthwave][Synthwave]] music genre and is likely named after the 1986 racer game, [[https://en.wikipedia.org/wiki/Out_Run][Out Run]]. ** Time Frame -Outrun can be thought of as a retro-futuristic aesthetic born from the -1980s. +Outrun can be thought of as a retro-futuristic aesthetic born from the 1980s. ** Art -The color scheme uses a very dark color palette with the main colors -being deep oranges, blues, and purples. Red edges are common around -objects in Outrun art. The background of the Outrun aesthetic is almost -always a neon grid like you'd expect to see in Tron or a 1980s arcade -machine. +The color scheme uses a very dark color palette with the main colors being deep +oranges, blues, and purples. Red edges are common around objects in Outrun art. +The background of the Outrun aesthetic is almost always a neon grid like you'd +expect to see in Tron or a 1980s arcade machine. -Classic sports cars, chrome robots, computer generated graphics and -fonts, and the occasional use of rain or palm trees can be found in -Outrun art. +Classic sports cars, chrome robots, computer generated graphics and fonts, and +the occasional use of rain or palm trees can be found in Outrun art. ** Music -This aesthetic has a more aggressive and fast-paced style of music, -which tends to match the subject of the art in this aesthetic. +This aesthetic has a more aggressive and fast-paced style of music, which tends +to match the subject of the art in this aesthetic. -Outrun enthusiasts love what people in the 1980s thought the future -would look like. Take a look at a common video game discussed in Outrun -circles, Far Cry 3: Blood Dragon: +Outrun enthusiasts love what people in the 1980s thought the future would look +like. Take a look at a common video game discussed in Outrun circles, Far Cry 3: +Blood Dragon: #+caption: Fry Cry 3: Blood Dragon [[https://img.cleberg.net/blog/20210328-vaporwave-vs-outrun/far-cry.webp]] -Another example that doesn't force the color scheme as hard as some -online art does is Kung Fury: +Another example that doesn't force the color scheme as hard as some online art +does is Kung Fury: #+caption: Kung Fury [[https://img.cleberg.net/blog/20210328-vaporwave-vs-outrun/kung-fury.webp]] @@ -128,7 +116,7 @@ online art does is Kung Fury: * Conclusion -While Vaporwave and Outrun share similarities, they are two distinct -aesthetics with many important distinctions. Someone who enjoys one may -not necessarily enjoy the other, so it's important to make sure we -properly describe the aesthetic we're looking for. +While Vaporwave and Outrun share similarities, they are two distinct aesthetics +with many important distinctions. Someone who enjoys one may not necessarily +enjoy the other, so it's important to make sure we properly describe the +aesthetic we're looking for. diff --git a/content/blog/2021-03-30-vps-web-server.org b/content/blog/2021-03-30-vps-web-server.org index b27572e..0b38eaa 100644 --- a/content/blog/2021-03-30-vps-web-server.org +++ b/content/blog/2021-03-30-vps-web-server.org @@ -3,108 +3,93 @@ #+description: Instructional outline for setting up and maintaining a VPS environment configured for secure and scalable web hosting applications. #+slug: vps-web-server -* Shared Hosting vs. VPS - -Choosing a place to host a website is one of the most confusing -decisions for beginner web developers. Even for experienced web devs, -choosing between different forms of web hosting can be a daunting -choice. - -First, let's take a look at -[[https://en.wikipedia.org/wiki/Shared_web_hosting_service][shared web -hosting]]. Shared web hosting is a product where you are purchasing a -small piece of a web server that is being shared between many websites. -As a result, the cost of shared hosting is extremely low. You won't have -access to the server itself, which means you can't install your own -software on the server, such as Docker. Usually, you are simply allowed -to connect your domains to the server, set up domain security, and other -small utilities. - -In contrast, a -[[https://en.wikipedia.org/wiki/Virtual_private_server][virtual private -server]] (VPS) is a virtual machine that replicates the environment of -having a dedicated server to yourself. You are able to control the -virtual server's host names, base file system, package manager, etc. -Another great upside of a VPS is that since it's virtual, the company -providing the VPS can dynamically increase the disk size, RAM size, or -number of CPUs at any time. However, the virtual server is still -physically located on a server that is shared between multiple virtual -servers. - -The choice between shared hosting and VPS mostly depends on your skill -level with system administration. If you're comforting working on a -server that is mostly left up to you (or you're willing to learn), then -a VPS is usually a better option. However, shared hosting is a fantastic -option for people who don't want to have to learn how to manage their -server. +* Shared Hosting vs. VPS (Virtual Private Server) + +Choosing a place to host a website is one of the most confusing decisions for +beginner web developers. Even for experienced web devs, choosing between +different forms of web hosting can be a daunting choice. + +First, let's take a look at [[https://en.wikipedia.org/wiki/Shared_web_hosting_service][shared web hosting]]. Shared web hosting is a product +where you are purchasing a small piece of a web server that is being shared +between many websites. As a result, the cost of shared hosting is extremely low. +You won't have access to the server itself, which means you can't install your +own software on the server, such as Docker. Usually, you are simply allowed to +connect your domains to the server, set up domain security, and other small +utilities. + +In contrast, a [[https://en.wikipedia.org/wiki/Virtual_private_server][virtual private server]] (VPS) is a virtual machine that replicates +the environment of having a dedicated server to yourself. You are able to +control the virtual server's host names, base file system, package manager, etc. +Another great upside of a VPS is that since it's virtual, the company providing +the VPS can dynamically increase the disk size, RAM size, or number of CPUs at +any time. However, the virtual server is still physically located on a server +that is shared between multiple virtual servers. + +The choice between shared hosting and VPS mostly depends on your skill level +with system administration. If you're comforting working on a server that is +mostly left up to you (or you're willing to learn), then a VPS is usually a +better option. However, shared hosting is a fantastic option for people who +don't want to have to learn how to manage their server. * My Situation -I had used shared hosting for approximately 5 years before trying my -first VPS. I manage a homelab and have had success running a server and -performing typical sysadmin duties, but I was still hesitant to get a -VPS. One fear was that I always struggled to properly set up the -networking part of a server - DNS and hostname configurations were not -my friend. - -As a little bit of background, I originally used -[[https://www.siteground.com][Siteground]] for my initially shared -hosting and stayed on that platform for at least a year. However, the UI -was clunky, and I didn't like how they handled certain technical -aspects, so I switched to [[https://www.namecheap.com][Namecheap]]. -Namecheap was great because it is the service I primarily use for -purchasing domain names, which made it incredibly easy to link them to -my hosting service. However, it was still mediocre shared hosting, and -Namecheap is notorious for not letting you use -[[https://letsencrypt.org][Let's Encrypt]] to obtain free SSL/TLS -certificates; Namecheap wants to make you purchase certificates through -their store. - -Finally, I settled down with [[https://www.iwebfusion.net][iWebFusion]] -for about the last year of my shared hosting. This service was pretty -great, came with free SSL/TLS, and I never had any complaints. - -However, I finally grew tired of not being able to install software on -my own web server. I wanted to be able to try out things like -[[https://postmill.xyz][Postmill]] or [[https://matrix.org][Matrix]]. -This is possible with a VPS, so I decided to grab a new domain name to -try it out. +I had used shared hosting for approximately 5 years before trying my first VPS. +I manage a homelab and have had success running a server and performing typical +sysadmin duties, but I was still hesitant to get a VPS. One fear was that I +always struggled to properly set up the networking part of a server - DNS and +hostname configurations were not my friend. + +As a little bit of background, I originally used [[https://www.siteground.com][Siteground]] for my initially +shared hosting and stayed on that platform for at least a year. However, the +user interface (UI) was clunky, and I didn't like how they handled certain +technical aspects, so I switched to [[https://www.namecheap.com][Namecheap]]. Namecheap was great because it is +the service I primarily use for purchasing domain names, which made it +incredibly easy to link them to my hosting service. However, it was still +mediocre shared hosting, and Namecheap is notorious for not letting you use +[[https://letsencrypt.org][Let's Encrypt]] to obtain free SSL (Secure Socket Layer)/TLS (Transport Layer +Security) certificates; Namecheap wants to make you purchase certificates +through their store. + +Finally, I settled down with [[https://www.iwebfusion.net][iWebFusion]] for about the last year of my shared +hosting. This service was pretty great, came with free SSL/TLS, and I never had +any complaints. + +However, I finally grew tired of not being able to install software on my own +web server. I wanted to be able to try out things like [[https://postmill.xyz][Postmill]] or [[https://matrix.org][Matrix]]. This +is possible with a VPS, so I decided to grab a new domain name to try it out. * Getting Started: Buying a VPS -The first step to moving over to a VPS is (you guessed it): finding a -VPS provider. For my VPSs, I use [[https://1984hosting.com][1984]] and -prefer their services much more than any alternative, due to their -location (Iceland), their [[https://1984hosting.com/GDPR/][privacy -policy]], their respect for GDPR, and the ability to remain anonymous if -you pay in Bitcoin or Monero. +The first step to moving over to a VPS is (you guessed it): finding a VPS +provider. For my VPSs, I use [[https://1984hosting.com][1984]] and prefer their services much more than any +alternative, due to their location (Iceland), their [[https://1984hosting.com/GDPR/][privacy policy]], their +respect for GDPR, and the ability to remain anonymous if you pay in Bitcoin or +Monero. -[[https://njal.la][Njalla]] is another good, privacy-oriented option for -VPS services. +[[https://njal.la][Njalla]] is another good, privacy-oriented option for VPS services. -You'll have to decide what specifications you want on your VPS. For me, -I only build and deploy low-resource HTML, PHP, and Python websites. -This means I can survive on the smallest VPS: 1 CPU, 1GB of RAM, and -25GB SSD for $5.00 per month. +You'll have to decide what specifications you want on your VPS. For me, I only +build and deploy low-resource HTML, PHP, and Python websites. This means I can +survive on the smallest VPS: 1 CPU, 1GB of RAM, and 25GB SSD for $5.00 per +month. -As noted above, the great thing about a VPS is you can request your -provider to increase the resources at any time. +As noted above, the great thing about a VPS is you can request your provider to +increase the resources at any time. * Configuring DNS Settings -Okay, so now let's get into some actual work that has to be done to get -content moved from a shared host to a VPS. At this point, I'm assuming -you have a shared host with website content that you can still access, -and you've purchased a new VPS and can SSH into that server. +Okay, so now let's get into some actual work that has to be done to get content +moved from a shared host to a VPS. At this point, I'm assuming you have a shared +host with website content that you can still access, and you've purchased a new +VPS and can SSH into that server. -The first change is minor, but it should be done immediately in order to -get things moving: DNS settings. Go to wherever your DNS settings are -handled. If your shared host also managed your DNS settings, you'll need -to first move that DNS over to your new VPS provider. For me, I route my -DNS through [[https://www.gandi.net][Gandi]]. +The first change is minor, but it should be done immediately in order to get +things moving: DNS settings. Go to wherever your DNS settings are handled. If +your shared host also managed your DNS settings, you'll need to first move that +DNS over to your new VPS provider. For me, I route my DNS through [[https://www.gandi.net][Gandi]]. -Once you know where your DNS settings are, go ahead and update the =A= -records to match the public IP address of your VPS. For example: +Once you know where your DNS settings are, go ahead and update the =A= records +to match the public IP address of your VPS. For example: #+begin_src txt A example.com xxx.xxx.xxx.xxx @@ -112,36 +97,35 @@ A subdomain xxx.xxx.xxx.xxx CNAME www example.com. #+end_src -If you have any other records that require updates, such as MX or TXT -records for a mail server, be sure to update those accordingly. -Personally, I don't host my own mail server. I route all mail on my -custom domains to [[https://www.migadu.com][Migadu]]. Hosting your own -email server can become complex quickly and is not for beginners. +If you have any other records that require updates, such as MX or TXT records +for a mail server, be sure to update those accordingly. Personally, I don't host +my own mail server. I route all mail on my custom domains to [[https://www.migadu.com][Migadu]]. Hosting +your own email server can become complex quickly and is not for beginners. -DNS changes can take up to 48 hours to propagate, so be sure to give it -some time before assuming you've made an error. +DNS changes can take up to 48 hours to propagate, so be sure to give it some +time before assuming you've made an error. * Server Updates and Packages -Now that the DNS settings have been changed, let's set up our server -while we wait for the DNS to propagate. First up is to ssh into your -server. If you've signed up with a service like DigitalOcean, you can -add your SSH key to your account and to your VPS droplet so that you -don't need a password in order to SSH. +Now that the DNS settings have been changed, let's set up our server while we +wait for the DNS to propagate. First up is to ssh into your server. If you've +signed up with a service like DigitalOcean, you can add your SSH key to your +account and to your VPS droplet so that you don't need a password in order to +SSH. #+begin_src sh ssh root@xxx.xxx.xxx.xxx #+end_src -The VPS that is used in this blog post runs Ubuntu 20.04 with an Apache -web server. If you're working on a different operating system (OS) or -want a different web server, such as Nginx, you'll have to use different -commands to set it up. +The VPS that is used in this blog post runs Ubuntu 20.04 with an Apache web +server. If you're working on a different operating system (OS) or want a +different web server, such as Nginx, you'll have to use different commands to +set it up. First, let's update and upgrade our server. -*NOTE:* Since we have logged in to the server as =root= for now, we -don't need to use the =sudo= modifier before our commands. +*NOTE:* Since we have logged in to the server as =root= for now, we don't need +to use the =sudo= modifier before our commands. #+begin_src sh apt update && apt upgrade -y @@ -149,11 +133,11 @@ apt update && apt upgrade -y * Create A User Account -While being able to use =root= can be beneficial at times, you shouldn't -use =root= unless you have to. +While being able to use =root= can be beneficial at times, you shouldn't use +=root= unless you have to. -So let's set up a new user in our system. The =-m= option below tells -the OS to create a home directory for the new user. +So let's set up a new user in our system. The =-m= option below tells the OS to +create a home directory for the new user. #+begin_src sh adduser USERNAME @@ -165,40 +149,40 @@ Now, create a password for that user. passwd USERNAME #+end_src -Finally, add the user to the sudoers file, so they can perform -priveleged commands. +Finally, add the user to the sudoers file, so they can perform privileged +commands. #+begin_src sh usermod -a -G sudo USERNAME #+end_src -If you are using SSH keys and not passwords, you'll need to copy your -SSH key from your local machine to the VPS. If you haven't disabled -password-based SSH yet, the easiest way to do this is =ssh-copy-id= from -your local computer (not from the VPS): +If you are using SSH (secure shell protocol) keys and not passwords, you'll need +to copy your SSH key from your local machine to the VPS. If you haven't disabled +password-based SSH yet, the easiest way to do this is =ssh-copy-id= from your +local computer (not from the VPS): #+begin_src sh ssh-copy-id testuser@xxx.xxx.xxx.xxx #+end_src -If you've disabled password-based SSH, you'll need to manually copy your -SSH key into the =~/.ssh/authorized_keys= file. +If you've disabled password-based SSH, you'll need to manually copy your SSH key +into the =~/.ssh/authorized_keys= file. * Install Software -Our goal here is to host a web server, so the next step is to install -the Apache web server and any other packages we need. +Our goal here is to host a web server, so the next step is to install the Apache +web server and any other packages we need. -From this point on, I will be logged in as a user (not =root=) and will -need to use the =sudo= modifier for most commands. +From this point on, I will be logged in as a user (not =root=) and will need to +use the =sudo= modifier for most commands. #+begin_src sh sudo apt update; sudo apt upgrade -y; sudo apt autoremove -y sudo apt install apache2 #+end_src -If you need other language support, such as PHP, you'll need to install -that too. +If you need other language support, such as PHP, you'll need to install that +too. #+begin_src sh sudo apt install libapache2-mod-php php-dom @@ -208,19 +192,18 @@ sudo systemctl restart apache2 * Website Files & Folders -Next up is to create the directories for the domain(s) we want to be -hosted on this web server. +Next up is to create the directories for the domain(s) we want to be hosted on +this web server. #+begin_src sh cd /var/www sudo mkdir example.com #+end_src -We have a folder for =example.com= now, so let's add an =index.html= -file and put it within a specific =public_html= folder. You don't need -this =public_html= if you don't want it, but it helps with organizing -items related to =example.com= that you don't want to publish to the -internet. +We have a folder for =example.com= now, so let's add an =index.html= file and +put it within a specific =public_html= folder. You don't need this =public_html= +if you don't want it, but it helps with organizing items related to +=example.com= that you don't want to publish to the internet. #+begin_src sh cd example.com @@ -228,8 +211,8 @@ sudo mkdir public_html && cd public_html sudo nano index.html #+end_src -You can put anything you want in this =index.html= file. If you can't -think of anything, paste this in there: +You can put anything you want in this =index.html= file. If you can't think of +anything, paste this in there: #+begin_src html @@ -245,9 +228,8 @@ think of anything, paste this in there: #+end_src -If you want something to be served at =example.com/page01/file.txt=, -you'll have to create the =page01= directory under the =example.com= -directory. For example: +If you want something to be served at =example.com/page01/file.txt=, you'll have +to create the =page01= directory under the =example.com= directory. For example: #+begin_src sh cd /var/www/example.com/public_html @@ -257,9 +239,9 @@ sudo nano file.txt * Apache Configuration -Now, let's set up the files that will tell the server where to find the -files for =example.com=. We will copy the default configuration file and -create our own. +Now, let's set up the files that will tell the server where to find the files +for =example.com=. We will copy the default configuration file and create our +own. #+begin_src sh cd /etc/apache2/sites-available @@ -267,9 +249,8 @@ sudo cp 000-default.conf example.com.conf sudo nano example.com.conf #+end_src -This configuration file will have a few default lines, but you'll need -to edit it to look similar to this (settings may change based on your -personal needs): +This configuration file will have a few default lines, but you'll need to edit +it to look similar to this (settings may change based on your personal needs): #+begin_src config @@ -291,31 +272,30 @@ sudo a2dissite 000-default.conf sudo systemctl reload apache2 #+end_src -You can always run a test to make sure no errors or warnings are found -in your configuration files. +You can always run a test to make sure no errors or warnings are found in your +configuration files. #+begin_src sh sudo apache2ctl configtest #+end_src -Now, restart the web server entirely. After this, you should be able to -browse to =http://example.com= and see the HTML content you provided -earlier. Note that SSL/TLS has not been enabled yet, so you won't be +Now, restart the web server entirely. After this, you should be able to browse +to =http://example.com= and see the HTML (hypertext markup language) content you +provided earlier. Note that SSL/TLS has not been enabled yet, so you won't be able to use the secure version yet (=https://example.com=). #+begin_src sh sudo systemctl restart apache2 #+end_src -You can repeat this for as many websites as you need. Just create the -domain folders in =/var/www/=, add the configuration file, enable the -configuration, and restart =apache2=. +You can repeat this for as many websites as you need. Just create the domain +folders in =/var/www/=, add the configuration file, enable the configuration, +and restart =apache2=. * SSL/TLS Certificates: Serve Websites Over HTTPS -In order to serve secure content, you'll need to obtain SSL/TLS -certificates. Luckily, there's a free tool called -[[https://certbot.eff.org][Certbot]] that helps us with the process. +In order to serve secure content, you'll need to obtain SSL/TLS certificates. +Luckily, there's a free tool called [[https://certbot.eff.org][Certbot]] that helps us with the process. The first step is to install =snapd= and =core= for Ubuntu. @@ -340,10 +320,10 @@ sudo ln -s /snap/bin/certbot /usr/bin/certbot Finally, you can run =certbot= one of two ways: -1. run it and let it alter your Apache configuration files automatically - to enable HTTPS redirects. -2. run it and only allow it to create certificates. You'll need to - manually alter the config files to enable HTTPS redirects. +1. run it and let it alter your Apache configuration files automatically to + enable HTTPS (Hypertext Transport Protocol) redirects. +2. run it and only allow it to create certificates. You'll need to manually + alter the config files to enable HTTPS redirects. Run certbot and allow automatic config changes: @@ -358,11 +338,10 @@ files: sudo certbot certonly --apache #+end_src -The Certbot packages on your system come with a cron job or systemd -timer that will renew your certificates automatically before they -expire. You will not need to run Certbot again unless you change your -configuration. You can test automatic renewal for your certificates by -running this command: +The Certbot packages on your system come with a =cron= job or =systemd= timer +that will renew your certificates automatically before they expire. You will not +need to run Certbot again unless you change your configuration. You can test +automatic renewal for your certificates by running this command: #+begin_src sh sudo certbot renew --dry-run @@ -373,13 +352,11 @@ Now, test your domains by going to =https://example.com=. * Firewall Security To enable better security on your server, you'll need to enable a basic -firewall. For Ubuntu, we'll use -[[../secure-your-network-with-the-uncomplicated-firewall/][the -uncomplicated firewall]]. +firewall. For Ubuntu, we'll use [[https://cleberg.net/blog/ufw.html][the uncomplicated firewall]]. -Now, add the following rules to the firewall allow SSH, Apache, and -HTTP(S) connections. If you need to, you can enable different ports for -specifics applications, SFTP, etc. +Now, add the following rules to the firewall allow SSH, Apache, and HTTP(S) +connections. If you need to, you can enable different ports for specific +applications. #+begin_src sh sudo ufw default deny incoming @@ -397,15 +374,13 @@ sudo ufw enable * Troubleshooting -If you run into any issues during your VPS set-up, be sure to walk back -through your actions and make sure you didn't miss any steps. +If you run into any issues during your VPS set-up, be sure to walk back through +your actions and make sure you didn't miss any steps. -Many websites have fantastic guides to setting up various web servers. -This is one of the areas -[[https://www.digitalocean.com/community/tutorials][where DigitalOcean -shines]]. For simpler or more Linux-oriented questions, I suggest using -[Linuxize] ([[https://linuxize.com]]). +Many websites have fantastic guides to setting up various web servers. This is +one of the areas [[https://www.digitalocean.com/community/tutorials][where DigitalOcean shines]]. For simpler or more Linux-oriented +questions, I suggest using [Linuxize] ([[https://linuxize.com]]). -If you're getting certain errors (e.g. =500 Internal Server Error=) and -need to debug locally, you can view the =access.log= and =error.log= -files in the =/var/log/apache/= directory. +If you're getting certain errors (e.g. =500 Internal Server Error=) and need to +debug locally, you can view the =access.log= and =error.log= files in the +=/var/log/apache/= directory. diff --git a/content/blog/2021-04-17-gemini-server.org b/content/blog/2021-04-17-gemini-server.org index b915fb6..f223822 100644 --- a/content/blog/2021-04-17-gemini-server.org +++ b/content/blog/2021-04-17-gemini-server.org @@ -5,28 +5,26 @@ * Similar Article Available -To read more about Gemini and ways to test out this new protocol without -your own server, see my previous post -[[../launching-a-gemini-capsule/][Launching a Gemini Capsule]]. +To read more about Gemini and ways to test out this new protocol without your +own server, see my previous post [[../launching-a-gemini-capsule/][Launching a Gemini Capsule]]. * Preparation -This guide assumes you have access to a server accessible to the world -through a public IP address and that you own a domain name used for this -Gemini capsule. +This guide assumes you have access to a server accessible to the world through a +public IP (internet protocol) address and that you own a domain name used for +this Gemini capsule. * Getting Started with Agate -We are going to use [[https://github.com/mbrubeck/agate][Agate]] for -this tutorial. This is a basic Gemini server written in Rust. It takes -very little time and maintenance to get it running. +We are going to use [[https://github.com/mbrubeck/agate][Agate]] for this tutorial. This is a basic Gemini server +written in Rust. It takes very little time and maintenance to get it running. * Install Dependencies -First, you will need to install the Rust package for your system. On -Ubuntu, use the following commands (remember to use =sudo= if you are -not the root user). The Rust installation will give you options to -customize the installation; I used the default installation options. +First, you will need to install the Rust package for your system. On Ubuntu, use +the following commands (remember to use =sudo= if you are not the root user). +The Rust installation will give you options to customize the installation; I +used the default installation options. #+begin_src sh sudo apt update && sudo apt upgrade -y @@ -54,8 +52,8 @@ cargo install agate * Create Symlinks -Once Cargo has finished installing all the required packages, symlink -the executable to your $PATH. +Once Cargo has finished installing all the required packages, create a symbolic +link to the executable to your $PATH. #+begin_src sh sudo ln -s $HOME/.cargo/bin/agate /usr/local/bin/agate @@ -63,8 +61,8 @@ sudo ln -s $HOME/.cargo/bin/agate /usr/local/bin/agate * Using Agate's Built-In Installation Tool -If you're running Ubuntu or Debian, use the Debian installation script -found in Agate's GitHub repository, under the =tools/debian= folder. +If you're running Ubuntu or Debian, use the Debian installation script found in +Agate's GitHub repository, under the =tools/debian= folder. #+begin_src sh git clone https://github.com/mbrubeck/agate @@ -74,11 +72,11 @@ sudo ./install.sh * Configure the Gemini Service -We have a little more to do, but since this script tries to immediately -run the service, it will likely fail with an exit code. Let's add our -finishing touches. Edit the following file and replace the hostname with -your desired URL. You can also change the directory where content will -be served. +We have a little more to do, but since this script tries to immediately run the +service, it will likely fail with an exit code. Let's add our finishing touches. +Edit the following file and replace the hostname with your desired URL (uniform +resource locator). You can also change the directory where content will be +served. #+begin_src sh sudo nano /etc/systemd/system/gemini.service @@ -97,8 +95,8 @@ WorkingDirectory=/var/gemini/ ExecStart=agate --hostname gemini.example.com --lang en #+end_src -Since we've altered the systemd configuration files, we have to reload -the daemon. Let's do that, restart our service, and check its status. +Since we've altered the systemd configuration files, we have to reload the +daemon. Let's do that, restart our service, and check its status. #+begin_src sh sudo systemctl daemon-reload @@ -108,8 +106,8 @@ sudo systemctl status gemini.service * Fixing Systemd Errors -If you're still getting errors, the installation process may not have -properly enabled the gemini service. Fix it with the following commands. +If you're still getting errors, the installation process may not have properly +enabled the gemini service. Fix it with the following commands. #+begin_src sh sudo systemctl enable gemini.service @@ -119,9 +117,9 @@ sudo systemctl status gemini.service * Firewall Rules -Great! Our server is now functional and running. The first consideration -now is that you need to be able to access port 1965 on the server. If -you have a firewall enabled, you'll need to open that port up. +Great! Our server is now functional and running. The first consideration now is +that you need to be able to access port 1965 on the server. If you have a +firewall enabled, you'll need to open that port up. #+begin_src sh sudo ufw allow 1965 @@ -131,21 +129,18 @@ sudo ufw reload * Creating Content Let's create the Gemini capsule. Note that wherever you set the -WorkingDirectory variable to earlier, Agate will expect you to put your -Gemini capsule contents in a sub-folder called "content." So, I place my -files in "/var/gmi/content." I'm going to create that folder now and put -a file in there. +=WorkingDirectory= variable to earlier, Agate will expect you to put your Gemini +capsule contents in a sub-folder called =content=. So, I place my files in +=/var/gmi/content=. I'm going to create that folder now and put a file in there. #+begin_src sh sudo mkdir /var/gemini/content sudo nano /var/gemini/content/index.gmi #+end_src -You can put whatever you want in the "index.gmi" file, just make sure -it's valid Gemtext. +You can put whatever you want in the =index.gmi= file, just make sure it's valid +Gemtext. * The Results -To view the results, you can use a Gemini browser, such as -[[https://gmi.skyjake.fi/lagrange/][Lagrange]] or -[[https://github.com/makeworld-the-better-one/amfora][amfora]]. +To view the results, you can use a Gemini browser, such as [[https://gmi.skyjake.fi/lagrange/][Lagrange]] or [[https://github.com/makeworld-the-better-one/amfora][amfora]]. diff --git a/content/blog/2021-04-23-php-comment-system.org b/content/blog/2021-04-23-php-comment-system.org index c00cb75..33ba763 100644 --- a/content/blog/2021-04-23-php-comment-system.org +++ b/content/blog/2021-04-23-php-comment-system.org @@ -5,84 +5,79 @@ * The Terrible-ness of Commenting Systems -The current state of affairs regarding interactive comment systems is, -well, terrible. It is especially awful if you're a privacy conscious -person who does not generally load third-party scripts or frames on the -websites you visit. +The current state of affairs regarding interactive comment systems is, well, +terrible. It is especially awful if you're a privacy conscious person who does +not generally load third-party scripts or frames on the websites you visit. -Even further, many comment systems are charging exorbitant fees for -something that should be standard. +Even further, many comment systems are charging exorbitant fees for something +that should be standard. Of course, there are some really terrible options: - Facebook Comments - Discourse -There are some options that are better but still use too many scripts, -frames, or social integrations on your web page that could impact some -users: +There are some options that are better but still use too many scripts, frames, +or social integrations on your web page that could impact some users: - Disqus - Isso - Remark42 -Lastly, I looked into a few unique ways of generating blog comments, -such as using Twitter threads or GitHub issues to automatically post -issues. However, these both rely on external third-party sites that I -don't currently use. +Lastly, I looked into a few unique ways of generating blog comments, such as +using Twitter threads or GitHub issues to automatically post issues. However, +these both rely on external third-party sites that I don't currently use. * Stay Static with Server-Side Comments -The main issue for my personal use-case is that my blog is completely, -100% static. I use PHP on the back-end but website visitors only see -HTML and a single CSS file. No external javascript and no embedded -frames. +The main issue for my personal use-case is that my blog is completely, 100% +static. I use PHP on the back-end but website visitors only see HTML (Hypertext +Markup Language) and a single CSS (Cascading Style Sheets) file. No external +JavaScript and no embedded frames. -So, how do we keep a site static and still allow users to interact with -blog posts? The key actually pretty simple - I'm already using PHP, so -why not rely on the classic HTML =
= and a PHP script to save the -comments somewhere? As it turns out, this was a perfect solution for me. +So, how do we keep a site static and still allow users to interact with blog +posts? The key actually pretty simple - I'm already using PHP, so why not rely +on the classic HTML == and a PHP script to save the comments somewhere? As +it turns out, this was a perfect solution for me. -The second issue for my personal use-case is that I am trying to keep -the contents of my website accessible over time, as described by -[cite/t:@brandur], in his post entitled -[[https://brandur.org/fragments/graceful-degradation-time][Blog with -Markdown + Git, and degrade gracefully through time]] . +The second issue for my personal use-case is that I am trying to keep the +contents of my website accessible over time, as described by [cite/t:@brandur], +in his post entitled [[https://brandur.org/fragments/graceful-degradation-time][Blog with Markdown + Git, and degrade gracefully through +time]] . -This means I cannot rely on a database for comments, since I do not rely -on a database for any other part of my websites. +This means I cannot rely on a database for comments, since I do not rely on a +database for any other part of my websites. -I blog in plain Markdown files, commit all articles to Git, and ensure -that future readers will be able to see the source data long after I'm -gone, or the website has gone offline. However, I still haven't -committed any images served on my blog to Git, as I'm not entirely sold -on Git LFS yet - for now, images can be found at -[[https://img.cleberg.net][img.cleberg.net]]. +I blog in plain Markdown files, commit all articles to Git, and ensure that +future readers will be able to see the source data long after I'm gone, or the +website has gone offline. However, I still haven't committed any images served +on my blog to Git, as I'm not entirely sold on Git LFS (large file storage) +yet - for now, images can be found at [[https://img.cleberg.net][img.cleberg.net]]. -Saving my comments back to the Git repository ensures that another -aspect of my site will degrade gracefully. +Saving my comments back to the Git repository ensures that another aspect of my +site will degrade gracefully. * Create a Comment Form -Okay, let's get started. The first step is to create an HTML form that -users can see and utilize to submit comments. This is fairly easy and -can be changed depending on your personal preferences. +Okay, let's get started. The first step is to create an HTML form that users can +see and utilize to submit comments. This is fairly easy and can be changed +depending on your personal preferences. -Take a look at the code block below for the form I currently use. Note -that == is replaced automatically in PHP with the current -post's URL, so that my PHP script used later will know which blog post -the comment is related to. +Take a look at the code block below for the form I currently use. Note that +== is replaced automatically in PHP with the current post's URL +(uniform resource locator), so that my PHP script used later will know which +blog post the comment is related to. The form contains the following structure: -1. == - This is the form and will determine which PHP script to - send the comment to. -2. =