Commit af67e996dc
Unsigned
Layout: unified · split
content/blog/2020-01-25-linux-software.org +28 −28
| @@ -3,14 +3,14 @@ | |||
| 3 | #+description: Inventory and description of key Linux applications including graphical and command-line tools, with installation instructions for various distributions. | 3 | #+description: Inventory and description of key Linux applications including graphical and command-line tools, with installation instructions for various distributions. |
| 4 | #+slug: linux-software | 4 | #+slug: linux-software |
| 5 | 5 | ||
| 6 | * GUI Applications | 6 | * Graphical Applications |
| 7 | 7 | ||
| 8 | ** Etcher | 8 | ** Etcher |
| 9 | 9 | ||
| 10 | [[https://www.balena.io/etcher/][Etcher]] is a quick and easy way to burn ISO images to CDs and USB devices. There | 10 | [[https://www.balena.io/etcher/][Etcher]] is a quick and easy way to burn an optical disc image (ISO) to a compact |
| 11 | are two different ways you can install this program. First, you can navigate to | 11 | disc (CD) or universal serial bus (USB) device. There are two different ways you |
| 12 | the [[https://www.balena.io/etcher/][official website]] and download the AppImage file, which can run without | 12 | can install this program. First, you can navigate to the [[https://www.balena.io/etcher/][official website]] and |
| 13 | installation. | 13 | download the AppImage file, which can run without installation. |
| 14 | 14 | ||
| 15 | However, AppImage files are not executable by default, so you'll either need to | 15 | However, AppImage files are not executable by default, so you'll either need to |
| 16 | right-click to open the properties of the file and click the "Allow executing | 16 | right-click to open the properties of the file and click the "Allow executing |
| @@ -24,13 +24,13 @@ If you don't like AppImage files or just prefer repositories, you can use the | |||
| 24 | following commands to add the author's repository and install it through the | 24 | following commands to add the author's repository and install it through the |
| 25 | command-line only. | 25 | command-line only. |
| 26 | 26 | ||
| 27 | First, you'll have to echo the repo and write it to a list file: | 27 | First, you'll have to write the repository to a list file: |
| 28 | 28 | ||
| 29 | #+begin_src sh | 29 | #+begin_src sh |
| 30 | echo "deb https://deb.etcher.iostable etcher" | sudo tee /etc/apt/sources.list.d/balena-etcher.list | 30 | echo "deb https://deb.etcher.iostable etcher" | sudo tee /etc/apt/sources.list.d/balena-etcher.list |
| 31 | #+end_src | 31 | #+end_src |
| 32 | 32 | ||
| 33 | Next, add the application keys to Ubuntu's keyring: | 33 | Next, add the application keys to Ubuntu's key ring: |
| 34 | 34 | ||
| 35 | #+begin_src sh | 35 | #+begin_src sh |
| 36 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61 | 36 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61 |
| @@ -42,7 +42,8 @@ Finally, update the repositories and install the app. | |||
| 42 | sudo apt update && sudo apt install balena-etcher-electron | 42 | sudo apt update && sudo apt install balena-etcher-electron |
| 43 | #+end_src | 43 | #+end_src |
| 44 | 44 | ||
| 45 | Using Arch, Manjaro, or another distro using the AUR? Use this command instead: | 45 | Using Arch, Manjaro, or another distribution using the Arch User Repository |
| 46 | (AUR)? Use this command instead: | ||
| 46 | 47 | ||
| 47 | #+begin_src sh | 48 | #+begin_src sh |
| 48 | sudo pacman -S etcher | 49 | sudo pacman -S etcher |
| @@ -50,9 +51,9 @@ sudo pacman -S etcher | |||
| 50 | 51 | ||
| 51 | ** Atom | 52 | ** Atom |
| 52 | 53 | ||
| 53 | [[https://atom.io][Atom]] is the self-proclaimed "hackable text editor for the 21st century". This | 54 | [[https://atom.io][Atom]] is the self-proclaimed "hackable text editor for the 21st century". GitHub |
| 54 | text editor is made by GitHub, [[https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/][now owned by Microsoft]], and has some of the best | 55 | develops this editor, [[https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/][now owned by Microsoft]], and has some of the best add-ons |
| 55 | add-ons available to customize the layout and abilities of the app. | 56 | available to customize the layout and abilities of the app. |
| 56 | 57 | ||
| 57 | First, add the Atom repository to your sources. | 58 | First, add the Atom repository to your sources. |
| 58 | 59 | ||
| @@ -74,7 +75,7 @@ repository we just added, use this command: | |||
| 74 | sudo add-apt-repository -r ppa:webupd8team/atom | 75 | sudo add-apt-repository -r ppa:webupd8team/atom |
| 75 | #+end_src | 76 | #+end_src |
| 76 | 77 | ||
| 77 | You can also install Atom as a snap package, but it must be installed with the | 78 | You can also install Atom as a snap package, but you must install it with the |
| 78 | =--classic= flag. A [[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full explanation is available]] if you'd like to read more | 79 | =--classic= flag. A [[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full explanation is available]] if you'd like to read more |
| 79 | about why you need the classic flag. | 80 | about why you need the classic flag. |
| 80 | 81 | ||
| @@ -90,11 +91,11 @@ sudo pacman -S atom | |||
| 90 | 91 | ||
| 91 | ** Visual Studio Code | 92 | ** Visual Studio Code |
| 92 | 93 | ||
| 93 | [[https://code.visualstudio.com][Visual Studio Code]] is yet another fantastic choice for programming on Linux, | 94 | [[https://code.visualstudio.com][Visual Studio Code]] (VS Code) is yet another fantastic choice for programming on |
| 94 | especially if you need those extra add-ons to spice up your late-night coding | 95 | Linux, especially if you need those extra add-ons to spice up your late-night |
| 95 | sessions. The theme used in the screenshot is [[https://marketplace.visualstudio.com/items?itemName=EliverLara.mars][Mars]] by theme creator [[https://github.com/EliverLara][Eliver Lara]], | 96 | coding sessions. The theme used in the screenshot is [[https://marketplace.visualstudio.com/items?itemName=EliverLara.mars][Mars]] by theme creator |
| 96 | who makes a ton of great themes for VS Code, Atom, and various Linux desktop | 97 | [[https://github.com/EliverLara][Eliver Lara]], who makes a ton of great themes for VS Code, Atom, and Linux |
| 97 | environments. | 98 | desktop environments. |
| 98 | 99 | ||
| 99 | To install VS Code, you'll need to download the =.deb= file from the official | 100 | To install VS Code, you'll need to download the =.deb= file from the official |
| 100 | website. Once you've downloaded the file, either double-click it to install | 101 | website. Once you've downloaded the file, either double-click it to install |
| @@ -104,8 +105,8 @@ through the Software Center or run the following command: | |||
| 104 | sudo dpkg -i FILE_NAME.deb | 105 | sudo dpkg -i FILE_NAME.deb |
| 105 | #+end_src | 106 | #+end_src |
| 106 | 107 | ||
| 107 | You can also install VS Code as a snap package, but it must be installed with | 108 | You can also install VS Code as a snap package, but you must install it with the |
| 108 | the =--classic= flag. A [[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full explanation is available]] if you'd like to read more | 109 | =--classic= flag. A [[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full explanation is available]] if you'd like to read more |
| 109 | about why you need the classic flag. | 110 | about why you need the classic flag. |
| 110 | 111 | ||
| 111 | #+begin_src sh | 112 | #+begin_src sh |
| @@ -141,9 +142,9 @@ sudo dnf install gnome-tweaks | |||
| 141 | ** Steam | 142 | ** Steam |
| 142 | 143 | ||
| 143 | [[https://steampowered.com][Steam]] is one of the most popular gaming libraries for computers and is one of | 144 | [[https://steampowered.com][Steam]] is one of the most popular gaming libraries for computers and is one of |
| 144 | the main reasons that many people have been able to switch to Linux in recent | 145 | the main reasons that people have been able to switch to Linux in recent years, |
| 145 | years, thanks to Steam Proton, which makes it easier to play games not | 146 | thanks to Steam Proton, which makes it easier to play games not officially |
| 146 | officially created for Linux platforms. | 147 | created for Linux platforms. |
| 147 | 148 | ||
| 148 | To install Steam on Ubuntu, you just need to install the official package. | 149 | To install Steam on Ubuntu, you just need to install the official package. |
| 149 | 150 | ||
| @@ -210,11 +211,10 @@ sudo pacman -S neofetch | |||
| 210 | 211 | ||
| 211 | ** yt-dlp | 212 | ** yt-dlp |
| 212 | 213 | ||
| 213 | [[https://github.com/yt-dlp/yt-dlp][yt-dlp]] is an extremely handy command-line tool that allows you to download video | 214 | [[https://github.com/yt-dlp/yt-dlp][yt-dlp]] is a handy command-line tool that allows you to download video or audio |
| 214 | or audio files from various websites, such as YouTube. There are a ton of | 215 | files from websites, such as YouTube. There are a ton of different options when |
| 215 | different options when running this package, so be sure to run =yt-dlp --help= | 216 | running this package, so be sure to run =yt-dlp --help= first to look through |
| 216 | first to look through everything you can do (or give up and search for the best | 217 | everything you can do (or give up and search for the best configuration online). |
| 217 | config online). | ||
| 218 | 218 | ||
| 219 | While this shouldn't be a problem for most users, yt-dlp requires Python 2.6, | 219 | While this shouldn't be a problem for most users, yt-dlp requires Python 2.6, |
| 220 | 2.7, or 3.2+ to work correctly, so install Python if you don't have it already. | 220 | 2.7, or 3.2+ to work correctly, so install Python if you don't have it already. |
| @@ -231,7 +231,7 @@ sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o | |||
| 231 | /usr/local/bin/yt-dlp | 231 | /usr/local/bin/yt-dlp |
| 232 | #+end_src | 232 | #+end_src |
| 233 | 233 | ||
| 234 | Finally, make the file executable so that it can be run from the command-line. | 234 | Finally, make the file executable so that you can run it from the command-line. |
| 235 | 235 | ||
| 236 | #+begin_src sh | 236 | #+begin_src sh |
| 237 | sudo chmod a+rx /usr/local/bin/yt-dlp | 237 | sudo chmod a+rx /usr/local/bin/yt-dlp |
content/blog/2020-01-26-steam-on-ntfs.org +18 −17
| @@ -9,13 +9,14 @@ If you want to see how to install Steam on Linux, see my other post: [[../linux- | |||
| 9 | Software]]. | 9 | Software]]. |
| 10 | 10 | ||
| 11 | Are you having trouble launching games, even though they've installed correctly? | 11 | Are you having trouble launching games, even though they've installed correctly? |
| 12 | This may happen if you're storing your games on an NTFS-formatted drive. This | 12 | This may happen if you're storing your games on an NT File System |
| 13 | shouldn't be an issue if you're storing your games on the same drive that Steam | 13 | (NTFS)-formatted drive. This shouldn't be an issue if you're storing your games |
| 14 | is on, but some gamers prefer to put Steam on their main drive and game files on | 14 | on the same drive that Steam is on, but some gamers prefer to put Steam on their |
| 15 | another SSD or HDD. | 15 | main drive and game files on another solid state drive (SSD) or hard disk drive |
| 16 | 16 | (HDD). | |
| 17 | To fix this problem, you'll need to try a few things. First, you'll need to | 17 | |
| 18 | install the =ntfs-3g= package, which is meant for better interoperability with | 18 | To fix this problem, you'll need to try two things. First, you'll need to |
| 19 | install the =ntfs-3g= package, which allows for better interoperability with | ||
| 19 | Linux. | 20 | Linux. |
| 20 | 21 | ||
| 21 | #+begin_src sh | 22 | #+begin_src sh |
| @@ -38,9 +39,9 @@ For example: | |||
| 38 | mkdir /mnt/steam_library | 39 | mkdir /mnt/steam_library |
| 39 | #+end_src | 40 | #+end_src |
| 40 | 41 | ||
| 41 | To automatically mount drives upon system boot, you will need to collect a few | 42 | To automatically mount drives upon system boot, you will need to collect five |
| 42 | items. The UUID is the identification number connected to whichever drive you're | 43 | items. The universally unique identifier (UUID) is the identification number |
| 43 | using to store Steam games. | 44 | connected to whichever drive you're using to store Steam games. |
| 44 | 45 | ||
| 45 | Drives are usually labeled similar to =/dev/nvme0n1p1= or =/dev/sda1=, so you'll | 46 | Drives are usually labeled similar to =/dev/nvme0n1p1= or =/dev/sda1=, so you'll |
| 46 | need to find the line in the output of the command below that correlates to your | 47 | need to find the line in the output of the command below that correlates to your |
| @@ -50,8 +51,8 @@ drive and copy the UUID over to the =/etc/fstab= file. | |||
| 50 | sudo blkid | grep UUID= | 51 | sudo blkid | grep UUID= |
| 51 | #+end_src | 52 | #+end_src |
| 52 | 53 | ||
| 53 | Next, you'll need your =uid= and =gid=. To find these, run the following | 54 | Next, you'll need your user identified (=uid=) and group identifier (=gid=). To |
| 54 | command: | 55 | find these, run the following command: |
| 55 | 56 | ||
| 56 | #+begin_src sh | 57 | #+begin_src sh |
| 57 | id -u && id -g | 58 | id -u && id -g |
| @@ -71,13 +72,13 @@ Each drive you want to mount on boot should have its own line in the | |||
| 71 | UUID=B64E53824E5339F7 /mnt/steam_library ntfs-3g uid=1000,gid=1000 0 0 | 72 | UUID=B64E53824E5339F7 /mnt/steam_library ntfs-3g uid=1000,gid=1000 0 0 |
| 72 | #+end_src | 73 | #+end_src |
| 73 | 74 | ||
| 74 | Now all you need to do is unmount your drive and re-mount it. You can unmount | ||
| 75 | the drive by doing this (be sure to use the correct drive name here): | ||
| 76 | |||
| 77 | #+begin_src sh | 75 | #+begin_src sh |
| 78 | sudo umount /dev/sdxX | 76 | sudo umount /dev/sdxX |
| 79 | #+end_src | 77 | #+end_src |
| 80 | 78 | ||
| 79 | Now all you need to do is unmount your drive and re-mount it. You can unmount | ||
| 80 | the drive by doing this (be sure to use the correct drive name here): | ||
| 81 | |||
| 81 | You can re-mount all your drives by executing the following: | 82 | You can re-mount all your drives by executing the following: |
| 82 | 83 | ||
| 83 | #+begin_src sh | 84 | #+begin_src sh |
| @@ -85,5 +86,5 @@ sudo mount -a | |||
| 85 | #+end_src | 86 | #+end_src |
| 86 | 87 | ||
| 87 | If you don't know what your drive name is, or you're nervous about unmounting | 88 | If you don't know what your drive name is, or you're nervous about unmounting |
| 88 | and re-mounting, simply reboot your computer, and it will be done for you | 89 | and re-mounting, simply reboot your computer, and the system will mount the |
| 89 | automatically. | 90 | drive for you automatically. |
content/blog/2020-02-09-cryptography-basics.org +7 −7
| @@ -26,8 +26,8 @@ data to an intelligible form. | |||
| 26 | 26 | ||
| 27 | Cryptography cannot offer protection against the loss of data; it simply offers | 27 | Cryptography cannot offer protection against the loss of data; it simply offers |
| 28 | encryption methods to protect data at-rest and data in-traffic. At a high-level, | 28 | encryption methods to protect data at-rest and data in-traffic. At a high-level, |
| 29 | encrypted is when plaintext data is encrypted to ciphertext (a secure form of | 29 | encrypted is when plain text data is encrypted to cipher text (a secure form of |
| 30 | text that cannot be understood unless decrypted back to plaintext). The | 30 | text that cannot be understood unless decrypted back to plain text). The |
| 31 | encryption process is completed through the use of a mathematical function that | 31 | encryption process is completed through the use of a mathematical function that |
| 32 | utilizes one or more values called keys to encrypt or decrypt the data. | 32 | utilizes one or more values called keys to encrypt or decrypt the data. |
| 33 | 33 | ||
| @@ -41,7 +41,7 @@ pieces to the system: | |||
| 41 | - *Encryption Key:* A string of bits used within the encryption algorithm as the | 41 | - *Encryption Key:* A string of bits used within the encryption algorithm as the |
| 42 | secret that allows successful encryption or decryption of data. | 42 | secret that allows successful encryption or decryption of data. |
| 43 | - *Key Length (Size):* The maximum number of bits within the encryption key. | 43 | - *Key Length (Size):* The maximum number of bits within the encryption key. |
| 44 | It's important to remember that key size is regulated in many countries. | 44 | It's important to remember that key size is regulated in certain countries. |
| 45 | - *Message Digest:* A smaller, fixed-size bit string version of the original | 45 | - *Message Digest:* A smaller, fixed-size bit string version of the original |
| 46 | message. This is practically infeasible to reverse, which is why it's commonly | 46 | message. This is practically infeasible to reverse, which is why it's commonly |
| 47 | used to verify integrity. | 47 | used to verify integrity. |
| @@ -102,8 +102,8 @@ security while using fewer resources. | |||
| 102 | 102 | ||
| 103 | * Applications of Cryptographic Systems | 103 | * Applications of Cryptographic Systems |
| 104 | 104 | ||
| 105 | There are quite a few implementations of cryptographic systems around the world. | 105 | There are numerous implementations of cryptographic systems around the world. |
| 106 | Here are a few popular examples: | 106 | Here are six popular examples: |
| 107 | 107 | ||
| 108 | *Transport Layer Security (TLS):* One of the most famous cryptographic solutions | 108 | *Transport Layer Security (TLS):* One of the most famous cryptographic solutions |
| 109 | created is TLS, a session-layered or connection-layered internet protocol that | 109 | created is TLS, a session-layered or connection-layered internet protocol that |
| @@ -148,7 +148,7 @@ encryption method for Windows Active Directory (AD). | |||
| 148 | * Cybersecurity Controls | 148 | * Cybersecurity Controls |
| 149 | 149 | ||
| 150 | If you're someone who needs solutions on how to control risks associated with | 150 | If you're someone who needs solutions on how to control risks associated with |
| 151 | utilizing a crytograhpic system, start with a few basic controls: | 151 | utilizing a crytograhpic system, start with these basic controls: |
| 152 | 152 | ||
| 153 | - *Policies:* A policy on the use of cryptographic controls for protection of | 153 | - *Policies:* A policy on the use of cryptographic controls for protection of |
| 154 | information is implemented and is in accordance with organizational | 154 | information is implemented and is in accordance with organizational |
| @@ -162,4 +162,4 @@ utilizing a crytograhpic system, start with a few basic controls: | |||
| 162 | the business of the organization, robust, and align with recommended | 162 | the business of the organization, robust, and align with recommended |
| 163 | guidelines. | 163 | guidelines. |
| 164 | - *Protocol configuration:* Protocols have been reviewed and configured suitable | 164 | - *Protocol configuration:* Protocols have been reviewed and configured suitable |
| 165 | to the purpose of the business.\ No newline at end of file | 165 | to the purpose of the business. |
content/blog/2020-03-25-session-messenger.org +10 −10
| @@ -7,7 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | The company behind Session (Loki Foundation) is from Australia. If you didn't | 8 | The company behind Session (Loki Foundation) is from Australia. If you didn't |
| 9 | know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with | 9 | know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with |
| 10 | government requests to build backdoor access into applications. For more | 10 | government requests to build back door access into applications. For more |
| 11 | information, read my article on [[./2020-01-25-aes-encryption.html][AES Encryption]]. | 11 | information, read my article on [[./2020-01-25-aes-encryption.html][AES Encryption]]. |
| 12 | 12 | ||
| 13 | * About Session | 13 | * About Session |
| @@ -41,7 +41,7 @@ Since most people are looking for an alternative to a popular chat app, I am | |||
| 41 | going to list out the features that Session has so that you are able to | 41 | going to list out the features that Session has so that you are able to |
| 42 | determine if the app would suit your needs: | 42 | determine if the app would suit your needs: |
| 43 | 43 | ||
| 44 | - Multiple device linking (via QR code or ID) | 44 | - Multiple device linking [via a quick-response (QR) code or identifier (ID)] |
| 45 | - App locking via device screen lock, password, or fingerprint | 45 | - App locking via device screen lock, password, or fingerprint |
| 46 | - Screenshot blocking | 46 | - Screenshot blocking |
| 47 | - Incognito keyboard | 47 | - Incognito keyboard |
| @@ -55,7 +55,7 @@ determine if the app would suit your needs: | |||
| 55 | * Downloads | 55 | * Downloads |
| 56 | 56 | ||
| 57 | I have tested this app on Ubuntu 19.10, Android 10, macOS Monterey, and iOS 15. | 57 | I have tested this app on Ubuntu 19.10, Android 10, macOS Monterey, and iOS 15. |
| 58 | All apps have worked well without many issues. | 58 | All apps have worked well without issue. |
| 59 | 59 | ||
| 60 | Below is a brief overview of the Session app on Linux. To get this app, you'll | 60 | Below is a brief overview of the Session app on Linux. To get this app, you'll |
| 61 | need to go to the [[https://getsession.org/download/][Downloads]] page and click to link to the operating system | 61 | need to go to the [[https://getsession.org/download/][Downloads]] page and click to link to the operating system |
| @@ -81,8 +81,8 @@ password, you will need to enter it every time you open the app. | |||
| 81 | 81 | ||
| 82 | Once you've created your account and set up your profile details, the next step | 82 | Once you've created your account and set up your profile details, the next step |
| 83 | is to start messaging other people. To do so, you'll need to share your Session | 83 | is to start messaging other people. To do so, you'll need to share your Session |
| 84 | ID with other people. From this point, it's fairly straightforward and acts like | 84 | ID with other people. From this point, it's straightforward and acts like any |
| 85 | any other messaging app, so I won't dive into much detail here. | 85 | other messaging app, so I won't dive into much detail here. |
| 86 | 86 | ||
| 87 | ** macOS | 87 | ** macOS |
| 88 | 88 | ||
| @@ -91,7 +91,7 @@ pop-up box explaining the process that Session uses to hide your IP address: | |||
| 91 | 91 | ||
| 92 | ** iOS | 92 | ** iOS |
| 93 | 93 | ||
| 94 | The mobile app is quite simple and effective, giving you all the standard mobile | 94 | The mobile app is simple and effective, giving you all the standard mobile |
| 95 | messaging options you'd expect. | 95 | messaging options you'd expect. |
| 96 | 96 | ||
| 97 | * Potential Issues | 97 | * Potential Issues |
| @@ -100,9 +100,9 @@ I've discovered one annoying issue that would prevent from using this app | |||
| 100 | regularly. On a mobile device, there have been issues with receiving messages on | 100 | regularly. On a mobile device, there have been issues with receiving messages on |
| 101 | time. Even with battery optimization disabled and no network restrictions, | 101 | time. Even with battery optimization disabled and no network restrictions, |
| 102 | Session notifications sometimes do not display until I open the app or the | 102 | Session notifications sometimes do not display until I open the app or the |
| 103 | conversation itself and wait a few moments. This is actually one of the reasons | 103 | conversation itself and wait. This is actually one of the reasons I stopped |
| 104 | I stopped using Signal (this seems fixed as of my updates in 2021/2022, so I | 104 | using Signal (this seems fixed as of my updates in 2021/2022, so I wouldn't |
| 105 | wouldn't worry about this issue anymore). | 105 | worry about this issue anymore). |
| 106 | 106 | ||
| 107 | Looking for another messenger instead of Session? I recommend Signal, Matrix, | 107 | Looking for another messenger instead of Session? I recommend Signal, Matrix, |
| 108 | and IRC. | 108 | and internet relay chat (IRC). |
content/blog/2020-05-03-homelab.org +16 −11
| @@ -5,14 +5,14 @@ | |||
| 5 | 5 | ||
| 6 | * What is a Homelab? | 6 | * What is a Homelab? |
| 7 | 7 | ||
| 8 | Starting as a developer, I have largely stayed away from hardware-based hobbies | 8 | Starting as a developer, I have stayed away from hardware-based hobbies (other |
| 9 | (other than building a gaming desktop). However, as the quarantine for COVID-19 | 9 | than building a gaming desktop). However, as the quarantine for COVID-19 |
| 10 | stretches out further and further, I found myself bored and in search of new | 10 | stretches out further and further, I found myself bored and in search of new |
| 11 | hobbies. After spending the last few months browsing the [[https://www.reddit.com/r/homelab/][r/homelab]] subreddit, I | 11 | hobbies. After spending the last few months browsing the [[https://www.reddit.com/r/homelab/][r/homelab]] subreddit, I |
| 12 | decided it was time to jump in and try things out for myself. | 12 | decided it was time to jump in and try things out for myself. |
| 13 | 13 | ||
| 14 | Since I am a beginner and just recently graduated from college, everything I've | 14 | Since I am a beginner and just recently graduated from college, everything I've |
| 15 | done so far in my homelab is fairly low-budget. | 15 | done so far in my homelab is low-budget. |
| 16 | 16 | ||
| 17 | * Hardware | 17 | * Hardware |
| 18 | 18 | ||
| @@ -50,14 +50,15 @@ Here are the specifications for the Dell Optiplex 5040: | |||
| 50 | 50 | ||
| 51 | While this hardware would be awful for a work computer or a gaming rig, it | 51 | While this hardware would be awful for a work computer or a gaming rig, it |
| 52 | turned out to be wonderful for my server purposes. The only limitation I have | 52 | turned out to be wonderful for my server purposes. The only limitation I have |
| 53 | found so far is the CPU. The i3-6100 only has enough power for a single 4k video | 53 | found so far is the central processing unit (CPU). The i3-6100 only has enough |
| 54 | transcode at a time. I haven't tested more than three 1080p streams at a time, | 54 | power for a single 4k video transcode at a time. I haven't tested more than |
| 55 | but the maximum amount of streams I've ever actually used is two. | 55 | three 1080p streams at a time, but the maximum amount of streams I've ever |
| 56 | actually used is two. | ||
| 56 | 57 | ||
| 57 | ** WD easystore 10TB & 8TB | 58 | ** WD easystore 10TB & 8TB |
| 58 | 59 | ||
| 59 | Application storage and temporary files are stored on the internal hard drive of | 60 | Application storage and temporary files are stored on the internal hard drive of |
| 60 | the server, but all media files (movies, tv, games, books, etc) are stored | 61 | the server, but all media files (movies, television, games, books, etc) are stored |
| 61 | externally on my WD easystore hard drive. Creating auto-boot configurations in | 62 | externally on my WD easystore hard drive. Creating auto-boot configurations in |
| 62 | the =/etc/fstab= file on my server allows the hard drives to automatically mount | 63 | the =/etc/fstab= file on my server allows the hard drives to automatically mount |
| 63 | whenever I need to restart my server. | 64 | whenever I need to restart my server. |
| @@ -65,7 +66,8 @@ whenever I need to restart my server. | |||
| 65 | #+begin_quote | 66 | #+begin_quote |
| 66 | Update: In March 2022, I shucked the hard drives out of their external cases, | 67 | Update: In March 2022, I shucked the hard drives out of their external cases, |
| 67 | put some Kapton tape on the third power pin to prevent power shutdowns, and | 68 | put some Kapton tape on the third power pin to prevent power shutdowns, and |
| 68 | stuck them inside my server tower using internal SATA cables. | 69 | stuck them inside my server tower using internal Serial AT Attachment (SATA) |
| 70 | cables. | ||
| 69 | #+end_quote | 71 | #+end_quote |
| 70 | 72 | ||
| 71 | ** Netgear Unmanaged Switch | 73 | ** Netgear Unmanaged Switch |
| @@ -78,15 +80,18 @@ unmanaged switch, but I am comfortable with the choice. | |||
| 78 | ** TP-Link Managed Switch | 80 | ** TP-Link Managed Switch |
| 79 | 81 | ||
| 80 | Since I use the unmanaged switch to group all living room devices together, I | 82 | Since I use the unmanaged switch to group all living room devices together, I |
| 81 | use the managed switch to configure VLANs and secure my network. | 83 | use the managed switch to configure virtual local area networks (VLANs) and |
| 84 | secure my network. | ||
| 82 | 85 | ||
| 83 | ** Arris TM1602A Modem & Sagecom Fast 5280 Router | 86 | ** Arris TM1602A Modem & Sagecom Fast 5280 Router |
| 84 | 87 | ||
| 85 | My default modem and router, provided by my ISP, are fairly standard. The Arris | 88 | My default modem and router, provided by my ISP, are fairly standard. The Arris |
| 86 | modem supports DOCSIS 3.0, which is something that I definitely wanted as a | 89 | modem supports DOCSIS 3.0, which is something that I definitely wanted as a |
| 87 | minimum. The Sagecom router is also standard, no fancy bells or whistles. | 90 | minimum. The Sagecom router is also standard, no fancy bells or whistles. |
| 88 | However, it does support DHCP and DHCPv6, which is something you can use to | 91 | However, it does support the dynamic host configuration protocol (DHCP) for |
| 89 | route all household traffic through a pi-hole or firewall. | 92 | internet protocol version 4 (IPv4) and internet protocol version 6 (IPv6), which |
| 93 | is something iyou can use to route all household traffic through a pi-hole or | ||
| 94 | firewall. | ||
| 90 | 95 | ||
| 91 | ** TP-Link EAP | 96 | ** TP-Link EAP |
| 92 | 97 | ||
content/blog/2020-05-19-customizing-ubuntu.org +5 −5
| @@ -5,8 +5,8 @@ | |||
| 5 | 5 | ||
| 6 | * More Information | 6 | * More Information |
| 7 | 7 | ||
| 8 | For inspiration on designing your *nix computer, check out the | 8 | For inspiration on designing your *nix computer, check out the [[https://libredd.it/r/unixporn][r/unixporn]] |
| 9 | [[https://libredd.it/r/unixporn][r/unixporn]] subreddit! | 9 | subreddit! |
| 10 | 10 | ||
| 11 | * Customizing Ubuntu | 11 | * Customizing Ubuntu |
| 12 | 12 | ||
| @@ -36,7 +36,7 @@ default on Ubuntu. You might even like some of the pre-installed options. | |||
| 36 | ** GNOME Application Themes | 36 | ** GNOME Application Themes |
| 37 | 37 | ||
| 38 | To change the themes applied to applications in GNOME, you will need to change | 38 | To change the themes applied to applications in GNOME, you will need to change |
| 39 | the Applications dropdown in the Appearance section of Tweaks. To add more | 39 | the Applications drop-down in the Appearance section of Tweaks. To add more |
| 40 | themes, you will have to find your preferred theme online and follow the steps | 40 | themes, you will have to find your preferred theme online and follow the steps |
| 41 | below to have it show up in the Tweaks tool. While you may find themes anywhere, | 41 | below to have it show up in the Tweaks tool. While you may find themes anywhere, |
| 42 | one of the most popular sites for GNOME themes is [[https://www.gnome-look.org/][gnome-look.org]]. This website | 42 | one of the most popular sites for GNOME themes is [[https://www.gnome-look.org/][gnome-look.org]]. This website |
| @@ -55,7 +55,7 @@ Steps to import themes into Tweaks: | |||
| 55 | can move them to the =/usr/share/fonts/opentype/= or | 55 | can move them to the =/usr/share/fonts/opentype/= or |
| 56 | =/usr/share/fonts/opentype/= folders, if you have a specific font type. | 56 | =/usr/share/fonts/opentype/= folders, if you have a specific font type. |
| 57 | 4. Close tweaks if it is open. Re-open Tweaks and your new theme will be | 57 | 4. Close tweaks if it is open. Re-open Tweaks and your new theme will be |
| 58 | available in the Applications dropdown in the Appearance section of Tweaks. | 58 | available in the Applications drop-down in the Appearance section of Tweaks. |
| 59 | 59 | ||
| 60 | If the theme is not showing up after you've moved it into the themes folder, you | 60 | If the theme is not showing up after you've moved it into the themes folder, you |
| 61 | may have uncompressed the folder into a sub-folder. You can check this by | 61 | may have uncompressed the folder into a sub-folder. You can check this by |
| @@ -113,7 +113,7 @@ instead. | |||
| 113 | If you spend a lot of time typing commands, you know how important the style and | 113 | If you spend a lot of time typing commands, you know how important the style and |
| 114 | functionality of the terminal is. After spending a lot of time using the default | 114 | functionality of the terminal is. After spending a lot of time using the default |
| 115 | GNOME terminal with [[https://en.wikipedia.org/wiki/Bash_(Unix_shell)][unix shell]], I decided to try some different options. I ended | 115 | GNOME terminal with [[https://en.wikipedia.org/wiki/Bash_(Unix_shell)][unix shell]], I decided to try some different options. I ended |
| 116 | up choosing [[https://terminator-gtk3.readthedocs.io/en/latest/][Terminator]] with [[https://en.wikipedia.org/wiki/Z_shell][zsh]]. | 116 | up choosing [[https://terminator-gtk3.readthedocs.io/en/latest/][Terminator]] with [[https://en.wikipedia.org/wiki/Z_shell][zsh]] (Z Shell). |
| 117 | 117 | ||
| 118 | Terminator is great if you need to open multiple terminals at one time by simply | 118 | Terminator is great if you need to open multiple terminals at one time by simply |
| 119 | right-clicking and splitting the screen into as many terminals as you want. | 119 | right-clicking and splitting the screen into as many terminals as you want. |
content/blog/2020-07-26-business-analysis.org +6 −6
| @@ -36,9 +36,9 @@ from sklearn.cluster import KMeans | |||
| 36 | #+end_src | 36 | #+end_src |
| 37 | 37 | ||
| 38 | To begin our analysis, we need to import the data for this project. The data we | 38 | To begin our analysis, we need to import the data for this project. The data we |
| 39 | are using in this project comes directly from the Foursquare API. The first step | 39 | are using in this project comes directly from the Foursquare application |
| 40 | is to get the latitude and longitude of the city being studied (Lincoln, NE) and | 40 | programming interface (API). The first step is to get the latitude and longitude |
| 41 | setting up the folium map. | 41 | of the city being studied (Lincoln, NE) and setting up the folium map. |
| 42 | 42 | ||
| 43 | #+begin_src python | 43 | #+begin_src python |
| 44 | # Define the latitude and longitude, then map the results | 44 | # Define the latitude and longitude, then map the results |
| @@ -119,7 +119,7 @@ results3 = requests.get(url3).json() | |||
| 119 | 119 | ||
| 120 | Now that we have our data in three separate dataframes, we need to combine them | 120 | Now that we have our data in three separate dataframes, we need to combine them |
| 121 | into a single dataframe and make sure to reset the index so that we have a | 121 | into a single dataframe and make sure to reset the index so that we have a |
| 122 | unique ID for each business. The =get~categorytype~= function below will pull | 122 | unique ID for each business. The =get_category_type= function below will pull |
| 123 | the categories and name from each business's entry in the Foursquare data | 123 | the categories and name from each business's entry in the Foursquare data |
| 124 | automatically. Once all the data has been labeled and combined, the results are | 124 | automatically. Once all the data has been labeled and combined, the results are |
| 125 | stored in the =nearby_venues= dataframe. | 125 | stored in the =nearby_venues= dataframe. |
| @@ -221,8 +221,8 @@ as close as possible to each other, while being as far as possible away from | |||
| 221 | other clusters. | 221 | other clusters. |
| 222 | 222 | ||
| 223 | However, we first have to figure out how many clusters to use (defined as the | 223 | However, we first have to figure out how many clusters to use (defined as the |
| 224 | variable /'k'/). To do so, we will use the next two functions to calculate the | 224 | variable 'k'). To do so, we will use the next two functions to calculate the sum |
| 225 | sum of squares within clusters and then return the optimal number of clusters. | 225 | of squares within clusters and then return the optimal number of clusters. |
| 226 | 226 | ||
| 227 | #+begin_src python | 227 | #+begin_src python |
| 228 | # This function will return the sum of squares found in the data | 228 | # This function will return the sum of squares found in the data |
content/blog/2020-08-22-redirect-github-pages.org +11 −11
| @@ -7,8 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | ** Step 1 | 8 | ** Step 1 |
| 9 | 9 | ||
| 10 | Add a new file CNAME to your GitHub Pages repository containing only one line: | 10 | Add a new file called =CNAME= (canonical name) to your GitHub Pages repository |
| 11 | your top-level domain name. E.g.: =example.com= | 11 | containing only one line: your top-level domain name. E.g.: =example.com= |
| 12 | 12 | ||
| 13 | ** Step 2 | 13 | ** Step 2 |
| 14 | 14 | ||
| @@ -17,11 +17,12 @@ your top-level domain name. E.g.: =example.com= | |||
| 17 | 2.1: Remove all other top-level records (prefixed with @) of type A from your | 17 | 2.1: Remove all other top-level records (prefixed with @) of type A from your |
| 18 | DNS configuration. | 18 | DNS configuration. |
| 19 | 19 | ||
| 20 | 2.2: Remove a CNAME record for the second-level domain www if it is present. | 20 | 2.2: Remove a CNAME record for the second-level domain =www=, if it is present. |
| 21 | 21 | ||
| 22 | ** Step 3 | 22 | ** Step 3 |
| 23 | 23 | ||
| 24 | Add these 5 entries to the very top of your DNS configuration: | 24 | Add these 5 entries to the very top of your domain name system (DNS) |
| 25 | configuration: | ||
| 25 | 26 | ||
| 26 | #+begin_src txt | 27 | #+begin_src txt |
| 27 | @ A 185.199.108.153 | 28 | @ A 185.199.108.153 |
| @@ -41,7 +42,7 @@ immediately. They can take up to a full day to propagate. | |||
| 41 | * Long answer | 42 | * Long answer |
| 42 | 43 | ||
| 43 | This issue has two sides. One is the DNS configuration itself. Another one is | 44 | This issue has two sides. One is the DNS configuration itself. Another one is |
| 44 | the way GitHub Pages will forward HTTP requests. | 45 | the way GitHub Pages will forward hypertext transfer protocol (HTTP) requests. |
| 45 | 46 | ||
| 46 | We need to know a few things to understand what GitHub is trying to say in their | 47 | We need to know a few things to understand what GitHub is trying to say in their |
| 47 | documentation. | 48 | documentation. |
| @@ -52,7 +53,7 @@ There are two types of DNS records which interest us: CNAME and A. | |||
| 52 | 53 | ||
| 53 | =A= is also known as =Apex= or sometimes as =root entry=. It forwards requests | 54 | =A= is also known as =Apex= or sometimes as =root entry=. It forwards requests |
| 54 | to a specified fixed IP address. =CNAME= entry forwards requests to a specified | 55 | to a specified fixed IP address. =CNAME= entry forwards requests to a specified |
| 55 | URL (actual valid plain text URL, not an IP address). | 56 | URL (actual valid plain text URL, not an internet protocol (IP) address). |
| 56 | 57 | ||
| 57 | ** DNS Load balancing | 58 | ** DNS Load balancing |
| 58 | 59 | ||
| @@ -82,11 +83,10 @@ URL address (e.g. =username.github.io=) instead of a fixed IP address. | |||
| 82 | 83 | ||
| 83 | ** How GitHub Pages treats HTTP requests | 84 | ** How GitHub Pages treats HTTP requests |
| 84 | 85 | ||
| 85 | After a DNS request for =your_github_username.github.io= is resolved | 86 | After a DNS request for =your_github_username.github.io= is resolved into an IP |
| 86 | into an IP address, e.g. =185.199.108.153= your browser sends an HTTP | 87 | address, e.g. =185.199.108.153= your browser sends an HTTP request to that |
| 87 | request to that server with an HTTP header =Host=. Below are =curl= | 88 | server with an HTTP header =Host=. Below are =curl= examples that load the same |
| 88 | examples that load the same website (these examples might not work if | 89 | website (these examples might not work if you are behind a proxy server): |
| 89 | you are behind a proxy server): | ||
| 90 | 90 | ||
| 91 | #+begin_src sh | 91 | #+begin_src sh |
| 92 | curl --header "Host: your_github_username.github.io" http://185.199.108.153/ | 92 | curl --header "Host: your_github_username.github.io" http://185.199.108.153/ |
content/blog/2020-08-29-php-auth-flow.org +3 −2
| @@ -7,8 +7,9 @@ | |||
| 7 | 7 | ||
| 8 | When creating websites that will allow users to create accounts, the developer | 8 | When creating websites that will allow users to create accounts, the developer |
| 9 | always needs to consider the proper authentication flow for their app. For | 9 | always needs to consider the proper authentication flow for their app. For |
| 10 | example, some developers will utilize an API for authentication, some will use | 10 | example, some developers will utilize an application programming interface (API) |
| 11 | OAuth, and some may just use their own simple database. | 11 | for authentication, some will use OAuth, and some may just use their own simple |
| 12 | database. | ||
| 12 | 13 | ||
| 13 | For those using pre-built libraries, authentication may simply be a problem of | 14 | For those using pre-built libraries, authentication may simply be a problem of |
| 14 | copying and pasting the code from their library's documentation. For example, | 15 | copying and pasting the code from their library's documentation. For example, |
content/blog/2020-09-01-visual-recognition.org +12 −12
| @@ -5,13 +5,13 @@ | |||
| 5 | 5 | ||
| 6 | * What is IBM Watson? | 6 | * What is IBM Watson? |
| 7 | 7 | ||
| 8 | If you've never heard of [[https://www.ibm.com/watson][Watson]], this service is a suite of enterprise-ready AI | 8 | If you've never heard of [[https://www.ibm.com/watson][Watson]], this service is a suite of enterprise-ready |
| 9 | services, applications, and tooling provided by IBM. Watson contains quite a few | 9 | artificial intelligence (AI) services, applications, and tooling provided by |
| 10 | useful tools for data scientists and students, including the subject of this | 10 | IBM. Watson contains quite a few useful tools for data scientists and students, |
| 11 | post today: visual recognition. | 11 | including the subject of this post today: visual recognition. |
| 12 | 12 | ||
| 13 | If you'd like to view the official documentation for the Visual Recognition API, | 13 | If you'd like to view the official documentation for the Visual Recognition |
| 14 | visit the [[https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3?code=python][API Docs]]. | 14 | application programming interface (API), visit the [[https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3?code=python][API Docs]]. |
| 15 | 15 | ||
| 16 | * Prerequisites | 16 | * Prerequisites |
| 17 | 17 | ||
| @@ -19,12 +19,12 @@ To be able to use Watson Visual Recognition, you'll need the following: | |||
| 19 | 19 | ||
| 20 | 1. Create a free account on [[https://www.ibm.com/cloud/watson-studio][IBM Watson Studio]]. | 20 | 1. Create a free account on [[https://www.ibm.com/cloud/watson-studio][IBM Watson Studio]]. |
| 21 | 2. Add the [[https://www.ibm.com/cloud/watson-visual-recognition][Watson Visual Recognition]] service to your IBM Watson account. | 21 | 2. Add the [[https://www.ibm.com/cloud/watson-visual-recognition][Watson Visual Recognition]] service to your IBM Watson account. |
| 22 | 3. Get your API key and URL. To do this, first go to the [[https://dataplatform.cloud.ibm.com/home2?context=cpdaas][profile dashboard]] for | 22 | 3. Get your API key and URL (uniform resource locator). To do this, first go to |
| 23 | your IBM account and click on the Watson Visual Recognition service you | 23 | the [[https://dataplatform.cloud.ibm.com/home2?context=cpdaas][profile dashboard]] for your IBM account and click on the Watson Visual |
| 24 | created. This will be listed in the section titled *Your services*. Then | 24 | Recognition service you created. This will be listed in the section titled |
| 25 | click the *Credentials* tab and open the *Auto-generated credentials* | 25 | *Your services*. Then click the *Credentials* tab and open the |
| 26 | dropdown. Copy your API key and URL so that you can use them in the Python | 26 | *Auto-generated credentials* dropdown. Copy your API key and URL so that you |
| 27 | script later. | 27 | can use them in the Python script later. |
| 28 | 4. *[Optional]* While not required, you can also create the Jupyter Notebook for | 28 | 4. *[Optional]* While not required, you can also create the Jupyter Notebook for |
| 29 | this project right inside [[https://www.ibm.com/cloud/watson-studio][Watson Studio]]. Watson Studio will save your | 29 | this project right inside [[https://www.ibm.com/cloud/watson-studio][Watson Studio]]. Watson Studio will save your |
| 30 | notebooks inside an organized project and allow you to use their other | 30 | notebooks inside an organized project and allow you to use their other |
content/blog/2020-09-22-internal-audit.org +4 −5
| @@ -50,11 +50,10 @@ evidence to provide opinions or conclusions regarding an entity, operation, | |||
| 50 | function, process, system, or other subject matters. The internal auditor | 50 | function, process, system, or other subject matters. The internal auditor |
| 51 | determines the nature and scope of an assurance engagement. Generally, three | 51 | determines the nature and scope of an assurance engagement. Generally, three |
| 52 | parties are participants in assurance services: (1) the person or group directly | 52 | parties are participants in assurance services: (1) the person or group directly |
| 53 | involved with the entity, operation, function, process, system, or other subject | 53 | involved with the entity, operation, function, process, system, or other |
| 54 | 54 | subject - (the process owner), (2) the person or group making the assessment - | |
| 55 | - (the process owner), (2) the person or group making the assessment - (the | 55 | (the internal auditor), and (3) the person or group using the assessment - (the |
| 56 | internal auditor), and (3) the person or group using the assessment - (the | 56 | user). |
| 57 | user). | ||
| 58 | 57 | ||
| 59 | ** Consulting | 58 | ** Consulting |
| 60 | 59 | ||
content/blog/2020-09-25-happiness-map.org +1 −1
| @@ -76,7 +76,7 @@ Some countries need to be renamed, or they will be lost when you merge the | |||
| 76 | happiness and GeoJSON dataframes. This is something I discovered when the map | 76 | happiness and GeoJSON dataframes. This is something I discovered when the map |
| 77 | below showed empty countries. I searched both data frames for the missing | 77 | below showed empty countries. I searched both data frames for the missing |
| 78 | countries to see the naming differences. Any countries that do not have records | 78 | countries to see the naming differences. Any countries that do not have records |
| 79 | in the =happy_data= df will not show up on the map. | 79 | in the =happy_data= data frame will not show up on the map. |
| 80 | 80 | ||
| 81 | #+begin_src python | 81 | #+begin_src python |
| 82 | # Rename some countries to match our GeoJSON data | 82 | # Rename some countries to match our GeoJSON data |
content/blog/2020-12-27-website-redesign.org +11 −11
| @@ -19,10 +19,10 @@ anything on my main webpage that's vital, it allows me the freedom to change | |||
| 19 | things as inspiration strikes. | 19 | things as inspiration strikes. |
| 20 | 20 | ||
| 21 | Historically, I've relied on core utilities for spacing, components, and layouts | 21 | Historically, I've relied on core utilities for spacing, components, and layouts |
| 22 | from [[https://getbootstrap.com][Bootstrap]] and added custom CSS for fonts, accents, colors, and other items. | 22 | from [[https://getbootstrap.com][Bootstrap]] and added custom cascading style sheets (CSS) for fonts, accents, |
| 23 | I also tend to create sites with no border radius on items, visible borders, and | 23 | colors, and other items. I also tend to create sites with no border radius on |
| 24 | content that takes up the entire screen (using whitespace inside components | 24 | items, visible borders, and content that takes up the entire screen (using |
| 25 | instead of whitespace around my components). | 25 | whitespace inside components instead of whitespace around my components). |
| 26 | 26 | ||
| 27 | * The Redesign Process | 27 | * The Redesign Process |
| 28 | 28 | ||
| @@ -75,13 +75,13 @@ transferred (22 KB total), and my blog is at 6.5 KB transferred (13 KB total). | |||
| 75 | *That means the redesigned pages are less than 2% the size of the old designs.* | 75 | *That means the redesigned pages are less than 2% the size of the old designs.* |
| 76 | 76 | ||
| 77 | Google Lighthouse ranks the new webpage as 100 in performance, accessibility, | 77 | Google Lighthouse ranks the new webpage as 100 in performance, accessibility, |
| 78 | and best practices, with SEO at 92 since they think tap targets are not sized | 78 | and best practices, with search engine optimization (SEO) at 92 since they think |
| 79 | appropriately for mobile users. First contextual paints of the pages are under | 79 | tap targets are not sized appropriately for mobile users. First contextual |
| 80 | 0.8 seconds with 0 ms of blocking time. However, the blog subdomain ranks at 100 | 80 | paints of the pages are under 0.8 seconds with 0 ms (millisecond) of blocking |
| 81 | for all four categories! First contextual paints of the blog homepage are under | 81 | time. However, the blog subdomain ranks at 100 for all four categories! First |
| 82 | 1.0 seconds with 0 ms of blocking time, due to the fact that the CSS for my blog | 82 | contextual paints of the blog homepage are under 1.0 seconds with 0 ms of |
| 83 | is within a separate CSS file, and the CSS for my main website is simply | 83 | blocking time, due to the fact that the CSS for my blog is within a separate CSS |
| 84 | embedded in the HTML file. | 84 | file, and the CSS for my main website is simply embedded in the HTML file. |
| 85 | 85 | ||
| 86 | Now that everything is complete, I can confidently say I'm happy with the result | 86 | Now that everything is complete, I can confidently say I'm happy with the result |
| 87 | and proud to look at the fastest set of websites I've created so far. | 87 | and proud to look at the fastest set of websites I've created so far. |