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