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