Commit 972b15ecc9

972b15ecc9140bc41c0b80bcea7e71a4935cf4d3

parent: 7aef1980b5

Unsigned

cmc <hello@cleberg.net> · 2024-09-02 02:54 UTC

format 2018 to 2020 blog posts

Layout: unified · split

content/blog/2018-11-28-aes-encryption.org +79 −97
@@ -5,121 +5,103 @@
5 5
6* Basic AES 6* Basic AES
7 7
8If you're not familiar with encryption techniques, 8If you're not familiar with encryption techniques, [[https://en.wikipedia.org/wiki/Advanced_Encryption_Standard][AES]] is the *Advanced
9[[https://en.wikipedia.org/wiki/Advanced_Encryption_Standard][AES]] is 9Encryption Standard*. This specification was established by the National
10the *Advanced Encryption Standard*. This specification was established 10Institute of Standards and Technology, sub-selected from the Rijndael family of
11by the National Institute of Standards and Technology, sub-selected from 11ciphers (128, 192, and 256 bits) in 2001. Furthering its popularity and status,
12the Rijndael family of ciphers (128, 192, and 256 bits) in 2001. 12the US government chose AES as their default encryption method for top-secret
13Furthering its popularity and status, the US government chose AES as 13data, removing the previous standard which had been in place since 1977.
14their default encryption method for top-secret data, removing the 14
15previous standard which had been in place since 1977. 15AES has proven to be an extremely safe encryption method, with 7-round and
16 168-round attacks making no material improvements since the release of this
17AES has proven to be an extremely safe encryption method, with 7-round 17encryption standard almost two decades ago.
18and 8-round attacks making no material improvements since the release of
19this encryption standard almost two decades ago.
20 18
21#+begin_quote 19#+begin_quote
22Though many papers have been published on the cryptanalysis of AES, the 20Though many papers have been published on the cryptanalysis of AES, the fastest
23fastest single-key attacks on round-reduced AES variants [20, 33] so far 21single-key attacks on round-reduced AES variants [20, 33] so far are only
24are only slightly more powerful than those proposed 10 years ago 22slightly more powerful than those proposed 10 years ago [23,24].
25[23,24].
26 23
27- [[http://research.microsoft.com/en-us/projects/cryptanalysis/aesbc.pdf][Bogdonav, 24- [[http://research.microsoft.com/en-us/projects/cryptanalysis/aesbc.pdf][Bogdonav, et al.]]
28 et al.]]
29#+end_quote 25#+end_quote
30 26
31* How Secure is AES? 27* How Secure is AES?
32 28
33In theory, AES-256 is non-crackable due to the massive number of 29In theory, AES-256 is non-crackable due to the massive number of combinations
34combinations that can be produced. However, AES-128 is no longer 30that can be produced. However, AES-128 is no longer recommended as a viable
35recommended as a viable implementation to protect important data. 31implementation to protect important data.
36 32
37A semi-short 33A semi-short [[http://www.moserware.com/2009/09/stick-figure-guide-to-advanced.html][comic strip]] from Moserware quickly explains AES for the public to
38[[http://www.moserware.com/2009/09/stick-figure-guide-to-advanced.html][comic 34understand. Basically AES encrypts the data by obscuring the relationship
39strip]] from Moserware quickly explains AES for the public to 35between the data and the encrypted data. Additionally, this method spreads the
40understand. Basically AES encrypts the data by obscuring the 36message out. Lastly, the key produced by AES is the secret to decrypting it.
41relationship between the data and the encrypted data. Additionally, this 37Someone may know the method of AES, but without the key, they are powerless.
42method spreads the message out. Lastly, the key produced by AES is the 38
43secret to decrypting it. Someone may know the method of AES, but without 39To obscure and spread the data out, AES creates a substitution-permutation
44the key, they are powerless. 40network. Wikipedia has a wonderful [[https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/SubstitutionPermutationNetwork2.png/468px-SubstitutionPermutationNetwork2.png][example of an SP network]] available. This
45 41network sends the data through a set of S boxes (using the unique key) to
46To obscure and spread the data out, AES creates a 42substitute the bits with another block of bits. Then, a P box will permutate, or
47substitution-permutation network. Wikipedia has a wonderful 43rearrange, the bits. This is done over and over, with the key being derived from
48[[https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/SubstitutionPermutationNetwork2.png/468px-SubstitutionPermutationNetwork2.png][example 44the last round. For AES, the key size specifies the number of transformation
49of an SP network]] available. This network sends the data through a set
50of S boxes (using the unique key) to substitute the bits with another
51block of bits. Then, a P box will permutate, or rearrange, the bits.
52This is done over and over, with the key being derived from the last
53round. For AES, the key size specifies the number of transformation
54rounds: 10, 12, and 14 rounds for 128-bit, 192-bit, and 256-bit keys, 45rounds: 10, 12, and 14 rounds for 128-bit, 192-bit, and 256-bit keys,
55respectively. 46respectively.
56 47
57* The Process 48* The Process
58 49
591. *KeyExpansion*: Using 501. *KeyExpansion*: Using [[https://en.m.wikipedia.org/wiki/Advanced_Encryption_Standard][Rijndael's key schedule]], the keys are dynamically
60 [[https://en.m.wikipedia.org/wiki/Advanced_Encryption_Standard][Rijndael's 51 generated.
61 key schedule]], the keys are dynamically generated. 522. *AddRoundKey*: Each byte of the data is combined with this key using bitwise
622. *AddRoundKey*: Each byte of the data is combined with this key using 53 xor.
63 bitwise xor. 543. *SubBytes*: This is followed by the substitution of each byte of data.
643. *SubBytes*: This is followed by the substitution of each byte of 554. *ShiftRows*: Then, the final three rows are shifted a certain number of
65 data. 56 steps, dictated by the cipher.
664. *ShiftRows*: Then, the final three rows are shifted a certain number 575. *MixColumns*: After the rows have been shifted, the columns are mixed and
67 of steps, dictated by the cipher. 58 combined.
685. *MixColumns*: After the rows have been shifted, the columns are mixed 59
69 and combined. 60This process does not necessarily stop after one full round. Steps 2 through 5
70 61will repeat for the number of rounds specified by the key. However, the final
71This process does not necessarily stop after one full round. Steps 2 62round excludes the MixColumns step. As you can see, this is a fairly complex
72through 5 will repeat for the number of rounds specified by the key. 63process. One must have a solid understanding of general mathematic principles to
73However, the final round excludes the MixColumns step. As you can see, 64fully understand how the sequence works (and to even attempt to find a
74this is a fairly complex process. One must have a solid understanding of 65weakness).
75general mathematic principles to fully understand how the sequence works 66
76(and to even attempt to find a weakness). 67According to research done by Bogdanov et al., it would take billions of years
77 68to brute force a 126-bit key with current hardware. Additionally, this brute
78According to research done by Bogdanov et al., it would take billions of 69force attack would require storing 2^{88} bits of data! However, there are a few
79years to brute force a 126-bit key with current hardware. Additionally, 70different attacks that have been used to show vulnerabilities with the use of
80this brute force attack would require storing 2^{88} bits of data! 71this technology. Side-channel attacks use inadvertent leaks of data from the
81However, there are a few different attacks that have been used to show 72hardware or software, which can allow attackers to obtain the key or run
82vulnerabilities with the use of this technology. Side-channel attacks 73programs on a user's hardware.
83use inadvertent leaks of data from the hardware or software, which can 74
84allow attackers to obtain the key or run programs on a user's hardware. 75Please note that this is not something you should run out and try to implement
85 76in your =Hello, World!= app after only a few hours of research. While AES
86Please note that this is not something you should run out and try to 77(basically all encryption methods) is extremely efficient in what it does, it
87implement in your =Hello, World!= app after only a few hours of 78takes a lot of time and patience to understand. If you're looking for something
88research. While AES (basically all encryption methods) is extremely 79which currently implements AES, check out the [[https://www.bouncycastle.org/documentation.html][Legion of the Bouncy Castle]] for
89efficient in what it does, it takes a lot of time and patience to 80Java implementations of cryptographic algorithms.
90understand. If you're looking for something which currently implements
91AES, check out the
92[[https://www.bouncycastle.org/documentation.html][Legion of the Bouncy
93Castle]] for Java implementations of cryptographic algorithms.
94 81
95* Why Does Encryption Matter? 82* Why Does Encryption Matter?
96 83
97There are limitless reasons to enable encryption at-rest or in-transit 84There are limitless reasons to enable encryption at-rest or in-transit for
98for various aspects of your digital life. You can research specific 85various aspects of your digital life. You can research specific examples, such
99examples, such as 86as [[https://arstechnica.com/tech-policy/2018/12/australia-passes-new-law-to-thwart-strong-encryption/][Australia passes new law to thwart strong encryption]]. However, I will simply
100[[https://arstechnica.com/tech-policy/2018/12/australia-passes-new-law-to-thwart-strong-encryption/][Australia
101passes new law to thwart strong encryption]]. However, I will simply
102list a few basic reasons to always enable encryption, where feasible: 87list a few basic reasons to always enable encryption, where feasible:
103 88
1041. Privacy is a human right and is recognized as a national right in 891. Privacy is a human right and is recognized as a national right in some
105 some countries (e.g., 90 countries (e.g., [[https://www.law.cornell.edu/wex/fourth_amendment][US Fourth Amendment]]).
106 [[https://www.law.cornell.edu/wex/fourth_amendment][US Fourth 912. "Why not?" Encryption rarely affects performance or speed, so there's usually
107 Amendment]]). 92 not a reason to avoid it in the first place.
1082. "Why not?" Encryption rarely affects performance or speed, so there's 933. Your digital identity and activity (texts, emails, phone calls, online
109 usually not a reason to avoid it in the first place. 94 accounts, etc.) are extremely valuable and can result in terrible
1103. Your digital identity and activity (texts, emails, phone calls, 95 consequences, such as identity theft, if leaked to other parties. Encrypting
111 online accounts, etc.) are extremely valuable and can result in 96 this data prevents such leaks from ruining lives.
112 terrible consequences, such as identity theft, if leaked to other 974. Wiping or factory-resetting does not actually wipe all data from the storage
113 parties. Encrypting this data prevents such leaks from ruining lives. 98 device. There are methods to read data from the physical disks/boards inside
1144. Wiping or factory-resetting does not actually wipe all data from the 99 devices.
115 storage device. There are methods to read data from the physical
116 disks/boards inside devices.
1175. Corporations, governments, and other nefarious groups/individuals are 1005. Corporations, governments, and other nefarious groups/individuals are
118 actively looking for ways to collect personal information about 101 actively looking for ways to collect personal information about anyone they
119 anyone they can. If someone's data is unencrypted, that person may 102 can. If someone's data is unencrypted, that person may become a target due to
120 become a target due to the ease of data collection. 103 the ease of data collection.
121 104
122​*Read More:* 105​*Read More:*
123 106
124- [[http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf][Federal 107- [[http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf][Federal Information Processing Standards Publication 197]]
125 Information Processing Standards Publication 197]]
content/blog/2018-11-28-cpp-compiler.org +46 −53
@@ -5,14 +5,13 @@
5 5
6* A Brief Introduction 6* A Brief Introduction
7 7
8[[https://en.wikipedia.org/wiki/C%2B%2B][C++]] is a general-purpose 8[[https://en.wikipedia.org/wiki/C%2B%2B][C++]] is a general-purpose programming language with object-oriented, generic, and
9programming language with object-oriented, generic, and functional 9functional features in addition to facilities for low-level memory manipulation.
10features in addition to facilities for low-level memory manipulation.
11 10
12The source code, shown in the snippet below, must be compiled before it 11The source code, shown in the snippet below, must be compiled before it can be
13can be executed. There are many steps and intricacies to the compilation 12executed. There are many steps and intricacies to the compilation process, and
14process, and this post was a personal exercise to learn and remember as 13this post was a personal exercise to learn and remember as much information as I
15much information as I can. 14can.
16 15
17#+begin_src cpp 16#+begin_src cpp
18#include <iostream> 17#include <iostream>
@@ -27,24 +26,19 @@ int main()
27 26
28*** An Overview 27*** An Overview
29 28
30Compiling C++ projects is a frustrating task most days. Seemingly 29Compiling C++ projects is a frustrating task most days. Seemingly nonexistent
31nonexistent errors keeping your program from successfully compiling can 30errors keeping your program from successfully compiling can be annoying
32be annoying (especially since you know you wrote it perfectly the first 31(especially since you know you wrote it perfectly the first time, right?).
33time, right?). 32
34 33I'm learning more and more about C++ these days and decided to write this
35I'm learning more and more about C++ these days and decided to write 34concept down so that I can cement it even further in my own head. However, C++
36this concept down so that I can cement it even further in my own head. 35is not the only compiled language. Check out [[https://en.wikipedia.org/wiki/Compiled_language][the Wikipedia entry for compiled
37However, C++ is not the only compiled language. Check out 36languages]] for more examples of compiled languages.
38[[https://en.wikipedia.org/wiki/Compiled_language][the Wikipedia entry 37
39for compiled languages]] for more examples of compiled languages. 38I'll start with a wonderful, graphical way to conceptualize the C++ compiler.
40 39View [[https://web.archive.org/web/20190419035048/http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html][The C++ Compilation Process]] by Kurt MacMahon, an NIU professor, to see the
41I'll start with a wonderful, graphical way to conceptualize the C++ 40graphic and an explanation. The goal of the compilation process is to take the
42compiler. View 41C++ code and produce a shared library, dynamic library, or an executable file.
43[[https://web.archive.org/web/20190419035048/http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html][The
44C++ Compilation Process]] by Kurt MacMahon, an NIU professor, to see the
45graphic and an explanation. The goal of the compilation process is to
46take the C++ code and produce a shared library, dynamic library, or an
47executable file.
48 42
49** Compilation Phases 43** Compilation Phases
50 44
@@ -53,28 +47,27 @@ compiling C++ code.
53 47
54*** Step 1 48*** Step 1
55 49
56The first step is to expand the source code file to meet all 50The first step is to expand the source code file to meet all dependencies. The
57dependencies. The C++ preprocessor includes the code from all the header 51C++ preprocessor includes the code from all the header files, such as =#include
58files, such as =#include <iostream>=. Now, what does that mean? The 52<iostream>=. Now, what does that mean? The previous example includes the
59previous example includes the =iostream= header. This tells the computer 53=iostream= header. This tells the computer that you want to use the =iostream=
60that you want to use the =iostream= standard library, which contains 54standard library, which contains classes and functions written in the core
61classes and functions written in the core language. This specific header 55language. This specific header allows you to manipulate input/output streams.
62allows you to manipulate input/output streams. After all this, you'll 56After all this, you'll end up which a temporary file that contains the expanded
63end up which a temporary file that contains the expanded source code. 57source code.
64 58
65In the example of the C++ code above, the =iostream= class would be 59In the example of the C++ code above, the =iostream= class would be included in
66included in the expanded code. 60the expanded code.
67 61
68*** Step 2 62*** Step 2
69 63
70After the code is expanded, the compiler comes into play. The compiler 64After the code is expanded, the compiler comes into play. The compiler takes the
71takes the C++ code and converts this code into the assembly language, 65C++ code and converts this code into the assembly language, understood by the
72understood by the platform. You can see this in action if you head over 66platform. You can see this in action if you head over to the [[https://godbolt.org][GodBolt Compiler
73to the [[https://godbolt.org][GodBolt Compiler Explorer]], which shows 67Explorer]], which shows C++ being converted into assembly dynamically.
74C++ being converted into assembly dynamically.
75 68
76For example, the =Hello, world!= code snippet above compiles into the 69For example, the =Hello, world!= code snippet above compiles into the following
77following assembly code: 70assembly code:
78 71
79#+begin_src asm 72#+begin_src asm
80.LC0: 73.LC0:
@@ -120,17 +113,17 @@ _GLOBAL__sub_I_main:
120 113
121*** Step 3 114*** Step 3
122 115
123Third, the assembly code generated by the compiler is assembled into the 116Third, the assembly code generated by the compiler is assembled into the object
124object code for the platform. Essentially, this is when the compiler 117code for the platform. Essentially, this is when the compiler takes the assembly
125takes the assembly code and assembles it into machine code in a binary 118code and assembles it into machine code in a binary format. After researching
126format. After researching this online, I figured out that a lot of 119this online, I figured out that a lot of compilers will allow you to stop
127compilers will allow you to stop compilation at this step. This would be 120compilation at this step. This would be useful for compiling each source code
128useful for compiling each source code file separately. This saves time 121file separately. This saves time later if a single file changes; only that file
129later if a single file changes; only that file needs to be recompiled. 122needs to be recompiled.
130 123
131*** Step 4 124*** Step 4
132 125
133Finally, the object code file generated by the assembler is linked 126Finally, the object code file generated by the assembler is linked together with
134together with the object code files for any library functions used to 127the object code files for any library functions used to produce a shared
135produce a shared library, dynamic library, or an executable file. It 128library, dynamic library, or an executable file. It replaces all references to
136replaces all references to undefined symbols with the correct addresses. 129undefined symbols with the correct addresses.
content/blog/2019-01-07-useful-css.org +50 −61
@@ -5,35 +5,31 @@
5 5
6* Introduction to CSS 6* Introduction to CSS
7 7
8[[https://en.wikipedia.org/wiki/CSS][CSS]], the language used to markup 8[[https://en.wikipedia.org/wiki/CSS][CSS]], the language used to markup HTML code and make it "pretty", is one of the
9HTML code and make it "pretty", is one of the most effective ways to 9most effective ways to increase the attractiveness of a website. It can also
10increase the attractiveness of a website. It can also lead to increased 10lead to increased user engagement, retention, and satisfaction. In fact, there
11user engagement, retention, and satisfaction. In fact, there are whole 11are whole career fields are dedicated to the improvement of user experiences,
12career fields are dedicated to the improvement of user experiences,
13known as UI design and UX design. 12known as UI design and UX design.
14 13
15Some web developers are used to the common CSS properties, such as 14Some web developers are used to the common CSS properties, such as element
16element sizing, fonts, colors, etc., but are not as well versed in 15sizing, fonts, colors, etc., but are not as well versed in less-used properties
17less-used properties and values such as =flexbox=, =clip-path=, and 16and values such as =flexbox=, =clip-path=, and =transform=. This article will
18=transform=. This article will provide some insight into the less-used 17provide some insight into the less-used and unique CSS properties.
19and unique CSS properties.
20 18
21* CSS Variables 19* CSS Variables
22 20
23The first topic today is CSS variables. Variables are not often used by 21The first topic today is CSS variables. Variables are not often used by smaller
24smaller developers. CSS variables allow you to give your website a 22developers. CSS variables allow you to give your website a well-defined
25well-defined structure, where you can easily reuse CSS properties 23structure, where you can easily reuse CSS properties throughout the project.
26throughout the project.
27 24
28You can use variables to define things, such as color palettes. Then, 25You can use variables to define things, such as color palettes. Then, you can
29you can use these colors for backgrounds anywhere else in the HTML. This 26use these colors for backgrounds anywhere else in the HTML. This could be
30could be extended, where extra variables could be defined for 27extended, where extra variables could be defined for =primary-text=,
31=primary-text=, =quoted-text=, etc. Variables can also be used to define 28=quoted-text=, etc. Variables can also be used to define spacing (e.g. =32px= or
32spacing (e.g. =32px= or =2rem=), which can then be applied to margins, 29=2rem=), which can then be applied to margins, padding, font sizes, and more.
33padding, font sizes, and more.
34 30
35For example, here are some variables defined at the root of the website, 31For example, here are some variables defined at the root of the website, which
36which allows for any subsequent CSS rules to use those variables: 32allows for any subsequent CSS rules to use those variables:
37 33
38#+begin_src css 34#+begin_src css
39:root { 35:root {
@@ -49,23 +45,21 @@ body {
49 45
50* CSS Box Shadows 46* CSS Box Shadows
51 47
52Box shadows were once my mortal enemy. No matter how hard I tried, I 48Box shadows were once my mortal enemy. No matter how hard I tried, I just
53just couldn't get them to work how I wanted. Because of this, my 49couldn't get them to work how I wanted. Because of this, my favorite discovery
54favorite discovery has been CSSMatic's 50has been CSSMatic's [[https://www.cssmatic.com/box-shadow][box shadow generator]]. It provides an excellent tool to
55[[https://www.cssmatic.com/box-shadow][box shadow generator]]. It 51generate box shadows using their simple sliders. Surprisingly, this is the
56provides an excellent tool to generate box shadows using their simple 52reason I learned how box shadows work! You can use the sliders and watch how the
57sliders. Surprisingly, this is the reason I learned how box shadows 53CSS code changes in the image that is displayed. Through this, you should
58work! You can use the sliders and watch how the CSS code changes in the 54understand that the basic structure for box shadows is:
59image that is displayed. Through this, you should understand that the
60basic structure for box shadows is:
61 55
62#+begin_src css 56#+begin_src css
63box-shadow: inset horizontal vertical blur spread color; 57box-shadow: inset horizontal vertical blur spread color;
64#+end_src 58#+end_src
65 59
66Now, let's look at some basic examples! You can copy and paste the 60Now, let's look at some basic examples! You can copy and paste the following
67following code into a site like CodePen or your own HTML files. Feel 61code into a site like CodePen or your own HTML files. Feel free to play around
68free to play around with the code, experiment, and learn. 62with the code, experiment, and learn.
69 63
70*Box Shadow #1* 64*Box Shadow #1*
71 65
@@ -121,22 +115,20 @@ free to play around with the code, experiment, and learn.
121} 115}
122#+end_src 116#+end_src
123 117
124Try these box shadows out on your own and see how changing each shadow 118Try these box shadows out on your own and see how changing each shadow value
125value works. 119works.
126 120
127* CSS Flexbox 121* CSS Flexbox
128 122
129Now, let's move on to the best part of this article: flexbox. The 123Now, let's move on to the best part of this article: flexbox. The flexbox is by
130flexbox is by far my favorite new toy. I originally stumbled across this 124far my favorite new toy. I originally stumbled across this solution after
131solution after looking for more efficient ways of centering content 125looking for more efficient ways of centering content horizontally AND
132horizontally AND vertically. I had used a few hack-ish methods before, 126vertically. I had used a few hack-ish methods before, but flexbox throws those
133but flexbox throws those out the window. The best part of it all is that 127out the window. The best part of it all is that flexbox is /dead simple/.
134flexbox is /dead simple/.
135 128
136Flexbox pertains to the parent div of any element. You want the parent 129Flexbox pertains to the parent div of any element. You want the parent to be the
137to be the flexbox in which items are arranged to use the flex methods. 130flexbox in which items are arranged to use the flex methods. It's easier to see
138It's easier to see this in action that explained, so let's see an 131this in action that explained, so let's see an example.
139example.
140 132
141*Flexbox* 133*Flexbox*
142 134
@@ -171,24 +163,21 @@ example.
171} 163}
172#+end_src 164#+end_src
173 165
174You may notice that we no longer need to use the =top= property for the 166You may notice that we no longer need to use the =top= property for the =h3=
175=h3= elements in our code. This is because we set the display box to be 167elements in our code. This is because we set the display box to be a flex
176a flex container for the small boxes, AND we made the small boxes flex 168container for the small boxes, AND we made the small boxes flex containers for
177containers for their elements (the h3 tags). Flex boxes can be nested 169their elements (the h3 tags). Flex boxes can be nested like this to center
178like this to center content that is inside centered content. 170content that is inside centered content.
179 171
180For the example above, we designated the =justify-content= property to 172For the example above, we designated the =justify-content= property to be
181be =flex-start= so that the boxes stack from the left side of the 173=flex-start= so that the boxes stack from the left side of the screen. This
182screen. This property can be changed to =center= to make the boxes 174property can be changed to =center= to make the boxes appear in the center of
183appear in the center of the screen. 175the screen.
184 176
185For an interactive example, 177For an interactive example, [[https://codepen.io/LandonSchropp/pen/KpzzGo][check out this CodePen]] from [[https://codepen.io/LandonSchropp/][LandonScropp]]. Resize the
186[[https://codepen.io/LandonSchropp/pen/KpzzGo][check out this CodePen]]
187from [[https://codepen.io/LandonSchropp/][LandonScropp]]. Resize the
188window with dice to see how they collapse and re-align. 178window with dice to see how they collapse and re-align.
189 179
190* Even More CSS 180* Even More CSS
191 181
192For more inspiration, you can visit [[https://www.codepen.io][CodePen]], 182For more inspiration, you can visit [[https://www.codepen.io][CodePen]], [[https://dribbble.com][Dribbble]], or [[https://uimovement.com][UI Movement]] to browse
193[[https://dribbble.com][Dribbble]], or [[https://uimovement.com][UI 183the collections of many amazing web designers.
194Movement]] to browse the collections of many amazing web designers.
content/blog/2019-09-09-audit-analytics.org +142 −160
@@ -5,107 +5,99 @@
5 5
6* What Are Data Analytics? 6* What Are Data Analytics?
7 7
8A quick aside before I dive into this post: =data analytics= is a vague 8A quick aside before I dive into this post: =data analytics= is a vague term
9term that has become popular in recent years. Think of a =data analytic= 9that has become popular in recent years. Think of a =data analytic= as the
10as the output of any data analysis you perform. For example, a pivot 10output of any data analysis you perform. For example, a pivot table or a pie
11table or a pie chart could be a data analytic. 11chart could be a data analytic.
12 12
13[[https://en.wikipedia.org/wiki/Data_analysis][Data analysis]] is a 13[[https://en.wikipedia.org/wiki/Data_analysis][Data analysis]] is a process that utilizes statistics and other mathematical
14process that utilizes statistics and other mathematical methods to 14methods to discover useful information within datasets. This involves examining,
15discover useful information within datasets. This involves examining, 15cleaning, transforming, and modeling data so that you can use the data to
16cleaning, transforming, and modeling data so that you can use the data 16support an opinion, create more useful viewpoints, and gain knowledge to
17to support an opinion, create more useful viewpoints, and gain knowledge 17implement into audit planning or risk assessments.
18to implement into audit planning or risk assessments. 18
19 19One of the common mistakes that managers (and anyone new to the process) make is
20One of the common mistakes that managers (and anyone new to the process) 20assuming that everything involved with this process is "data analytics". In
21make is assuming that everything involved with this process is "data 21fact, data analytics are only a small part of the process.
22analytics". In fact, data analytics are only a small part of the 22
23process. 23See *Figure 1* for a more accurate representation of where data analysis sits
24 24within the full process. This means that data analysis does not include querying
25See *Figure 1* for a more accurate representation of where data analysis 25or extracting data, selecting samples, or performing audit tests. These steps
26sits within the full process. This means that data analysis does not 26can be necessary for an audit (and may even be performed by the same
27include querying or extracting data, selecting samples, or performing 27associates), but they are not data analytics.
28audit tests. These steps can be necessary for an audit (and may even be
29performed by the same associates), but they are not data analytics.
30 28
31* Current Use of Analytics in Auditing 29* Current Use of Analytics in Auditing
32 30
33While data analysis has been an integral part of most businesses and 31While data analysis has been an integral part of most businesses and departments
34departments for the better part of the last century, only recently have 32for the better part of the last century, only recently have internal audit
35internal audit functions been adopting this practice. The internal audit 33functions been adopting this practice. The internal audit function works
36function works exclusively to provide assurance and consulting services 34exclusively to provide assurance and consulting services to the business areas
37to the business areas within the firm (except for internal auditing 35within the firm (except for internal auditing firms who are hired by different
38firms who are hired by different companies to perform their roles). 36companies to perform their roles).
39 37
40#+begin_quote 38#+begin_quote
41Internal Auditing helps an organization accomplish its objectives by 39Internal Auditing helps an organization accomplish its objectives by bringing a
42bringing a systematic, disciplined approach to evaluate and improve the 40systematic, disciplined approach to evaluate and improve the effectiveness of
43effectiveness of risk management, control and governance processes. 41risk management, control and governance processes.
44 42
45- The IIA's Definition of Internal Audit 43- The IIA's Definition of Internal Audit
46#+end_quote 44#+end_quote
47 45
48Part of the blame for the slow adoption of data analysis can be 46Part of the blame for the slow adoption of data analysis can be attributed to
49attributed to the fact that internal auditing is strongly based on 47the fact that internal auditing is strongly based on tradition and following the
50tradition and following the precedents set by previous auditors. 48precedents set by previous auditors. However, there can be no progress without
51However, there can be no progress without auditors who are willing to 49auditors who are willing to break the mold and test new audit techniques. In
52break the mold and test new audit techniques. In fact, as of 2018, 50fact, as of 2018, [[https://www.cpapracticeadvisor.com/accounting-audit/news/12404086/internal-audit-groups-are-lagging-in-data-analytics][only 63% of internal audit departments currently utilize data
53[[https://www.cpapracticeadvisor.com/accounting-audit/news/12404086/internal-audit-groups-are-lagging-in-data-analytics][only 51analytics]] in North America. This number should be as close as possible to 100%.
5463% of internal audit departments currently utilize data analytics]] in 52I have never been part of an audit that would not have benefited from data
55North America. This number should be as close as possible to 100%. I
56have never been part of an audit that would not have benefited from data
57analytics. 53analytics.
58 54
59So, how do internal audit functions remedy this situation? It's 55So, how do internal audit functions remedy this situation? It's definitely not
60definitely not as easy as walking into work on Monday and telling your 56as easy as walking into work on Monday and telling your Chief Audit Executive
61Chief Audit Executive that you're going to start implementing analytics 57that you're going to start implementing analytics in the next audit. You need a
62in the next audit. You need a plan and a system to make the analysis 58plan and a system to make the analysis process as effective as possible.
63process as effective as possible.
64 59
65* The DELTA Model 60* The DELTA Model
66 61
67One of the easiest ways to experiment with data analytics and gain an 62One of the easiest ways to experiment with data analytics and gain an
68understanding of the processes is to implement them within your own 63understanding of the processes is to implement them within your own department.
69department. But how do we do this if we've never worked with analysis 64But how do we do this if we've never worked with analysis before? One of the
70before? One of the most common places to start is to research some data 65most common places to start is to research some data analysis models currently
71analysis models currently available. For this post, we'll take a look at 66available. For this post, we'll take a look at the DELTA model. You can take a
72the DELTA model. You can take a look at *Figure 2* for a quick overview 67look at *Figure 2* for a quick overview of the model.
73of the model.
74 68
75The DELTA model sets a few guidelines for areas wanting to implement 69The DELTA model sets a few guidelines for areas wanting to implement data
76data analytics so that the results can be as comprehensive as possible: 70analytics so that the results can be as comprehensive as possible:
77 71
78- *Data*: Must be clean, accessible, and (usually) unique. 72- *Data*: Must be clean, accessible, and (usually) unique.
79- *Enterprise-Wide Focus*: Key data systems and analytical resources 73- *Enterprise-Wide Focus*: Key data systems and analytical resources must be
80 must be available for use (by the Internal Audit Function). 74 available for use (by the Internal Audit Function).
81- *Leaders*: Must promote a data analytics approach and show the value 75- *Leaders*: Must promote a data analytics approach and show the value of
82 of analytical results. 76 analytical results.
83- *Targets*: Must be set for key areas and risks that the analytics can 77- *Targets*: Must be set for key areas and risks that the analytics can be
84 be compared against (KPIs). 78 compared against (KPIs).
85- *Analysts*: There must be auditors willing and able to perform data 79- *Analysts*: There must be auditors willing and able to perform data analytics
86 analytics or else the system cannot be sustained. 80 or else the system cannot be sustained.
87 81
88* Finding the Proper KPIs 82* Finding the Proper KPIs
89 83
90Once the Internal Audit Function has decided that they want to start 84Once the Internal Audit Function has decided that they want to start using data
91using data analytics internally and have ensured they're properly set up 85analytics internally and have ensured they're properly set up to do so, they
92to do so, they need to figure out what they will be testing against. Key 86need to figure out what they will be testing against. Key Performance Indicators
93Performance Indicators (KPIs) are qualitative or quantitative factors 87(KPIs) are qualitative or quantitative factors that can be evaluated and
94that can be evaluated and assessed to determine if the department is 88assessed to determine if the department is performing well, usually compared to
95performing well, usually compared to historical or industry benchmarks. 89historical or industry benchmarks. Once KPIs have been agreed upon and set,
96Once KPIs have been agreed upon and set, auditors can use data analytics 90auditors can use data analytics to assess and report on these KPIs. This allows
97to assess and report on these KPIs. This allows the person performing 91the person performing the analytics the freedom to express opinions on the
98the analytics the freedom to express opinions on the results, whereas 92results, whereas the results are ambiguous if no KPIs exist.
99the results are ambiguous if no KPIs exist. 93
100 94It should be noted that tracking KPIs in the department can help ensure you have
101It should be noted that tracking KPIs in the department can help ensure 95a rigorous Quality Assurance and Improvement Program (QAIP) in accordance with
102you have a rigorous Quality Assurance and Improvement Program (QAIP) in 96some applicable standards, such as IPPF Standard 1300.
103accordance with some applicable standards, such as IPPF Standard 1300.
104 97
105#+begin_quote 98#+begin_quote
106The chief audit executive must develop and maintain a quality assurance 99The chief audit executive must develop and maintain a quality assurance and
107and improvement program that covers all aspects of the internal audit 100improvement program that covers all aspects of the internal audit activity.
108activity.
109 101
110- IPPF Standard 1300 102- IPPF Standard 1300
111#+end_quote 103#+end_quote
@@ -113,38 +105,36 @@ activity.
113Additionally, IPPF Standard 2060 discusses reporting: 105Additionally, IPPF Standard 2060 discusses reporting:
114 106
115#+begin_quote 107#+begin_quote
116The chief audit executive must report periodically to senior management 108The chief audit executive must report periodically to senior management and the
117and the board on the internal audit activity's purpose, authority, 109board on the internal audit activity's purpose, authority, responsibility, and
118responsibility, and performance relative to its plan and on its 110performance relative to its plan and on its conformance with the Code of Ethics
119conformance with the Code of Ethics and the Standards. Reporting must 111and the Standards. Reporting must also include significant risk and control
120also include significant risk and control issues, including fraud risks, 112issues, including fraud risks, governance issues, and other matters that require
121governance issues, and other matters that require the attention of 113the attention of senior management and/or the board.
122senior management and/or the board.
123 114
124- IPPF Standard 2060 115- IPPF Standard 2060
125#+end_quote 116#+end_quote
126 117
127The hardest part of finding KPIs is to determine which KPIs are 118The hardest part of finding KPIs is to determine which KPIs are appropriate for
128appropriate for your department. Since every department is different and 119your department. Since every department is different and has different goals,
129has different goals, KPIs will vary drastically between companies. To 120KPIs will vary drastically between companies. To give you an idea of where to
130give you an idea of where to look, here are some ideas I came up with 121look, here are some ideas I came up with when discussing the topic with a few
131when discussing the topic with a few colleagues. 122colleagues.
132 123
133- Efficiency/Budgeting: 124- Efficiency/Budgeting:
134 - Audit hours to staff utilization ratio (annual hours divided by 125 - Audit hours to staff utilization ratio (annual hours divided by total annual
135 total annual work hours). 126 work hours).
136 - Audit hours compared to the number of audits completed. 127 - Audit hours compared to the number of audits completed.
137 - Time between audit steps or to complete the whole audit. E.g., time 128 - Time between audit steps or to complete the whole audit. E.g., time from
138 from fieldwork completion to audit report issuance. 129 fieldwork completion to audit report issuance.
139- Reputation: 130- Reputation:
140 - The frequency that management has requested the services of the IAF. 131 - The frequency that management has requested the services of the IAF.
141 - Management, audit committee, or external audit satisfaction survey 132 - Management, audit committee, or external audit satisfaction survey results.
142 results. 133 - Education, experience, certifications, tenure, and training of the auditors
143 - Education, experience, certifications, tenure, and training of the 134 on staff.
144 auditors on staff.
145- Quality: 135- Quality:
146 - Number and frequency of audit findings. Assign monetary or numerical 136 - Number and frequency of audit findings. Assign monetary or numerical values,
147 values, if possible. 137 if possible.
148 - Percentage of recommendations issued and implemented. 138 - Percentage of recommendations issued and implemented.
149- Planning: 139- Planning:
150 - Percentage or number of key risks audited per year or per audit. 140 - Percentage or number of key risks audited per year or per audit.
@@ -152,69 +142,61 @@ when discussing the topic with a few colleagues.
152 142
153* Data Analysis Tools 143* Data Analysis Tools
154 144
155Finally, to be able to analyze and report on the data analysis, auditors 145Finally, to be able to analyze and report on the data analysis, auditors need to
156need to evaluate the tools at their disposal. There are many options 146evaluate the tools at their disposal. There are many options available, but a
157available, but a few of the most common ones can easily get the job 147few of the most common ones can easily get the job done. For example, almost
158done. For example, almost every auditor already has access to Microsoft 148every auditor already has access to Microsoft Excel. Excel is more powerful than
159Excel. Excel is more powerful than most people give it credit for and 149most people give it credit for and can accomplish a lot of basic statistics
160can accomplish a lot of basic statistics without much work. If you don't 150without much work. If you don't know a lot about statistics but still want to
161know a lot about statistics but still want to see some of the more basic 151see some of the more basic results, Excel is a great option.
162results, Excel is a great option. 152
163 153To perform more in-depth statistical analysis or to explore large datasets that
164To perform more in-depth statistical analysis or to explore large 154Excel cannot handle, auditors will need to explore other options. The big three
165datasets that Excel cannot handle, auditors will need to explore other 155that have had a lot of success in recent years are Python, R, and ACL. ACL can
166options. The big three that have had a lot of success in recent years 156be used as either a graphical tool (point and click) or as a scripting tool,
167are Python, R, and ACL. ACL can be used as either a graphical tool 157where the auditor must write the scripts manually. Python and the R-language are
168(point and click) or as a scripting tool, where the auditor must write 158solely scripting languages.
169the scripts manually. Python and the R-language are solely scripting 159
170languages. 160The general trend in the data analytics environment is that if the tool allows
171 161you to do everything by clicking buttons or dragging elements, you won't be able
172The general trend in the data analytics environment is that if the tool 162to fully utilize the analytics you need. The most robust solutions are created
173allows you to do everything by clicking buttons or dragging elements, 163by those who understand how to write the scripts manually. It should be noted
174you won't be able to fully utilize the analytics you need. The most 164that as the utility of a tool increases, it usually means that the learning
175robust solutions are created by those who understand how to write the 165curve for that tool will also be higher. It will take auditors longer to learn
176scripts manually. It should be noted that as the utility of a tool 166how to utilize Python, R, or ACL versus learning how to utilize Excel.
177increases, it usually means that the learning curve for that tool will
178also be higher. It will take auditors longer to learn how to utilize
179Python, R, or ACL versus learning how to utilize Excel.
180 167
181* Visualization 168* Visualization
182 169
183Once an auditor has finally found the right data, KPIs, and tools, they 170Once an auditor has finally found the right data, KPIs, and tools, they must
184must report these results so that actions can be taken. Performing 171report these results so that actions can be taken. Performing in-depth data
185in-depth data analysis is only useful if the results are understood by 172analysis is only useful if the results are understood by the audiences of the
186the audiences of the data. The best way to create this understanding is 173data. The best way to create this understanding is to visualize the results of
187to visualize the results of the data. Let's take a look at some of the 174the data. Let's take a look at some of the best options to visualize and report
188best options to visualize and report the results you've found. 175the results you've found.
189 176
190Some of the most popular commercial tools for visualization are 177Some of the most popular commercial tools for visualization are Microsoft
191Microsoft PowerBI and Tableau Desktop. However, other tools exist such 178PowerBI and Tableau Desktop. However, other tools exist such as JMP, Plotly,
192as JMP, Plotly, Qlikview, Alteryx, or D3. Some require commercial 179Qlikview, Alteryx, or D3. Some require commercial licenses while others are
193licenses while others are simply free to use. For corporate data, you 180simply free to use. For corporate data, you may want to make sure that the tool
194may want to make sure that the tool does not communicate any of the data 181does not communicate any of the data outside the company (such as cloud
195outside the company (such as cloud storage). I won't be going into depth 182storage). I won't be going into depth on any of these tools since visualization
196on any of these tools since visualization is largely a subjective and 183is largely a subjective and creative experience, but remember to constantly
197creative experience, but remember to constantly explore new options as 184explore new options as you repeat the process.
198you repeat the process. 185
199 186Lastly, let's take a look at an example of data visualization. This example
200Lastly, let's take a look at an example of data visualization. This 187comes from a [[https://talent.works/2018/03/28/the-science-of-the-job-search-part-iii-61-of-entry-level-jobs-require-3-years-of-experience/][blog post written by Kushal Chakrabarti]] in 2018 about the percent
201example comes from a 188of entry-level US jobs that require experience. *Figure 3* shows us an
202[[https://talent.works/2018/03/28/the-science-of-the-job-search-part-iii-61-of-entry-level-jobs-require-3-years-of-experience/][blog 189easy-to-digest picture of the data. We can quickly tell that only about 12.5% of
203post written by Kushal Chakrabarti]] in 2018 about the percent of 190entry-level jobs don't require experience.
204entry-level US jobs that require experience. *Figure 3* shows us an 191
205easy-to-digest picture of the data. We can quickly tell that only about 192This is the kind of result that easily describes the data for you. However, make
20612.5% of entry-level jobs don't require experience. 193sure to include an explanation of what the results mean. Don't let the reader
207 194assume what the data means, especially if it relates to a complex subject. /Tell
208This is the kind of result that easily describes the data for you. 195a story/ about the data and why the results matter.
209However, make sure to include an explanation of what the results mean.
210Don't let the reader assume what the data means, especially if it
211relates to a complex subject. /Tell a story/ about the data and why the
212results matter.
213 196
214* Wrap-Up 197* Wrap-Up
215 198
216While this is not an all-encompassing program that you can just adopt 199While this is not an all-encompassing program that you can just adopt into your
217into your department, it should be enough to get anyone started on the 200department, it should be enough to get anyone started on the process of
218process of understanding and implementing data analytics. Always 201understanding and implementing data analytics. Always remember to continue
219remember to continue learning and exploring new options as your 202learning and exploring new options as your processes grow and evolve.
220processes grow and evolve.
content/blog/2019-12-03-the-ansoff-matrix.org +83 −95
@@ -5,118 +5,106 @@
5 5
6* Overview 6* Overview
7 7
8As the world of business evolves, managers must approach business 8As the world of business evolves, managers must approach business planning and
9planning and strategy with a contemporary mindset. According to Dess, 9strategy with a contemporary mindset. According to Dess, McNamara, Eisner, and
10McNamara, Eisner, and Lee, managers must be willing to adapt to the 10Lee, managers must be willing to adapt to the modern business environment by
11modern business environment by going beyond "'incremental management', 11going beyond "'incremental management', whereby they view their job as making a
12whereby they view their job as making a series of small, minor changes 12series of small, minor changes to improve the efficiency of the firm's
13to improve the efficiency of the firm's operations"(2019). 13operations"(2019).
14 14
15One reason that strategic management is crucial is because most 15One reason that strategic management is crucial is because most businesses that
16businesses that fail in the United States each year fail due to a lack 16fail in the United States each year fail due to a lack of strategic focus or
17of strategic focus or direction(2019). The rate of failure for 17direction(2019). The rate of failure for businesses with poor strategies shows
18businesses with poor strategies shows that strategic planning and 18that strategic planning and management are crucial to a business's strength and
19management are crucial to a business's strength and longevity, injecting 19longevity, injecting the critical factors of growth and direction into a
20the critical factors of growth and direction into a company's business 20company's business plan.
21plan. 21
22 22One of the most significant strategic planning and management frameworks that
23One of the most significant strategic planning and management frameworks 23companies can use is the [[https://en.wikipedia.org/wiki/Ansoff_matrix][Ansoff Matrix]]. While this framework has unique purposes
24that companies can use is the 24and use-cases, it can effectively help an organization grow and compete.
25[[https://en.wikipedia.org/wiki/Ansoff_matrix][Ansoff Matrix]]. While 25Specifically, the Ansoff matrix is one of the most effective frameworks for
26this framework has unique purposes and use-cases, it can effectively 26companies who want to focus on increasing sales revenue or profitability(2019).
27help an organization grow and compete. Specifically, the Ansoff matrix 27
28is one of the most effective frameworks for companies who want to focus 28This framework uses a two-by-two figure to show the four strategic options for
29on increasing sales revenue or profitability(2019). 29companies to use in this framework: market penetration, market development,
30 30product development, and diversification (see *Figure 1*). The x-axis of the
31This framework uses a two-by-two figure to show the four strategic 31matrix focuses on the firm's markets and also determines if the firm is looking
32options for companies to use in this framework: market penetration, 32to enter new markets or innovate in its current markets. The y-axis of the
33market development, product development, and diversification (see 33matrix focuses on the firm's products and determines if the firm wants to pursue
34*Figure 1*). The x-axis of the matrix focuses on the firm's markets and 34strategies around their existing products or explore new products.
35also determines if the firm is looking to enter new markets or innovate
36in its current markets. The y-axis of the matrix focuses on the firm's
37products and determines if the firm wants to pursue strategies around
38their existing products or explore new products.
39 35
40* Strategic Options 36* Strategic Options
41 37
42** Market Penetration 38** Market Penetration
43 39
44The most straightforward strategy in the Ansoff matrix is to focus on 40The most straightforward strategy in the Ansoff matrix is to focus on existing
45existing products in existing markets, also known as market 41products in existing markets, also known as market penetration(2019). Companies
46penetration(2019). Companies such as Coca-Cola have used market 42such as Coca-Cola have used market penetration successfully by investing a lot
47penetration successfully by investing a lot of money to get further 43of money to get further value out of their current markets. Coca-Cola does this
48value out of their current markets. Coca-Cola does this by introducing 44by introducing new features such as Christmas-themed bottles, personal names on
49new features such as Christmas-themed bottles, personal names on the 45the bottles, and other marketing schemes.
50bottles, and other marketing schemes.
51 46
52** Market Development 47** Market Development
53 48
54Market development extends existing products into new markets in an 49Market development extends existing products into new markets in an attempt to
55attempt to increase the number of buyers. One interesting way that 50increase the number of buyers. One interesting way that Coca-Cola used this
56Coca-Cola used this strategy comes from the stigma that Diet Coke is a 51strategy comes from the stigma that Diet Coke is a woman's drink(2019).
57woman's drink(2019). Coca-Cola introduced Coca-Cola Zero, which 52Coca-Cola introduced Coca-Cola Zero, which contained the same nutritional
58contained the same nutritional content as Diet Coke, but was packaged in 53content as Diet Coke, but was packaged in a dark black can to appear more
59a dark black can to appear more "manly"(2019). 54"manly"(2019).
60 55
61** Product Development 56** Product Development
62 57
63Product development uses existing markets to introduce new products so 58Product development uses existing markets to introduce new products so that the
64that the firm can better meet customer needs(2019). The extreme end of 59firm can better meet customer needs(2019). The extreme end of diversification is
65diversification is home to companies such as Johnson & Johnson, a 60home to companies such as Johnson & Johnson, a healthcare company that has
66healthcare company that has developed a business portfolio of more than 61developed a business portfolio of more than 60,000 different products(2019).
6760,000 different products(2019). Johnson & Johnson's dedication to 62Johnson & Johnson's dedication to continuous diversification has led them to a
68continuous diversification has led them to a balance sheet rating of 63balance sheet rating of "AAA", industry recognition for diversification, and
69"AAA", industry recognition for diversification, and increases in their 64increases in their investor dividends for 57 consecutive years(2019).
70investor dividends for 57 consecutive years(2019).
71 65
72** Related Diversification 66** Related Diversification
73 67
74Diversification, the final strategy of the Ansoff Matrix, is more 68Diversification, the final strategy of the Ansoff Matrix, is more difficult than
75difficult than the others since it involves exploring both new markets 69the others since it involves exploring both new markets and new products.
76and new products. Related diversification is a diversification strategy 70Related diversification is a diversification strategy that closely relates to
77that closely relates to the firm's core business. Coca-Cola's best 71the firm's core business. Coca-Cola's best example of related diversification is
78example of related diversification is its acquisition of Glaceau and 72its acquisition of Glaceau and Vitamin Water, which expanded their drinking
79Vitamin Water, which expanded their drinking lines of business(2019). 73lines of business(2019).
80 74
81** Unrelated Diversification 75** Unrelated Diversification
82 76
83Unrelated diversification is a diversification strategy that does not 77Unrelated diversification is a diversification strategy that does not really
84really relate to the firm's core business but still diversifies their 78relate to the firm's core business but still diversifies their business
85business portfolio. A good example of this would be a coffee company who 79portfolio. A good example of this would be a coffee company who has decided to
86has decided to enter the market for bicycle sales. The main purpose of 80enter the market for bicycle sales. The main purpose of this strategy is to an
87this strategy is to an extremely diverse company that will not go 81extremely diverse company that will not go bankrupt if one market goes through
88bankrupt if one market goes through difficult times. However, this 82difficult times. However, this requires a lot of independent skills and heavy
89requires a lot of independent skills and heavy investments since the 83investments since the company most likely cannot easily transfer knowledge
90company most likely cannot easily transfer knowledge between the markets 84between the markets they compete in.
91they compete in.
92 85
93* Requirements for Success 86* Requirements for Success
94 87
95To use the Ansoff Matrix framework, managers need to formulate corporate 88To use the Ansoff Matrix framework, managers need to formulate corporate goals
96goals and objectives. Without goals and direction, management frameworks 89and objectives. Without goals and direction, management frameworks do not
97do not present much practical utility. Further, the Ansoff Matrix 90present much practical utility. Further, the Ansoff Matrix requires the managers
98requires the managers involved to make tactical decisions and create a 91involved to make tactical decisions and create a path for the company to take
99path for the company to take toward their goals. Lastly, both the Ansoff 92toward their goals. Lastly, both the Ansoff Matrix needs to consider both
100Matrix needs to consider both internal and external perspectives 93internal and external perspectives throughout the strategy formulation process.
101throughout the strategy formulation process. 94
102 95One interesting probability is that companies will be using multiple strategic
103One interesting probability is that companies will be using multiple 96planning and management frameworks at the same time. While this may sound like
104strategic planning and management frameworks at the same time. While 97it could crowd the management process, there are numerous reasons to do so. For
105this may sound like it could crowd the management process, there are 98example, the Ansoff Matrix and the Balanced Scorecard are relatively popular,
106numerous reasons to do so. For example, the Ansoff Matrix and the 99and they cover entirely different parts of a company's strategy. Using the
107Balanced Scorecard are relatively popular, and they cover entirely 100results from the Balanced Scorecard could inform a company of the potential
108different parts of a company's strategy. Using the results from the 101product and market demands, such as from customer or supplier survey results, to
109Balanced Scorecard could inform a company of the potential product and 102help the company determine which Ansoff Matrix strategy to pursue. However, a
110market demands, such as from customer or supplier survey results, to 103combined approach at this level would require mature frameworks and focused
111help the company determine which Ansoff Matrix strategy to pursue. 104managers who are able to strategize at a high level.
112However, a combined approach at this level would require mature 105
113frameworks and focused managers who are able to strategize at a high 106Lastly, it should be noted that the author of the Ansoff matrix, Igor Ansoff,
114level. 107often used the term [[https://en.wikipedia.org/wiki/Analysis_paralysis][paralysis by analysis]] to explain the mistake of companies
115 108who overuse analysis and spend too much time planning. Companies need to
116Lastly, it should be noted that the author of the Ansoff matrix, Igor 109understand the utility of a strategic management framework while ensuring that
117Ansoff, often used the term 110the company is poised to execute as efficiently as they have planned.
118[[https://en.wikipedia.org/wiki/Analysis_paralysis][paralysis by
119analysis]] to explain the mistake of companies who overuse analysis and
120spend too much time planning. Companies need to understand the utility
121of a strategic management framework while ensuring that the company is
122poised to execute as efficiently as they have planned.
content/blog/2019-12-16-password-security.org +74 −92
@@ -7,121 +7,103 @@
7 7
8** Why Does It Matter? 8** Why Does It Matter?
9 9
10Information security, including passwords and identities, has become one 10Information security, including passwords and identities, has become one of the
11of the most important digital highlights of the last decade. With 11most important digital highlights of the last decade. With [[https://www.usatoday.com/story/money/2018/12/28/data-breaches-2018-billions-hit-growing-number-cyberattacks/2413411002/][billions of people
12[[https://www.usatoday.com/story/money/2018/12/28/data-breaches-2018-billions-hit-growing-number-cyberattacks/2413411002/][billions 12affected by data breaches each year]], there's a greater need to introduce strong
13of people affected by data breaches each year]], there's a greater need 13information security systems. If you think you've been part of a breach, or you
14to introduce strong information security systems. If you think you've 14want to check and see, you can use [[https://haveibeenpwned.com/][Have I Been Pwned]] to see if your email has
15been part of a breach, or you want to check and see, you can use 15been involved in any public breaches. Remember that there's a possibility that a
16[[https://haveibeenpwned.com/][Have I Been Pwned]] to see if your email 16company experienced a breach and did not report it to anyone.
17has been involved in any public breaches. Remember that there's a
18possibility that a company experienced a breach and did not report it to
19anyone.
20 17
21** How Do I Protect Myself? 18** How Do I Protect Myself?
22 19
23The first place to start with any personal security check-up is to 20The first place to start with any personal security check-up is to gather a list
24gather a list of all the different websites, apps, or programs that 21of all the different websites, apps, or programs that require you to have login
25require you to have login credentials. Optionally, once you know where 22credentials. Optionally, once you know where your information is being stored,
26your information is being stored, you can sort the list from the 23you can sort the list from the most-important items such as banks or government
27most-important items such as banks or government logins to less 24logins to less important items such as your favorite meme site. You will want to
28important items such as your favorite meme site. You will want to ensure 25ensure that your critical logins are secure before getting to the others.
29that your critical logins are secure before getting to the others.
30 26
31Once you think you have a good idea of all your different authentication 27Once you think you have a good idea of all your different authentication
32methods, I recommend using a password manager such as 28methods, I recommend using a password manager such as [[https://bitwarden.com/][Bitwarden]]. Using a
33[[https://bitwarden.com/][Bitwarden]]. Using a password manager allows 29password manager allows you to automatically save your logins, create randomized
34you to automatically save your logins, create randomized passwords, and 30passwords, and transfer passwords across devices. However, you'll need to
35transfer passwords across devices. However, you'll need to memorize your 31memorize your "vault password" that allows you to open the password manager.
36"vault password" that allows you to open the password manager. It's 32It's important to make this something hard to guess since it would allow anyone
37important to make this something hard to guess since it would allow 33who has it to access every password you've stored in there.
38anyone who has it to access every password you've stored in there. 34
39 35Personally, I recommend using a [[https://en.wikipedia.org/wiki/Passphrase][passphrase]] instead of a [[https://en.wikipedia.org/wiki/Password][password]] for your vault
40Personally, I recommend using a 36password. Instead of using a string of characters (whether random or simple),
41[[https://en.wikipedia.org/wiki/Passphrase][passphrase]] instead of a 37use a phrase and add in symbols and a number. For example, your vault password
42[[https://en.wikipedia.org/wiki/Password][password]] for your vault 38could be =Racing-Alphabet-Gourd-Parrot3=. Swap the symbols out for whichever
43password. Instead of using a string of characters (whether random or 39symbol you want, move the number around, and fine-tune the passphrase until you
44simple), use a phrase and add in symbols and a number. For example, your 40are confident that you can remember it whenever necessary.
45vault password could be =Racing-Alphabet-Gourd-Parrot3=. Swap the 41
46symbols out for whichever symbol you want, move the number around, and 42Once you've stored your passwords, make sure you continually check up on your
47fine-tune the passphrase until you are confident that you can remember 43account and make sure you aren't following bad password practices. Krebs on
48it whenever necessary. 44Security has a great [[https://krebsonsecurity.com/password-dos-and-donts/][blog post on password recommendations]]. Any time that a data
49 45breach happens, make sure you check to see if you were included, and if you need
50Once you've stored your passwords, make sure you continually check up on 46to reset any account passwords.
51your account and make sure you aren't following bad password practices.
52Krebs on Security has a great
53[[https://krebsonsecurity.com/password-dos-and-donts/][blog post on
54password recommendations]]. Any time that a data breach happens, make
55sure you check to see if you were included, and if you need to reset any
56account passwords.
57 47
58* Developers 48* Developers
59 49
60** What Are the Basic Requirements? 50** What Are the Basic Requirements?
61 51
62When developing any password-protected application, there are a few 52When developing any password-protected application, there are a few basic rules
63basic rules that anyone should follow even if they do not follow any 53that anyone should follow even if they do not follow any official guidelines
64official guidelines such as NIST. The foremost practice is to require 54such as NIST. The foremost practice is to require users to use passwords that
65users to use passwords that are at least 8 characters and cannot easily 55are at least 8 characters and cannot easily be guessed. This sounds extremely
66be guessed. This sounds extremely simple, but it requires quite a few 56simple, but it requires quite a few different strategies. First, the application
67different strategies. First, the application should check the potential 57should check the potential passwords against a dictionary of insecure passwords
68passwords against a dictionary of insecure passwords such =password=, 58such =password=, =1234abc=, or =application_name=.
69=1234abc=, or =application_name=. 59
70 60Next, the application should offer guidance on the strength of passwords being
71Next, the application should offer guidance on the strength of passwords 61entered during enrollment. Further, NIST officially recommends *not*
72being entered during enrollment. Further, NIST officially recommends 62implementing any composition rules that make passwords hard to remember (e.g.
73*not* implementing any composition rules that make passwords hard to 63passwords with letters, numbers, and special characters) and instead encouraging
74remember (e.g. passwords with letters, numbers, and special characters) 64the use of long pass phrases which can include spaces. It should be noted that
75and instead encouraging the use of long pass phrases which can include 65to be able to keep spaces within passwords, all unicode characters should be
76spaces. It should be noted that to be able to keep spaces within 66supported, and passwords should not be truncated.
77passwords, all unicode characters should be supported, and passwords
78should not be truncated.
79 67
80** What Does NIST Recommend? 68** What Does NIST Recommend?
81 69
82The National Institute of Standards and Technology 70The National Institute of Standards and Technology ([[https://www.nist.gov][NIST]]) in the US Department
83([[https://www.nist.gov][NIST]]) in the US Department of Commerce 71of Commerce regularly publishes information around information security and
84regularly publishes information around information security and digital 72digital identity guidelines. Recently, NIST published [[https://pages.nist.gov/800-63-3/sp800-63b.html][Special Publication
85identity guidelines. Recently, NIST published
86[[https://pages.nist.gov/800-63-3/sp800-63b.html][Special Publication
87800-63b]]: Digital Identity Guidelines and Authentication and Lifecycle 73800-63b]]: Digital Identity Guidelines and Authentication and Lifecycle
88Management. 74Management.
89 75
90#+begin_quote 76#+begin_quote
91A Memorized Secret authenticator - commonly referred to as a password 77A Memorized Secret authenticator - commonly referred to as a password or, if
92or, if numeric, a PIN - is a secret value intended to be chosen and 78numeric, a PIN - is a secret value intended to be chosen and memorized by the
93memorized by the user. Memorized secrets need to be of sufficient 79user. Memorized secrets need to be of sufficient complexity and secrecy that it
94complexity and secrecy that it would be impractical for an attacker to 80would be impractical for an attacker to guess or otherwise discover the correct
95guess or otherwise discover the correct secret value. A memorized secret 81secret value. A memorized secret is something you know.
96is something you know.
97 82
98- NIST Special Publication 800-63B 83- NIST Special Publication 800-63B
99#+end_quote 84#+end_quote
100 85
101NIST offers a lot of guidance on passwords, but I'm going to highlight 86NIST offers a lot of guidance on passwords, but I'm going to highlight just a
102just a few of the important factors: 87few of the important factors:
103 88
104- Require passwords to be a minimum of 8 characters (6 characters if 89- Require passwords to be a minimum of 8 characters (6 characters if randomly
105 randomly generated and be generated using an approved random bit 90 generated and be generated using an approved random bit generator).
106 generator). 91- Compare potential passwords against a list that contains values known to be
107- Compare potential passwords against a list that contains values known 92 commonly-used, expected, or compromised.
108 to be commonly-used, expected, or compromised.
109- Offer guidance on password strength, such as a strength meter. 93- Offer guidance on password strength, such as a strength meter.
110- Implement a rate-limiting mechanism to limit the number of failed 94- Implement a rate-limiting mechanism to limit the number of failed
111 authentication attempts for each user account. 95 authentication attempts for each user account.
112- Do not require composition rules for passwords and do not require 96- Do not require composition rules for passwords and do not require passwords to
113 passwords to be changed periodically (unless compromised). 97 be changed periodically (unless compromised).
114- Allow pasting of user identification and passwords to facilitate the 98- Allow pasting of user identification and passwords to facilitate the use of
115 use of password managers. 99 password managers.
116- Allow users to view the password as it is being entered. 100- Allow users to view the password as it is being entered.
117- Use secure forms of communication and storage, including salting and 101- Use secure forms of communication and storage, including salting and hashing
118 hashing passwords using a one-way key derivation function. 102 passwords using a one-way key derivation function.
119 103
120NIST offers further guidance on other devices that require specific 104NIST offers further guidance on other devices that require specific security
121security policies, querying for passwords, and more. All the information 105policies, querying for passwords, and more. All the information discussed so far
122discussed so far comes from 106comes from [[https://pages.nist.gov/800-63-3/sp800-63b.html][NIST SP800-63b]] but NIST offers a lot of information on digital
123[[https://pages.nist.gov/800-63-3/sp800-63b.html][NIST SP800-63b]] but 107identities, enrollment, identity proofing, authentication, lifecycle management,
124NIST offers a lot of information on digital identities, enrollment, 108federation, and assertions in the total [[https://pages.nist.gov/800-63-3/][NIST SP800-63 Digital Identity
125identity proofing, authentication, lifecycle management, federation, and 109Guidelines]].
126assertions in the total [[https://pages.nist.gov/800-63-3/][NIST
127SP800-63 Digital Identity Guidelines]].
content/blog/2020-01-25-linux-software.org +66 −87
@@ -7,29 +7,27 @@
7 7
8** Etcher 8** Etcher
9 9
10[[https://www.balena.io/etcher/][Etcher]] is a quick and easy way to 10[[https://www.balena.io/etcher/][Etcher]] is a quick and easy way to burn ISO images to CDs and USB devices. There
11burn ISO images to CDs and USB devices. There are two different ways you 11are two different ways you can install this program. First, you can navigate to
12can install this program. First, you can navigate to the 12the [[https://www.balena.io/etcher/][official website]] and download the AppImage file, which can run without
13[[https://www.balena.io/etcher/][official website]] and download the 13installation.
14AppImage file, which can run without installation.
15 14
16However, AppImage files are not executable by default, so you'll either 15However, AppImage files are not executable by default, so you'll either need to
17need to right-click to open the properties of the file and click the 16right-click to open the properties of the file and click the "Allow executing
18"Allow executing file as program" box in the Permissions tab or use the 17file as program" box in the Permissions tab or use the following command:
19following command:
20 18
21#+begin_src sh 19#+begin_src sh
22chmod u+x FILE_NAME 20chmod u+x FILE_NAME
23#+end_src 21#+end_src
24 22
25If you don't like AppImage files or just prefer repositories, you can 23If you don't like AppImage files or just prefer repositories, you can use the
26use the following commands to add the author's repository and install it 24following commands to add the author's repository and install it through the
27through the command-line only. 25command-line only.
28 26
29First, you'll have to echo the repo and write it to a list file: 27First, you'll have to echo the repo and write it to a list file:
30 28
31#+begin_src sh 29#+begin_src sh
32echo "deb https://deb.etcher.io stable etcher" | sudo tee /etc/apt/sources.list.d/balena-etcher.list 30echo "deb https://deb.etcher.iostable etcher" | sudo tee /etc/apt/sources.list.d/balena-etcher.list
33#+end_src 31#+end_src
34 32
35Next, add the application keys to Ubuntu's keyring: 33Next, add the application keys to Ubuntu's keyring:
@@ -44,8 +42,7 @@ Finally, update the repositories and install the app.
44sudo apt update && sudo apt install balena-etcher-electron 42sudo apt update && sudo apt install balena-etcher-electron
45#+end_src 43#+end_src
46 44
47Using Arch, Manjaro, or another distro using the AUR? Use this command 45Using Arch, Manjaro, or another distro using the AUR? Use this command instead:
48instead:
49 46
50#+begin_src sh 47#+begin_src sh
51sudo pacman -S etcher 48sudo pacman -S etcher
@@ -53,11 +50,9 @@ sudo pacman -S etcher
53 50
54** Atom 51** Atom
55 52
56[[https://atom.io][Atom]] is the self-proclaimed "hackable text editor 53[[https://atom.io][Atom]] is the self-proclaimed "hackable text editor for the 21st century". This
57for the 21st century". This text editor is made by GitHub, 54text 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
58[[https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/][now 55add-ons available to customize the layout and abilities of the app.
59owned by Microsoft]], and has some of the best add-ons available to
60customize the layout and abilities of the app.
61 56
62First, add the Atom repository to your sources. 57First, add the Atom repository to your sources.
63 58
@@ -71,26 +66,23 @@ Next, update your package listings and install atom.
71sudo apt update && sudo apt install atom 66sudo apt update && sudo apt install atom
72#+end_src 67#+end_src
73 68
74If you have issues updating your packages with the Atom repository, 69If you have issues updating your packages with the Atom repository, you'll need
75you'll need to use the snap package described below instead of the 70to use the snap package described below instead of the repository. To remove the
76repository. To remove the repository we just added, use this command: 71repository we just added, use this command:
77 72
78#+begin_src sh 73#+begin_src sh
79sudo add-apt-repository -r ppa:webupd8team/atom 74sudo add-apt-repository -r ppa:webupd8team/atom
80#+end_src 75#+end_src
81 76
82You can also install Atom as a snap package, but it must be installed 77You can also install Atom as a snap package, but it must be installed with the
83with the =--classic= flag. A 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
84[[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full 79about why you need the classic flag.
85explanation is available]] if you'd like to read more about why you need
86the classic flag.
87 80
88#+begin_src sh 81#+begin_src sh
89snap install atom --classic 82snap install atom --classic
90#+end_src 83#+end_src
91 84
92Using Arch, Manjaro, or another distro using the AUR? Use this command 85Using Arch, Manjaro, or another distro using the AUR? Use this command instead:
93instead:
94 86
95#+begin_src sh 87#+begin_src sh
96sudo pacman -S atom 88sudo pacman -S atom
@@ -98,28 +90,23 @@ sudo pacman -S atom
98 90
99** Visual Studio Code 91** Visual Studio Code
100 92
101[[https://code.visualstudio.com][Visual Studio Code]] is yet another 93[[https://code.visualstudio.com][Visual Studio Code]] is yet another fantastic choice for programming on Linux,
102fantastic choice for programming on Linux, especially if you need those 94especially if you need those extra add-ons to spice up your late-night coding
103extra add-ons to spice up your late-night coding sessions. The theme 95sessions. 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]],
104used in the screenshot is 96who makes a ton of great themes for VS Code, Atom, and various Linux desktop
105[[https://marketplace.visualstudio.com/items?itemName=EliverLara.mars][Mars]]
106by theme creator [[https://github.com/EliverLara][Eliver Lara]], who
107makes a ton of great themes for VS Code, Atom, and various Linux desktop
108environments. 97environments.
109 98
110To install VS Code, you'll need to download the =.deb= file from the 99To install VS Code, you'll need to download the =.deb= file from the official
111official website. Once you've downloaded the file, either double-click 100website. Once you've downloaded the file, either double-click it to install
112it to install through the Software Center or run the following command: 101through the Software Center or run the following command:
113 102
114#+begin_src sh 103#+begin_src sh
115sudo dpkg -i FILE_NAME.deb 104sudo dpkg -i FILE_NAME.deb
116#+end_src 105#+end_src
117 106
118You can also install VS Code as a snap package, but it must be installed 107You can also install VS Code as a snap package, but it must be installed with
119with the =--classic= flag. A 108the =--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
120[[https://language-bash.com/blog/how-to-snap-introducing-classic-confinement][full 109about why you need the classic flag.
121explanation is available]] if you'd like to read more about why you need
122the classic flag.
123 110
124#+begin_src sh 111#+begin_src sh
125snap install code --classic 112snap install code --classic
@@ -134,19 +121,18 @@ sudo pacman -S yay binutils make gcc pkg-config fakeroot yay -S visual-studio-co
134 121
135** GNOME Tweaks 122** GNOME Tweaks
136 123
137[[https://gitlab.gnome.org/GNOME/gnome-tweaks][Gnome Tweaks]] is the 124[[https://gitlab.gnome.org/GNOME/gnome-tweaks][Gnome Tweaks]] is the ultimate tool to use if you want to customize your GNOME
138ultimate tool to use if you want to customize your GNOME desktop 125desktop environment. This is how you can switch application themes (GTK), shell
139environment. This is how you can switch application themes (GTK), shell 126themes, icons, fonts, and more. To install GNOME Tweaks on Ubuntu, you just need
140themes, icons, fonts, and more. To install GNOME Tweaks on Ubuntu, you 127to install the official package.
141just need to install the official package.
142 128
143#+begin_src sh 129#+begin_src sh
144sudo apt install gnome-tweaks 130sudo apt install gnome-tweaks
145#+end_src 131#+end_src
146 132
147If you've installed Manjaro or Arch with Gnome, you should have the 133If you've installed Manjaro or Arch with Gnome, you should have the tweak tool
148tweak tool pre-installed. If you're on Fedora, this tool is available as 134pre-installed. If you're on Fedora, this tool is available as an official
149an official package: 135package:
150 136
151#+begin_src sh 137#+begin_src sh
152sudo dnf install gnome-tweaks 138sudo dnf install gnome-tweaks
@@ -154,14 +140,12 @@ sudo dnf install gnome-tweaks
154 140
155** Steam 141** Steam
156 142
157[[https://steampowered.com][Steam]] is one of the most popular gaming 143[[https://steampowered.com][Steam]] is one of the most popular gaming libraries for computers and is one of
158libraries for computers and is one of the main reasons that many people 144the main reasons that many people have been able to switch to Linux in recent
159have been able to switch to Linux in recent years, thanks to Steam 145years, thanks to Steam Proton, which makes it easier to play games not
160Proton, which makes it easier to play games not officially created for 146officially created for Linux platforms.
161Linux platforms.
162 147
163To install Steam on Ubuntu, you just need to install the official 148To install Steam on Ubuntu, you just need to install the official package.
164package.
165 149
166#+begin_src sh 150#+begin_src sh
167sudo apt install steam-installer 151sudo apt install steam-installer
@@ -193,34 +177,32 @@ Finally, install the program:
193sudo pacman -S steam 177sudo pacman -S steam
194#+end_src 178#+end_src
195 179
196[[./2020-01-26-steam-on-ntfs-drives.html][Problem Launching Steam Games? 180[[./2020-01-26-steam-on-ntfs-drives.html][Problem Launching Steam Games? Click Here.]]
197Click Here.]]
198 181
199* Command-Line Packages 182* Command-Line Packages
200 183
201** neofetch 184** neofetch
202 185
203[[https://github.com/dylanaraps/neofetch][Neofetch]] is a customizable 186[[https://github.com/dylanaraps/neofetch][Neofetch]] is a customizable tool used in the command-line to show system
204tool used in the command-line to show system information. This is 187information. This is exceptionally useful if you want to see your system's
205exceptionally useful if you want to see your system's information 188information quickly without the clutter of some resource-heavy GUI apps.
206quickly without the clutter of some resource-heavy GUI apps.
207 189
208This is an official package if you're running Ubuntu 17.04 or later, so 190This is an official package if you're running Ubuntu 17.04 or later, so simply
209simply use the following command: 191use the following command:
210 192
211#+begin_src sh 193#+begin_src sh
212sudo apt install neofetch 194sudo apt install neofetch
213#+end_src 195#+end_src
214 196
215If you're running Ubuntu 16.10 or earlier, you'll have to use a series 197If you're running Ubuntu 16.10 or earlier, you'll have to use a series of
216of commands: 198commands:
217 199
218#+begin_src sh 200#+begin_src sh
219sudo add-apt-repository ppa:dawidd0811/neofetch; sudo apt update; sudo apt install neofetch 201sudo add-apt-repository ppa:dawidd0811/neofetch; sudo apt update; sudo apt
202install neofetch
220#+end_src 203#+end_src
221 204
222Using Arch, Manjaro, or another distro using the AUR? Use this command 205Using Arch, Manjaro, or another distro using the AUR? Use this command instead:
223instead:
224 206
225#+begin_src sh 207#+begin_src sh
226sudo pacman -S neofetch 208sudo pacman -S neofetch
@@ -228,31 +210,28 @@ sudo pacman -S neofetch
228 210
229** yt-dlp 211** yt-dlp
230 212
231[[https://github.com/yt-dlp/yt-dlp][yt-dlp]] is an extremely handy 213[[https://github.com/yt-dlp/yt-dlp][yt-dlp]] is an extremely handy command-line tool that allows you to download video
232command-line tool that allows you to download video or audio files from 214or audio files from various websites, such as YouTube. There are a ton of
233various websites, such as YouTube. There are a ton of different options 215different options when running this package, so be sure to run =yt-dlp --help=
234when running this package, so be sure to run =yt-dlp --help= first to 216first to look through everything you can do (or give up and search for the best
235look through everything you can do (or give up and search for the best
236config online). 217config online).
237 218
238While this shouldn't be a problem for most users, yt-dlp requires Python 219While this shouldn't be a problem for most users, yt-dlp requires Python 2.6,
2392.6, 2.7, or 3.2+ to work correctly, so install Python if you don't have 2202.7, or 3.2+ to work correctly, so install Python if you don't have it already.
240it already. You can check to see if you have Python installed by 221You can check to see if you have Python installed by running:
241running:
242 222
243#+begin_src sh 223#+begin_src sh
244python -V 224python -V
245#+end_src 225#+end_src
246 226
247To get the youtube-dl package, simply curl the URL and output the 227To get the youtube-dl package, simply curl the URL and output the results.
248results.
249 228
250#+begin_src sh 229#+begin_src sh
251sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp 230sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o
231/usr/local/bin/yt-dlp
252#+end_src 232#+end_src
253 233
254Finally, make the file executable so that it can be run from the 234Finally, make the file executable so that it can be run from the command-line.
255command-line.
256 235
257#+begin_src sh 236#+begin_src sh
258sudo chmod a+rx /usr/local/bin/yt-dlp 237sudo chmod a+rx /usr/local/bin/yt-dlp
content/blog/2020-01-26-steam-on-ntfs.org +28 −30
@@ -5,28 +5,28 @@
5 5
6* Auto-Mount Steam Drives 6* Auto-Mount Steam Drives
7 7
8If you want to see how to install Steam on Linux, see my other post: 8If you want to see how to install Steam on Linux, see my other post: [[../linux-software/][Linux
9[[../linux-software/][Linux Software]]. 9Software]].
10 10
11Are you having trouble launching games, even though they've installed 11Are you having trouble launching games, even though they've installed correctly?
12correctly? This may happen if you're storing your games on an 12This may happen if you're storing your games on an NTFS-formatted drive. This
13NTFS-formatted drive. This shouldn't be an issue if you're storing your 13shouldn't be an issue if you're storing your games on the same drive that Steam
14games on the same drive that Steam is on, but some gamers prefer to put 14is on, but some gamers prefer to put Steam on their main drive and game files on
15Steam on their main drive and game files on another SSD or HDD. 15another SSD or HDD.
16 16
17To fix this problem, you'll need to try a few things. First, you'll need 17To fix this problem, you'll need to try a few things. First, you'll need to
18to install the =ntfs-3g= package, which is meant for better 18install the =ntfs-3g= package, which is meant for better interoperability with
19interoperability with Linux. 19Linux.
20 20
21#+begin_src sh 21#+begin_src sh
22sudo apt install ntfs-3g 22sudo apt install ntfs-3g
23#+end_src 23#+end_src
24 24
25Next, you should set up the =/etc/fstab= file to automatically mount 25Next, you should set up the =/etc/fstab= file to automatically mount your drives
26your drives on boot. To automatically mount your drives when the 26on boot. To automatically mount your drives when the computer boots up, you'll
27computer boots up, you'll have to create the folders you want to mount 27have to create the folders you want to mount your drive to first. I store mine
28your drive to first. I store mine in the =/mnt= folder using names that 28in the =/mnt= folder using names that I'll recognize, but you can create your
29I'll recognize, but you can create your folders wherever you want. 29folders wherever you want.
30 30
31#+begin_src sh 31#+begin_src sh
32mkdir /path/to/folder 32mkdir /path/to/folder
@@ -38,14 +38,13 @@ For example:
38mkdir /mnt/steam_library 38mkdir /mnt/steam_library
39#+end_src 39#+end_src
40 40
41To automatically mount drives upon system boot, you will need to collect 41To automatically mount drives upon system boot, you will need to collect a few
42a few items. The UUID is the identification number connected to 42items. The UUID is the identification number connected to whichever drive you're
43whichever drive you're using to store Steam games. 43using to store Steam games.
44 44
45Drives are usually labeled similar to =/dev/nvme0n1p1= or =/dev/sda1=, 45Drives are usually labeled similar to =/dev/nvme0n1p1= or =/dev/sda1=, so you'll
46so you'll need to find the line in the output of the command below that 46need to find the line in the output of the command below that correlates to your
47correlates to your drive and copy the UUID over to the =/etc/fstab= 47drive and copy the UUID over to the =/etc/fstab= file.
48file.
49 48
50#+begin_src sh 49#+begin_src sh
51sudo blkid | grep UUID= 50sudo blkid | grep UUID=
@@ -58,8 +57,8 @@ command:
58id -u && id -g 57id -u && id -g
59#+end_src 58#+end_src
60 59
61Now that you have collected the necessary information, open the 60Now that you have collected the necessary information, open the =/etc/fstab=
62=/etc/fstab= file: 61file:
63 62
64#+begin_src sh 63#+begin_src sh
65sudo nano /etc/fstab 64sudo nano /etc/fstab
@@ -72,9 +71,8 @@ Each drive you want to mount on boot should have its own line in the
72UUID=B64E53824E5339F7 /mnt/steam_library ntfs-3g uid=1000,gid=1000 0 0 71UUID=B64E53824E5339F7 /mnt/steam_library ntfs-3g uid=1000,gid=1000 0 0
73#+end_src 72#+end_src
74 73
75Now all you need to do is unmount your drive and re-mount it. You can 74Now all you need to do is unmount your drive and re-mount it. You can unmount
76unmount the drive by doing this (be sure to use the correct drive name 75the drive by doing this (be sure to use the correct drive name here):
77here):
78 76
79#+begin_src sh 77#+begin_src sh
80sudo umount /dev/sdxX 78sudo umount /dev/sdxX
@@ -86,6 +84,6 @@ You can re-mount all your drives by executing the following:
86sudo mount -a 84sudo mount -a
87#+end_src 85#+end_src
88 86
89If you don't know what your drive name is, or you're nervous about 87If you don't know what your drive name is, or you're nervous about unmounting
90unmounting and re-mounting, simply reboot your computer, and it will be 88and re-mounting, simply reboot your computer, and it will be done for you
91done for you automatically. 89automatically.
content/blog/2020-02-09-cryptography-basics.org +127 −139
@@ -5,173 +5,161 @@
5 5
6* Similar Article Available 6* Similar Article Available
7 7
8If you haven't already, feel free to read my post on 8If you haven't already, feel free to read my post on [[../aes-encryption/][AES Encryption]].
9[[../aes-encryption/][AES Encryption]].
10 9
11* What is Cryptography? 10* What is Cryptography?
12 11
13In layman's terms, cryptography is a process that can change data from a 12In layman's terms, cryptography is a process that can change data from a
14readable format into an unreadable format (and vice-versa) through a 13readable format into an unreadable format (and vice-versa) through a series of
15series of processes and secrets. More technically, this is the Internet 14processes and secrets. More technically, this is the Internet Security
16Security Glossary's definition: 15Glossary's definition:
17 16
18#+begin_quote 17#+begin_quote
19[Cryptography is] the mathematical science that deals with transforming 18[Cryptography is] the mathematical science that deals with transforming data to
20data to render its meaning unintelligible (i.e., to hide its semantic 19render its meaning unintelligible (i.e., to hide its semantic content), prevent
21content), prevent its undetected alteration, or prevent its unauthorized 20its undetected alteration, or prevent its unauthorized use. If the
22use. If the transformation is reversible, cryptography also deals with 21transformation is reversible, cryptography also deals with restoring encrypted
23restoring encrypted data to an intelligible form. 22data to an intelligible form.
24 23
25- [[https://tools.ietf.org/html/rfc2828][Internet Security Glossary 24- [[https://tools.ietf.org/html/rfc2828][Internet Security Glossary (2000)]]
26 (2000)]]
27#+end_quote 25#+end_quote
28 26
29Cryptography cannot offer protection against the loss of data; it simply 27Cryptography cannot offer protection against the loss of data; it simply offers
30offers encryption methods to protect data at-rest and data in-traffic. 28encryption methods to protect data at-rest and data in-traffic. At a high-level,
31At a high-level, encrypted is when plaintext data is encrypted to 29encrypted is when plaintext data is encrypted to ciphertext (a secure form of
32ciphertext (a secure form of text that cannot be understood unless 30text that cannot be understood unless decrypted back to plaintext). The
33decrypted back to plaintext). The encryption process is completed 31encryption process is completed through the use of a mathematical function that
34through the use of a mathematical function that utilizes one or more 32utilizes one or more values called keys to encrypt or decrypt the data.
35values called keys to encrypt or decrypt the data.
36 33
37* Key Elements of Cryptographic Systems 34* Key Elements of Cryptographic Systems
38 35
39To create or evaluate a cryptographic system, you need to know the 36To create or evaluate a cryptographic system, you need to know the essential
40essential pieces to the system: 37pieces to the system:
41 38
42- *Encryption Algorithm (Primitive):* A mathematical process that 39- *Encryption Algorithm (Primitive):* A mathematical process that encrypts and
43 encrypts and decrypts data. 40 decrypts data.
44- *Encryption Key:* A string of bits used within the encryption 41- *Encryption Key:* A string of bits used within the encryption algorithm as the
45 algorithm as the secret that allows successful encryption or 42 secret that allows successful encryption or decryption of data.
46 decryption of data. 43- *Key Length (Size):* The maximum number of bits within the encryption key.
47- *Key Length (Size):* The maximum number of bits within the encryption 44 It's important to remember that key size is regulated in many countries.
48 key. It's important to remember that key size is regulated in many 45- *Message Digest:* A smaller, fixed-size bit string version of the original
49 countries. 46 message. This is practically infeasible to reverse, which is why it's commonly
50- *Message Digest:* A smaller, fixed-size bit string version of the 47 used to verify integrity.
51 original message. This is practically infeasible to reverse, which is
52 why it's commonly used to verify integrity.
53 48
54* Symmetric Systems (Secret Key Cryptography) 49* Symmetric Systems (Secret Key Cryptography)
55 50
56Symmetric cryptography utilizes a secret, bidirectional key to perform 51Symmetric cryptography utilizes a secret, bidirectional key to perform both
57both encryption and decryption of the data. The most common 52encryption and decryption of the data. The most common implementation of
58implementation of symmetric cryptography is the Advanced Encryption 53symmetric cryptography is the Advanced Encryption Standard, which uses keys that
59Standard, which uses keys that are 128 bits to 256 bits in size. This 54are 128 bits to 256 bits in size. This standard came after the National
60standard came after the National Institute of Standards and Technology 55Institute of Standards and Technology (NIST) decided to retire the Data
61(NIST) decided to retire the Data Encryption Standard (DES) in 2001. 56Encryption Standard (DES) in 2001.
62 57
63Since brute force attacks strongly correlate with key length, the 56-bit 58Since brute force attacks strongly correlate with key length, the 56-bit key
64key length of DES was considered insecure after it was publicly broken 59length of DES was considered insecure after it was publicly broken in under 24
65in under 24 hours. However, there is a modern implementation of DES 60hours. However, there is a modern implementation of DES called Triple DES where
66called Triple DES where the DES method is applied three times to each 61the DES method is applied three times to each data block.
67data block. 62
68 63The main advantages to symmetric systems are the ease of use, since only one key
69The main advantages to symmetric systems are the ease of use, since only 64is required for both encryption and decryption, and the simplicity of the
70one key is required for both encryption and decryption, and the 65algorithms. This helps with bulk data encryption that may unnecessarily waste
71simplicity of the algorithms. This helps with bulk data encryption that 66time and power using asymmetric systems.
72may unnecessarily waste time and power using asymmetric systems. 67
73 68However, symmetric systems have disadvantages to keep in mind. Since the key is
74However, symmetric systems have disadvantages to keep in mind. Since the 69private, it can be difficult to safely distribute keys to communication
75key is private, it can be difficult to safely distribute keys to 70partners. Additionally, the key cannot be used to sign messages since it's
76communication partners. Additionally, the key cannot be used to sign 71necessary to keep the key private.
77messages since it's necessary to keep the key private.
78 72
79* Asymmetric Systems (Public Key Cryptography) 73* Asymmetric Systems (Public Key Cryptography)
80 74
81Asymmetric cryptography utilizes two keys within the system: a secret 75Asymmetric cryptography utilizes two keys within the system: a secret key that
82key that is privately-held and a public key that can be distributed 76is privately-held and a public key that can be distributed freely. The
83freely. The interesting aspect of asymmetric cryptography is that either 77interesting aspect of asymmetric cryptography is that either key can be used to
84key can be used to encrypt the data, there's no rule that dictates which 78encrypt the data, there's no rule that dictates which key must be used for
85key must be used for encryption. Once one key is used to encrypt the 79encryption. Once one key is used to encrypt the data, only the other key can be
86data, only the other key can be used to decrypt the data. This means 80used to decrypt the data. This means that if the private key encrypts the data,
87that if the private key encrypts the data, only the public key can 81only the public key can decrypt the data.
88decrypt the data. 82
89 83An advantage of this system is that if you successfully decrypt data using one
90An advantage of this system is that if you successfully decrypt data 84of the keys, you can be sure of the sender since only the other key could have
91using one of the keys, you can be sure of the sender since only the 85encrypted the data.
92other key could have encrypted the data. 86
93 87One of the major implementations of an asymmetric system is a digital signature.
94One of the major implementations of an asymmetric system is a digital 88A digital signature can be generated using the sender's private key, or a
95signature. A digital signature can be generated using the sender's 89one-way hash function and is used to provide assurance for the integrity and
96private key, or a one-way hash function and is used to provide assurance 90authenticity of the message. A couple common message digest algorithms are
97for the integrity and authenticity of the message. A couple common 91SHA-256 and SHA-512, which securely compress data and produce a 128-bit message
98message digest algorithms are SHA-256 and SHA-512, which securely 92digest.
99compress data and produce a 128-bit message digest. 93
100 94It should be noted that man-in-the-middle attacks are one of the risks with
101It should be noted that man-in-the-middle attacks are one of the risks 95digital signatures and public keys. To combat this, applications often use a
102with digital signatures and public keys. To combat this, applications 96public key infrastructure (PKI) to independently authenticate the validity of
103often use a public key infrastructure (PKI) to independently 97signatures and keys.
104authenticate the validity of signatures and keys. 98
105 99Due to the large key size and [[https://crypto.stackexchange.com/a/591][inefficient mathematical functions]] of asymmetric
106Due to the large key size and 100encryption, elliptical curve cryptography (ECC) is often used to increase
107[[https://crypto.stackexchange.com/a/591][inefficient mathematical 101security while using fewer resources.
108functions]] of asymmetric encryption, elliptical curve cryptography
109(ECC) is often used to increase security while using fewer resources.
110 102
111* Applications of Cryptographic Systems 103* Applications of Cryptographic Systems
112 104
113There are quite a few implementations of cryptographic systems around 105There are quite a few implementations of cryptographic systems around the world.
114the world. Here are a few popular examples: 106Here are a few popular examples:
115 107
116*Transport Layer Security (TLS):* One of the most famous cryptographic 108*Transport Layer Security (TLS):* One of the most famous cryptographic solutions
117solutions created is TLS, a session-layered or connection-layered 109created is TLS, a session-layered or connection-layered internet protocol that
118internet protocol that allows for secure communications between browsers 110allows for secure communications between browsers and servers. Using handshakes,
119and servers. Using handshakes, peer negotiation, and authentication 111peer negotiation, and authentication allows TLS to prevent eavesdropping and
120allows TLS to prevent eavesdropping and malicious transformation of 112malicious transformation of data. The major reason for TLS popularity is that a
121data. The major reason for TLS popularity is that a major vulnerability 113major vulnerability was found in the SSL protocol in 2014. Instead of SSL, TLS
122was found in the SSL protocol in 2014. Instead of SSL, TLS can be used 114can be used with HTTP to form HTTPS and is the preferred method for modern web
123with HTTP to form HTTPS and is the preferred method for modern web
124development due to its increased security. 115development due to its increased security.
125 116
126*Secure Hypertext Transfer Protocol (HTTPS):* An application layer 117*Secure Hypertext Transfer Protocol (HTTPS):* An application layer protocol that
127protocol that allows for secure transport of data between servers and 118allows for secure transport of data between servers and web clients. One of the
128web clients. One of the unique parts of HTTPS is that it uses a secured 119unique parts of HTTPS is that it uses a secured port number instead of the
129port number instead of the default web port address. 120default web port address.
130 121
131*Virtual Private Network (VPN):* VPNs are made to securely extend a 122*Virtual Private Network (VPN):* VPNs are made to securely extend a private
132private network across public networks by utilizing an encrypted layered 123network across public networks by utilizing an encrypted layered tunneling
133tunneling protocol paired with an authentication method, such as 124protocol paired with an authentication method, such as usernames and passwords.
134usernames and passwords. This technology originally allowed remote 125This technology originally allowed remote employees to access their company's
135employees to access their company's data but have evolved into one of 126data but have evolved into one of the top choices for anyone who wishes to mask
136the top choices for anyone who wishes to mask their sensitive personal 127their sensitive personal data.
137data.
138 128
139*Internet Protocol Security (IPSec):* This protocol suite facilitates 129*Internet Protocol Security (IPSec):* This protocol suite facilitates
140communication between two or more hosts or subnets by authenticating and 130communication between two or more hosts or subnets by authenticating and
141encrypting the data packets. IPSec is used in a lot of VPNs to establish 131encrypting the data packets. IPSec is used in a lot of VPNs to establish the VPN
142the VPN connection through the transport and tunnel mode encryption 132connection through the transport and tunnel mode encryption methods. IPSec
143methods. IPSec encrypts just the data portion of packets in the 133encrypts just the data portion of packets in the transport methods, but it
144transport methods, but it encrypts both the data and headers in the 134encrypts both the data and headers in the tunnel method (introducing an
145tunnel method (introducing an additional header for authentication). 135additional header for authentication).
146 136
147*Secure Shell (SSH):* SSH is another network protocol used to protect 137*Secure Shell (SSH):* SSH is another network protocol used to protect network
148network services by authenticating users through a secure channel. This 138services by authenticating users through a secure channel. This protocol is
149protocol is often used for command-line (shell) functions such as remote 139often used for command-line (shell) functions such as remote shell commands,
150shell commands, logins, and file transfers. 140logins, and file transfers.
151 141
152*Kerberos:* Developed by MIT, Kerberos is a computer-network 142*Kerberos:* Developed by MIT, Kerberos is a computer-network authentication
153authentication protocol that works on the basis of tickets to allow 143protocol that works on the basis of tickets to allow nodes communicating over a
154nodes communicating over a non-secure network to prove their identity to 144non-secure network to prove their identity to one another securely. This is most
155one another securely. This is most commonly used in business 145commonly used in business environments when used as the authentication and
156environments when used as the authentication and encryption method for 146encryption method for Windows Active Directory (AD).
157Windows Active Directory (AD).
158 147
159* Cybersecurity Controls 148* Cybersecurity Controls
160 149
161If you're someone who needs solutions on how to control risks associated 150If you're someone who needs solutions on how to control risks associated with
162with utilizing a crytograhpic system, start with a few basic controls: 151utilizing a crytograhpic system, start with a few basic controls:
163 152
164- *Policies:* A policy on the use of cryptographic controls for 153- *Policies:* A policy on the use of cryptographic controls for protection of
165 protection of information is implemented and is in accordance with 154 information is implemented and is in accordance with organizational
166 organizational objectives. 155 objectives.
167- *Key management:* A policy on the use, protection and lifetime of 156- *Key management:* A policy on the use, protection and lifetime of
168 cryptographic keys is implemented through the entire application 157 cryptographic keys is implemented through the entire application lifecycle.
169 lifecycle. 158- *Key size:* The organization has researched the optimal key size for their
170- *Key size:* The organization has researched the optimal key size for 159 purposes, considering national laws, required processing power, and longevity
171 their purposes, considering national laws, required processing power, 160 of the solution.
172 and longevity of the solution. 161- *Algorithm selection:* Implemented algorithms are sufficiently appropriate for
173- *Algorithm selection:* Implemented algorithms are sufficiently 162 the business of the organization, robust, and align with recommended
174 appropriate for the business of the organization, robust, and align 163 guidelines.
175 with recommended guidelines. 164- *Protocol configuration:* Protocols have been reviewed and configured suitable
176- *Protocol configuration:* Protocols have been reviewed and configured 165 to the purpose of the business.
177 suitable to the purpose of the business.
content/blog/2020-03-25-session-messenger.org +52 −60
@@ -5,46 +5,41 @@
5 5
6* Privacy Warning 6* Privacy Warning
7 7
8The company behind Session (Loki Foundation) is from Australia. If you 8The company behind Session (Loki Foundation) is from Australia. If you didn't
9didn't know, Australia has introduced 9know, Australia has introduced [[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] mandating companies comply with
10[[https://parlinfo.aph.gov.au/parlInfo/download/legislation/bills/r6195_aspassed/toc_pdf/18204b01.pdf][legislation]] 10government requests to build backdoor access into applications. For more
11mandating companies comply with government requests to build backdoor 11information, read my article on [[./2020-01-25-aes-encryption.html][AES Encryption]].
12access into applications. For more information, read my article on
13[[./2020-01-25-aes-encryption.html][AES Encryption]].
14 12
15* About Session 13* About Session
16 14
17[[https://getsession.org][Session]] is a private, cross-platform 15[[https://getsession.org][Session]] is a private, cross-platform messaging app from the [[https://loki.foundation][Loki Foundation]]. As
18messaging app from the [[https://loki.foundation][Loki Foundation]]. As 16someone who has spent years looking for quality alternatives to major messaging
19someone who has spent years looking for quality alternatives to major 17apps, I was excited when I first heard about Session. Reading through [[https://arxiv.org/pdf/2002.04609.pdf][Session's
20messaging apps, I was excited when I first heard about Session. Reading 18white paper]], you can learn the technologies behind the Session app. Part of the
21through [[https://arxiv.org/pdf/2002.04609.pdf][Session's white paper]], 19security of Session comes from the Signal protocol, which was forked as the
22you can learn the technologies behind the Session app. Part of the 20origin of Session.
23security of Session comes from the Signal protocol, which was forked as
24the origin of Session.
25 21
26#+begin_quote 22#+begin_quote
27Session is an end-to-end encrypted messenger that removes sensitive 23Session is an end-to-end encrypted messenger that removes sensitive metadata
28metadata collection, and is designed for people who want privacy and 24collection, and is designed for people who want privacy and freedom from any
29freedom from any forms of surveillance. 25forms of surveillance.
30#+end_quote 26#+end_quote
31 27
32In general, this app promises security through end-to-end encryption, 28In general, this app promises security through end-to-end encryption,
33decentralized onion routing, and private identities. The biggest change 29decentralized onion routing, and private identities. The biggest change that the
34that the Loki Foundation has made to the Signal protocol is removing the 30Loki Foundation has made to the Signal protocol is removing the need for a phone
35need for a phone number. Instead, a random identification string is 31number. Instead, a random identification string is generated for any session you
36generated for any session you create. This means you can create a new 32create. This means you can create a new session for each device if you want to,
37session for each device if you want to, or link new devices with your 33or link new devices with your ID.
38ID.
39 34
40Since Session's website and white paper describe the details of 35Since Session's website and white paper describe the details of Session's
41Session's security, I'm going to focus on using the app in this post. 36security, I'm going to focus on using the app in this post.
42 37
43* Features 38* Features
44 39
45Since most people are looking for an alternative to a popular chat app, 40Since most people are looking for an alternative to a popular chat app, I am
46I am going to list out the features that Session has so that you are 41going to list out the features that Session has so that you are able to
47able to determine if the app would suit your needs: 42determine if the app would suit your needs:
48 43
49- Multiple device linking (via QR code or ID) 44- Multiple device linking (via QR code or ID)
50- App locking via device screen lock, password, or fingerprint 45- App locking via device screen lock, password, or fingerprint
@@ -59,15 +54,15 @@ able to determine if the app would suit your needs:
59 54
60* Downloads 55* Downloads
61 56
62I have tested this app on Ubuntu 19.10, Android 10, macOS Monterey, and 57I have tested this app on Ubuntu 19.10, Android 10, macOS Monterey, and iOS 15.
63iOS 15. All apps have worked well without many issues. 58All apps have worked well without many issues.
64 59
65Below is a brief overview of the Session app on Linux. To get this app, 60Below is a brief overview of the Session app on Linux. To get this app, you'll
66you'll need to go to the [[https://getsession.org/download/][Downloads]] 61need to go to the [[https://getsession.org/download/][Downloads]] page and click to link to the operating system
67page and click to link to the operating system you're using. 62you're using.
68 63
69For Linux, it will download an AppImage that you'll need to enable with 64For Linux, it will download an AppImage that you'll need to enable with the
70the following command: 65following command:
71 66
72#+begin_src sh 67#+begin_src sh
73sudo chmod u+x session-messenger-desktop-linux-x86_64-1.0.5.AppImage 68sudo chmod u+x session-messenger-desktop-linux-x86_64-1.0.5.AppImage
@@ -75,42 +70,39 @@ sudo chmod u+x session-messenger-desktop-linux-x86_64-1.0.5.AppImage
75 70
76* Creating an Account 71* Creating an Account
77 72
78Once you've installed the app, simply run the app and create your unique 73Once you've installed the app, simply run the app and create your unique Session
79Session ID. It will look something like this: 74ID. It will look something like this:
80=05af1835afdd63c947b47705867501d6373f486aa1ae05b1f2f3fcd24570eba608=. 75=05af1835afdd63c947b47705867501d6373f486aa1ae05b1f2f3fcd24570eba608=.
81 76
82You'll need to set a display name and, optionally, a password. If you 77You'll need to set a display name and, optionally, a password. If you set a
83set a password, you will need to enter it every time you open the app. 78password, you will need to enter it every time you open the app.
84 79
85* Start Messaging 80* Start Messaging
86 81
87Once you've created your account and set up your profile details, the 82Once you've created your account and set up your profile details, the next step
88next step is to start messaging other people. To do so, you'll need to 83is to start messaging other people. To do so, you'll need to share your Session
89share your Session ID with other people. From this point, it's fairly 84ID with other people. From this point, it's fairly straightforward and acts like
90straightforward and acts like any other messaging app, so I won't dive 85any other messaging app, so I won't dive into much detail here.
91into much detail here.
92 86
93** macOS 87** macOS
94 88
95One key feature to note is that the desktop application now provides a 89One key feature to note is that the desktop application now provides a helpful
96helpful pop-up box explaining the process that Session uses to hide your 90pop-up box explaining the process that Session uses to hide your IP address:
97IP address:
98 91
99** iOS 92** iOS
100 93
101The mobile app is quite simple and effective, giving you all the 94The mobile app is quite simple and effective, giving you all the standard mobile
102standard mobile messaging options you'd expect. 95messaging options you'd expect.
103 96
104* Potential Issues 97* Potential Issues
105 98
106I've discovered one annoying issue that would prevent from using this 99I've discovered one annoying issue that would prevent from using this app
107app regularly. On a mobile device, there have been issues with receiving 100regularly. On a mobile device, there have been issues with receiving messages on
108messages on time. Even with battery optimization disabled and no network 101time. Even with battery optimization disabled and no network restrictions,
109restrictions, Session notifications sometimes do not display until I 102Session notifications sometimes do not display until I open the app or the
110open the app or the conversation itself and wait a few moments. This is 103conversation itself and wait a few moments. This is actually one of the reasons
111actually one of the reasons I stopped using Signal (this seems fixed as 104I stopped using Signal (this seems fixed as of my updates in 2021/2022, so I
112of my updates in 2021/2022, so I wouldn't worry about this issue 105wouldn't worry about this issue anymore).
113anymore). 106
114 107Looking for another messenger instead of Session? I recommend Signal, Matrix,
115Looking for another messenger instead of Session? I recommend Signal, 108and IRC.
116Matrix, and IRC.
content/blog/2020-05-03-homelab.org +76 −88
@@ -5,27 +5,23 @@
5 5
6* What is a Homelab? 6* What is a Homelab?
7 7
8Starting as a developer, I have largely stayed away from hardware-based 8Starting as a developer, I have largely stayed away from hardware-based hobbies
9hobbies (other than building a gaming desktop). However, as the 9(other than building a gaming desktop). However, as the quarantine for COVID-19
10quarantine for COVID-19 stretches out further and further, I found 10stretches out further and further, I found myself bored and in search of new
11myself bored and in search of new hobbies. After spending the last few 11hobbies. After spending the last few months browsing the [[https://www.reddit.com/r/homelab/][r/homelab]] subreddit, I
12months browsing the [[https://www.reddit.com/r/homelab/][r/homelab]] 12decided it was time to jump in and try things out for myself.
13subreddit, I decided it was time to jump in and try things out for
14myself.
15 13
16Since I am a beginner and just recently graduated from college, 14Since I am a beginner and just recently graduated from college, everything I've
17everything I've done so far in my homelab is fairly low-budget. 15done so far in my homelab is fairly low-budget.
18 16
19* Hardware 17* Hardware
20 18
21** Raspberry Pi 4 19** Raspberry Pi 4
22 20
23Luckily, I had actually purchased a 21Luckily, I had actually purchased a [[https://www.raspberrypi.org/products/raspberry-pi-4-model-b/][Raspberry Pi 4]] before the quarantine started
24[[https://www.raspberrypi.org/products/raspberry-pi-4-model-b/][Raspberry 22so that I could try to keep Plex Media Center running, even while my desktop
25Pi 4]] before the quarantine started so that I could try to keep Plex 23computer was turned off. I started here, using the Pi to hold Plex and Pi-hole
26Media Center running, even while my desktop computer was turned off. I 24until I grew tired with the slow performance.
27started here, using the Pi to hold Plex and Pi-hole until I grew tired
28with the slow performance.
29 25
30Here are the specifications for the Pi 4: 26Here are the specifications for the Pi 4:
31 27
@@ -37,12 +33,12 @@ Here are the specifications for the Pi 4:
37 33
38** Dell Optiplex 5040 34** Dell Optiplex 5040
39 35
40Since I wasn't happy with the Pi as my main server, I turned to 36Since I wasn't happy with the Pi as my main server, I turned to Craigslist. I
41Craigslist. I know a lot of other homelabbers use Ebay, but I can't seem 37know a lot of other homelabbers use Ebay, but I can't seem to ever trust it
42to ever trust it enough to purchase items on there. So I used Craigslist 38enough to purchase items on there. So I used Craigslist and found a Dell
43and found a Dell Optiplex 5040 desktop computer on sale for $90. While 39Optiplex 5040 desktop computer on sale for $90. While this computer might be
44this computer might be underpowered, it was one of the few computers 40underpowered, it was one of the few computers under $100 that was available
45under $100 that was available during quarantine. 41during quarantine.
46 42
47Here are the specifications for the Dell Optiplex 5040: 43Here are the specifications for the Dell Optiplex 5040:
48 44
@@ -52,111 +48,103 @@ Here are the specifications for the Dell Optiplex 5040:
52- Gigabit Ethernet 48- Gigabit Ethernet
53- 500GB Hard Drive 49- 500GB Hard Drive
54 50
55While this hardware would be awful for a work computer or a gaming rig, 51While this hardware would be awful for a work computer or a gaming rig, it
56it turned out to be wonderful for my server purposes. The only 52turned out to be wonderful for my server purposes. The only limitation I have
57limitation I have found so far is the CPU. The i3-6100 only has enough 53found so far is the CPU. The i3-6100 only has enough power for a single 4k video
58power for a single 4k video transcode at a time. I haven't tested more 54transcode at a time. I haven't tested more than three 1080p streams at a time,
59than three 1080p streams at a time, but the maximum amount of streams 55but the maximum amount of streams I've ever actually used is two.
60I've ever actually used is two.
61 56
62** WD easystore 10TB & 8TB 57** WD easystore 10TB & 8TB
63 58
64Application storage and temporary files are stored on the internal hard 59Application storage and temporary files are stored on the internal hard drive of
65drive of the server, but all media files (movies, tv, games, books, etc) 60the server, but all media files (movies, tv, games, books, etc) are stored
66are stored externally on my WD easystore hard drive. Creating auto-boot 61externally on my WD easystore hard drive. Creating auto-boot configurations in
67configurations in the =/etc/fstab= file on my server allows the hard 62the =/etc/fstab= file on my server allows the hard drives to automatically mount
68drives to automatically mount whenever I need to restart my server. 63whenever I need to restart my server.
69 64
70#+begin_quote 65#+begin_quote
71Update: In March 2022, I shucked the hard drives out of their external 66Update: In March 2022, I shucked the hard drives out of their external cases,
72cases, put some Kapton tape on the third power pin to prevent power 67put some Kapton tape on the third power pin to prevent power shutdowns, and
73shutdowns, and stuck them inside my server tower using internal SATA 68stuck them inside my server tower using internal SATA cables.
74cables.
75#+end_quote 69#+end_quote
76 70
77** Netgear Unmanaged Switch 71** Netgear Unmanaged Switch
78 72
79To manage all the ethernet cords used by my homelab, my desktop, and my 73To manage all the ethernet cords used by my homelab, my desktop, and my living
80living room media center, I purchased an 8-port gigabit ethernet switch 74room media center, I purchased an 8-port gigabit ethernet switch for $50 at my
81for $50 at my local computer store. This is probably much more than I 75local computer store. This is probably much more than I should have spent on an
82should have spent on an unmanaged switch, but I am comfortable with the 76unmanaged switch, but I am comfortable with the choice.
83choice.
84 77
85** TP-Link Managed Switch 78** TP-Link Managed Switch
86 79
87Since I use the unmanaged switch to group all living room devices 80Since I use the unmanaged switch to group all living room devices together, I
88together, I use the managed switch to configure VLANs and secure my 81use the managed switch to configure VLANs and secure my network.
89network.
90 82
91** Arris TM1602A Modem & Sagecom Fast 5280 Router 83** Arris TM1602A Modem & Sagecom Fast 5280 Router
92 84
93My default modem and router, provided by my ISP, are fairly standard. 85My default modem and router, provided by my ISP, are fairly standard. The Arris
94The Arris modem supports DOCSIS 3.0, which is something that I 86modem supports DOCSIS 3.0, which is something that I definitely wanted as a
95definitely wanted as a minimum. The Sagecom router is also standard, no 87minimum. The Sagecom router is also standard, no fancy bells or whistles.
96fancy bells or whistles. However, it does support DHCP and DHCPv6, which 88However, it does support DHCP and DHCPv6, which is something you can use to
97is something you can use to route all household traffic through a 89route all household traffic through a pi-hole or firewall.
98pi-hole or firewall.
99 90
100** TP-Link EAP 91** TP-Link EAP
101 92
102In order to gain better control over the network, I use my own wireless 93In order to gain better control over the network, I use my own wireless access
103access point instead of the one included in the Sagecom router above. 94point instead of the one included in the Sagecom router above. Now I can control
104Now I can control and organize all of my ethernet connections through 95and organize all of my ethernet connections through the VLANs on the managed
105the VLANs on the managed switch and wireless connections through the 96switch and wireless connections through the VLANS on the EAP.
106VLANS on the EAP.
107 97
108** Generic Printer 98** Generic Printer
109 99
110The last piece to my homelab is a standard wireless printer. Nothing 100The last piece to my homelab is a standard wireless printer. Nothing special
111special here. 101here.
112 102
113* Software 103* Software
114 104
115** Ubuntu Server 20.04 105** Ubuntu Server 20.04
116 106
117While the 20.04 version of Ubuntu was just released, I always like to 107While the 20.04 version of Ubuntu was just released, I always like to experiment
118experiment with new features (and I don't mind breaking my system - it 108with new features (and I don't mind breaking my system - it just gives me more
119just gives me more experience learning how to fix things). So, I have 109experience learning how to fix things). So, I have Ubuntu Server 20.04 installed
120Ubuntu Server 20.04 installed on the Dell Optiplex server and Ubuntu 110on the Dell Optiplex server and Ubuntu Server 19.10 installed on the Raspberry
121Server 19.10 installed on the Raspberry Pi. Once I find an acceptable 111Pi. Once I find an acceptable use for the Pi, I will most likely switch the
122use for the Pi, I will most likely switch the operating system. 112operating system.
123 113
124** Docker 114** Docker
125 115
126I am /very/ new to Docker, but I have had a lot of fun playing with it 116I am /very/ new to Docker, but I have had a lot of fun playing with it so far.
127so far. Docker is used to create containers that can hold all the 117Docker is used to create containers that can hold all the contents of a system
128contents of a system without interfering with other software on the same 118without interfering with other software on the same system. So far, I have
129system. So far, I have successfully installed pi-hole, GitLab, Gogs, and 119successfully installed pi-hole, GitLab, Gogs, and Nextcloud in containers.
130Nextcloud in containers. However, I opted to delete all of those so that 120However, I opted to delete all of those so that I can reconfigure them more
131I can reconfigure them more professionally at a later time. 121professionally at a later time.
132 122
133** Plex Media Server 123** Plex Media Server
134 124
135Plex is a media center software that allows you to organize your movies, 125Plex is a media center software that allows you to organize your movies, TV
136TV shows, music, photos, and videos automatically. It will even download 126shows, music, photos, and videos automatically. It will even download metadata
137metadata for you so that you can easily browse these collections. 127for you so that you can easily browse these collections.
138 128
139** Pi-hole 129** Pi-hole
140 130
141Pi-hole is an alternative ad-blocker that runs at the DNS level, 131Pi-hole is an alternative ad-blocker that runs at the DNS level, allowing you to
142allowing you to block traffic when it hits your network, so that you can 132block traffic when it hits your network, so that you can reject any traffic you
143reject any traffic you deem to be bad. Pi-hole uses blacklists and 133deem to be bad. Pi-hole uses blacklists and whitelists to decide which traffic
144whitelists to decide which traffic block and, luckily, there are a lot 134block and, luckily, there are a lot of pre-made lists out there on Reddit,
145of pre-made lists out there on Reddit, GitHub, etc. 135GitHub, etc.
146 136
147** Nextcloud 137** Nextcloud
148 138
149While I had trouble with the Docker version of Nextcloud, I was very 139While I had trouble with the Docker version of Nextcloud, I was very successful
150successful when setting up the snap version. Using this, I was able to 140when setting up the snap version. Using this, I was able to map Nextcloud to a
151map Nextcloud to a subdomain of a domain I own in Namecheap. 141subdomain of a domain I own in Namecheap. Additionally, Nextcloud has an
152Additionally, Nextcloud has an integration with Let's Encrypt that 142integration with Let's Encrypt that allows me to issue certificates
153allows me to issue certificates automatically to any new domain I 143automatically to any new domain I authorize.
154authorize.
155 144
156** Webmin 145** Webmin
157 146
158To monitor my servers, and the processes running on them, I use the 147To monitor my servers, and the processes running on them, I use the Webmin
159Webmin dashboard. This was fairly painless to set up, and I currently 148dashboard. This was fairly painless to set up, and I currently access it
160access it straight through the server's IP address. In the future, I 149straight through the server's IP address. In the future, I will be looking to
161will be looking to configure Webmin to use a custom domain just like 150configure Webmin to use a custom domain just like Nextcloud.
162Nextcloud.
content/blog/2020-05-19-customizing-ubuntu.org +80 −96
@@ -10,145 +10,127 @@ For inspiration on designing your *nix computer, check out the
10 10
11* Customizing Ubuntu 11* Customizing Ubuntu
12 12
13New to Linux and want to add a personal touch to your machine? One of 13New to Linux and want to add a personal touch to your machine? One of the best
14the best perks of Linux is that it is *extremely* customizable. You can 14perks of Linux is that it is *extremely* customizable. You can change the styles
15change the styles of the windows, shell (status bars/docks), icons, 15of the windows, shell (status bars/docks), icons, fonts, terminals, and more.
16fonts, terminals, and more.
17 16
18In this post, I'm going to go through customization on Ubuntu 20.04 17In this post, I'm going to go through customization on Ubuntu 20.04 (GNOME)
19(GNOME) since most new users tend to choose Ubuntu-based distros. If 18since most new users tend to choose Ubuntu-based distros. If you've found a way
20you've found a way to install Arch with i3-gaps, I'm assuming you know 19to install Arch with i3-gaps, I'm assuming you know how to find more advanced
21how to find more advanced tutorials out there on customizations. 20tutorials out there on customizations.
22 21
23** Required Tools 22** Required Tools
24 23
25Ubuntu 20.04 ships with the default desktop environment 24Ubuntu 20.04 ships with the default desktop environment [[https://www.gnome.org/][Gnome]], which includes
26[[https://www.gnome.org/][Gnome]], which includes the handy 25the handy =gnome-tweaks= tool to quickly change designs. To install this, just
27=gnome-tweaks= tool to quickly change designs. To install this, just
28open your terminal and enter the following command: 26open your terminal and enter the following command:
29 27
30#+begin_src sh 28#+begin_src sh
31sudo apt install gnome-tweaks 29sudo apt install gnome-tweaks
32#+end_src 30#+end_src
33 31
34After you've finished installing the tool, simply launch the Tweaks 32After you've finished installing the tool, simply launch the Tweaks application,
35application, and you'll be able to access the various customization 33and you'll be able to access the various customization options available by
36options available by default on Ubuntu. You might even like some of the 34default on Ubuntu. You might even like some of the pre-installed options.
37pre-installed options.
38 35
39** GNOME Application Themes 36** GNOME Application Themes
40 37
41To change the themes applied to applications in GNOME, you will need to 38To change the themes applied to applications in GNOME, you will need to change
42change the Applications dropdown in the Appearance section of Tweaks. To 39the Applications dropdown in the Appearance section of Tweaks. To add more
43add more themes, you will have to find your preferred theme online and 40themes, you will have to find your preferred theme online and follow the steps
44follow the steps below to have it show up in the Tweaks tool. While you 41below to have it show up in the Tweaks tool. While you may find themes anywhere,
45may find themes anywhere, one of the most popular sites for GNOME themes 42one of the most popular sites for GNOME themes is [[https://www.gnome-look.org/][gnome-look.org]]. This website
46is [[https://www.gnome-look.org/][gnome-look.org]]. This website
47contains themes for applications, shells, icons, and cursors. 43contains themes for applications, shells, icons, and cursors.
48 44
49Steps to import themes into Tweaks: 45Steps to import themes into Tweaks:
50 46
511. Download the theme. 471. Download the theme.
522. These files are usually compressed (.zip, .tar.gz, .tar.xz), so you 482. These files are usually compressed (.zip, .tar.gz, .tar.xz), so you will need
53 will need to extract the contents. This is easiest when opening the 49 to extract the contents. This is easiest when opening the file explorer,
54 file explorer, right-clicking the compressed file, and choosing 50 right-clicking the compressed file, and choosing "Extract here."
55 "Extract here."
563. Move the theme folder to =/usr/share/themes/=. You can do so with the 513. Move the theme folder to =/usr/share/themes/=. You can do so with the
57 following command: =sudo mv theme-folder/ /usr/share/themes/=. 52 following command: =sudo mv theme-folder/ /usr/share/themes/=.
58 - Icons and cursors will be moved to the =/usr/share/icons/= folder. 53 - Icons and cursors will be moved to the =/usr/share/icons/= folder.
59 - Fonts will be moved to the =/usr/share/fonts/= folder 54 - Fonts will be moved to the =/usr/share/fonts/= folder Alternatively, you
60 Alternatively, you can move them to the 55 can move them to the =/usr/share/fonts/opentype/= or
61 =/usr/share/fonts/opentype/= or =/usr/share/fonts/opentype/= 56 =/usr/share/fonts/opentype/= folders, if you have a specific font type.
62 folders, if you have a specific font type.
634. Close tweaks if it is open. Re-open Tweaks and your new theme will be 574. Close tweaks if it is open. Re-open Tweaks and your new theme will be
64 available in the Applications dropdown in the Appearance section of 58 available in the Applications dropdown in the Appearance section of Tweaks.
65 Tweaks.
66 59
67If the theme is not showing up after you've moved it into the themes 60If the theme is not showing up after you've moved it into the themes folder, you
68folder, you may have uncompressed the folder into a sub-folder. You can 61may have uncompressed the folder into a sub-folder. You can check this by
69check this by entering the theme folder and listing the contents: 62entering the theme folder and listing the contents:
70 63
71#+begin_src sh 64#+begin_src sh
72cd /usr/share/themes/Mojave-Dark && ls -la 65cd /usr/share/themes/Mojave-Dark && ls -la
73#+end_src 66#+end_src
74 67
75This is an example of what the contents of your theme folder should look 68This is an example of what the contents of your theme folder should look like.
76like. If you just see another folder there, you should move that folder 69If you just see another folder there, you should move that folder up into the
77up into the =/usr/share/themes/= folder. 70=/usr/share/themes/= folder.
78 71
79#+begin_src sh 72#+begin_src sh
80cinnamon COPYING gnome-shell gtk-2.0 gtk-3.0 index.theme metacity-1 plank xfwm4 73cinnamon COPYING gnome-shell gtk-2.0 gtk-3.0 index.theme metacity-1 plank xfwm4
81#+end_src 74#+end_src
82 75
83** GNOME Shell Themes 76** GNOME Shell Themes
84 77
85To change the appearance of the title bar, default dock, app menu, and 78To change the appearance of the title bar, default dock, app menu, and other
86other parts of the GNOME shell, you'll need to install the 79parts of the GNOME shell, you'll need to install the [[https://extensions.gnome.org/extension/19/user-themes/][user themes]] extension on
87[[https://extensions.gnome.org/extension/19/user-themes/][user themes]] 80[[https://extensions.gnome.org/][Gnome Extensions]]. To be able to install extensions, you will first need to
88extension on [[https://extensions.gnome.org/][Gnome Extensions]]. To be 81install the browser extension that the website instructs you to. See this
89able to install extensions, you will first need to install the browser 82screenshot for the blue box with a link to the extension.
90extension that the website instructs you to. See this screenshot for the
91blue box with a link to the extension.
92 83
93After the browser extension is installed, you will need to install the 84After the browser extension is installed, you will need to install the native
94native host connector: 85host connector:
95 86
96#+begin_src sh 87#+begin_src sh
97sudo apt install chrome-gnome-shell 88sudo apt install chrome-gnome-shell
98#+end_src 89#+end_src
99 90
100Finally, you can go the 91Finally, you can go the [[https://extensions.gnome.org/extension/19/user-themes/][user themes]] extension page and click the installation
101[[https://extensions.gnome.org/extension/19/user-themes/][user themes]] 92button. This will enable the Shell option in Tweaks. Now you can move shell
102extension page and click the installation button. This will enable the 93themes to the =/usr/share/themes= directory, using the same steps mentioned in
103Shell option in Tweaks. Now you can move shell themes to the 94the previous section, and enable the new theme in Tweaks.
104=/usr/share/themes= directory, using the same steps mentioned in the
105previous section, and enable the new theme in Tweaks.
106 95
107** Icons & Cursors 96** Icons & Cursors
108 97
109Icons and cursors are installed exactly the same way, so I'm grouping 98Icons and cursors are installed exactly the same way, so I'm grouping these
110these together in this post. Both of these items will need to follow the 99together in this post. Both of these items will need to follow the same process
111same process as installing themes, except you will want to move your 100as installing themes, except you will want to move your font folders to the
112font folders to the =/usr/share/icons/= directory instead. 101=/usr/share/icons/= directory instead.
113 102
114** Fonts 103** Fonts
115 104
116Fonts are one of the overlooked parts of customization, but a good font 105Fonts are one of the overlooked parts of customization, but a good font can make
117can make the whole screen look different. For example, I have installed 106the whole screen look different. For example, I have installed the [[https://github.com/IBM/plex/releases][IBM Plex]]
118the [[https://github.com/IBM/plex/releases][IBM Plex]] fonts on my 107fonts on my system. This follows the same process as installing themes, except
119system. This follows the same process as installing themes, except you 108you will want to move your font folders to the =/usr/share/fonts/= directory
120will want to move your font folders to the =/usr/share/fonts/= directory
121instead. 109instead.
122 110
123** Terminal 111** Terminal
124 112
125If you spend a lot of time typing commands, you know how important the 113If you spend a lot of time typing commands, you know how important the style and
126style and functionality of the terminal is. After spending a lot of time 114functionality of the terminal is. After spending a lot of time using the default
127using the default GNOME terminal with 115GNOME terminal with [[https://en.wikipedia.org/wiki/Bash_(Unix_shell)][unix shell]], I decided to try some different options. I ended
128[[https://en.wikipedia.org/wiki/Bash_(Unix_shell)][unix shell]], I 116up choosing [[https://terminator-gtk3.readthedocs.io/en/latest/][Terminator]] with [[https://en.wikipedia.org/wiki/Z_shell][zsh]].
129decided to try some different options. I ended up choosing 117
130[[https://terminator-gtk3.readthedocs.io/en/latest/][Terminator]] with 118Terminator is great if you need to open multiple terminals at one time by simply
131[[https://en.wikipedia.org/wiki/Z_shell][zsh]]. 119right-clicking and splitting the screen into as many terminals as you want.
132 120While this project hasn't been updated in a while, [[https://github.com/gnome-terminator/terminator/issues/1][it is coming under new
133Terminator is great if you need to open multiple terminals at one time 121development]]. However, this terminal is great and I haven't experienced any
134by simply right-clicking and splitting the screen into as many terminals 122errors yet.
135as you want. While this project hasn't been updated in a while, 123
136[[https://github.com/gnome-terminator/terminator/issues/1][it is coming 124For the shell choice, I decided to choose zsh after trying it out on a fresh
137under new development]]. However, this terminal is great and I haven't 125Manjaro installation. Zsh is great if you like to change the themes of your
138experienced any errors yet. 126terminal, include icons, or add plugins.
139 127
140For the shell choice, I decided to choose zsh after trying it out on a 128The desktop uses the [[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]] to suggest past commands as you type.
141fresh Manjaro installation. Zsh is great if you like to change the 129In addition, it suggests corrections if you misspell a command. Lastly, it uses
142themes of your terminal, include icons, or add plugins. 130the =af-magic= theme, which adds dashed lines between commands, moving the
143 131user@host tag to the right side of the terminal, and changes the colors. There
144The desktop uses the 132are plenty of plugins and themes to choose from. Just figure out what you like
145[[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]] 133and add it to your =~/.zshrc= file!
146to suggest past commands as you type. In addition, it suggests
147corrections if you misspell a command. Lastly, it uses the =af-magic=
148theme, which adds dashed lines between commands, moving the user@host
149tag to the right side of the terminal, and changes the colors. There are
150plenty of plugins and themes to choose from. Just figure out what you
151like and add it to your =~/.zshrc= file!
152 134
153*** Steps to Replicate My Terminal 135*** Steps to Replicate My Terminal
154 136
@@ -173,18 +155,20 @@ sudo apt install terminator
173To install Oh My Zsh on Ubuntu: 155To install Oh My Zsh on Ubuntu:
174 156
175#+begin_src sh 157#+begin_src sh
176sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 158sh -c "$(curl -fsSL
159https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
177#+end_src 160#+end_src
178 161
179To install zsh-autosuggestions via Oh My Zsh: 162To install zsh-autosuggestions via Oh My Zsh:
180 163
181#+begin_src sh 164#+begin_src sh
182git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions 165git clone https://github.com/zsh-users/zsh-autosuggestions
166${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
183#+end_src 167#+end_src
184 168
185Then, add the following plugin wording to your =~/.zshrc= file (the 169Then, add the following plugin wording to your =~/.zshrc= file (the default
186default config usually has the =git= plugin activated, so just add any 170config usually has the =git= plugin activated, so just add any other plugins to
187other plugins to the parentheses separated by a space): 171the parentheses separated by a space):
188 172
189#+begin_src sh 173#+begin_src sh
190nano ~/.zshrc 174nano ~/.zshrc
@@ -194,5 +178,5 @@ nano ~/.zshrc
194plugins=(git zsh-autosuggestions) 178plugins=(git zsh-autosuggestions)
195#+end_src 179#+end_src
196 180
197Finally, you need to log out of your computer and log back in so your 181Finally, you need to log out of your computer and log back in so your user shell
198user shell can refresh. 182can refresh.
content/blog/2020-07-20-video-game-sales.org +18 −21
@@ -5,10 +5,8 @@
5 5
6* Background Information 6* Background Information
7 7
8This dataset (obtained from 8This dataset (obtained from [[https://www.kaggle.com/gregorut/videogamesales/data][Kaggle]]) contains a list of video games with sales
9[[https://www.kaggle.com/gregorut/videogamesales/data][Kaggle]]) 9greater than 100,000 copies. It was generated by a scrape of vgchartz.com.
10contains a list of video games with sales greater than 100,000 copies.
11It was generated by a scrape of vgchartz.com.
12 10
13Fields include: 11Fields include:
14 12
@@ -24,8 +22,7 @@ Fields include:
24- Other_{Sales}: Sales in the rest of the world (in millions) 22- Other_{Sales}: Sales in the rest of the world (in millions)
25- Global_{Sales}: Total worldwide sales. 23- Global_{Sales}: Total worldwide sales.
26 24
27There are 16,598 records. 2 records were dropped due to incomplete 25There are 16,598 records. 2 records were dropped due to incomplete information.
28information.
29 26
30* Import the Data 27* Import the Data
31 28
@@ -138,18 +135,18 @@ df3.sort_values(by=['Global_Sales'], ascending=False).head(5)
138 135
139* Discussion 136* Discussion
140 137
141The purpose of exploring datasets is to ask questions, answer questions, 138The purpose of exploring datasets is to ask questions, answer questions, and
142and discover intelligence that can be used to inform decision-making. 139discover intelligence that can be used to inform decision-making. So, what have
143So, what have we found in this dataset? 140we found in this dataset?
144 141
145Today we simply explored a publicly-available dataset to see what kind 142Today we simply explored a publicly-available dataset to see what kind of
146of information it contained. During that exploration, we found that 143information it contained. During that exploration, we found that video game
147video game sales peaked in 2006. That peak was largely due to Nintendo, 144sales peaked in 2006. That peak was largely due to Nintendo, who sold the top 5
148who sold the top 5 games in 2006 and has a number of games in the top-10 145games in 2006 and has a number of games in the top-10 list for the years
149list for the years 1980-2020. Additionally, the top four platforms by 1461980-2020. Additionally, the top four platforms by global sales (Wii, NES, GB,
150global sales (Wii, NES, GB, DS) are owned by Nintendo. 147DS) are owned by Nintendo.
151 148
152We didn't explore everything this dataset has to offer, but we can tell 149We didn't explore everything this dataset has to offer, but we can tell from a
153from a brief analysis that Nintendo seems to rule sales in the video 150brief analysis that Nintendo seems to rule sales in the video gaming world.
154gaming world. Further analysis could provide insight into which genres, 151Further analysis could provide insight into which genres, regions, publishers,
155regions, publishers, or world events are correlated with sales. 152or world events are correlated with sales.
content/blog/2020-07-26-business-analysis.org +57 −62
@@ -5,9 +5,9 @@
5 5
6* Background Information 6* Background Information
7 7
8This project aims to help investors learn more about a random city in 8This project aims to help investors learn more about a random city in order to
9order to determine optimal locations for business investments. The data 9determine optimal locations for business investments. The data used in this
10used in this project was obtained using Foursquare's developer API. 10project was obtained using Foursquare's developer API.
11 11
12Fields include: 12Fields include:
13 13
@@ -16,13 +16,13 @@ Fields include:
16- Venue Latitude 16- Venue Latitude
17- Venue Longitude 17- Venue Longitude
18 18
19There are 232 records found using the center of Lincoln as the area of 19There are 232 records found using the center of Lincoln as the area of interest
20interest with a radius of 10,000. 20with a radius of 10,000.
21 21
22* Import the Data 22* Import the Data
23 23
24The first step is the simplest: import the applicable libraries. We will 24The first step is the simplest: import the applicable libraries. We will be
25be using the libraries below for this project. 25using the libraries below for this project.
26 26
27#+begin_src python 27#+begin_src python
28# Import the Python libraries we will be using 28# Import the Python libraries we will be using
@@ -35,10 +35,10 @@ from pandas.io.json import json_normalize
35from sklearn.cluster import KMeans 35from sklearn.cluster import KMeans
36#+end_src 36#+end_src
37 37
38To begin our analysis, we need to import the data for this project. The 38To begin our analysis, we need to import the data for this project. The data we
39data we are using in this project comes directly from the Foursquare 39are using in this project comes directly from the Foursquare API. The first step
40API. The first step is to get the latitude and longitude of the city 40is to get the latitude and longitude of the city being studied (Lincoln, NE) and
41being studied (Lincoln, NE) and setting up the folium map. 41setting 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
@@ -49,11 +49,11 @@ map_LNK = folium.Map(location=[latitude, longitude], zoom_start=12)
49map_LNK 49map_LNK
50#+end_src 50#+end_src
51 51
52Now that we have defined our city and created the map, we need to go get 52Now that we have defined our city and created the map, we need to go get the
53the business data. The Foursquare API will limit the results to 100 per 53business data. The Foursquare API will limit the results to 100 per API call, so
54API call, so we use our first API call below to determine the total 54we use our first API call below to determine the total results that Foursquare
55results that Foursquare has found. Since the total results are 232, we 55has found. Since the total results are 232, we perform the API fetching process
56perform the API fetching process three times (100 + 100 + 32 = 232). 56three times (100 + 100 + 32 = 232).
57 57
58#+begin_src python 58#+begin_src python
59# Foursquare API credentials 59# Foursquare API credentials
@@ -117,13 +117,12 @@ results3 = requests.get(url3).json()
117 117
118* Clean the Data 118* Clean the Data
119 119
120Now that we have our data in three separate dataframes, we need to 120Now that we have our data in three separate dataframes, we need to combine them
121combine them into a single dataframe and make sure to reset the index so 121into a single dataframe and make sure to reset the index so that we have a
122that we have a unique ID for each business. The =get~categorytype~= 122unique ID for each business. The =get~categorytype~= function below will pull
123function below will pull the categories and name from each business's 123the categories and name from each business's entry in the Foursquare data
124entry in the Foursquare data automatically. Once all the data has been 124automatically. Once all the data has been labeled and combined, the results are
125labeled and combined, the results are stored in the =nearby_venues= 125stored in the =nearby_venues= dataframe.
126dataframe.
127 126
128#+begin_src python 127#+begin_src python
129# This function will extract the category of the venue from the API dictionary 128# This function will extract the category of the venue from the API dictionary
@@ -192,9 +191,9 @@ nearby_venues
192 191
193* Visualize the Data 192* Visualize the Data
194 193
195We now have a complete, clean data set. The next step is to visualize 194We now have a complete, clean data set. The next step is to visualize this data
196this data onto the map we created earlier. We will be using folium's 195onto the map we created earlier. We will be using folium's =CircleMarker()=
197=CircleMarker()= function to do this. 196function to do this.
198 197
199#+begin_src python 198#+begin_src python
200# add markers to map 199# add markers to map
@@ -216,15 +215,14 @@ map_LNK
216 215
217* Clustering: /k-means/ 216* Clustering: /k-means/
218 217
219To cluster the data, we will be using the /k-means/ algorithm. This 218To cluster the data, we will be using the /k-means/ algorithm. This algorithm is
220algorithm is iterative and will automatically make sure that data points 219iterative and will automatically make sure that data points in each cluster are
221in each cluster are as close as possible to each other, while being as 220as close as possible to each other, while being as far as possible away from
222far as possible away from other clusters. 221other clusters.
223 222
224However, we first have to figure out how many clusters to use (defined 223However, we first have to figure out how many clusters to use (defined as the
225as the variable /'k'/). To do so, we will use the next two functions to 224variable /'k'/). To do so, we will use the next two functions to calculate the
226calculate the sum of squares within clusters and then return the optimal 225sum of squares within clusters and then return the optimal number of clusters.
227number of clusters.
228 226
229#+begin_src python 227#+begin_src python
230# 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
@@ -262,9 +260,9 @@ def optimal_number_of_clusters(wcss):
262n = optimal_number_of_clusters(sum_of_squares) 260n = optimal_number_of_clusters(sum_of_squares)
263#+end_src 261#+end_src
264 262
265Now that we have found that our optimal number of clusters is six, we 263Now that we have found that our optimal number of clusters is six, we need to
266need to perform k-means clustering. When this clustering occurs, each 264perform k-means clustering. When this clustering occurs, each business is
267business is assigned a cluster number from 0 to 5 in the dataframe. 265assigned a cluster number from 0 to 5 in the dataframe.
268 266
269#+begin_src python 267#+begin_src python
270# set number of clusters equal to the optimal number 268# set number of clusters equal to the optimal number
@@ -304,12 +302,11 @@ map_clusters
304 302
305* Investigate Clusters 303* Investigate Clusters
306 304
307Now that we have figured out our clusters, let's do a little more 305Now that we have figured out our clusters, let's do a little more analysis to
308analysis to provide more insight into the clusters. With the information 306provide more insight into the clusters. With the information below, we can see
309below, we can see which clusters are more popular for businesses and 307which clusters are more popular for businesses and which are less popular. The
310which are less popular. The results below show us that clusters 0 308results below show us that clusters 0 through 3 are popular, while clusters 4
311through 3 are popular, while clusters 4 and 5 are not very popular at 309and 5 are not very popular at all.
312all.
313 310
314#+begin_src python 311#+begin_src python
315# Show how many venues are in each cluster 312# Show how many venues are in each cluster
@@ -320,9 +317,9 @@ for x in range(0,6):
320 print("---") 317 print("---")
321#+end_src 318#+end_src
322 319
323Our last piece of analysis is to summarize the categories of businesses 320Our last piece of analysis is to summarize the categories of businesses within
324within each cluster. With these results, we can clearly see that 321each cluster. With these results, we can clearly see that restaurants, coffee
325restaurants, coffee shops, and grocery stores are the most popular. 322shops, and grocery stores are the most popular.
326 323
327#+begin_src python 324#+begin_src python
328# Calculate how many venues there are in each category 325# Calculate how many venues there are in each category
@@ -348,19 +345,17 @@ with pd.option_context('display.max_rows', None, 'display.max_columns', None):
348 345
349* Discussion 346* Discussion
350 347
351In this project, we gathered location data for Lincoln, Nebraska, USA 348In this project, we gathered location data for Lincoln, Nebraska, USA and
352and clustered the data using the k-means algorithm in order to identify 349clustered the data using the k-means algorithm in order to identify the unique
353the unique clusters of businesses in Lincoln. Through these actions, we 350clusters of businesses in Lincoln. Through these actions, we found that there
354found that there are six unique business clusters in Lincoln and that 351are six unique business clusters in Lincoln and that two of the clusters are
355two of the clusters are likely unsuitable for investors. The remaining 352likely unsuitable for investors. The remaining four clusters have a variety of
356four clusters have a variety of businesses, but are largely dominated by 353businesses, but are largely dominated by restaurants and grocery stores.
357restaurants and grocery stores. 354
358 355Using this project, investors can now make more informed decisions when deciding
359Using this project, investors can now make more informed decisions when 356the location and category of business in which to invest.
360deciding the location and category of business in which to invest. 357
361 358Further studies may involve other attributes for business locations, such as
362Further studies may involve other attributes for business locations, 359population density, average wealth across the city, or crime rates. In addition,
363such as population density, average wealth across the city, or crime 360further studies may include additional location data and businesses by utilizing
364rates. In addition, further studies may include additional location data 361multiple sources, such as Google Maps and OpenStreetMap.
365and businesses by utilizing multiple sources, such as Google Maps and
366OpenStreetMap.
content/blog/2020-08-22-redirect-github-pages.org +44 −52
@@ -7,18 +7,17 @@
7 7
8** Step 1 8** Step 1
9 9
10Add a new file CNAME to your GitHub Pages repository containing only one 10Add a new file CNAME to your GitHub Pages repository containing only one line:
11line: your top-level domain name. E.g.: =example.com= 11your top-level domain name. E.g.: =example.com=
12 12
13** Step 2 13** Step 2
14 14
15[Optional] but highly recommended 15[Optional] but highly recommended
16 16
172.1: Remove all other top-level records (prefixed with @) of type A from 172.1: Remove all other top-level records (prefixed with @) of type A from your
18your DNS configuration. 18DNS configuration.
19 19
202.2: Remove a CNAME record for the second-level domain www if it is 202.2: Remove a CNAME record for the second-level domain www if it is present.
21present.
22 21
23** Step 3 22** Step 3
24 23
@@ -41,48 +40,45 @@ immediately. They can take up to a full day to propagate.
41 40
42* Long answer 41* Long answer
43 42
44This issue has two sides. One is the DNS configuration itself. Another 43This issue has two sides. One is the DNS configuration itself. Another one is
45one is the way GitHub Pages will forward HTTP requests. 44the way GitHub Pages will forward HTTP requests.
46 45
47We need to know a few things to understand what GitHub is trying to say 46We need to know a few things to understand what GitHub is trying to say in their
48in their documentation. 47documentation.
49 48
50** DNS Entry Types 49** DNS Entry Types
51 50
52There are two types of DNS records which interest us: CNAME and A. 51There are two types of DNS records which interest us: CNAME and A.
53 52
54=A= is also known as =Apex= or sometimes as =root entry=. It forwards 53=A= is also known as =Apex= or sometimes as =root entry=. It forwards requests
55requests to a specified fixed IP address. =CNAME= entry forwards 54to a specified fixed IP address. =CNAME= entry forwards requests to a specified
56requests to a specified URL (actual valid plain text URL, not an IP 55URL (actual valid plain text URL, not an IP address).
57address).
58 56
59** DNS Load balancing 57** DNS Load balancing
60 58
61GitHub has one central URL address which accepts all DNS requests for 59GitHub has one central URL address which accepts all DNS requests for GitHub
62GitHub Pages: =http://username.github.io=. That URL is resolved to 60Pages: =http://username.github.io=. That URL is resolved to different IP
63different IP addresses based on your geographical location. Website 61addresses based on your geographical location. Website hosted on GitHub Pages is
64hosted on GitHub Pages is a simple collection of =HTML=, =CSS= and =JS= 62a simple collection of =HTML=, =CSS= and =JS= files. GitHub distributes these
65files. GitHub distributes these files to different servers across the 63files to different servers across the globe. So that when your browser sends a
66globe. So that when your browser sends a request from Europe, it 64request from Europe, it receives data from a server in Europe. The same is valid
67receives data from a server in Europe. The same is valid for the 65for the requests from Asia and the USA.
68requests from Asia and the USA.
69 66
70** What GitHub is trying to say 67** What GitHub is trying to say
71 68
72Since =A= records in DNS must contain IP addresses, and they must be 69Since =A= records in DNS must contain IP addresses, and they must be either
73either =185.199.108.153= or =185.199.109.153= or =185.199.110.153= or 70=185.199.108.153= or =185.199.109.153= or =185.199.110.153= or
74=185.199.111.153=, there is no way to forward requests to a server 71=185.199.111.153=, there is no way to forward requests to a server located
75located somewhere in Europe or Asia. Your website hosted at GitHub Pages 72somewhere in Europe or Asia. Your website hosted at GitHub Pages will be
76will be downloaded from a central GitHub Pages server. There is a minor 73downloaded from a central GitHub Pages server. There is a minor risk that if
77risk that if GitHub Pages DNS servers (=x.x.x.153=) are down for some 74GitHub Pages DNS servers (=x.x.x.153=) are down for some reason, all custom
78reason, all custom domains which use fixed GitHub Pages IP addresses 75domains which use fixed GitHub Pages IP addresses will not be accessible (their
79will not be accessible (their DNS requests will not be resolvable). 76DNS requests will not be resolvable).
80 77
81That is why GitHub strongly suggests to either use a second-level domain 78That is why GitHub strongly suggests to either use a second-level domain for
82for your GitHub Pages (e.g. =blog.example.com=) or use a DNS service 79your GitHub Pages (e.g. =blog.example.com=) or use a DNS service provider that
83provider that supports a record type =ALIAS= that acts as =A= record but 80supports a record type =ALIAS= that acts as =A= record but forwards request to a
84forwards request to a URL address (e.g. =username.github.io=) instead of 81URL address (e.g. =username.github.io=) instead of a fixed IP address.
85a fixed IP address.
86 82
87** How GitHub Pages treats HTTP requests 83** How GitHub Pages treats HTTP requests
88 84
@@ -101,12 +97,12 @@ curl --header "Host: example.com" http://185.199.108.153/
101This way GitHub Pages servers know which user website to serve. 97This way GitHub Pages servers know which user website to serve.
102 98
103#+begin_quote 99#+begin_quote
104GitHub Pages server will automatically redirect HTTP requests to the 100GitHub Pages server will automatically redirect HTTP requests to the top-level
105top-level domain if your =CNAME= file contains =example.com= but 101domain if your =CNAME= file contains =example.com= but =www.example.com= is
106=www.example.com= is requested. 102requested.
107 103
108The same is valid if your =CNAME= file contains =www.example.com= but 104The same is valid if your =CNAME= file contains =www.example.com= but the header
109the header =Host= in the =HTTP= request contains =example.com=. 105=Host= in the =HTTP= request contains =example.com=.
110#+end_quote 106#+end_quote
111 107
112** Why can't I add a =CNAME= record entry that accepts a top-level request (=@=) to my DNS configuration? 108** Why can't I add a =CNAME= record entry that accepts a top-level request (=@=) to my DNS configuration?
@@ -114,18 +110,14 @@ the header =Host= in the =HTTP= request contains =example.com=.
114Quote from the GitHub Pages documentation: 110Quote from the GitHub Pages documentation:
115 111
116#+begin_quote 112#+begin_quote
117Warning: Do not create a CNAME record for your custom apex domain! Doing 113Warning: Do not create a CNAME record for your custom apex domain! Doing so may
118so may cause issues with other services, such as email, on that domain. 114cause issues with other services, such as email, on that domain.
119#+end_quote 115#+end_quote
120 116
121** References: 117** References:
122 118
1231. [[https://docs.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site][Setting 1191. [[https://docs.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site][Setting up a custom domain with GitHub Pages]]
124 up a custom domain with GitHub Pages]] 1202. [[https://docs.github.com/en/github/working-with-github-pages/troubleshooting-custom-domains-and-github-pages][My custom domain isn't working]]
1252. [[https://docs.github.com/en/github/working-with-github-pages/troubleshooting-custom-domains-and-github-pages][My 1213. [[https://serverfault.com/questions/589370/cannot-access-my-github-pages-website-by-ip-address][Cannot access my GitHub Pages website by IP Address]]
126 custom domain isn't working]] 1224. [[https://stackoverflow.com/questions/23375422/how-do-i-set-up-github-pages-to-redirect-dns-requests-from-a-subdomain-e-g-www][How do I set up GitHub Pages to redirect DNS requests from a subdomain (e.g.
1273. [[https://serverfault.com/questions/589370/cannot-access-my-github-pages-website-by-ip-address][Cannot 123 www) to the top-level domain (TLD, Apex record)?]]
128 access my GitHub Pages website by IP Address]]
1294. [[https://stackoverflow.com/questions/23375422/how-do-i-set-up-github-pages-to-redirect-dns-requests-from-a-subdomain-e-g-www][How
130 do I set up GitHub Pages to redirect DNS requests from a subdomain
131 (e.g. www) to the top-level domain (TLD, Apex record)?]]
content/blog/2020-08-29-php-auth-flow.org +40 −47
@@ -5,16 +5,15 @@
5 5
6* Introduction 6* Introduction
7 7
8When creating websites that will allow users to create accounts, the 8When creating websites that will allow users to create accounts, the developer
9developer always needs to consider the proper authentication flow for 9always needs to consider the proper authentication flow for their app. For
10their app. For example, some developers will utilize an API for 10example, some developers will utilize an API for authentication, some will use
11authentication, some will use OAuth, and some may just use their own 11OAuth, and some may just use their own simple database.
12simple database.
13 12
14For those using pre-built libraries, authentication may simply be a 13For those using pre-built libraries, authentication may simply be a problem of
15problem of copying and pasting the code from their library's 14copying and pasting the code from their library's documentation. For example,
16documentation. For example, here's the code I use to authenticate users 15here's the code I use to authenticate users with the Tumblr OAuth API for my
17with the Tumblr OAuth API for my Tumblr client, Vox Populi: 16Tumblr client, Vox Populi:
18 17
19#+begin_src php 18#+begin_src php
20// Start the session 19// Start the session
@@ -39,24 +38,23 @@ $client = new Tumblr\API\Client(
39); 38);
40#+end_src 39#+end_src
41 40
42However, developers creating authentication flows from scratch will need 41However, developers creating authentication flows from scratch will need to
43to think carefully about when to make sure a web page will check the 42think carefully about when to make sure a web page will check the user's
44user's authenticity. 43authenticity.
45 44
46In this article, we're going to look at a simple authentication flow 45In this article, we're going to look at a simple authentication flow using a
47using a MySQL database and PHP. 46MySQL database and PHP.
48 47
49* Creating User Accounts 48* Creating User Accounts
50 49
51The beginning to any type of user authentication is to create a user 50The beginning to any type of user authentication is to create a user account.
52account. This process can take many formats, but the simplest is to 51This process can take many formats, but the simplest is to accept user input
53accept user input from a form (e.g., username and password) and send it 52from a form (e.g., username and password) and send it over to your database. For
54over to your database. For example, here's a snippet that shows how to 53example, here's a snippet that shows how to get username and password parameters
55get username and password parameters that would come when a user submits 54that would come when a user submits a form to your PHP script.
56a form to your PHP script.
57 55
58*Note*: Ensure that your password column is large enough to hold the 56*Note*: Ensure that your password column is large enough to hold the hashed
59hashed value (at least 60 characters or longer). 57value (at least 60 characters or longer).
60 58
61#+begin_src php 59#+begin_src php
62// Get the values from the URL 60// Get the values from the URL
@@ -95,9 +93,9 @@ $conn->close();
95 93
96** Validate Returning Users 94** Validate Returning Users
97 95
98To be able to verify that a returning user has a valid username and 96To be able to verify that a returning user has a valid username and password in
99password in your database is as simple as having users fill out a form 97your database is as simple as having users fill out a form and comparing their
100and comparing their inputs to your database. 98inputs to your database.
101 99
102#+begin_src php 100#+begin_src php
103// Query the database for username and password 101// Query the database for username and password
@@ -114,24 +112,23 @@ if(password_verify($password_input, $hashed_password)) {
114 112
115* Storing Authentication State 113* Storing Authentication State
116 114
117Once you've created the user's account, now you're ready to initialize 115Once you've created the user's account, now you're ready to initialize the
118the user's session. *You will need to do this on every page you load 116user's session. *You will need to do this on every page you load while the user
119while the user is logged in.* To do so, simply enter the following code 117is logged in.* To do so, simply enter the following code snippet:
120snippet:
121 118
122#+begin_src php 119#+begin_src php
123session_start(); 120session_start();
124#+end_src 121#+end_src
125 122
126Once you've initialized the session, the next step is to store the 123Once you've initialized the session, the next step is to store the session in a
127session in a cookie so that you can access it later. 124cookie so that you can access it later.
128 125
129#+begin_src php 126#+begin_src php
130setcookie(session_name()); 127setcookie(session_name());
131#+end_src 128#+end_src
132 129
133Now that the session name has been stored, you'll be able to check if 130Now that the session name has been stored, you'll be able to check if there's an
134there's an active session whenever you load a page. 131active session whenever you load a page.
135 132
136#+begin_src php 133#+begin_src php
137if(isset(session_name())) { 134if(isset(session_name())) {
@@ -141,9 +138,9 @@ if(isset(session_name())) {
141 138
142** Removing User Authentication 139** Removing User Authentication
143 140
144The next logical step is to give your users the option to log out once 141The next logical step is to give your users the option to log out once they are
145they are done using your application. This can be tricky in PHP since a 142done using your application. This can be tricky in PHP since a few of the
146few of the standard ways do not always work. 143standard ways do not always work.
147 144
148#+begin_src php 145#+begin_src php
149// Initialize the session. 146// Initialize the session.
@@ -181,14 +178,10 @@ die();
181 178
182* Wrapping Up 179* Wrapping Up
183 180
184Now you should be ready to begin your authentication programming with 181Now you should be ready to begin your authentication programming with PHP. You
185PHP. You can create user accounts, create sessions for users across 182can create user accounts, create sessions for users across different pages of
186different pages of your site, and then destroy the user data when 183your site, and then destroy the user data when they're ready to leave.
187they're ready to leave. 184
188 185For more information on this subject, I recommend reading the [[https://www.php.net/][PHP Documentation]].
189For more information on this subject, I recommend reading the 186Specifically, you may want to look at [[https://www.php.net/manual/en/features.http-auth.php][HTTP Authentication with PHP]], [[https://www.php.net/manual/en/book.session.php][session
190[[https://www.php.net/][PHP Documentation]]. Specifically, you may want 187handling]], and [[https://www.php.net/manual/en/function.hash.php][hash]].
191to look at [[https://www.php.net/manual/en/features.http-auth.php][HTTP
192Authentication with PHP]],
193[[https://www.php.net/manual/en/book.session.php][session handling]],
194and [[https://www.php.net/manual/en/function.hash.php][hash]].
content/blog/2020-09-01-visual-recognition.org +60 −71
@@ -5,38 +5,31 @@
5 5
6* What is IBM Watson? 6* What is IBM Watson?
7 7
8If you've never heard of [[https://www.ibm.com/watson][Watson]], this 8If you've never heard of [[https://www.ibm.com/watson][Watson]], this service is a suite of enterprise-ready AI
9service is a suite of enterprise-ready AI services, applications, and 9services, applications, and tooling provided by IBM. Watson contains quite a few
10tooling provided by IBM. Watson contains quite a few useful tools for 10useful tools for data scientists and students, including the subject of this
11data scientists and students, including the subject of this post today: 11post today: visual recognition.
12visual recognition.
13 12
14If you'd like to view the official documentation for the Visual 13If you'd like to view the official documentation for the Visual Recognition API,
15Recognition API, visit the 14visit the [[https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3?code=python][API Docs]].
16[[https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3?code=python][API
17Docs]].
18 15
19* Prerequisites 16* Prerequisites
20 17
21To be able to use Watson Visual Recognition, you'll need the following: 18To be able to use Watson Visual Recognition, you'll need the following:
22 19
231. Create a free account on 201. Create a free account on [[https://www.ibm.com/cloud/watson-studio][IBM Watson Studio]].
24 [[https://www.ibm.com/cloud/watson-studio][IBM Watson Studio]]. 212. Add the [[https://www.ibm.com/cloud/watson-visual-recognition][Watson Visual Recognition]] service to your IBM Watson account.
252. Add the [[https://www.ibm.com/cloud/watson-visual-recognition][Watson 223. Get your API key and URL. To do this, first go to the [[https://dataplatform.cloud.ibm.com/home2?context=cpdaas][profile dashboard]] for
26 Visual Recognition]] service to your IBM Watson account. 23 your IBM account and click on the Watson Visual Recognition service you
273. Get your API key and URL. To do this, first go to the 24 created. This will be listed in the section titled *Your services*. Then
28 [[https://dataplatform.cloud.ibm.com/home2?context=cpdaas][profile 25 click the *Credentials* tab and open the *Auto-generated credentials*
29 dashboard]] for your IBM account and click on the Watson Visual 26 dropdown. Copy your API key and URL so that you can use them in the Python
30 Recognition service you created. This will be listed in the section 27 script later.
31 titled *Your services*. Then click the *Credentials* tab and open the 284. *[Optional]* While not required, you can also create the Jupyter Notebook for
32 *Auto-generated credentials* dropdown. Copy your API key and URL so 29 this project right inside [[https://www.ibm.com/cloud/watson-studio][Watson Studio]]. Watson Studio will save your
33 that you can use them in the Python script later. 30 notebooks inside an organized project and allow you to use their other
344. *[Optional]* While not required, you can also create the Jupyter 31 integrated products, such as storage containers, AI models, documentation,
35 Notebook for this project right inside 32 external sharing, etc.
36 [[https://www.ibm.com/cloud/watson-studio][Watson Studio]]. Watson
37 Studio will save your notebooks inside an organized project and allow
38 you to use their other integrated products, such as storage
39 containers, AI models, documentation, external sharing, etc.
40 33
41* Calling the IBM Watson Visual Recognition API 34* Calling the IBM Watson Visual Recognition API
42 35
@@ -48,8 +41,8 @@ To begin, we need to install the proper Python package for IBM Watson.
48pip install --upgrade --user "ibm-watson>=4.5.0" 41pip install --upgrade --user "ibm-watson>=4.5.0"
49#+end_src 42#+end_src
50 43
51Next, we need to specify the API key, version, and URL given to us when 44Next, we need to specify the API key, version, and URL given to us when we
52we created the Watson Visual Recognition service. 45created the Watson Visual Recognition service.
53 46
54#+begin_src python 47#+begin_src python
55apikey = "<your-apikey>" 48apikey = "<your-apikey>"
@@ -73,15 +66,15 @@ visual_recognition = VisualRecognitionV3(
73visual_recognition.set_service_url(url) 66visual_recognition.set_service_url(url)
74#+end_src 67#+end_src
75 68
76*[Optional]* If you'd like to tell the API not to use any data to 69*[Optional]* If you'd like to tell the API not to use any data to improve their
77improve their products, set the following header. 70products, set the following header.
78 71
79#+begin_src python 72#+begin_src python
80visual_recognition.set_default_headers({'x-watson-learning-opt-out': "true"}) 73visual_recognition.set_default_headers({'x-watson-learning-opt-out': "true"})
81#+end_src 74#+end_src
82 75
83Now we have our API all set and ready to go. For this example, I'm going 76Now we have our API all set and ready to go. For this example, I'm going to
84to include a =dict= of photos to load as we test out the API. 77include a =dict= of photos to load as we test out the API.
85 78
86#+begin_src python 79#+begin_src python
87data = [ 80data = [
@@ -112,14 +105,14 @@ data = [
112] 105]
113#+end_src 106#+end_src
114 107
115Now that we've set up our libraries and have the photos ready, let's 108Now that we've set up our libraries and have the photos ready, let's create a
116create a loop to call the API for each image. The code below shows a 109loop to call the API for each image. The code below shows a loop that calls the
117loop that calls the URL of each image and sends it to the API, 110URL of each image and sends it to the API, requesting results with at least 60%
118requesting results with at least 60% confidence. The results are output 111confidence. The results are output to the console with dotted lines separating
119to the console with dotted lines separating each section. 112each section.
120 113
121In the case of an API error, the codes and explanations are output to 114In the case of an API error, the codes and explanations are output to the
122the console. 115console.
123 116
124#+begin_src python 117#+begin_src python
125from ibm_watson import ApiException 118from ibm_watson import ApiException
@@ -146,23 +139,22 @@ except ApiException as ex:
146 139
147* The Results 140* The Results
148 141
149Here we can see the full result set of our function above. If you view 142Here we can see the full result set of our function above. If you view each of
150each of the URLs that we sent to the API, you'll be able to see that it 143the URLs that we sent to the API, you'll be able to see that it was remarkably
151was remarkably accurate. To be fair, these are clear high-resolution, 144accurate. To be fair, these are clear high-resolution, clear photos shot with a
152clear photos shot with a professional camera. In reality, you will most 145professional camera. In reality, you will most likely be processing images that
153likely be processing images that are lower quality and may have a lot of 146are lower quality and may have a lot of noise in the photo.
154noise in the photo.
155 147
156However, we can clearly see the benefit of being able to call this API 148However, we can clearly see the benefit of being able to call this API instead
157instead of attempting to write our own image recognition function. Each 149of attempting to write our own image recognition function. Each of the
158of the classifications returned was a fair description of the image. 150classifications returned was a fair description of the image.
159 151
160If you wanted to restrict the results to those that are at least 90% 152If you wanted to restrict the results to those that are at least 90% confident
161confident or greater, you would simply adjust the =threshold= in the 153or greater, you would simply adjust the =threshold= in the
162=visual_recognition.classify()= function. 154=visual_recognition.classify()= function.
163 155
164When your program runs, it should show the output below for each photo 156When your program runs, it should show the output below for each photo you
165you provide. 157provide.
166 158
167#+begin_src txt 159#+begin_src txt
168---------------------------------------------------------------- 160----------------------------------------------------------------
@@ -181,22 +173,19 @@ greenishness color ( 0.975 )
181 173
182* Discussion 174* Discussion
183 175
184Now, this was a very minimal implementation of the API. We simply 176Now, this was a very minimal implementation of the API. We simply supplied some
185supplied some images and looked to see how accurate the results were. 177images and looked to see how accurate the results were. However, you could
186However, you could implement this type of API into many machine learning 178implement this type of API into many machine learning (ML) models.
187(ML) models. 179
188 180For example, you could be working for a company that scans their warehouses or
189For example, you could be working for a company that scans their 181inventory using drones. Would you want to pay employees to sit there and watch
190warehouses or inventory using drones. Would you want to pay employees to 182drone footage all day in order to identify or count things in the video?
191sit there and watch drone footage all day in order to identify or count 183Probably not. Instead, you could use a classification system similar to this one
192things in the video? Probably not. Instead, you could use a 184in order to train your machine learning model to correctly identify items that
193classification system similar to this one in order to train your machine 185the drones show through video. More specifically, you could have your machine
194learning model to correctly identify items that the drones show through 186learning model watch a drone fly over a field of sheep in order to count how
195video. More specifically, you could have your machine learning model 187many sheep are living in that field.
196watch a drone fly over a field of sheep in order to count how many sheep 188
197are living in that field. 189There are many ways to implement machine learning functionality, but hopefully
198 190this post helped inspire some deeper thought about the tools that can help
199There are many ways to implement machine learning functionality, but 191propel us further into the future of machine learning and AI.
200hopefully this post helped inspire some deeper thought about the tools
201that can help propel us further into the future of machine learning and
202AI.
content/blog/2020-09-22-internal-audit.org +161 −176
@@ -5,69 +5,67 @@
5 5
6* Definitions 6* Definitions
7 7
8One of the many reasons that Internal Audit needs such thorough 8One of the many reasons that Internal Audit needs such thorough explaining to
9explaining to non-auditors is that Internal Audit can serve many 9non-auditors is that Internal Audit can serve many purposes, depending on the
10purposes, depending on the organization's size and needs. However, the 10organization's size and needs. However, the Institute of Internal Auditors (IIA)
11Institute of Internal Auditors (IIA) defines Internal Auditing as: 11defines Internal Auditing as:
12 12
13#+begin_quote 13#+begin_quote
14Internal auditing is an independent, objective assurance and consulting 14Internal auditing is an independent, objective assurance and consulting activity
15activity designed to add value and improve an organization's operations. 15designed to add value and improve an organization's operations. It helps an
16It helps an organization accomplish its objectives by bringing a 16organization accomplish its objectives by bringing a systematic, disciplined
17systematic, disciplined approach to evaluate and improve the 17approach to evaluate and improve the effectiveness of risk management, control,
18effectiveness of risk management, control, and governance processes. 18and governance processes.
19#+end_quote 19#+end_quote
20 20
21However, this definition uses quite a few terms that aren't clear unless 21However, this definition uses quite a few terms that aren't clear unless the
22the reader already has a solid understanding of the auditing profession. 22reader already has a solid understanding of the auditing profession. To further
23To further explain, the following is a list of definitions that can help 23explain, the following is a list of definitions that can help supplement
24supplement understanding of internal auditing. 24understanding of internal auditing.
25 25
26** Independent 26** Independent
27 27
28Independence is the freedom from conditions that threaten the ability of 28Independence is the freedom from conditions that threaten the ability of the
29the internal audit activity to carry out internal audit responsibilities 29internal audit activity to carry out internal audit responsibilities in an
30in an unbiased manner. To achieve the degree of independence necessary 30unbiased manner. To achieve the degree of independence necessary to effectively
31to effectively carry out the responsibilities of the internal audit 31carry out the responsibilities of the internal audit activity, the chief audit
32activity, the chief audit executive has direct and unrestricted access 32executive has direct and unrestricted access to senior management and the board.
33to senior management and the board. This can be achieved through a 33This can be achieved through a dual-reporting relationship. Threats to
34dual-reporting relationship. Threats to independence must be managed at 34independence must be managed at the individual auditor, engagement, functional,
35the individual auditor, engagement, functional, and organizational 35and organizational levels.
36levels.
37 36
38** Objective 37** Objective
39 38
40Objectivity is an unbiased mental attitude that allows internal auditors 39Objectivity is an unbiased mental attitude that allows internal auditors to
41to perform engagements in such a manner that they believe in their work 40perform engagements in such a manner that they believe in their work product and
42product and that no quality compromises are made. Objectivity requires 41that no quality compromises are made. Objectivity requires that internal
43that internal auditors do not subordinate their judgment on audit 42auditors do not subordinate their judgment on audit matters to others. Threats
44matters to others. Threats to objectivity must be managed at the 43to objectivity must be managed at the individual auditor, engagement,
45individual auditor, engagement, functional, and organizational levels. 44functional, and organizational levels.
46 45
47** Assurance 46** Assurance
48 47
49Assurance services involve the internal auditor's objective assessment 48Assurance services involve the internal auditor's objective assessment of
50of evidence to provide opinions or conclusions regarding an entity, 49evidence to provide opinions or conclusions regarding an entity, operation,
51operation, function, process, system, or other subject matters. The 50function, process, system, or other subject matters. The internal auditor
52internal auditor determines the nature and scope of an assurance 51determines the nature and scope of an assurance engagement. Generally, three
53engagement. Generally, three parties are participants in assurance 52parties are participants in assurance services: (1) the person or group directly
54services: (1) the person or group directly involved with the entity, 53involved with the entity, operation, function, process, system, or other subject
55operation, function, process, system, or other subject
56 54
57- (the process owner), (2) the person or group making the assessment - 55- (the process owner), (2) the person or group making the assessment - (the
58 (the internal auditor), and (3) the person or group using the 56 internal auditor), and (3) the person or group using the assessment - (the
59 assessment - (the user). 57 user).
60 58
61** Consulting 59** Consulting
62 60
63Consulting services are advisory in nature and are generally performed 61Consulting services are advisory in nature and are generally performed at the
64at the specific request of an engagement client. The nature and scope of 62specific request of an engagement client. The nature and scope of the consulting
65the consulting engagement are subject to agreement with the engagement 63engagement are subject to agreement with the engagement client. Consulting
66client. Consulting services generally involve two parties: (1) the 64services generally involve two parties: (1) the person or group offering the
67person or group offering the advice (the internal auditor), and (2) the 65advice (the internal auditor), and (2) the person or group seeking and receiving
68person or group seeking and receiving the advice (the engagement 66the advice (the engagement client). When performing consulting services, the
69client). When performing consulting services, the internal auditor 67internal auditor should maintain objectivity and not assume management
70should maintain objectivity and not assume management responsibility. 68responsibility.
71 69
72** Governance, Risk Management, & Compliance (GRC) 70** Governance, Risk Management, & Compliance (GRC)
73 71
@@ -77,172 +75,159 @@ reliably achieve objectives, address uncertainty and act with integrity.
77* Audit Charter & Standards 75* Audit Charter & Standards
78 76
79First, it's important to note that not every organization needs internal 77First, it's important to note that not every organization needs internal
80auditors. In fact, it's unwise for an organization to hire internal 78auditors. In fact, it's unwise for an organization to hire internal auditors
81auditors unless they have regulatory requirements for auditing and have 79unless they have regulatory requirements for auditing and have the capital to
82the capital to support the department. Internal audit is a cost center 80support the department. Internal audit is a cost center that can only affect
83that can only affect revenue indirectly. 81revenue indirectly.
84 82
85Once an organization determines the need for internal assurance 83Once an organization determines the need for internal assurance services, they
86services, they will hire a Chief Audit Executive and create the audit 84will hire a Chief Audit Executive and create the audit charter. This charter is
87charter. This charter is a document, approved by the company's governing 85a document, approved by the company's governing body, that will define internal
88body, that will define internal audit's purpose, authority, 86audit's purpose, authority, responsibility, and position within the
89responsibility, and position within the organization. Fortunately, the 87organization. Fortunately, the IIA has model charters available to IIA members
90IIA has model charters available to IIA members for those developing or 88for those developing or improving their charter.
91improving their charter. 89
92 90Beyond the charter and organizational documents, internal auditors follow a few
93Beyond the charter and organizational documents, internal auditors 91different standards in order to perform their job. First is the International
94follow a few different standards in order to perform their job. First is 92Professional Practices Framework (IPPF) by the IIA, which is the model of
95the International Professional Practices Framework (IPPF) by the IIA, 93standards for internal auditing. In addition, ISACA's Information Technology
96which is the model of standards for internal auditing. In addition, 94Assurance Framework (ITAF) helps guide auditors in reference to information
97ISACA's Information Technology Assurance Framework (ITAF) helps guide 95technology (IT) compliance and assurance. Finally, additional standards such as
98auditors in reference to information technology (IT) compliance and 96FASB, GAAP, and industry-specific standards are used when performing internal
99assurance. Finally, additional standards such as FASB, GAAP, and 97audit work.
100industry-specific standards are used when performing internal audit
101work.
102 98
103* Three Lines of Defense 99* Three Lines of Defense
104 100
105[[https://theiia.org][The IIA]] released the original Three Lines of 101[[https://theiia.org][The IIA]] released the original Three Lines of Defense model in 2013, but have
106Defense model in 2013, but have released an updated version in 2020. 102released an updated version in 2020.
107 103
108I won't go into depth about the changes made to the model in this 104I won't go into depth about the changes made to the model in this article.
109article. Instead, let's take a look at the most current model. 105Instead, let's take a look at the most current model.
110 106
111The updated model forgets the strict idea of areas performing their own 107The updated model forgets the strict idea of areas performing their own
112functions or line of defense. Instead of talking about management, risk, 108functions or line of defense. Instead of talking about management, risk, and
113and internal audit as 1-2-3, the new model creates a more fluid and 109internal audit as 1-2-3, the new model creates a more fluid and cooperative
114cooperative model. 110model.
115 111
116Looking at this model from an auditing perspective shows us that 112Looking at this model from an auditing perspective shows us that auditors will
117auditors will need to align, communicate, and collaborate with 113need to align, communicate, and collaborate with management, including business
118management, including business area managers and chief officers, as well 114area managers and chief officers, as well as reporting to the governing body.
119as reporting to the governing body. The governing body will instruct 115The governing body will instruct internal audit /functionally/ on their goals
120internal audit /functionally/ on their goals and track their progress 116and track their progress periodically.
121periodically. 117
122 118However, the internal audit department will report /administratively/ to a chief
123However, the internal audit department will report /administratively/ to 119officer in the company for the purposes of collaboration, direction, and
124a chief officer in the company for the purposes of collaboration, 120assistance with the business. Note that in most situations, the governing body
125direction, and assistance with the business. Note that in most 121is the audit committee on the company's board of directors.
126situations, the governing body is the audit committee on the company's 122
127board of directors. 123The result of this structure is that internal audit is an independent and
128 124objective function that can provide assurance over the topics they audit.
129The result of this structure is that internal audit is an independent
130and objective function that can provide assurance over the topics they
131audit.
132 125
133* Audit Process 126* Audit Process
134 127
135A normal audit will generally follow the same process, regardless of the 128A normal audit will generally follow the same process, regardless of the topic.
136topic. However, certain special projects or abnormal business areas may 129However, certain special projects or abnormal business areas may call for
137call for changes to the audit process. The audit process is not set in 130changes to the audit process. The audit process is not set in stone, it's simply
138stone, it's simply a set of best practices so that audits can be 131a set of best practices so that audits can be performed consistently.
139performed consistently.
140 132
141While different organizations may tweak the process, it will generally 133While different organizations may tweak the process, it will generally follow
142follow this flow: 134this flow:
143 135
144** 1. Risk Assessment 136** 1. Risk Assessment
145 137
146The risk assessment part of the process has historically been performed 138The risk assessment part of the process has historically been performed
147annually, but many organizations have moved to performing this process 139annually, but many organizations have moved to performing this process much more
148much more frequently. In fact, some organizations are moving to an agile 140frequently. In fact, some organizations are moving to an agile approach that can
149approach that can take new risks into the risk assessment and 141take new risks into the risk assessment and re-prioritize risk areas on-the-go.
150re-prioritize risk areas on-the-go. To perform a risk assessment, 142To perform a risk assessment, leaders in internal audit will research industry
151leaders in internal audit will research industry risks, consult with 143risks, consult with business leaders around the company, and perform analyses on
152business leaders around the company, and perform analyses on company 144company data.
153data.
154 145
155Once a risk assessment has been documented, the audit department has a 146Once a risk assessment has been documented, the audit department has a
156prioritized list of risks that can be audited. This is usually in the 147prioritized list of risks that can be audited. This is usually in the form of
157form of auditable entities, such as business areas or departments. 148auditable entities, such as business areas or departments.
158 149
159** 2. Planning 150** 2. Planning
160 151
161During the planning phase of an audit, auditors will meet with the 152During the planning phase of an audit, auditors will meet with the business area
162business area to discuss the various processes, controls, and risks 153to discuss the various processes, controls, and risks applicable to the
163applicable to the business. This helps the auditors determine the scope 154business. This helps the auditors determine the scope limits for the audit, as
164limits for the audit, as well as timing and subject-matter experts. 155well as timing and subject-matter experts. Certain documents will be created in
165Certain documents will be created in this phase that will be used to 156this phase that will be used to keep the audit on-track an in-scope as it goes
166keep the audit on-track an in-scope as it goes forward. 157forward.
167 158
168** 3. Testing 159** 3. Testing
169 160
170The testing phase, also known as fieldwork or execution, is where 161The testing phase, also known as fieldwork or execution, is where internal
171internal auditors will take the information they've discovered and test 162auditors will take the information they've discovered and test it against
172it against regulations, industry standards, company rules, best 163regulations, industry standards, company rules, best practices, as well as
173practices, as well as validating that any processes are complete and 164validating that any processes are complete and accurate. For example, an audit
174accurate. For example, an audit of HR would most likely examine 165of HR would most likely examine processes such as employee on-boarding, employee
175processes such as employee on-boarding, employee termination, security 166termination, security of personally identifiable information (PII), or the IT
176of personally identifiable information (PII), or the IT systems involved 167systems involved in these processes. Company standards would be examined and
177in these processes. Company standards would be examined and compared 168compared against how the processes are actually being performed day-to-day, as
178against how the processes are actually being performed day-to-day, as 169well as compared against regulations such as the Equal Employment Opportunity
179well as compared against regulations such as the Equal Employment 170(EEO), American with Disabilities Act, and National Labor Relations Act.
180Opportunity (EEO), American with Disabilities Act, and National Labor
181Relations Act.
182 171
183** 4. Reporting 172** 4. Reporting
184 173
185Once all the tests have been completed, the audit will enter the 174Once all the tests have been completed, the audit will enter the reporting
186reporting phase. This is when the audit team will conclude on the 175phase. This is when the audit team will conclude on the evidence they've
187evidence they've collected, interviews they've held, and any opinions 176collected, interviews they've held, and any opinions they've formed on the
188they've formed on the controls in place. A summary of the audit 177controls in place. A summary of the audit findings, conclusions, and specific
189findings, conclusions, and specific recommendations are officially 178recommendations are officially communicated to the client through a draft
190communicated to the client through a draft report. Clients have the 179report. Clients have the opportunity to respond to the report and submit an
191opportunity to respond to the report and submit an action plan and time 180action plan and time frame. These responses become part of the final report
192frame. These responses become part of the final report which is 181which is distributed to the appropriate level of administration.
193distributed to the appropriate level of administration.
194 182
195** 5. Follow-Up 183** 5. Follow-Up
196 184
197After audits have been completed and management has formed action plans 185After audits have been completed and management has formed action plans and time
198and time frames for audit issues, internal audit will follow up once 186frames for audit issues, internal audit will follow up once that due date has
199that due date has arrived. In most cases, the follow-up will simply 187arrived. In most cases, the follow-up will simply consist of a meeting to
200consist of a meeting to discuss how the action plan has been completed 188discuss how the action plan has been completed and to request documentation to
201and to request documentation to prove it. 189prove it.
202 190
203* Audit Department Structure 191* Audit Department Structure
204 192
205While an internal audit department is most often thought of as a team of 193While an internal audit department is most often thought of as a team of
206full-time employees, there are actually many different ways in which a 194full-time employees, there are actually many different ways in which a
207department can be structured. As the world becomes more digital and 195department can be structured. As the world becomes more digital and fast-paced,
208fast-paced, outsourcing has become a more attractive option for some 196outsourcing has become a more attractive option for some organizations. Internal
209organizations. Internal audit can be fully outsourced or partially 197audit can be fully outsourced or partially outsourced, allowing for flexibility
210outsourced, allowing for flexibility in cases where turnover is high. 198in cases where turnover is high.
211 199
212In addition, departments can implement a rotational model. This allows 200In addition, departments can implement a rotational model. This allows for
213for interested employees around the organization to rotate into the 201interested employees around the organization to rotate into the internal audit
214internal audit department for a period of time, allowing them to obtain 202department for a period of time, allowing them to obtain knowledge of risks and
215knowledge of risks and controls and allowing the internal audit team to 203controls and allowing the internal audit team to obtain more business area
216obtain more business area knowledge. This program is popular in very 204knowledge. This program is popular in very large organizations, but
217large organizations, but organizations tend to rotate lower-level audit 205organizations tend to rotate lower-level audit staff instead of managers. This
218staff instead of managers. This helps prevent any significant knowledge 206helps prevent any significant knowledge loss as auditors rotate out to business
219loss as auditors rotate out to business areas. 207areas.
220 208
221* Consulting 209* Consulting
222 210
223Consulting is not an easy task at any organization, especially for a 211Consulting is not an easy task at any organization, especially for a department
224department that can have negative perceptions within the organization as 212that can have negative perceptions within the organization as the "compliance
225the "compliance police." However, once an internal audit department has 213police." However, once an internal audit department has delivered value to
226delivered value to organization, adding consulting to their suite of 214organization, adding consulting to their suite of services is a smart move. In
227services is a smart move. In most cases, Internal Audit can insert 215most cases, Internal Audit can insert themselves into a consulting role without
228themselves into a consulting role without affecting the process of 216affecting the process of project management at the company. This means that
229project management at the company. This means that internal audit can 217internal audit can add objective assurance and opinions to business areas as
230add objective assurance and opinions to business areas as they develop 218they develop new processes, instead of coming in periodically to audit an area
231new processes, instead of coming in periodically to audit an area and 219and file issues that could have been fixed at the beginning.
232file issues that could have been fixed at the beginning.
233 220
234* Data Science & Data Analytics 221* Data Science & Data Analytics
235 222
236One major piece of the internal audit function in the modern world is 223One major piece of the internal audit function in the modern world is data
237data science. While the process is data science, most auditors will 224science. While the process is data science, most auditors will refer to anything
238refer to anything in this realm as data analytics. Hot topics such as 225in this realm as data analytics. Hot topics such as robotic process automation
239robotic process automation (RPA), machine learning (ML), and data mining 226(RPA), machine learning (ML), and data mining have taken over the auditing world
240have taken over the auditing world in recent years. These technologies 227in recent years. These technologies have been immensely helpful with increasing
241have been immensely helpful with increasing the effectiveness and 228the effectiveness and efficiency of auditors.
242efficiency of auditors. 229
243 230For example, mundane and repetitive tasks can be automated in order for auditors
244For example, mundane and repetitive tasks can be automated in order for 231to make more room in their schedules for labor-intensive work. Further, auditors
245auditors to make more room in their schedules for labor-intensive work. 232will need to adapt technologies like machine learning in order to extract more
246Further, auditors will need to adapt technologies like machine learning 233value from the data they're using to form conclusions.
247in order to extract more value from the data they're using to form
248conclusions.
content/blog/2020-09-25-happiness-map.org +32 −37
@@ -5,10 +5,9 @@
5 5
6* Background Information 6* Background Information
7 7
8The dataset (obtained from 8The dataset (obtained from [[https://www.kaggle.com/unsdsn/world-happiness][Kaggle]]) used in this article contains a list of
9[[https://www.kaggle.com/unsdsn/world-happiness][Kaggle]]) used in this 9countries around the world, their happiness rankings and scores, as well as
10article contains a list of countries around the world, their happiness 10other national scoring measures.
11rankings and scores, as well as other national scoring measures.
12 11
13Fields include: 12Fields include:
14 13
@@ -21,8 +20,8 @@ Fields include:
21- Generosity 20- Generosity
22- Perceptions of corruption 21- Perceptions of corruption
23 22
24There are 156 records. Since there are ~195 countries in the world, we 23There are 156 records. Since there are ~195 countries in the world, we can see
25can see that around 40 countries will be missing from this dataset. 24that around 40 countries will be missing from this dataset.
26 25
27* Install Packages 26* Install Packages
28 27
@@ -35,9 +34,8 @@ analysis.
35 34
36* Import the Data 35* Import the Data
37 36
38We only need a couple packages to create a choropleth map. We will use 37We only need a couple packages to create a choropleth map. We will use [[https://python-visualization.github.io/folium/][Folium]],
39[[https://python-visualization.github.io/folium/][Folium]], which 38which provides map visualizations in Python. We will also use geopandas and
40provides map visualizations in Python. We will also use geopandas and
41pandas to wrangle our data before we put it on a map. 39pandas to wrangle our data before we put it on a map.
42 40
43#+begin_src python 41#+begin_src python
@@ -47,14 +45,14 @@ import geopandas as gpd
47import pandas as pd 45import pandas as pd
48#+end_src 46#+end_src
49 47
50To get anything to show up on a map, we need a file that will specify 48To get anything to show up on a map, we need a file that will specify the
51the boundaries of each country. Luckily, GeoJSON files exist (for free!) 49boundaries of each country. Luckily, GeoJSON files exist (for free!) on the
52on the internet. To get the boundaries of every country in the world, we 50internet. To get the boundaries of every country in the world, we will use the
53will use the GeoJSON link shown below. 51GeoJSON link shown below.
54 52
55GeoPandas will take this data and load it into a dataframe so that we 53GeoPandas will take this data and load it into a dataframe so that we can easily
56can easily match it to the data we're trying to analyze. Let's look at 54match it to the data we're trying to analyze. Let's look at the GeoJSON
57the GeoJSON dataframe: 55dataframe:
58 56
59#+begin_src python 57#+begin_src python
60# Load the GeoJSON data with geopandas 58# Load the GeoJSON data with geopandas
@@ -62,9 +60,9 @@ geo_data = gpd.read_file('https://raw.githubusercontent.com/datasets/geo-countri
62geo_data.head() 60geo_data.head()
63#+end_src 61#+end_src
64 62
65Next, let's load the data from the Kaggle dataset. I've downloaded this 63Next, let's load the data from the Kaggle dataset. I've downloaded this file, so
66file, so update the file path if you have it somewhere else. After 64update the file path if you have it somewhere else. After loading, let's take a
67loading, let's take a look at this dataframe: 65look at this dataframe:
68 66
69#+begin_src python 67#+begin_src python
70# Load the world happiness data with pandas 68# Load the world happiness data with pandas
@@ -74,12 +72,11 @@ happy_data.head()
74 72
75* Clean the Data 73* Clean the Data
76 74
77Some countries need to be renamed, or they will be lost when you merge 75Some countries need to be renamed, or they will be lost when you merge the
78the happiness and GeoJSON dataframes. This is something I discovered 76happiness and GeoJSON dataframes. This is something I discovered when the map
79when the map below showed empty countries. I searched both data frames 77below showed empty countries. I searched both data frames for the missing
80for the missing countries to see the naming differences. Any countries 78countries to see the naming differences. Any countries that do not have records
81that do not have records in the =happy_data= df will not show up on the 79in the =happy_data= df will not show up on the map.
82map.
83 80
84#+begin_src python 81#+begin_src python
85# Rename some countries to match our GeoJSON data 82# Rename some countries to match our GeoJSON data
@@ -104,11 +101,11 @@ happy_data.at[democratic_congo_index, 'Country or region'] = 'Democratic Republi
104* Merge the Data 101* Merge the Data
105 102
106Now that we have clean data, we need to merge the GeoJSON data with the 103Now that we have clean data, we need to merge the GeoJSON data with the
107happiness data. Since we've stored them both in dataframes, we just need 104happiness data. Since we've stored them both in dataframes, we just need to call
108to call the =.merge()= function. 105the =.merge()= function.
109 106
110We will also rename a couple columns, just so that they're a little 107We will also rename a couple columns, just so that they're a little easier to
111easier to use when we create the map. 108use when we create the map.
112 109
113#+begin_src python 110#+begin_src python
114# Merge the two previous dataframes into a single geopandas dataframe 111# Merge the two previous dataframes into a single geopandas dataframe
@@ -122,10 +119,9 @@ merged_df = merged_df.rename(columns = {'Country or region':'Country'})
122* Create the Map 119* Create the Map
123 120
124The data is finally ready to be added to a map. The code below shows the 121The data is finally ready to be added to a map. The code below shows the
125simplest way to find the center of the map and create a Folium map 122simplest way to find the center of the map and create a Folium map object. The
126object. The important part is to remember to reference the merged 123important part is to remember to reference the merged dataframe for our GeoJSON
127dataframe for our GeoJSON data and value data. The columns specify which 124data and value data. The columns specify which geo data and value data to use.
128geo data and value data to use.
129 125
130#+begin_src python 126#+begin_src python
131# Assign centroids to map 127# Assign centroids to map
@@ -157,10 +153,9 @@ Let's look at the resulting map.
157 153
158* Create a Tooltip on Hover 154* Create a Tooltip on Hover
159 155
160Now that we have a map set up, we could stop. However, I want to add a 156Now that we have a map set up, we could stop. However, I want to add a tooltip
161tooltip so that I can see more information about each country. The 157so that I can see more information about each country. The =tooltip_data= code
162=tooltip_data= code below will show a popup on hover with all the data 158below will show a popup on hover with all the data fields shown.
163fields shown.
164 159
165#+begin_src python 160#+begin_src python
166 # Adding labels to map 161 # Adding labels to map
content/blog/2020-10-12-mediocrity.org +84 −95
@@ -5,120 +5,109 @@
5 5
6* Perfect is the Enemy of Good 6* Perfect is the Enemy of Good
7 7
8As the saying goes, "the best is the enemy of the good." As we strive 8As the saying goes, "the best is the enemy of the good." As we strive for
9for perfection, we often fail to realize the implications of such an 9perfection, we often fail to realize the implications of such an undertaking.
10undertaking. Attempting to reach perfection is often unrealistic. Even 10Attempting to reach perfection is often unrealistic. Even worse, it can get in
11worse, it can get in the way of achieving a good outcome. In certain 11the way of achieving a good outcome. In certain situations, we try so hard to
12situations, we try so hard to achieve the ideal solution that we have 12achieve the ideal solution that we have burned the bridges that would have
13burned the bridges that would have allowed us to reach a lesser yet 13allowed us to reach a lesser yet still superb solution.
14still superb solution. 14
15 15Philosophers throughout history have inspected this plight from many viewpoints.
16Philosophers throughout history have inspected this plight from many 16Greek mythology speaks of the [[https://en.wikipedia.org/wiki/Golden_mean_(philosophy)][golden mean]], which uses the story of Icarus to
17viewpoints. Greek mythology speaks of the 17illustrate that sometimes "the middle course" is the best solution. In this
18[[https://en.wikipedia.org/wiki/Golden_mean_(philosophy)][golden mean]], 18story, Daedalus, a famous artist of his time, built feathered wings for himself
19which uses the story of Icarus to illustrate that sometimes "the middle 19and his son so that they might escape the clutches of King Minos. Daedalus warns
20course" is the best solution. In this story, Daedalus, a famous artist 20his beloved son whom he loved so much to "fly the middle course", between the
21of his time, built feathered wings for himself and his son so that they 21sea spray and the sun's heat. Icarus did not heed his father; he flew up and up
22might escape the clutches of King Minos. Daedalus warns his beloved son 22until the sun melted the wax off his wings. For not heeding the middle course,
23whom he loved so much to "fly the middle course", between the sea spray 23he fell into the sea and drowned.
24and the sun's heat. Icarus did not heed his father; he flew up and up 24
25until the sun melted the wax off his wings. For not heeding the middle 25More recently, management scholars have explored the [[https://en.wikipedia.org/wiki/Pareto_principle][Pareto principle]] and found
26course, he fell into the sea and drowned. 26that as we increase the frequency of something, or strive to perform actions to
27 27achieve some form of perfection, we run into [[https://en.wikipedia.org/wiki/Diminishing_returns][diminishing returns]].
28More recently, management scholars have explored the 28
29[[https://en.wikipedia.org/wiki/Pareto_principle][Pareto principle]] and 29Even further, Harold Demsetz is noted as coining the term [[https://en.wikipedia.org/wiki/Nirvana_fallacy][the Nirvana fallacy]] in
30found that as we increase the frequency of something, or strive to 301969, which shows the fallacy of comparing actual things with unrealistic,
31perform actions to achieve some form of perfection, we run into 31idealized alternatives. This is another trap that we may fall into, where we are
32[[https://en.wikipedia.org/wiki/Diminishing_returns][diminishing 32constantly thinking of the ultimate solutions to problems, when something more
33returns]]. 33realistic needs to be considered.
34
35Even further, Harold Demsetz is noted as coining the term
36[[https://en.wikipedia.org/wiki/Nirvana_fallacy][the Nirvana fallacy]]
37in 1969, which shows the fallacy of comparing actual things with
38unrealistic, idealized alternatives. This is another trap that we may
39fall into, where we are constantly thinking of the ultimate solutions to
40problems, when something more realistic needs to be considered.
41 34
42Over and over throughout history, we've found that perfection is often 35Over and over throughout history, we've found that perfection is often
43unrealistic and unachievable. However, we push ourselves and our peers 36unrealistic and unachievable. However, we push ourselves and our peers to "give
44to "give 100%" or "go the extra mile," while it may be that the better 37100%" or "go the extra mile," while it may be that the better course is to give
45course is to give a valuable level of effort while considering the 38a valuable level of effort while considering the effects of further effort on
46effects of further effort on the outcome. Working harder does not always 39the outcome. Working harder does not always help us achieve loftier goals.
47help us achieve loftier goals. 40
48 41This has presented itself to me most recently during my time studying at my
49This has presented itself to me most recently during my time studying at 42university. I was anxious and feeling the stresses of my courses, career, and
50my university. I was anxious and feeling the stresses of my courses, 43personal life for quite a while, which was greatly affecting how well I was
51career, and personal life for quite a while, which was greatly affecting 44doing at school and my level of effort at work. One day, I happened to be
52how well I was doing at school and my level of effort at work. One day, 45talking to my father when he said something simple that hit home:
53I happened to be talking to my father when he said something simple that
54hit home:
55 46
56#+begin_quote 47#+begin_quote
57All you can do is show up and do your best. Worrying about the outcomes 48All you can do is show up and do your best. Worrying about the outcomes won't
58won't affect the outcome itself. 49affect the outcome itself.
59#+end_quote 50#+end_quote
60 51
61The thought was extremely straightforward and uncomplicated, yet it was 52The thought was extremely straightforward and uncomplicated, yet it was
62something that I had lost sight of during my stress-filled years at 53something that I had lost sight of during my stress-filled years at school. Ever
63school. Ever since then, I've found myself pausing and remembering that 54since then, I've found myself pausing and remembering that quote every time I
64quote every time I get anxious or stressed. It helps to stop and think 55get anxious or stressed. It helps to stop and think "Can I do anything to affect
65"Can I do anything to affect the outcome, or am I simply worrying over 56the outcome, or am I simply worrying over something I can't change?"
66something I can't change?"
67 57
68* When Mediocrity Isn't Enough 58* When Mediocrity Isn't Enough
69 59
70One problem with the philosophies presented in this post is that they 60One problem with the philosophies presented in this post is that they are
71are implemented far too often in situations where mediocrity simply 61implemented far too often in situations where mediocrity simply isn't adequate.
72isn't adequate. For example, let's take a look at digital user data, 62For example, let's take a look at digital user data, specifically
73specifically personally-identifiable information (PII). As a 63personally-identifiable information (PII). As a cybersecurity auditor in the
74cybersecurity auditor in the United States, I have found that most 64United States, I have found that most companies are concerned more with
75companies are concerned more with compliance than any actual safeguards 65compliance than any actual safeguards over the privacy or protection of user
76over the privacy or protection of user data. Other than companies who 66data. Other than companies who have built their reputation on privacy and
77have built their reputation on privacy and security, most companies will 67security, most companies will use [[https://en.wikipedia.org/wiki/Satisficing][satisficing]] as their primary decision-making
78use [[https://en.wikipedia.org/wiki/Satisficing][satisficing]] as their 68strategy around user data.
79primary decision-making strategy around user data.
80 69
81#+begin_quote 70#+begin_quote
82Satisficing is a decision-making strategy or cognitive heuristic that 71Satisficing is a decision-making strategy or cognitive heuristic that entails
83entails searching through the available alternatives until an 72searching through the available alternatives until an acceptability threshold is
84acceptability threshold is met. 73met.
85#+end_quote 74#+end_quote
86 75
87This means that each decision will be met with certain possible 76This means that each decision will be met with certain possible solutions until
88solutions until one of the solutions meets their minimum acceptable 77one of the solutions meets their minimum acceptable standards. For companies
89standards. For companies that deal with user data, the 78that deal with user data, the minimum-acceptable standards come from three
90minimum-acceptable standards come from three areas: 79areas:
91 80
921. Laws and regulations 811. Laws and regulations
932. Competitive pressure 822. Competitive pressure
943. Risk of monetary or reputation loss 833. Risk of monetary or reputation loss
95 84
96Working with project management or auditing, the primary concern here is 85Working with project management or auditing, the primary concern here is the
97the risk of legal ramifications. Since the primary risk comes from laws 86risk of legal ramifications. Since the primary risk comes from laws and
98and regulations, companies will require that any project that involves 87regulations, companies will require that any project that involves user data
99user data must follow all the rules of those laws so that the company 88must follow all the rules of those laws so that the company can protect itself
100can protect itself from fines or other penalties. 89from fines or other penalties.
101 90
102Following this, companies will consider best practices in order to place 91Following this, companies will consider best practices in order to place itself
103itself in a competitive position (e.g. Google vs. Apple) and review any 92in a competitive position (e.g. Google vs. Apple) and review any recent or
104recent or ongoing litigation against companies regarding user data. In a 93ongoing litigation against companies regarding user data. In a perfect company,
105perfect company, management would then consider the ethical 94management would then consider the ethical responsibilities of their
106responsibilities of their organization and discuss their 95organization and discuss their responsibilities over things like
107responsibilities over things like personally-identifiable information. 96personally-identifiable information.
108 97
109However, as we mentioned above, most companies follow the idea of 98However, as we mentioned above, most companies follow the idea of satisficing,
110satisficing, which states that they have met the minimum acceptable 99which states that they have met the minimum acceptable standards and can now
111standards and can now move on to other decisions. Modern business 100move on to other decisions. Modern business culture in the United States
112culture in the United States dictates that profits are the golden 101dictates that profits are the golden measure of how well a company or manager is
113measure of how well a company or manager is performing, so we often 102performing, so we often don't think about our responsibilities beyond these
114don't think about our responsibilities beyond these basic standards. 103basic standards.
115 104
116Not all situations demand excellence, but I believe that applying any 105Not all situations demand excellence, but I believe that applying any philosophy
117philosophy as a broad stroke across one's life can be a mistake. We must 106as a broad stroke across one's life can be a mistake. We must be able to think
118be able to think critically about what we are doing as we do it and ask 107critically about what we are doing as we do it and ask ourselves a few
119ourselves a few questions. Have I done everything I can in this 108questions. Have I done everything I can in this situation? Is mediocrity an
120situation? Is mediocrity an acceptable outcome, or should we strive for 109acceptable outcome, or should we strive for perfection, even if we can't attain
121perfection, even if we can't attain it? 110it?
122 111
123Taking a few moments to think critically throughout our day, as we make 112Taking a few moments to think critically throughout our day, as we make
124decisions, can have a tremendous effect on the outcomes we create. 113decisions, can have a tremendous effect on the outcomes we create.
content/blog/2020-12-27-website-redesign.org +71 −84
@@ -5,96 +5,83 @@
5 5
6* A Brief History 6* A Brief History
7 7
8As a form of continuous learning and entertainment, I've been running a 8As a form of continuous learning and entertainment, I've been running a handful
9handful of websites since 2016 when I took my first programming courses 9of websites since 2016 when I took my first programming courses in college. I
10in college. I maintain one main website, the place I consider the 10maintain one main website, the place I consider the official website to
11official website to represent me. Under this site, I have a handful of 11represent me. Under this site, I have a handful of subdirectories and
12subdirectories and subdomains. 12subdomains.
13 13
14One of the parts I've enjoyed the most about web development is the 14One of the parts I've enjoyed the most about web development is the aspect of
15aspect of designing an identity for a web page and working to find 15designing an identity for a web page and working to find exciting ways to
16exciting ways to display the site's content. Inevitably, this means I've 16display the site's content. Inevitably, this means I've changed the designs for
17changed the designs for my websites more times than I could possibly 17my websites more times than I could possibly count. Since I don't really host
18count. Since I don't really host anything on my main webpage that's 18anything on my main webpage that's vital, it allows me the freedom to change
19vital, it allows me the freedom to change things as inspiration strikes. 19things as inspiration strikes.
20 20
21Historically, I've relied on core utilities for spacing, components, and 21Historically, I've relied on core utilities for spacing, components, and layouts
22layouts from [[https://getbootstrap.com][Bootstrap]] and added custom 22from [[https://getbootstrap.com][Bootstrap]] and added custom CSS for fonts, accents, colors, and other items.
23CSS for fonts, accents, colors, and other items. I also tend to create 23I also tend to create sites with no border radius on items, visible borders, and
24sites with no border radius on items, visible borders, and content that 24content that takes up the entire screen (using whitespace inside components
25takes up the entire screen (using whitespace inside components instead 25instead of whitespace around my components).
26of whitespace around my components).
27 26
28* The Redesign Process 27* The Redesign Process
29 28
30About a week ago, I found myself wishing for a new design yet again. The 29About a week ago, I found myself wishing for a new design yet again. The prior
31prior design was largely inspired by IBM's 30design was largely inspired by IBM's [[https://www.carbondesignsystem.com][Carbon Design System]] and relied on jQuery,
32[[https://www.carbondesignsystem.com][Carbon Design System]] and relied 31Bootstrap, along with some compressed [[https://en.wikipedia.org/wiki/WebP][.webp]] images.
33on jQuery, Bootstrap, along with some compressed 32
34[[https://en.wikipedia.org/wiki/WebP][.webp]] images. 33To anyone who knows my preferences toward web design - and even in my personal
35 34life - it should be no surprise that I immediately started looking for
36To anyone who knows my preferences toward web design - and even in my 35inspiration on minimalism. While there are some decent minimalistic designs on
37personal life - it should be no surprise that I immediately started 36sites like [[https://dribbble.com/search/shots/popular/web-design?q=minimalism][Dribbble]], people seem to mostly discuss [[https://brutalist-web.design][brutalist web design]] when you
38looking for inspiration on minimalism. While there are some decent 37ask about minimalism. While brutalist web design doesn't have to be minimal, it
39minimalistic designs on sites like 38often is.
40[[https://dribbble.com/search/shots/popular/web-design?q=minimalism][Dribbble]], 39
41people seem to mostly discuss [[https://brutalist-web.design][brutalist 40I suppose, in a way, I did create a brutalist website since my HTML is semantic
42web design]] when you ask about minimalism. While brutalist web design 41and accessible, hyperlinks are colored and underlined, and all native browser
43doesn't have to be minimal, it often is. 42functions like scrolling and the back button work as expected. However, I didn't
44 43think about brutalism while designing these sites.
45I suppose, in a way, I did create a brutalist website since my HTML is 44
46semantic and accessible, hyperlinks are colored and underlined, and all 45The new design followed a simple design process. I walked through the screens on
47native browser functions like scrolling and the back button work as 46my blog and asked myself: "Is this element necessary for a user?" This allowed
48expected. However, I didn't think about brutalism while designing these 47me to first start by removing all javascript, which had the sole purpose of
49sites. 48allowing users to open a collapsed navbar on mobile. Replacing the collapsible
50 49navbar allowed me to remove both jQuery and Bootstrap's javascript.
51The new design followed a simple design process. I walked through the 50
52screens on my blog and asked myself: "Is this element necessary for a 51Next, I removed things like author names (since I'm literally the only person
53user?" This allowed me to first start by removing all javascript, which 52who will ever write on this site), multiple ways to click on a blog post card,
54had the sole purpose of allowing users to open a collapsed navbar on 53blog post descriptions, and the scroll-to-top button. It also helped to move all
55mobile. Replacing the collapsible navbar allowed me to remove both 54categories to a single page, rather than have each category on its own page.
56jQuery and Bootstrap's javascript. 55
57 56The final big piece to finish the "[[https://en.wikipedia.org/wiki/Marie_Kondo#KonMari_method][KonMari]]"-like part of my process was to
58Next, I removed things like author names (since I'm literally the only 57remove Bootstrap CSS in its entirety. However, this meant pulling out a few very
59person who will ever write on this site), multiple ways to click on a 58useful classes, such as =.img-fluid= and the default font stacks to keep in my
60blog post card, blog post descriptions, and the scroll-to-top button. It 59custom CSS.
61also helped to move all categories to a single page, rather than have 60
62each category on its own page. 61After removing all the unnecessary pieces, I was finally able to reorganize my
63 62content and add a very small amount of custom CSS to make everything pretty.
64The final big piece to finish the 63This took a brief amount of time, effectively just consisting of me converting
65"[[https://en.wikipedia.org/wiki/Marie_Kondo#KonMari_method][KonMari]]"-like 64=<div>= tags into things like =<ul>= lists and choosing accent colors.
66part of my process was to remove Bootstrap CSS in its entirety. However,
67this meant pulling out a few very useful classes, such as =.img-fluid=
68and the default font stacks to keep in my custom CSS.
69
70After removing all the unnecessary pieces, I was finally able to
71reorganize my content and add a very small amount of custom CSS to make
72everything pretty. This took a brief amount of time, effectively just
73consisting of me converting =<div>= tags into things like =<ul>= lists
74and choosing accent colors.
75 65
76* The Results 66* The Results
77 67
78** Reflection 68** Reflection
79 69
80So, what did all of this reorganizing do to my webpages? Well, first, my 70So, what did all of this reorganizing do to my webpages? Well, first, my
81websites are now *ridiculously fast*. Since the prior designs were also 71websites are now *ridiculously fast*. Since the prior designs were also minimal
82minimal and didn't have many images, they measured up in Firefox's 72and didn't have many images, they measured up in Firefox's Network Monitor
83Network Monitor around 300 KB - 600KB. After making the changes, my main 73around 300 KB - 600KB. After making the changes, my main site is at 5 KB
84site is at 5 KB transferred (22 KB total), and my blog is at 6.5 KB 74transferred (22 KB total), and my blog is at 6.5 KB transferred (13 KB total).
85transferred (13 KB total). *That means the redesigned pages are less 75*That means the redesigned pages are less than 2% the size of the old designs.*
86than 2% the size of the old designs.* 76
87 77Google Lighthouse ranks the new webpage as 100 in performance, accessibility,
88Google Lighthouse ranks the new webpage as 100 in performance, 78and best practices, with SEO at 92 since they think tap targets are not sized
89accessibility, and best practices, with SEO at 92 since they think tap 79appropriately for mobile users. First contextual paints of the pages are under
90targets are not sized appropriately for mobile users. First contextual 800.8 seconds with 0 ms of blocking time. However, the blog subdomain ranks at 100
91paints of the pages are under 0.8 seconds with 0 ms of blocking time. 81for all four categories! First contextual paints of the blog homepage are under
92However, the blog subdomain ranks at 100 for all four categories! First 821.0 seconds with 0 ms of blocking time, due to the fact that the CSS for my blog
93contextual paints of the blog homepage are under 1.0 seconds with 0 ms 83is within a separate CSS file, and the CSS for my main website is simply
94of blocking time, due to the fact that the CSS for my blog is within a 84embedded in the HTML file.
95separate CSS file, and the CSS for my main website is simply embedded in 85
96the HTML file. 86Now that everything is complete, I can confidently say I'm happy with the result
97 87and proud to look at the fastest set of websites I've created so far.
98Now that everything is complete, I can confidently say I'm happy with
99the result and proud to look at the fastest set of websites I've created
100so far.
content/blog/2020-12-28-neon-drive.org +38 −49
@@ -5,80 +5,69 @@
5 5
6* Game Description 6* Game Description
7 7
8[[https://store.steampowered.com/app/433910/Neon_Drive/][Neon Drive]] 8[[https://store.steampowered.com/app/433910/Neon_Drive/][Neon Drive]] presents itself as a simple arcade-style game inspired by the arcade
9presents itself as a simple arcade-style game inspired by the arcade 9race games of the 1980s, yet it has managed to take up hours of my life without
10race games of the 1980s, yet it has managed to take up hours of my life 10much effort. The game description, directly from the Steam page, is intriguing
11without much effort. The game description, directly from the Steam page, 11enough to entice anyone who's been looking for a good arcade racing game:
12is intriguing enough to entice anyone who's been looking for a good
13arcade racing game:
14 12
15#+begin_quote 13#+begin_quote
16Neon Drive is a slick retro-futuristic arcade game that will make your 14Neon Drive is a slick retro-futuristic arcade game that will make your brain
17brain melt. You've been warned. From beautiful cityscapes and ocean 15melt. You've been warned. From beautiful cityscapes and ocean roads to exploding
18roads to exploding enemy spaceships, Neon Drive has it all. 16enemy spaceships, Neon Drive has it all.
19#+end_quote 17#+end_quote
20 18
21* Gameplay 19* Gameplay
22 20
23The game holds true to the 21The game holds true to the [[https://en.wikipedia.org/wiki/Retrofuturism][retro-futurism]] style, including chrome female robots,
24[[https://en.wikipedia.org/wiki/Retrofuturism][retro-futurism]] style, 22pixelated arcade machines, and [[https://teddit.net/r/outrun/][outrun]] aesthetics.
25including chrome female robots, pixelated arcade machines, and
26[[https://teddit.net/r/outrun/][outrun]] aesthetics.
27 23
28Each level of the game is shown as a separate arcade machine. Each 24Each level of the game is shown as a separate arcade machine. Each arcade
29arcade machine lets you play on Normal, Hard, Insane, Practice, and Free 25machine lets you play on Normal, Hard, Insane, Practice, and Free Run. To beat
30Run. To beat each arcade, you must reach the end of the level without 26each arcade, you must reach the end of the level without crashing your car into
31crashing your car into the various obstacles on the course. Basic levels 27the various obstacles on the course. Basic levels let you move left or right to
32let you move left or right to avoid blocks in the road. Later levels put 28avoid blocks in the road. Later levels put you through other tests, such as
33you through other tests, such as dodging traffic or blasting asteroids. 29dodging traffic or blasting asteroids.
34 30
35The game uses synthwave music to keep you on track to make the correct 31The game uses synthwave music to keep you on track to make the correct moves by
36moves by timing the beats of the songs to the correct moves on the 32timing the beats of the songs to the correct moves on the screen. It reminds me
37screen. It reminds me of the early Guitar Hero games, as well as mobile 33of the early Guitar Hero games, as well as mobile apps like VOEZ - repetition
38apps like VOEZ - repetition and staying on-beat is the only way to win. 34and staying on-beat is the only way to win.
39 35
40* In-Game Screenshots 36* In-Game Screenshots
41 37
42Taking a look at the main menu, you can see that Neon Drive plays into 38Taking a look at the main menu, you can see that Neon Drive plays into every
43every stereotype you can think of around retro-futuristic, synthwave 39stereotype you can think of around retro-futuristic, synthwave arcades (in a
44arcades (in a good way). 40good way).
45 41
46Once you get into the first level, we see that the choice of car fits 42Once you get into the first level, we see that the choice of car fits right in
47right in with the stereotypical cars of the 80s, like the 43with the stereotypical cars of the 80s, like the [[https://en.wikipedia.org/wiki/DMC_DeLorean][DeLorean]] or the [[https://en.wikipedia.org/wiki/Ferrari_F40][Ferrari F40]].
48[[https://en.wikipedia.org/wiki/DMC_DeLorean][DeLorean]] or the 44Each new level comes with new color schemes and cars, so you should never get
49[[https://en.wikipedia.org/wiki/Ferrari_F40][Ferrari F40]]. Each new
50level comes with new color schemes and cars, so you should never get
51tired of the aesthetic. 45tired of the aesthetic.
52 46
53Personally, I love the orange and blue colors used in level 2: 47Personally, I love the orange and blue colors used in level 2:
54 48
55If you're the competitive type and getting 100% on all arcade machines 49If you're the competitive type and getting 100% on all arcade machines isn't
56isn't enough, there are leaderboards for the regular part of the game, 50enough, there are leaderboards for the regular part of the game, and the
57and the endurance game mode. 51endurance game mode.
58 52
59* Other Suggestions 53* Other Suggestions
60 54
61Neon Drive sits nicely within the well-founded cult genre of Outrun. 55Neon Drive sits nicely within the well-founded cult genre of Outrun. Other games
62Other games that I've enjoyed in this same spectrum are: 56that I've enjoyed in this same spectrum are:
63 57
64- [[https://store.steampowered.com/app/233270/Far_Cry_3__Blood_Dragon/][Far 58- [[https://store.steampowered.com/app/233270/Far_Cry_3__Blood_Dragon/][Far Cry 3: Blood Dragon]]
65 Cry 3: Blood Dragon]]
66- [[https://store.steampowered.com/app/1239690/Retrowave/][Retrowave]] 59- [[https://store.steampowered.com/app/1239690/Retrowave/][Retrowave]]
67- [[https://store.steampowered.com/app/732810/Slipstream/][Slipstream]] 60- [[https://store.steampowered.com/app/732810/Slipstream/][Slipstream]]
68 61
69Although these games aren't necessarily in the same genre, they do have 62Although these games aren't necessarily in the same genre, they do have aspects
70aspects that place them close enough to interest gamers that enjoyed 63that place them close enough to interest gamers that enjoyed Neon Drive:
71Neon Drive:
72 64
73- [[https://store.steampowered.com/app/311800/Black_Ice/][Black Ice]] 65- [[https://store.steampowered.com/app/311800/Black_Ice/][Black Ice]]
74- [[https://store.steampowered.com/app/746850/Cloudpunk/][Cloudpunk]] 66- [[https://store.steampowered.com/app/746850/Cloudpunk/][Cloudpunk]]
75- [[https://store.steampowered.com/app/1222680/Need_for_Speed_Heat/][Need 67- [[https://store.steampowered.com/app/1222680/Need_for_Speed_Heat/][Need for Speed: Heat]]
76 for Speed: Heat]]
77- [[https://store.steampowered.com/app/1019310/VirtuaVerse/][VirtuaVerse]] 68- [[https://store.steampowered.com/app/1019310/VirtuaVerse/][VirtuaVerse]]
78 69
79Of course, if all you really care about is the arcade aspect of these 70Of course, if all you really care about is the arcade aspect of these games, you
80games, you can check out the 71can check out the [[https://store.steampowered.com/app/400020/Atari_Vault/][Atari Vault]] or any of the other classic games sold on Steam by
81[[https://store.steampowered.com/app/400020/Atari_Vault/][Atari Vault]] 72companies like Namco, Atari. For something like Nintendo, you'd have to settle
82or any of the other classic games sold on Steam by companies like Namco, 73for buying used classic consoles or delve into the world of emulation.
83Atari. For something like Nintendo, you'd have to settle for buying used
84classic consoles or delve into the world of emulation.
content/blog/2020-12-29-zork.org +44 −56
@@ -5,28 +5,24 @@
5 5
6* Download (Free) 6* Download (Free)
7 7
8Before we get into the game itself, you should know that you can 8Before we get into the game itself, you should know that you can download Zork
9download Zork for free from Infocom's 9for free from Infocom's [[http://infocom-if.org/downloads/downloads.html][download page]]. So feel free to boot it up and take a
10[[http://infocom-if.org/downloads/downloads.html][download page]]. So 10ride back to the 1980s with this masterpiece.
11feel free to boot it up and take a ride back to the 1980s with this
12masterpiece.
13 11
14* Game Description 12* Game Description
15 13
16Zork is an interactive, text-based computer game originally released 14Zork is an interactive, text-based computer game originally released in 1980.
17in 1980. This series, split into three separate games, introduced a 15This series, split into three separate games, introduced a robust and
18robust and sophisticated text parser to gamers. People were largely used 16sophisticated text parser to gamers. People were largely used to the simple
19to the simple commands used in the popular game 17commands used in the popular game [[https://en.wikipedia.org/wiki/Colossal_Cave_Adventure][Colossal Cave Adventure]], but Zork allowed
20[[https://en.wikipedia.org/wiki/Colossal_Cave_Adventure][Colossal Cave 18users to send more complex commands that included prepositions and conjunctions.
21Adventure]], but Zork allowed users to send more complex commands that 19
22included prepositions and conjunctions. 20Zork tracks your score as you explore the map, find tools, and collect trophy
23 21items (e.g., a jewel-encrusted egg). When you place your trophy items in the
24Zork tracks your score as you explore the map, find tools, and collect 22trophy case found in the Living Room area, you gain score points. Collecting the
25trophy items (e.g., a jewel-encrusted egg). When you place your trophy 23Twenty Treasures of Zork and placing them within the trophy case wins the game.
26items in the trophy case found in the Living Room area, you gain score 24However, you must explore the map, solve puzzles, and avoid being eaten by a
27points. Collecting the Twenty Treasures of Zork and placing them within 25grue to collect these treasures.
28the trophy case wins the game. However, you must explore the map, solve
29puzzles, and avoid being eaten by a grue to collect these treasures.
30 26
31* The Map 27* The Map
32 28
@@ -42,45 +38,37 @@ map.
42 38
43* In-Game Screenshots 39* In-Game Screenshots
44 40
45After playing the game (for the first time ever) for several weeks 41After playing the game (for the first time ever) for several weeks around 2014,
46around 2014, I was finally able to beat the game with some online help 42I was finally able to beat the game with some online help to find the last
47to find the last couple items. As I was writing this post, I installed 43couple items. As I was writing this post, I installed the game again to grab
48the game again to grab some screenshots to show off the true glory of 44some screenshots to show off the true glory of this game. As noted in [[https://www.filfre.net/2012/01/exploring-zork-part-1/][Jimmy
49this game. As noted in 45Maher's playthrough]], the original Zork games looked quite a bit different due to
50[[https://www.filfre.net/2012/01/exploring-zork-part-1/][Jimmy Maher's 46the older hardware of computers like the Apple II and multiple bug fixes that
51playthrough]], the original Zork games looked quite a bit different due 47Infocom pushed out after the game's initial release. My play-through uses the
52to the older hardware of computers like the Apple II and multiple bug 48[[https://store.steampowered.com/app/570580/Zork_Anthology/][Zork Anthology]] version, which utilizes DOSBox on Windows.
53fixes that Infocom pushed out after the game's initial release. My 49
54play-through uses the 50The first screenshot here shows the introductory information, which doesn't
55[[https://store.steampowered.com/app/570580/Zork_Anthology/][Zork 51include instructions of any kind for the player. If you haven't played text
56Anthology]] version, which utilizes DOSBox on Windows. 52adventures before, try to use simple commands like "go west," "look around," or
57 53"hit troll with elvish sword."
58The first screenshot here shows the introductory information, which 54
59doesn't include instructions of any kind for the player. If you haven't 55In this second screenshot, we see the player has entered the house and found the
60played text adventures before, try to use simple commands like "go 56trophy case in the living room. The lantern and sword in this room allow the
61west," "look around," or "hit troll with elvish sword." 57player to explore dark areas and attack enemies. If you don't use the lantern,
62 58you won't be able to see anything in dark areas, and you may be eaten by a grue.
63In this second screenshot, we see the player has entered the house and 59
64found the trophy case in the living room. The lantern and sword in this 60Finally, we see that the player has found the first treasure: a jewel-encrusted
65room allow the player to explore dark areas and attack enemies. If you 61egg. These treasures can be taken back to the house and placed in the trophy
66don't use the lantern, you won't be able to see anything in dark areas, 62case or carried until you feel like you want to put things away.
67and you may be eaten by a grue.
68
69Finally, we see that the player has found the first treasure: a
70jewel-encrusted egg. These treasures can be taken back to the house and
71placed in the trophy case or carried until you feel like you want to put
72things away.
73 63
74* Conclusion 64* Conclusion
75 65
76It's been quite a few years since I first played Zork, but I clearly 66It's been quite a few years since I first played Zork, but I clearly remember
77remember the late nights and bloodshot eyes that helped me find all the 67the late nights and bloodshot eyes that helped me find all the treasures. This
78treasures. This game is well worth the time and effort, even though the 68game is well worth the time and effort, even though the text-based aspect may be
79text-based aspect may be off-putting to gamers who didn't have to grow 69off-putting to gamers who didn't have to grow up playing games without graphics.
80up playing games without graphics. However, I believe that the strategy 70However, I believe that the strategy and skills learned in early video games
81and skills learned in early video games like Zork can actually help you, 71like Zork can actually help you, even when playing newer games.
82even when playing newer games.
83 72
84If you do decide to play Zork, you can download Zork I, II, and III from 73If you do decide to play Zork, you can download Zork I, II, and III from
85Infocom's [[http://infocom-if.org/downloads/downloads.html][download 74Infocom's [[http://infocom-if.org/downloads/downloads.html][download page]] for free or search the internet for an online version.
86page]] for free or search the internet for an online version.