{"version":"https://jsonfeed.org/version/1","title":"Blog on Hakeem Almidan","description":"Recent content in Blog on Hakeem Almidan","home_page_url":"https://hakeem-almidan.com/","feed_url":"https://hakeem-almidan.com/index.json","icon":"https://hakeem-almidan.com/static/apple-touch-icon.png","favicon":"https://hakeem-almidan.com/static/apple-touch-icon.png","items":[{"title":"lsdir - A Shell Alias for Only Listing Directories","date_published":"2024-09-13T01:01:01-07:00","date_modified":"2024-10-27T18:45:11+03:00","id":"https://hakeem-almidan.com/posts/lsdir/","url":"https://hakeem-almidan.com/posts/lsdir/","content_html":"\u003ch2 id=\"the-problem\"\u003eThe Problem\u003c/h2\u003e\n\u003cp\u003eWhen working in the terminal, you sometimes need to list only the directories in the current location. The standard \u003ccode\u003els\u003c/code\u003e command shows both files and directories, which can be overwhelming in cluttered directories.\u003c/p\u003e\n\u003cp\u003eThe command for listing only directories in the current location is \u003ccode\u003els -d */\u003c/code\u003e (\u003ca href=\"https://stackoverflow.com/a/29264762/7974948\"\u003esource\u003c/a\u003e) which is not simple to remember, especially if it\u0026rsquo;s not something that you do often.\u003c/p\u003e\n\u003ch2 id=\"the-solution-lsdir\"\u003eThe Solution: lsdir\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003elsdir\u003c/code\u003e, an alias for only listing directories, which hopefully is easier to remember.\u003c/p\u003e\n\u003ch3 id=\"1-open-your-zshrc-or-bashrc-file\"\u003e1. Open your \u003ccode\u003e.zshrc\u003c/code\u003e or \u003ccode\u003e.bashrc\u003c/code\u003e file:\u003c/h3\u003e\n\u003cp\u003eFor Zsh:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-zsh\" data-lang=\"zsh\"\u003evim ~/.zshrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor Bash:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-zsh\" data-lang=\"zsh\"\u003evim ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"2-click-i-on-your-keyboard-to-go-into-editing-mode-in-vim\"\u003e2. Click \u003ccode\u003ei\u003c/code\u003e on your keyboard to go into editing mode in \u003ccode\u003evim\u003c/code\u003e\u003c/h3\u003e\n\u003ch3 id=\"3-add-the-following-line\"\u003e3. Add the following line:\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-zsh\" data-lang=\"zsh\"\u003ealias lsdir\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;ls -d */\u0026#39;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"4-save-the-file-and-reload-your-shell-configuration\"\u003e4. Save the file and reload your shell configuration:\u003c/h3\u003e\n\u003cp\u003eFor Zsh:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-zsh\" data-lang=\"zsh\"\u003esource ~/.zshrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor Bash:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-zsh\" data-lang=\"zsh\"\u003esource ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"5-try-it\"\u003e5. Try it\u003c/h3\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"lsdir_cmnd.png\"\u003e\u003cimg src=\"lsdir_cmnd.png\" alt=\"Directories listed using ls and lsdir commands\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eDirectories listed using ls and lsdir commands\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eYou\u0026rsquo;re done; Happy coding! 👾\u003c/p\u003e\n"},{"title":"Stop Arrowing Up So Much In Terminal; Search Instead! (Linux/Unix)","date_published":"2020-12-31T19:01:40+03:00","date_modified":"2021-03-28T13:30:59+03:00","id":"https://hakeem-almidan.com/posts/terminal-search/","url":"https://hakeem-almidan.com/posts/terminal-search/","content_html":"\u003ch2 id=\"problem\"\u003eProblem\u003c/h2\u003e\n\u003cp\u003eDo you ever \u003cem\u003eNOT\u003c/em\u003e feel like re-writing a command that you wrote some N commands ago?\nI do!\u003c/p\u003e\n\u003cp\u003eArrowing up and focusing until you reach what you want can be annoying for an efficient\nprogrammer. Although it usually only takes a couple of seconds, it still adds up. Plus,\nyou don\u0026rsquo;t want to waste your brainpower on such a task (unless you like doing it).\u003c/p\u003e\n\u003cp\u003eOne of the best pieces of advice I heard when I first started programming is:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;Always improve/automate tasks that you know you\u0026rsquo;re going to continuously repeat in the future\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eSo let\u0026rsquo;s do that. Let\u0026rsquo;s improve this situation.\u003c/p\u003e\n\u003ch2 id=\"solution\"\u003eSolution\u003c/h2\u003e\n\u003ch4 id=\"ctrlr\"\u003eCtrl+r\u003c/h4\u003e\n\u003cp\u003eThis does a \u0026lsquo;reverse-i-search\u0026rsquo; or \u0026lsquo;bck-i-search\u0026rsquo;, which finds the most recent closest match.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCtrl+r\u003c/code\u003e again to go to next match (further back in history).\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"ctrl-r.png\"\u003e\u003cimg src=\"ctrl-r.png\" alt=\"Ctrl\u0026#43;r keyboard shortcut example use\" width=\"400\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eCtrl+r keyboard shortcut example use\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eIt searches through an environment variable called \u003ccode\u003e$HISTFILE\u003c/code\u003e. The number of commands that\nthis file remembers depends on your \u003ccode\u003e$HISTSIZE\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eI believe the default \u003ccode\u003e$HISTSIZE\u003c/code\u003e in Unix/Linux is around 500. You can check yours by running:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Bash\" data-lang=\"Bash\"\u003e$ echo $HISTSIZE\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch4 id=\"alternative-approach\"\u003eAlternative approach\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Bash\" data-lang=\"Bash\"\u003e$ history \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e\n  \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e echo \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;example command 0\u0026#39;\u003c/span\u003e\n  \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e echo \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;example command 1\u0026#39;\u003c/span\u003e\n  \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e echo \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;example command 2\u0026#39;\u003c/span\u003e\n  \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e echo \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;example command 3\u0026#39;\u003c/span\u003e\n  ...\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis displays your history from 0 to \u003ccode\u003e$HISTSIZE\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eYou can either scroll or \u003ccode\u003eCmd+f\u003c/code\u003e to find your command.\nTo execute the command, run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Bash\" data-lang=\"Bash\"\u003e$ !\u0026lt;command-number\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u0026hellip; where \u003ccode\u003ecommand-number\u003c/code\u003e is the number displayed leftmost to your selected command.\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"history.png\"\u003e\u003cimg src=\"history.png\" alt=\"\u0026#39;history 0\u0026#39; command example use\" width=\"500\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003e\u0026lsquo;history 0\u0026rsquo; command example use\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eHappy coding!\u003c/p\u003e\n"},{"title":"Useful Tools that Helped in Building a Custom Promotion-Code CLI (built in Ruby)","date_published":"2020-11-24T21:13:02+03:00","date_modified":"2020-11-27T22:07:36+03:00","id":"https://hakeem-almidan.com/posts/custom-promotion-code-cli/","url":"https://hakeem-almidan.com/posts/custom-promotion-code-cli/","content_html":"\u003ch2 id=\"table-of-contents\"\u003eTable of contents\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#what\"\u003eWhat\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#why\"\u003eWhy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#the-tools\"\u003eThe Tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#show-me-the-code\"\u003eShow me the code\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"what\"\u003eWhat\u003c/h2\u003e\n\u003cp\u003eThis is post is going to be referring to \u003ca href=\"https://github.com/Hakeemmidan/custom-promotion-code-cli\"\u003ethis custom promotion-code generating CLI\u003c/a\u003e\u0026rsquo;s code, and about useful tools that helped in building it. All the tools mentioned are native to Ruby (no external gems were used)\u003c/p\u003e\n\u003cp\u003eThe data generated is going to be stored in a JSON object, and has the following format:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-JSON\" data-lang=\"JSON\"\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026lt;FirstName LastName\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e:\u003c/span\u003e {\n  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;String: Generated code\u0026#34;\u003c/span\u003e,\n  \u003cspan style=\"color:#f92672\"\u003e\u0026#34;activated\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Boolean\u0026#34;\u003c/span\u003e\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou may think \u0026ldquo;Wait a minute there, that\u0026rsquo;s not a scalable solution, isn\u0026rsquo;t it?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eWell, yes, ideally, the promotion codes should be directly connected to your database. But if you want a quick solution, this should be fine\u003c/p\u003e\n\u003cp\u003eAlso, keep in mind that this is not storing your main data. It\u0026rsquo;s just storing the promotion codes and checking\nwhether they\u0026rsquo;re activated or not. It has a constant (O(1)) lookup and write time-complexity, and can hold an awful lot of data. Approximately, a JSON file can hold about \u003ca href=\"https://stackoverflow.com/a/60300454/7974948\"\u003e18 quintillion characters\u003c/a\u003e. For context: \u0026ldquo;Harry Potter and the Deathly Hallows\u0026rdquo; has \u003ca href=\"https://docs.google.com/document/d/1gIMVTGfHAODR_1CUjLpM_4Uzrrs3BLzt9IRq2rLK8-0/edit?usp=sharing\"\u003eabout 1 million characters\u003c/a\u003e. So, in total, a JSON file would hold about \u003cem\u003e13 trillion\u003c/em\u003e copies of that book. That\u0026rsquo;s a lot!\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"prm-cli-screenshot.png\"\u003e\u003cimg src=\"prm-cli-screenshot.png\" alt=\"Screenshot of promotional code generator CLI\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eScreenshot of promotional code generator CLI\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"why\"\u003eWhy\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;Why should I bother with creating a \u003cem\u003ecustom\u003c/em\u003e promotion-code generator?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eAs you may know, promotional codes are typically used in stores, offline and online, to drive traffic.\nGenerally speaking, general promotion codes (ones not mapped to a specific person), don\u0026rsquo;t need to be unique.\nIn fact, you want them to be generic to drive as much traffic to your store as possible. They should be easy to guess and could be safely made up by humans\u003c/p\u003e\n\u003cp\u003eCustomized promotion codes, on the other hand, though intended to also drive traffic, have another sole purpose. The main purpose of them should be to get specific people onto your platform\u003c/p\u003e\n\u003cp\u003eUnderstanding that these codes are made for specific people, you want them to be harder to guess. That is because we don\u0026rsquo;t want some imposter claiming our invitees' rewards\u003c/p\u003e\n\u003cp\u003eHope that makes sense. If not, feel free to drop a comment\u003c/p\u003e\n\u003ch2 id=\"the-tools\"\u003eThe Tools\u003c/h2\u003e\n\u003ch3 id=\"1-kernelputshttpsruby-docorgcore-270kernelhtmlmethod-i-puts\"\u003e1. \u003ca href=\"https://ruby-doc.org/core-2.7.0/Kernel.html#method-i-puts\"\u003eKernel#puts\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003ePrints string on single line (doesn\u0026rsquo;t allow other stuff to get printed on same line)\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003eputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Hello\u0026#39;\u003c/span\u003e\nputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;world\u0026#39;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003eHello\nWorld\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"2-kernelgetshttpsapidockcomrubykernelgets-and-stringchomphttpsruby-docorgcore-250stringhtmlmethod-i-chomp\"\u003e2. \u003ca href=\"https://apidock.com/ruby/Kernel/gets\"\u003eKernel#gets\u003c/a\u003e and \u003ca href=\"https://ruby-doc.org/core-2.5.0/String.html#method-i-chomp\"\u003eString#chomp\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003egets\u003c/code\u003e: Takes input from shell\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003echomp\u003c/code\u003e: Takes off newline character (\u003ccode\u003e\u0026quot;\\n\u0026quot;\u003c/code\u003e) off from end of string. This character gets generated when user hits the \u003ccode\u003eenter\u003c/code\u003e key\u003c/p\u003e\n\u003cp\u003ePut together because they are often used together. Just having \u003ccode\u003eKernel#gets\u003c/code\u003e will leave you with a string with \u003ccode\u003e\u0026quot;\\n\u0026quot;\u003c/code\u003e at the end of it\u003c/p\u003e\n\u003cp\u003eThe following example uses both to avoid that\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003eputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Please say something: \u0026#39;\u003c/span\u003e\n\nanswer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e gets\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003echomp\n\nputs answer\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e$ Please say something: Hello\nHello\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNote: The project referred to in this post doesn\u0026rsquo;t use \u003ccode\u003egets.chomp\u003c/code\u003e and uses\n\u003ccode\u003eReadline\u003c/code\u003e (\u003ca href=\"#3-readlinereadlinefile-name-refer-to-history-boolhttpsruby-docorgstdlib-251libdocreadlinerdocreadlinehtmlmethod-c-readline\"\u003e#3\u003c/a\u003e) instead. That is since \u003ccode\u003eReadline\u003c/code\u003e provides autocompletion, history reference, and other useful functionalities. But \u003ccode\u003egets.chomp\u003c/code\u003e could be useful for getting simple input in some\ninstances. So it\u0026rsquo;s worth the mention\u003c/p\u003e\n\u003ch3 id=\"3-readlinereadlinefile-name-refer-to-history-boolhttpsruby-docorgstdlib-251libdocreadlinerdocreadlinehtmlmethod-c-readline\"\u003e3. \u003ca href=\"https://ruby-doc.org/stdlib-2.5.1/libdoc/readline/rdoc/Readline.html#method-c-readline\"\u003eReadline::readline(\u0026lt;file name\u0026gt;, \u0026lt;refer to history bool\u0026gt;)\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTakes input from shell. Takes off newline character (\u003ccode\u003e\u0026quot;\\n\u0026quot;\u003c/code\u003e) automatically\u003c/p\u003e\n\u003cp\u003eSecond argument takes boolean to flag whether to remember history or not.\nIf you set to \u003ccode\u003etrue\u003c/code\u003e,  it will remember previous answers from same file-run session\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003erequire \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;readline\u0026#39;\u003c/span\u003e\n\nanswer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eReadline\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ereadline(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Please say something: \u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e)\n\nputs answer\n\nanswer \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eReadline\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ereadline(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Please say something: \u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e)\n\nputs answer\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e$ Please say something: Hello\nHello\n$ Please say something: \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e*click up-arrow*\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n$ Please say something: Hello\nHello\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"4-readlinecompletion_proc--prochttpsruby-docorgstdlib-251libdocreadlinerdocreadlinehtmlmethod-c-completion_proc\"\u003e4. \u003ca href=\"https://ruby-doc.org/stdlib-2.5.1/libdoc/readline/rdoc/Readline.html#method-c-completion_proc\"\u003eReadline::completion_proc = \u0026lt;proc\u0026gt;\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eAdds autocompletion functionality based on given proc\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003erequire \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;readline\u0026#39;\u003c/span\u003e\n\n\u003cspan style=\"color:#66d9ef\"\u003eLIST\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;action\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;bear\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;computer\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n\ncomp \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e proc { \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003es\u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eLIST\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003egrep(\u003cspan style=\"color:#e6db74\"\u003e/^\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e#{\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003eRegexp\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eescape(s)\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e/\u003c/span\u003e) }\n\n\u003cspan style=\"color:#66d9ef\"\u003eReadline\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ecompletion_proc \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e comp\n\u003cspan style=\"color:#66d9ef\"\u003eReadline\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ereadline(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e$ co\u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003e*click on tab*\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e\n$ computer\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"5-stringdowncasehttpsruby-docorgcore-250stringhtmlmethod-i-downcase\"\u003e5. \u003ca href=\"https://ruby-doc.org/core-2.5.0/String.html#method-i-downcase\"\u003eString#downcase\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eLower-cases a string\u003c/p\u003e\n\u003cp\u003eUseful for keeping data format consistent\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003eputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;HELLO WORLD\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edowncase\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ehello world\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"6stringstriphttpsruby-docorgcore-250stringhtmlmethod-i-strip\"\u003e6.\u003ca href=\"https://ruby-doc.org/core-2.5.0/String.html#method-i-strip\"\u003eString#strip\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eTakes off whitespace from beginning and end of string\u003c/p\u003e\n\u003cp\u003eUseful for keeping data format consistent\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003eputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#39; hi there \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003estrip\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ehi there\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(I know it doesn\u0026rsquo;t show up there, but there should be no white spaces at the ends of the string)\u003c/p\u003e\n\u003ch3 id=\"7-ioreadfile-namehttpsruby-docorgcore-251iohtmlmethod-c-read\"\u003e7. \u003ca href=\"https://ruby-doc.org/core-2.5.1/IO.html#method-c-read\"\u003eIO.read(\u0026lt;file name\u0026gt;)\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eReads file content and returns it as string\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003efile_content \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eIO\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eread(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;data.json\u0026#39;\u003c/span\u003e)\n\nputs file_content\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{\\\u0026#34;some key\\\u0026#34;: \\\u0026#34;some value\\\u0026#34;}\u0026#34;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"8-jsonparsejson-stringhttpsruby-docorgstdlib-272libdocjsonrdocjsonhtmlmethod-i-parse\"\u003e8. \u003ca href=\"https://ruby-doc.org/stdlib-2.7.2/libdoc/json/rdoc/JSON.html#method-i-parse\"\u003eJSON#parse(\u0026lt;json string\u0026gt;)\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConverts JSON string to JSON object\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003erequire \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;json\u0026#39;\u003c/span\u003e\n\nputs \u003cspan style=\"color:#66d9ef\"\u003eJSON\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eparse(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003esome key\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e: \u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003esome value\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e}\u0026#34;\u003c/span\u003e)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some key\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some value\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"9-jsondumpjson-stringhttpsruby-docorgstdlib-272libdocjsonrdocjsonhtmlmethod-i-dump\"\u003e9. \u003ca href=\"https://ruby-doc.org/stdlib-2.7.2/libdoc/json/rdoc/JSON.html#method-i-dump\"\u003eJSON#dump(\u0026lt;json string\u0026gt;)\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eConverts JSON object to JSON string\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003erequire \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;json\u0026#39;\u003c/span\u003e\n\nputs \u003cspan style=\"color:#66d9ef\"\u003eJSON\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edump({\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some key\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some value\u0026#34;\u003c/span\u003e})\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;{\\\u0026#34;some key\\\u0026#34;: \\\u0026#34;some value\\\u0026#34;}\u0026#34;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"10-fileopenfile-name-w-file-changes-to-file-httpsruby-docorgstdlib-272libdocjsonrdocjsonhtmlmethod-i-dump\"\u003e10. \u003ca href=\"https://ruby-doc.org/stdlib-2.7.2/libdoc/json/rdoc/JSON.html#method-i-dump\"\u003eFile::Open(\u0026lt;file name\u0026gt;, \u0026lsquo;w\u0026rsquo;) {|file| \u0026lt;changes to file\u0026gt;} \u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eOpens and writes data to file (writing automatically gets it saved)\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003erequire \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;json\u0026#39;\u003c/span\u003e\n\nfile_name \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;data.json\u0026#39;\u003c/span\u003e\nnew_data \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some new key\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some new value\u0026#34;\u003c/span\u003e}\n\n\u003cspan style=\"color:#66d9ef\"\u003eFile\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eopen(file_name,\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e){ \u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003efile\u003cspan style=\"color:#f92672\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eJSON\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edump(new_data, file) }\njson \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eJSON\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eparse(\u003cspan style=\"color:#66d9ef\"\u003eIO\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eread(file_name))\n\nputs json\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"color:#f92672\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some key\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some value\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some new key\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;some new value\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"bonus\"\u003eBonus:\u003c/h3\u003e\n\u003ch3 id=\"11-ecolor-numbermsome-stringe0mhttpsenwikipediaorgwikiansi_escape_codecolors\"\u003e11. \u003ca href=\"https://en.wikipedia.org/wiki/ANSI_escape_code#Colors\"\u003e\u0026quot;\\e[#{\u0026lt;color number\u0026gt;}m#{\u0026lt;some string\u0026gt;}\\e[0m\u0026quot;\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eChanges color of string in shell based on \u003ca href=\"https://en.wikipedia.org/wiki/ANSI_escape_code#Colors\"\u003eANSI escape code\u003c/a\u003e FG Code number\u003c/p\u003e\n\u003cp\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Ruby\" data-lang=\"Ruby\"\u003estr \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;Hello world\u0026#39;\u003c/span\u003e\ncolor_num \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e36\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e# cyan\u003c/span\u003e\n\nputs \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\e\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e#{\u003c/span\u003ecolor_num\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003em\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e#{\u003c/span\u003estr\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e\\e\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e[0m\u0026#34;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOutput:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-Shell\" data-lang=\"Shell\"\u003e\n\n\u003cspan style=\"color:#00aaaa\"\u003eHello world\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"show-me-the-code\"\u003eShow me the code\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s \u003ca href=\"https://github.com/Hakeemmidan/custom-promotion-code-cli\"\u003ethe link\u003c/a\u003e to the repo\u003c/p\u003e\n\u003cp\u003eIf you plan to create a similar tool, I suggest scanning around the \u003ca href=\"https://github.com/Hakeemmidan/custom-promotion-code-cli\"\u003erepo\u003c/a\u003e (same link). It\u0026rsquo;s basically 4 files of Ruby code, and none of them exceed 100 lines. Hope that helps\u003c/p\u003e\n\u003cp\u003eHappy coding!\u003c/p\u003e\n"},{"title":"Why do puffins often have mutliple fish in their beaks at once?","date_published":"2020-07-24T21:07:40+03:00","date_modified":"2024-10-08T22:14:34+03:00","id":"https://hakeem-almidan.com/posts/puffin-multiple-fish-in-beak-wonder/","url":"https://hakeem-almidan.com/posts/puffin-multiple-fish-in-beak-wonder/","content_html":"\u003cp\u003eHave you ever noticed that puffins often simultaneously carry multiple fish in their beaks at once?\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;d be something like this:\n\u003cfigure class=\"image center u-filter-almost-black-and-white\"\u003e\n\u003ca href=\"puffin-w-fish-in-mouth.jpg\"\u003e\u003cimg src=\"puffin-w-fish-in-mouth.jpg\" alt=\"Puffin with multiple fish in beak\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003ePuffin with multiple fish in beak (\u003ca href=\"https://ocean.si.edu/ocean-life/seabirds/watching-fish-puffins-beak\"\u003eSource\u003c/a\u003e)\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/p\u003e\n\u003cp\u003eI thought this was interesting, and I had so many questions, including:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#do-they-catch-them-all-in-one-scoop\"\u003eDo they catch them all in one scoop?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-come-the-fish-are-so-organized\"\u003eHow come the fish are so organized?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#do-they-hide-their-food-while-catching-other-fish-why-do-other-birds-not-steal-them\"\u003eDo they hide their food while catching other fish?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#is-this-a-flex\"\u003eIs this a \u0026lsquo;flex\u0026rsquo;?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-type-of-fish-do-they-mostly-catch\"\u003eWhat type of fish do they mostly catch?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#the-why\"\u003eThe why\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#conclusion\"\u003eConclusion\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBelow, I attempt to answer each question (for Atlantic Puffins specifically).\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"do-they-catch-them-all-in-one-scoop\"\u003eDo they catch them all in one scoop?\u003c/h3\u003e\n\u003cp\u003eAccording to this \u003ca href=\"https://www.int-res.com/abstracts/meps/v520/p257-267/\"\u003eOxford University study\u003c/a\u003e, the answer is no. Puffins make multiple dives per hunt (a.k.a. bout), catching about 1 fish in each dive. They average about 25 dives per hunt.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"how-come-the-fish-are-so-organized\"\u003eHow come the fish are so organized?\u003c/h3\u003e\n\u003cp\u003eAccording to BBC, in \u003ca href=\"https://www.bbc.co.uk/programmes/articles/3DlgWjmWQg2qBYLY1J0vFgN/thirteen-proper-puffin-facts\"\u003ethis article\u003c/a\u003e, puffins stack fish in their beaks using a combination of their tongue and beaks.\u003c/p\u003e\n\u003cp\u003eTheir beaks contain \u0026lsquo;tentacles\u0026rsquo;, which are like small teeth that keep the fish in place. And they use their tongues to push up existing fish while opening their mouths to catch new ones.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"do-they-hide-their-food-while-catching-other-fish\"\u003eDo they hide their food while catching other fish?\u003c/h3\u003e\n\u003cp\u003eNo, they mostly just keep it in their beaks.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"is-this-a-flex\"\u003eIs this a \u0026lsquo;flex\u0026rsquo;?\u003c/h3\u003e\n\u003cp\u003eIt doesn\u0026rsquo;t seem like it. Their \u003ca href=\"https://en.wikipedia.org/wiki/Atlantic_puffin#Reproduction\"\u003emating/courtship protocol\u003c/a\u003e doesn\u0026rsquo;t usually involve fish. But since I haven\u0026rsquo;t found too much evidence of that, I\u0026rsquo;d say that\u0026rsquo;s up for investigation!\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"what-type-of-fish-do-they-mostly-catch\"\u003eWhat type of fish do they mostly catch?\u003c/h3\u003e\n\u003cp\u003eAccording to this \u003ca href=\"https://www.int-res.com/abstracts/meps/v520/p257-267/\"\u003eOxford University study\u003c/a\u003e, they mostly feed on \u003ca href=\"https://en.wikipedia.org/wiki/Sand_eel\"\u003esand eel\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"the-why\"\u003eThe why\u003c/h3\u003e\n\u003cp\u003eAccording to \u003ca href=\"https://brill.com/view/journals/beh/40/3-4/article-p263_4.xml\"\u003ethis study in Iceland\u003c/a\u003e and \u003ca href=\"https://www.bbc.co.uk/programmes/articles/3DlgWjmWQg2qBYLY1J0vFgN/thirteen-proper-puffin-facts\"\u003ethis BBC article\u003c/a\u003e, other birds, such as \u003ca href=\"https://en.wikipedia.org/wiki/Skua\"\u003eSkuas\u003c/a\u003e and \u003ca href=\"https://en.wikipedia.org/wiki/Gull\"\u003eGulls (aka Seagulls)\u003c/a\u003e would literally try to steal the fish off of the Puffins' mouths. And if some fish fall, these two birds, or other birds, would get it.\u003c/p\u003e\n\u003cp\u003eSo the short answer is: \u003cstrong\u003eThey keep it in their mouths to keep it safe for their children.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eInterestingly, Puffins \u003ca href=\"https://www.worldwildlife.org/blogs/good-nature-travel/posts/ten-high-flying-facts-about-puffins#:~:text=Puffins%20lay%20just%20one%20egg,and%20caring%20for%20the%20chick.\"\u003eonly lay one egg a year\u003c/a\u003e. So they have to be extra careful with that food.\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s kind of heroic; they\u0026rsquo;re fighting for their baby\u0026rsquo;s (singular) life. They could just eat the fish and abandon their baby/chick, but they choose not to. It\u0026rsquo;s also worth mentioning that puffins are tiny, they\u0026rsquo;re smaller than a Subway sandwich (\u003ca href=\"https://www.birders-store.co.uk/the-north-american-bird-guide-2nd-edition.html\"\u003e11 inches tall\u003c/a\u003e), and weigh less than a soda can (\u003ca href=\"https://www.birders-store.co.uk/the-north-american-bird-guide-2nd-edition.html\"\u003e380 g\u003c/a\u003e). So \u003ca href=\"https://www.youtube.com/watch?v=r777dlf7wRM\"\u003eother birds can really mess them up\u003c/a\u003e. Which makes this whole thing even more heroic.\u003c/p\u003e\n\u003cp\u003eI understand that this is a childlike view, if you look at it from a scientific view, they\u0026rsquo;re just keeping their species from going extinct. But I guess we could still learn a thing or two from them.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"conclusion\"\u003eConclusion\u003c/h3\u003e\n\u003cp\u003ePuffins feed on Sea Eels (fish) and carry a bunch of them around either for themselves or for their chick (they lay one egg a year). Because it would be too dangerous to leave it on the ground otherwise.\u003c/p\u003e\n\u003cp\u003eThey sound like great parents and deserve a round of \u003ca href=\"https://en.wikipedia.org/wiki/Ululation\"\u003eUlulation\u003c/a\u003e. Kolololoooosh\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"side-note\"\u003eSide note:\u003c/h3\u003e\n\u003cp\u003eWhile looking into this, I found out that there\u0026rsquo;s another type of bird that stacks fish in their beak! The bird\u0026rsquo;s name is the Razorbill (a.k.a. Alca torda). Here is a picture of it carrying fish like a puffin:\u003c/p\u003e\n\u003cfigure class=\"image center u-filter-almost-black-and-white\"\u003e\n\u003ca href=\"razorbill-w-fish-in-mouth.jpg\"\u003e\u003cimg src=\"razorbill-w-fish-in-mouth.jpg\" alt=\"Razorbill with multiple fish in beak\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eRazorbill with multiple fish in beak (\u003ca href=\"http://www.oiseaux-birds.com/page-family-alcidae.html\"\u003eSource\u003c/a\u003e)\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eBut according to \u003ca href=\"https://www.int-res.com/abstracts/meps/v520/p257-267/\"\u003ethis study\u003c/a\u003e (the same Oxford study mentioned above) puffins do tend to carry more fish overall. Razorbills can carry 2 to 10 fish, whereas puffins can carry up to 50!\u003c/p\u003e\n"},{"title":"SCSS Animation Mixin","date_published":"2020-05-05T17:15:02-07:00","date_modified":"2020-11-04T22:20:22+03:00","id":"https://hakeem-almidan.com/posts/scss-animation-mixin/","url":"https://hakeem-almidan.com/posts/scss-animation-mixin/","content_html":"\u003ch2 id=\"problem\"\u003eProblem\u003c/h2\u003e\n\u003cp\u003eThe slightest change in CSS animations (\u003ccode\u003e@keyframes\u003c/code\u003e) requires a creation of a new animation.\u003c/p\u003e\n\u003ch4 id=\"problem-example\"\u003eProblem Example\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-SCSS\" data-lang=\"SCSS\"\u003e\u003cspan style=\"color:#66d9ef\"\u003e@keyframes\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eto-yellow\u003c/span\u003e {\n  \u003cspan style=\"color:#f92672\"\u003e50\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e%\u003c/span\u003e { \u003cspan style=\"color:#f92672\"\u003ebackground-color\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eyellow\u003c/span\u003e; }\n}\n\n\u003cspan style=\"color:#66d9ef\"\u003e@keyframes\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eto-skyblue\u003c/span\u003e {\n  \u003cspan style=\"color:#f92672\"\u003e50\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e%\u003c/span\u003e { \u003cspan style=\"color:#f92672\"\u003ebackground-color\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eskyblue\u003c/span\u003e; }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBoth of the animations pretty much do the same thing, but we had to create two of them.\nWe had to create two of them because their property (\u003ccode\u003ebackground-color\u003c/code\u003e) had different values (i.e. \u003ccode\u003eyellow\u003c/code\u003e and \u003ccode\u003eskyblue\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eThis doesn\u0026rsquo;t follow the \u003ca href=\"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself\"\u003eDRY\u003c/a\u003e software development principle.\u003c/p\u003e\n\u003cp\u003eTo fix this, we\u0026rsquo;re going to use an SCSS \u003ca href=\"https://sass-lang.com/documentation/at-rules/mixin\"\u003emixin\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"solution\"\u003eSolution\u003c/h2\u003e\n\u003cp\u003eLooking at the problem example above, we\u0026rsquo;d replace it with something like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-SCSS\" data-lang=\"SCSS\"\u003e\u003cspan style=\"color:#66d9ef\"\u003e@mixin\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e animation-mixin\u003c/span\u003e($name\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e $color-var) {\n  \u003cspan style=\"color:#66d9ef\"\u003e@keyframes\u003c/span\u003e #{\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e} {\n    \u003cspan style=\"color:#f92672\"\u003e50\u003c/span\u003e\u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e%\u003c/span\u003e { \u003cspan style=\"color:#f92672\"\u003ebackground-color\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#960050;background-color:#1e0010\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003ecolor-var\u003c/span\u003e; }\n  }\n}\n\n\u003cspan style=\"color:#66d9ef\"\u003e@include\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e animation-mixin\u003c/span\u003e(to-yellow\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e yellow);\n\n\u003cspan style=\"color:#66d9ef\"\u003e@include\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e animation-mixin\u003c/span\u003e(to-skyblue\u003cspan style=\"color:#f92672\"\u003e,\u003c/span\u003e skyblue);\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen you could call the \u003ccode\u003eto-yellow\u003c/code\u003e and \u003ccode\u003eto-skyblue\u003c/code\u003e animations in your selectors as needed:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-SCSS\" data-lang=\"SCSS\"\u003e\u003cspan style=\"color:#f92672\"\u003ediv\u003c/span\u003e {\n  \u003cspan style=\"color:#f92672\"\u003eheight\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e100px\u003c/span\u003e;\n  \u003cspan style=\"color:#f92672\"\u003ewidth\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e100px\u003c/span\u003e;\n  \u003cspan style=\"color:#f92672\"\u003ebackground-color\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ewhitesmoke\u003c/span\u003e;\n  \u003cspan style=\"color:#f92672\"\u003eanimation\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eto-yellow\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e4s\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eease\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003einfinite\u003c/span\u003e;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLive example:\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\n\n  \u003cp class=\"codepen\" data-height=\"265\" data-theme-id=\"dark\" data-default-tab=\"css,result\" data-user=\"Hakeemmidan\" data-slug-hash=\"OJPaezR\" style=\"height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;\" data-pen-title=\"SCSS Animation Mixin\"\u003e\n    \u003cspan\u003eSee the Pen \u003ca href=\"https://codepen.io/Hakeemmidan/pen/OJPaezR\"\u003e\n    SCSS Animation Mixin\u003c/a\u003e by Abdulhakeem Almidan (\u003ca href=\"https://codepen.io/Hakeemmidan\"\u003e@Hakeemmidan\u003c/a\u003e)\n    on \u003ca href=\"https://codepen.io\"\u003eCodePen\u003c/a\u003e.\u003c/span\u003e\n  \u003c/p\u003e\n  \u003cscript async src=\"https://static.codepen.io/assets/embed/ei.js\"\u003e\u003c/script\u003e\n\n"},{"title":"How to Prevent CSS Hover State From Getting stuck on Mobile Browsers","date_published":"2020-04-16T21:58:27-07:00","date_modified":"2021-01-01T14:41:39+03:00","id":"https://hakeem-almidan.com/posts/css-hover-on-mobile/","url":"https://hakeem-almidan.com/posts/css-hover-on-mobile/","content_html":"\u003ch2 id=\"problem\"\u003eProblem\u003c/h2\u003e\n\u003cp\u003eThe CSS hover state often gets stuck on mobile (touch screen) browsers. It would be something like this:\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"example-sticky-hover.gif\"\u003e\u003cimg src=\"example-sticky-hover.gif\" alt=\"GIF of clicking on link and css hover state getting stuck\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eHover state getting stuck on-click on mobile\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"solution\"\u003eSolution\u003c/h2\u003e\n\u003cp\u003eUsing the \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover\"\u003e\u0026lsquo;hover\u0026rsquo; CSS media query\u003c/a\u003e, which could be applied either through SCSS or CSS. In the case of SCSS, we\u0026rsquo;re going to use a \u003ca href=\"https://sass-lang.com/documentation/at-rules/mixin\"\u003emixin\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHere is each solution respectively:\u003c/p\u003e\n\u003ch3 id=\"option-1-scss-mixin\"\u003eOption 1: SCSS Mixin\u003c/h3\u003e\n\u003cp\u003eThe mixin:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-SCSS\" data-lang=\"SCSS\"\u003e\u003cspan style=\"color:#66d9ef\"\u003e@mixin\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e hover-supported\u003c/span\u003e {    \n    \u003cspan style=\"color:#66d9ef\"\u003e@media\u003c/span\u003e (hover\u003cspan style=\"color:#f92672\"\u003e:\u003c/span\u003e hover) { \n      \u003cspan style=\"color:#66d9ef\"\u003e@content\u003c/span\u003e;\n    }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExample use:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-SCSS\" data-lang=\"SCSS\"\u003e  \u003cspan style=\"color:#a6e22e\"\u003e.example\u003c/span\u003e {\n    \u003cspan style=\"color:#66d9ef\"\u003e@include\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e hover-supported\u003c/span\u003e() {\n      \u003cspan style=\"color:#66d9ef\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:hover\u003c/span\u003e {\n        \u003cspan style=\"color:#f92672\"\u003ebackground-color\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003eblack\u003c/span\u003e;\n      }\n    }\n  }\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"option-2-css\"\u003eOption 2: CSS\u003c/h3\u003e\n\u003cp\u003eExample use:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"\u003e\u003ccode class=\"language-CSS\" data-lang=\"CSS\"\u003e  @\u003cspan style=\"color:#66d9ef\"\u003emedia\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003ehover\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003ehover\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e)\u003c/span\u003e {\n    .\u003cspan style=\"color:#a6e22e\"\u003eexample\u003c/span\u003e:\u003cspan style=\"color:#a6e22e\"\u003ehover\u003c/span\u003e {\n      \u003cspan style=\"color:#66d9ef\"\u003ebackground-color\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003eblack\u003c/span\u003e;\n    }\n  }\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"explanation\"\u003eExplanation\u003c/h3\u003e\n\u003cp\u003eBoth examples change the \u003ccode\u003ebackground-color\u003c/code\u003e of HTML elements with class \u003ccode\u003eexample\u003c/code\u003e\nonly when they\u0026rsquo;re hovered-over on non-touch screen devices (or any \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover\"\u003ehover\u003c/a\u003e\nsupported device). In short, \u003cem\u003ethis applies hover styling on only non-touch screen devices\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePS: I\u0026rsquo;m not sure how this would act on touch-screen laptops.\u003c/p\u003e\n"},{"title":"Choosing a Static Website Generator: Hugo vs. Jekyll","date_published":"2020-03-23T23:37:28-07:00","date_modified":"2021-03-30T15:10:19+03:00","id":"https://hakeem-almidan.com/posts/hugo-vs-jekyll/","url":"https://hakeem-almidan.com/posts/hugo-vs-jekyll/","content_html":"\u003ch2 id=\"what-are-static-websites\"\u003eWhat are static websites?\u003c/h2\u003e\n\u003cp\u003eIn simple terms, static websites are a collection of webpages that have fixed content. They are the most basic type of website and are typically considered the easiest to create.\u003c/p\u003e\n\u003cp\u003eThese websites are considered the easiest to create because they have a low barrier of entry. They usually are not connected to a \u003ca href=\"https://en.wikipedia.org/wiki/Data_access_layer\"\u003ebackend\u003c/a\u003e or a \u003ca href=\"https://en.wikipedia.org/wiki/Database\"\u003edatabase\u003c/a\u003e, so the only thing that you need to manage is the \u003ca href=\"https://en.wikipedia.org/wiki/Presentation_layer\"\u003efrontend\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eGiven that information, static websites look essentially the same for all users (because you wouldn\u0026rsquo;t have user data to customize their experience). User data, like emails and \u003ca href=\"https://en.wikipedia.org/wiki/Digest_access_authentication\"\u003epassword digests\u003c/a\u003e, need a database for storage and are considered unsafe to store in the frontend.\u003c/p\u003e\n\u003ch2 id=\"why-pick-a-static-website-over-a-regular-dynamic-website\"\u003eWhy pick a static website over a \u0026lsquo;regular\u0026rsquo;, dynamic website?\u003c/h2\u003e\n\u003cp\u003eAlthough static websites are cool and all, why should one choose them over dynamic (a.k.a. full-stack) websites? Here are the advantages that a static website holds over a dynamic one (generally speaking):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eFaster:\u003c/strong\u003e Since static websites don\u0026rsquo;t have a backend or a database, all the \u003ca href=\"https://en.wikipedia.org/wiki/Web_hosting_service\"\u003eweb hosting server\u003c/a\u003e has to do is serve the needed file. There will be no API calls to retrieve data from the database, so you\u0026rsquo;re less likely to see any loading signs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCheaper:\u003c/strong\u003e Hosting static websites is mostly free. They can be hosted on free web hosting services such as \u003ca href=\"https://pages.github.com/\"\u003eGitHub Pages\u003c/a\u003e, \u003ca href=\"https://www.netlify.com/\"\u003eNetlify\u003c/a\u003e, and others. The only cost that you\u0026rsquo;re likely to face is for a custom domain name, and that\u0026rsquo;s optional.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSafer:\u003c/strong\u003e Since there\u0026rsquo;s no backend or database, your site is less likely to be breached for private data. There\u0026rsquo;s no opportunity to perform \u003ca href=\"https://en.wikipedia.org/wiki/SQL_injection\"\u003eSQL injection\u003c/a\u003e and similar database attacks. I think it\u0026rsquo;s good practice to assume that anything stored in your static website will be available to the public.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"when-should-i-choose-a-static-website-over-a-dynamic-one\"\u003eWhen should I choose a static website over a dynamic one?\u003c/h2\u003e\n\u003cp\u003eYou should pick to choose a static website if your website doesn\u0026rsquo;t allow users to make POST, PUT, PATCH, CONNECT or DELETE \u003ca href=\"https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol\"\u003eHTTP\u003c/a\u003e requests. In other words, you should probably choose to use a static website if your users are not going to modify any of your website\u0026rsquo;s data.\u003c/p\u003e\n\u003ch2 id=\"what-are-static-website-generators\"\u003eWhat are static website \u003cem\u003egenerators\u003c/em\u003e?\u003c/h2\u003e\n\u003cp\u003eStatic website \u003cem\u003egenerators\u003c/em\u003e are exactly what they sound like. They\u0026rsquo;re automated processes that help you produce static websites. These technologies differentiate themselves in different ways. But the main two differentiating themes are typically speed and customization.\u003c/p\u003e\n\u003ch2 id=\"picking-a-static-website-generator\"\u003ePicking a static website generator\u003c/h2\u003e\n\u003cp\u003eHere\u0026rsquo;s a list of \u003ca href=\"https://www.staticgen.com/\"\u003ethe most popular static site generators\u003c/a\u003e. Currently, the top three are \u003ca href=\"https://nextjs.org/\"\u003eNext.js\u003c/a\u003e, \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e, and \u003ca href=\"https://nuxtjs.org/\"\u003eNuxt.js\u003c/a\u003e. \u003ca href=\"https://www.gatsbyjs.org/\"\u003eGatsby.js\u003c/a\u003e is a pretty popular one too.\u003c/p\u003e\n\u003cp\u003eToday, we\u0026rsquo;re going to be talking about \u003ca href=\"https://jekyllrb.com/\"\u003eJekyll\u003c/a\u003e and \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e, how they differ, and why you may choose one over the other. But before we go on, you may be wondering: why are we not looking at something like Next or Nuxt since they\u0026rsquo;re so popular? Well, although these technologies are great, I\u0026rsquo;ve decided to avoid writing about them due to a few reasons, including the following:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eThey\u0026rsquo;re built on top of frameworks:\u003c/strong\u003e Next is built on \u003ca href=\"https://reactjs.org/\"\u003eReact.js\u003c/a\u003e, and Nuxt is built on \u003ca href=\"https://vuejs.org/\"\u003eVue.js\u003c/a\u003e. So learning them would also mean that you\u0026rsquo;re going to eventually learn the framework behind them. Hugo and Jekyll, on the other hand, are built on \u003ca href=\"https://golang.org/\"\u003eGo\u003c/a\u003e and \u003ca href=\"https://www.ruby-lang.org/en/\"\u003eRuby\u003c/a\u003e (programming languages) respectively. So their barrier to entry is a bit lower.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eThey\u0026rsquo;re often used as a part of full-stack applications:\u003c/strong\u003e Next and Nuxt are typically used to optimize the frontend of full-stack applications (and are kind of built for that purpose). So browsing questions about them and reading their documentation may confuse you if you plan to use them to build pure static websites [that aren\u0026rsquo;t connected to a backend or database in any way]. Hugo and Jekyll, in contrast, are mostly designed to create and maintain stand-alone static websites. So getting help for them may be easier.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"hugo-vs-jekyll-style-themes\"\u003eHugo vs. Jekyll: Style (themes)\u003c/h2\u003e\n\u003cp\u003eYou can pick a theme to build your website (rather than building it from scratch). Most themes are free and open-sourced. There are plenty of themes to choose from in both technologies.\u003c/p\u003e\n\u003cp\u003ePopular themes are sometimes available under both technologies. So if you see a theme that you like with one technology, I would suggest searching for it in the other. Here are links to theme pages for each:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://jekyllrb.com/docs/themes/\"\u003eJekyll themes\u003c/a\u003e (under \u0026ldquo;Pick up a theme\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://themes.gohugo.io/\"\u003eHugo themes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"hugo-vs-jekyll-speed\"\u003eHugo vs. Jekyll: Speed\u003c/h2\u003e\n\u003cp\u003eOne of the main differences between Hugo and Jekyll is their speed. Looking at \u003ca href=\"https://forestry.io/blog/hugo-vs-jekyll-benchmark/\"\u003ethis\u003c/a\u003e benchmarking test, it is said that Hugo is \u0026ldquo;\u0026hellip; between 23 and 63 times faster than Jekyll\u0026rdquo; (Macrae, 2018) in terms of build time. This becomes more apparent as the number of pages grows. Here\u0026rsquo;s a graph demonstrating the difference:\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"hugo-vs-jekyll-speed-graph.png\"\u003e\u003cimg src=\"hugo-vs-jekyll-speed-graph.png\" alt=\"Column graph of build times by Hugo and Jekyll as page number increases\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eBuild time difference on page number increase (\u003ca href=\"https://forestry.io/blog/hugo-vs-jekyll-benchmark/\"\u003eSource\u003c/a\u003e)\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch2 id=\"hugo-vs-jekyll-the-learning-curve\"\u003eHugo vs. Jekyll: The learning curve\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHugo\u0026rsquo;s docs are harder to follow:\u003c/strong\u003e As pointed out by Ben Congdon in \u003ca href=\"https://benjamincongdon.me/blog/2018/06/06/Switching-from-Jekyll-to-Hugo/\"\u003ehis blog\u003c/a\u003e, Hugo follows a \u003ca href=\"https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design\"\u003etop-down engineering\u003c/a\u003e approach, where it tries to provide everything a user may need. While Jekyll, on the other hand, follows a \u003ca href=\"https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design\"\u003ebottom-up\u003c/a\u003e approach where it provides minimal tools and lets you build the rest. This makes Hugo a little harder to learn. I personally found its documentation to be a little overwhelming. Jekyll\u0026rsquo;s documentation was much easier to read, navigate, and follow.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eGreat communities with both:\u003c/strong\u003e Although Jekyll (\u003ca href=\"https://en.wikipedia.org/wiki/Jekyll_(software)\"\u003eest. 2008\u003c/a\u003e) has been around longer than Hugo (\u003ca href=\"https://en.wikipedia.org/wiki/Hugo_(software)\"\u003eest. 2013\u003c/a\u003e), I found both to have great communities. I didn\u0026rsquo;t have trouble finding answers for either of them.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eProgramming language familiarity:\u003c/strong\u003e Depending on the programming languages you currently know, you may choose one technology over the other. As discussed, Jekyll is built on Ruby and Hugo is built on Go. If you\u0026rsquo;re a beginner programmer, choosing Jekyll may be the easier route since Ruby is considered easier to learn than Go. If you\u0026rsquo;re familiar with \u003ca href=\"https://stackoverflow.com/a/1517670/7974948\"\u003estatically typed programming\u003c/a\u003e languages, then Hugo may be the better option for you, as Go is statically typed.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIt may be important to note that according to \u003ca href=\"https://hired.com/state-of-software-engineers\"\u003ethis\u003c/a\u003e report by \u003ca href=\"https://hired.com/home\"\u003eHired.com\u003c/a\u003e, programmers experienced with Go had the most interview requests on their platform (in 2019). Here\u0026rsquo;s a graph demonstrating this further:\u003c/p\u003e\n\u003cfigure class=\"image center\"\u003e\n\u003ca href=\"hired-most-demand-langs.png\"\u003e\u003cimg src=\"hired-most-demand-langs.png\" alt=\"Graph of most in demand programming languages provided by Hired\"\u003e\u003c/a\u003e\n\u003cfigcaption\u003e\n\u003cp\u003eMost in demand programming languages of 2019 (\u003ca href=\"https://hired.com/state-of-software-engineers\"\u003eSource\u003c/a\u003e)\u003c/p\u003e\n\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eSo if you are currently looking for a job (like I am), it may be worth it to look into Go, and how it may help you grow as a programmer. In case you do want to check it out, I think going through \u003ca href=\"https://tour.golang.org/welcome/1\"\u003ethis interactive tutorial\u003c/a\u003e provided by the language\u0026rsquo;s official website may be a good way to start.\u003c/p\u003e\n\u003ch2 id=\"hugo-vs-jekyll-when-to-use-what\"\u003eHugo vs. Jekyll: When to use what\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eJekyll:\u003c/strong\u003e I would recommend using Jekyll for building websites that don\u0026rsquo;t exceed 500 pages in size (to avoid long build time). Look at \u003ca href=\"https://developer.spotify.com/\"\u003eSpotify for Developers\u003c/a\u003e, \u003ca href=\"https://www.twitchcon.com/\"\u003eTwitchCon\u0026rsquo;s website\u003c/a\u003e, and \u003ca href=\"https://www.sketch.com/\"\u003eSketch App\u0026rsquo;s website\u003c/a\u003e for Jekyll generated examples. More can be found on \u003ca href=\"https://jekyllrb.com/showcase/\"\u003eJekyll\u0026rsquo;s showcase page\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eHugo:\u003c/strong\u003e I would recommend Hugo for blogs, and for websites that you know are going to continue to grow in page count over time. Look at \u003ca href=\"https://benjamincongdon.me/\"\u003eBen Congdon\u0026rsquo;s website\u003c/a\u003e, \u003ca href=\"https://annadodson.co.uk/\"\u003eAnna Dodson\u0026rsquo;s website\u003c/a\u003e, and \u003ca href=\"https://www.pharmaseal.co/\"\u003ePharmaseal\u0026rsquo;s website\u003c/a\u003e for Hugo generated examples. More can be found on \u003ca href=\"https://gohugo.io/showcase/\"\u003eHugo\u0026rsquo;s showcase page\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you want to look at an even deeper comparison of the two technologies, I recommend \u003ca href=\"https://forestry.io/blog/hugo-and-jekyll-compared/\"\u003ethis article\u003c/a\u003e by \u003ca href=\"https://forestry.io/\"\u003eForestry.io\u003c/a\u003e.\u003c/p\u003e\n"},{"title":"About","date_published":"0001-01-01T00:00:00Z","date_modified":"2021-01-25T00:22:24+03:00","id":"https://hakeem-almidan.com/about/","url":"https://hakeem-almidan.com/about/","content_html":"\u003cp\u003eHi,\nI’m Abdulhakeem. You can call me Hakeem. I have experience building full-stack applications in many languages and frameworks. What I’ve learned over time is that the main mental challenge often lies in the logic behind what you\u0026rsquo;re building, and not in the language/framework itself.\u003c/p\u003e\n\u003cp\u003eOutside of work, I enjoy painting, playing volleyball, soccer, scuba diving, and hanging out with friends. I also enjoy reading about business and finance.\u003c/p\u003e\n\u003ch3 id=\"resume\"\u003eResume\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://hakeemmidan.github.io/resume/\"\u003elink\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"contact\"\u003eContact\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"mailto:Hakeemmidan@gmail.com\"\u003eHakeemmidan@gmail.com\u003c/a\u003e\u003c/p\u003e\n\n\n  \u003cspan\u003e\n    \u003c!-- github --\u003e\n    \u003ca class=\"u-link-with-no-underline\" href=\"https://github.com/Hakeemmidan\"\u003e\n      \u003csvg class=\"online-presence-logo\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eGitHub icon\u003c/title\u003e\u003cpath d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"/\u003e\u003c/svg\u003e\n    \u003c/a\u003e\n\n    \u003c!-- linkedin --\u003e\n    \u003ca class=\"u-link-with-no-underline\" href=\"https://www.linkedin.com/in/abdulhakeem-almidan/\"\u003e\n      \u003csvg class=\"online-presence-logo\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eLinkedIn icon\u003c/title\u003e\u003cpath d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"/\u003e\u003c/svg\u003e\n    \u003c/a\u003e\n\n    \u003c!-- angelList --\u003e\n    \u003ca class=\"u-link-with-no-underline\" href=\"https://angel.co/abdulhakeem-almidan\"\u003e\n      \u003csvg class=\"online-presence-logo\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eAngelList icon\u003c/title\u003e\u003cpath d=\"M16.465 9.954c.735-2 1.31-3.65 1.723-4.954.41-1.3.618-2.1.618-2.4 0-.315-.07-.564-.21-.738-.135-.174-.324-.264-.567-.264-.31 0-.63.255-.94.765-.32.51-.67 1.334-1.06 2.467l-1.65 4.76 2.08.362h-.01v.002zm-2.193 4.435c-.474-.03-.923-.08-1.344-.15-.42-.08-.83-.19-1.216-.33.177.35.335.7.472 1.05.138.35.25.69.34 1.04.26-.33.54-.63.83-.9.292-.27.6-.51.915-.72zm-1.862-5l-1.78-5.14c-.464-1.31-.82-2.16-1.075-2.57-.25-.4-.525-.6-.822-.6-.23 0-.417.08-.56.26-.144.18-.214.41-.214.7 0 .5.19 1.38.57 2.64.38 1.25.96 2.89 1.73 4.93.06-.12.16-.21.28-.26.12-.05.28-.08.49-.08.06 0 .19.01.39.01.19.02.52.04.97.09zm-1.618 7.96c.188 0 .36-.09.51-.26.15-.18.234-.36.234-.55 0-.21-.15-.7-.452-1.46-.3-.76-.68-1.51-1.13-2.25-.33-.55-.655-.97-.97-1.25-.324-.28-.625-.42-.91-.42-.23 0-.484.14-.767.44-.28.29-.42.56-.42.81 0 .26.14.66.413 1.18.275.53.645 1.09 1.104 1.68.485.65.94 1.15 1.37 1.51.428.36.77.54 1.02.54h-.002zm-4.945-.4c.156.19.37.46.646.82.723 1 1.395 1.5 2.01 1.5.21 0 .397-.07.563-.2.164-.14.247-.27.247-.42 0-.17-.11-.44-.33-.83-.222-.39-.524-.82-.907-1.3-.44-.56-.805-.97-1.098-1.23-.288-.26-.525-.39-.697-.39-.38 0-.74.21-1.06.62-.32.4-.48.9-.48 1.46 0 .45.12.95.35 1.51.23.55.55 1.11.98 1.67.65.87 1.46 1.53 2.42 2 .96.46 2.03.69 3.19.69 2.14 0 3.94-.8 5.38-2.4 1.45-1.6 2.17-3.6 2.17-6.01 0-.74-.05-1.33-.16-1.76-.11-.43-.29-.75-.54-.95-.45-.38-1.33-.71-2.63-1.01-1.3-.3-2.66-.45-4.08-.45-.39 0-.68.07-.84.2-.16.13-.24.36-.24.673 0 .75.42 1.29 1.26 1.626.84.34 2.19.51 4.06.51h.676c.15 0 .28.06.37.174.09.11.15.28.18.52-.19.17-.57.37-1.154.6-.59.22-1.03.45-1.34.665-.66.484-1.19 1.06-1.59 1.724-.4.66-.6 1.29-.6 1.883 0 .36.086.8.258 1.31.17.51.26.823.26.95v.11l-.03.15c-.48-.03-.86-.313-1.14-.85-.287-.53-.42-1.24-.42-2.13v-.15c-.09.075-.176.135-.26.165-.086.034-.178.05-.27.05-.1 0-.198-.006-.29-.02-.09-.016-.18-.04-.29-.075.03.12.057.24.076.353.01.12.02.21.02.27 0 .406-.16.76-.48 1.05-.32.287-.7.43-1.14.43-.69 0-1.397-.34-2.11-1.01-.715-.674-1.07-1.34-1.07-1.985 0-.12.015-.23.04-.323s.075-.17.14-.24zm11.807-6.73c.985.18 1.685.6 2.09 1.25.41.64.61 1.66.61 3.06 0 2.77-.828 5.03-2.492 6.79-1.667 1.76-3.797 2.65-6.387 2.65-1.023 0-2.016-.19-2.976-.56-.97-.37-1.79-.89-2.49-1.54-.79-.73-1.39-1.49-1.78-2.3-.4-.81-.6-1.64-.6-2.48 0-.95.2-1.68.6-2.19.4-.52 1.05-.87 1.93-1.06-.17-.39-.29-.71-.36-.98-.08-.27-.12-.47-.12-.61 0-.5.26-1.01.78-1.52.52-.52 1.01-.78 1.47-.78.19 0 .4.03.62.11.22.07.47.19.75.35-.81-2.35-1.43-4.2-1.81-5.5-.39-1.31-.58-2.2-.58-2.7 0-.68.17-1.23.52-1.63.36-.4.84-.6 1.44-.6 1.03 0 2.34 2.31 3.93 6.923.28.79.48 1.4.63 1.83l.51-1.453c1.59-4.55 2.95-6.83 4.1-6.83.56 0 1.01.19 1.34.57.33.383.5.887.5 1.523 0 .48-.19 1.36-.56 2.65-.367 1.28-.92 2.96-1.67 5.04\"/\u003e\u003c/svg\u003e\n    \u003c/a\u003e\n\n    \u003c!-- codepen --\u003e\n    \u003ca class=\"u-link-with-no-underline\" href=\"https://codepen.io/Hakeemmidan/pens/public\"\u003e\n      \u003csvg class=\"online-presence-logo\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"\u003e\u003ctitle\u003eCodePen icon\u003c/title\u003e\u003cpath d=\"M18.144 13.067v-2.134L16.55 12zm1.276 1.194a.628.628 0 01-.006.083l-.005.028-.011.053-.01.031c-.005.016-.01.031-.017.047l-.014.03a.78.78 0 01-.021.043l-.019.03a.57.57 0 01-.08.1l-.026.025a.602.602 0 01-.036.03l-.029.022-.01.008-6.782 4.522a.637.637 0 01-.708 0L4.864 14.79l-.01-.008a.599.599 0 01-.065-.052l-.026-.025-.032-.034-.021-.028a.588.588 0 01-.067-.11l-.014-.031a.644.644 0 01-.017-.047l-.01-.03c-.004-.018-.008-.036-.01-.054l-.006-.028a.628.628 0 01-.006-.083V9.739c0-.028.002-.055.006-.083l.005-.027.011-.054.01-.03a.574.574 0 01.12-.217l.031-.034.026-.025a.62.62 0 01.065-.052l.01-.008 6.782-4.521a.638.638 0 01.708 0l6.782 4.521.01.008.03.022.035.03c.01.008.017.016.026.025a.545.545 0 01.08.1l.019.03a.633.633 0 01.021.043l.014.03c.007.016.012.032.017.047l.01.031c.004.018.008.036.01.054l.006.027a.619.619 0 01.006.083zM12 0C5.373 0 0 5.372 0 12 0 18.627 5.373 24 12 24c6.628 0 12-5.372 12-12 0-6.627-5.372-12-12-12m0 10.492L9.745 12 12 13.51 14.255 12zm.638 4.124v2.975l4.996-3.33-2.232-1.493zm-6.272-.356l4.996 3.33v-2.974l-2.764-1.849zm11.268-4.52l-4.996-3.33v2.974l2.764 1.85zm-6.272-.356V6.41L6.366 9.74l2.232 1.493zm-5.506 1.549v2.134L7.45 12Z\"/\u003e\u003c/svg\u003e\n    \u003c/a\u003e\n  \u003c/span\u003e\n\n\u003ch3 id=\"about-website\"\u003eAbout website\u003c/h3\u003e\n\u003cp\u003eLike what you\u0026rsquo;re seeing? Subscribe below to recieve notifications of new posts ⬇️\u003c/p\u003e\n\u003cp\u003ePromise not to send more than 1 email per month (not counting subscription confirmation email) 👨‍💻\n\n\n\u003c!-- Begin Mailchimp Signup Form --\u003e\n\u003cdiv id=\"mc_embed_signup\"\u003e\n\u003cform action=\"https://hakeem-almidan.us2.list-manage.com/subscribe/post?u=2a214450dbf0906444fa3503a\u0026amp;id=637c7a92ad\" method=\"post\" id=\"mc-embedded-subscribe-form\" name=\"mc-embedded-subscribe-form\" class=\"validate\" novalidate\u003e\n  \u003clink href=\"//cdn-images.mailchimp.com/embedcode/horizontal-slim-10_7.css\" rel=\"stylesheet\" type=\"text/css\"\u003e\n    \u003cdiv id=\"mc_embed_signup_scroll\"\u003e\n\t\u003cinput type=\"email\" value=\"\" name=\"EMAIL\" class=\"email\" id=\"mce-EMAIL\" placeholder=\"email address\" required\u003e\n    \u003c!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--\u003e\n    \u003cdiv style=\"position: absolute; left: -5000px;\" aria-hidden=\"true\"\u003e\u003cinput type=\"text\" name=\"b_2a214450dbf0906444fa3503a_637c7a92ad\" tabindex=\"-1\" value=\"\"\u003e\u003c/div\u003e\n    \u003cdiv class=\"clear\"\u003e\u003cinput type=\"submit\" value=\"Subscribe\" name=\"subscribe\" id=\"mc-embedded-subscribe\" class=\"button\"\u003e\u003c/div\u003e\n    \u003c/div\u003e\n\u003c/form\u003e\n\u003c/div\u003e\n\u003c!--End mc_embed_signup--\u003e\n\u003c/p\u003e\n\u003cp\u003eThis website is powered by \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e using the \u003ca href=\"https://github.com/frjo/hugo-theme-zen\"\u003eZen theme\u003c/a\u003e\u003c/p\u003e\n"}]}