
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://blog.imkhoi.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>KHOI | Blog</title>
    <link>https://blog.imkhoi.com/</link>
    <atom:link href="https://blog.imkhoi.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Open sourcing knowledge | Welcome to Khoi&#39;s Blog</description>
    <language>en</language>
    <item>
      <title>How to create swap file to deploy NextJS and Docker app on Ubuntu VPS</title>
      <link>https://blog.imkhoi.com/posts/2024/12/how-to-create-swap-file-to-deploy-nextjs-and-docker-app-on-ubuntu-vps/</link>
      <description>&lt;h1 id=&quot;what-is-a-swap-space&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/12/how-to-create-swap-file-to-deploy-nextjs-and-docker-app-on-ubuntu-vps/#what-is-a-swap-space&quot;&gt;&lt;span&gt;What is a swap space&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I ran into an issue where building a NextJS app on Docker would take forever. Then, I found out I could solve this by adding a swap space to my Ubuntu VPS.&lt;/p&gt;
&lt;p&gt;So what is a swap space?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swap space is a designated area on a hard drive (HDD or SSD) that acts as an extension of a computer’s physical RAM. When the RAM is full, the operating system moves inactive or less frequently used data from RAM to this swap space to free up memory for active tasks. This process is known as “swapping.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;how-to-create-a-swap-space&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/12/how-to-create-swap-file-to-deploy-nextjs-and-docker-app-on-ubuntu-vps/#how-to-create-a-swap-space&quot;&gt;&lt;span&gt;How to create a swap space&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To create a swap file on an Ubuntu Linux VPS for building a Docker and NextJS application, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check existing swap space:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;swapon&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--show&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If this command returns no output, you don’t have any swap space configured.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create swap file&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; fallocate &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; 2G /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a 2GB swap file (it worked in my case). Adjust the size as needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set permissions&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This restricts access to root only, enhancing security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up swap area&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkswap&lt;/span&gt; /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This formats the file as swap space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activate swap&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;swapon&lt;/span&gt; /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This enables the swap file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make swap permanent
Edit &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add this line:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/swapfile none swap sw 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This ensures the swap file is mounted on reboot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify swap:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;swapon&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--show&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should now display information about your new swap space.&lt;/p&gt;
&lt;p&gt;After that, running my &lt;code&gt;docker build&lt;/code&gt; script worked just fine!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/12/how-to-create-swap-file-to-deploy-nextjs-and-docker-app-on-ubuntu-vps/</guid>
    </item>
    <item>
      <title>Troubleshooting ENOSPC no space left on device — Docker</title>
      <link>https://blog.imkhoi.com/posts/2024/08/troubleshooting-enospc-no-space-left-on-device-docker/</link>
      <description>&lt;p&gt;Recently ran into an issue where I deployed a NextJS app with Docker on my DigitalOcean Ubuntu VPS and it logged this out while building: &lt;code&gt;ENOSPC no space left on device&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So I ran &lt;code&gt;df -h&lt;/code&gt; to view how much space on my disk left. This is what I got:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;Filesystem  ...     Use%   Mounted on
/dev/vda1   ...      100%   /&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fortunately, I found this &lt;a href=&quot;https://stackoverflow.com/questions/50142049/enospc-no-space-left-on-device-nodejs&quot; target=&quot;_blank&quot;&gt;Stackoverflow article&lt;/a&gt;, and realized that my Docker app had been creating containers and those became orphaned or unused. This is not so obvious, since running &lt;code&gt;docker ps&lt;/code&gt; and &lt;code&gt;docker image ls&lt;/code&gt; did not show these orphaned containers (or maybe my skill issue).&lt;/p&gt;
&lt;p&gt;So to clean these up, all I had to do was running &lt;code&gt;docker system prune --all&lt;/code&gt; and said &lt;code&gt;Yes&lt;/code&gt; to the CLI prompt. Now, running &lt;code&gt;df -h&lt;/code&gt; again showed me this:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;Filesystem  ...     Use%   Mounted on
/dev/vda1   ...      59%   /&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, I ran the command to rebuild and deploy the Docker app. Everything worked as usual!&lt;/p&gt;
</description>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/08/troubleshooting-enospc-no-space-left-on-device-docker/</guid>
    </item>
    <item>
      <title>Fixing NextJS 14 package issue</title>
      <link>https://blog.imkhoi.com/posts/2024/07/fixing-nextjs-14-package-issue/</link>
      <description>&lt;p&gt;Recently upgraded a NextJS app to version 14.2.5 from version 14.2.4, and during the process, I ran &lt;code&gt;npm update&lt;/code&gt; and got some stuff messed up, and the NextJS app was not running well, eg: logging in did not work.&lt;/p&gt;
&lt;p&gt;This took me a while to solve so I figured to document it here, and to be honest I still did not know the root cause, but I guess it had something to do with &lt;code&gt;package-lock.json&lt;/code&gt;. Here is how I fixed it.&lt;/p&gt;
&lt;p&gt;I was on the &lt;code&gt;dev&lt;/code&gt; branch with the troubling NextJS app. I &lt;code&gt;git checkout&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; (which was still on &lt;code&gt;next@14.2.4&lt;/code&gt;) and noticed that if I ran &lt;code&gt;npm ci&lt;/code&gt; then &lt;code&gt;npm run dev&lt;/code&gt;, the app worked as expected.&lt;/p&gt;
&lt;p&gt;Then, I copied &lt;code&gt;main&lt;/code&gt;’s &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; to a different folder, then I &lt;code&gt;git checkout&lt;/code&gt; to &lt;code&gt;dev&lt;/code&gt;, and pasted the 2 files to &lt;code&gt;dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next, I ran &lt;code&gt;npm ci&lt;/code&gt; to do a clean install, then I ran &lt;code&gt;npm rm next&lt;/code&gt; to uninstall &lt;code&gt;next@14.2.4&lt;/code&gt;, and &lt;code&gt;npm i next@latest&lt;/code&gt; to install &lt;code&gt;next@14.2.5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And, voila it worked again!&lt;/p&gt;
</description>
      <pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/07/fixing-nextjs-14-package-issue/</guid>
    </item>
    <item>
      <title>Tips for technical co-founder</title>
      <link>https://blog.imkhoi.com/posts/2024/03/tips-for-technical-co-founder/</link>
      <description>&lt;p&gt;My notes from &lt;a href=&quot;https://youtu.be/rP7bpYsfa6Q?si=NfvopkHd0mUzRk13&quot; target=&quot;_blank&quot;&gt;from YC Tips for technical co-founder — Diana Hu&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;ideating&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/tips-for-technical-co-founder/#ideating&quot;&gt;&lt;span&gt;Ideating&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Build prototype ASAP in a matter of days.&lt;/li&gt;
&lt;li&gt;Create 90/10 solution.
&lt;ul&gt;
&lt;li&gt;Focusing on a minimal viable product (MVP) that covers 90% of the essential features while leaving out the remaining 10% for future iterations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Choose tech for iteration speed.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The only tech choices that matter are the ones tied to your customer promises.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prototype mistakes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Over-building.&lt;/li&gt;
&lt;li&gt;Not talking to users.&lt;/li&gt;
&lt;li&gt;Not letting go of bad ideas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;launched-stage&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/tips-for-technical-co-founder/#launched-stage&quot;&gt;&lt;span&gt;Launched stage&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Launch in a few weeks.&lt;/p&gt;
&lt;p&gt;Quickly iterate with hard &amp;amp; soft data.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you have set up analytics before launch.&lt;/li&gt;
&lt;li&gt;Pick something simple: Google Analytics, Mixpanel, Amplitude, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Continuously launch.&lt;/p&gt;
&lt;p&gt;Balancing building vs fixing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tech debt is fine. Balance it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;how-the-role-evolves&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/tips-for-technical-co-founder/#how-the-role-evolves&quot;&gt;&lt;span&gt;How the role evolves&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Decide what engineering culture will look like.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evolve into leading a small team of engineers.&lt;/li&gt;
&lt;li&gt;First hires are likely friends.&lt;/li&gt;
&lt;li&gt;Start to have communication overhead.&lt;/li&gt;
&lt;li&gt;Your role is morphing
&lt;ul&gt;
&lt;li&gt;2-5 engineers: 70% time to code&lt;/li&gt;
&lt;li&gt;5-10 engineers: coding &amp;lt;50%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/03/tips-for-technical-co-founder/</guid>
    </item>
    <item>
      <title>Learning Go — Week 5</title>
      <link>https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/</link>
      <description>&lt;p&gt;Have not made any update to my Golang journey, because I had been busy building my first Golang project over the past few weeks.&lt;/p&gt;
&lt;p&gt;This project was built with NextJS on the frontend and Go as the API backend server.&lt;/p&gt;
&lt;h1 id=&quot;how-it-started&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/#how-it-started&quot;&gt;&lt;span&gt;How it started&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Having learned Golang for a while, I was looking for an idea of what to build. Luckily, one day, a close friend/co-worker of my aunt hit me up and asked if I could build an online storefront for him.&lt;/p&gt;
&lt;p&gt;Of course, I said yes! Given a deadline of 4 weeks, my goal was to get it done fast, and works well enough. Also, I had to use Golang, yes, forcing myself to learn Golang hands-on in 4 weeks.&lt;/p&gt;
&lt;h1 id=&quot;the-tech&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/#the-tech&quot;&gt;&lt;span&gt;The tech&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After researching, I decided to use SQLite (no need to setup a SQL user, ROLE, etc.) → &lt;em&gt;KISS — Keep It Stupid Simple!&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SQLite works great as the database engine for most low to medium traffic websites… The amount of web traffic that SQLite can handle depends on how heavily the website uses its database… any site that gets fewer than 100K hits/day should work fine with SQLite… SQLite has been demonstrated to work with 10 times that amount of traffic. — &lt;a href=&quot;https://www.sqlite.org/whentouse.html&quot; target=&quot;_blank&quot;&gt;SQLite.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To interact with the SQLite database, I used &lt;a href=&quot;https://gorm.io/&quot; target=&quot;_blank&quot;&gt;Gorm&lt;/a&gt; — a Golang ORM.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Object-Relational Mapping (ORM) simplifies how programmers interact with databases by bridging the gap between relational data stored in databases and objects used in programming languages. Eg: translating object-oriented code into SQL queries.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And instead of using Go’s pure &lt;code&gt;net/http&lt;/code&gt; package, I used &lt;a href=&quot;https://gofiber.io/&quot; target=&quot;_blank&quot;&gt;Fiber&lt;/a&gt; — a NodeJS Express-inspired web framework written in Go, so I could have the syntax familiarity from Express and still the high performance of Go.&lt;/p&gt;
&lt;h1 id=&quot;result&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/#result&quot;&gt;&lt;span&gt;Result&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After making many changes for the client, finally launched the site — &lt;a href=&quot;https://www.5piecesclothing.com/&quot; target=&quot;_blank&quot;&gt;5Pieces Clothing&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;You can check out the &lt;a href=&quot;https://github.com/KhoiUna/nextjs-go-ecommerce-cms&quot; target=&quot;_blank&quot;&gt;open source&lt;/a&gt; version as well!&lt;/p&gt;
&lt;h1 id=&quot;reflection&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/#reflection&quot;&gt;&lt;span&gt;Reflection&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Go is very strict about types. There were times I wanted to build fast, but had to go back to fix the &lt;em&gt;type&lt;/em&gt; issues. Oh, and Go also doesn’t like the unused variables, too.&lt;/p&gt;
&lt;p&gt;Using Gorm was quite a pain, I might’ve have used raw SQL instead 😅.&lt;/p&gt;
&lt;p&gt;Thank you for reading! Feel free to contribute to &lt;a href=&quot;https://github.com/KhoiUna/nextjs-go-ecommerce-cms&quot; target=&quot;_blank&quot;&gt;NextJS + Go Ecommerce CMS&lt;/a&gt;!&lt;/p&gt;
</description>
      <pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/03/learning-go-week-5/</guid>
    </item>
    <item>
      <title>Learning Go — Week 4</title>
      <link>https://blog.imkhoi.com/posts/2024/01/learning-go-week-4/</link>
      <description>&lt;h1 id=&quot;error-handling&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/01/learning-go-week-4/#error-handling&quot;&gt;&lt;span&gt;Error handling&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I love how Go does error-handling!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error handling is not done via exceptions in Go. Instead, errors are normal values of types that implement the built-in error interface. The error interface is very minimal. It contains only one method &lt;code&gt;Error()&lt;/code&gt; that returns the error message as a string. — &lt;a href=&quot;https://exercism.org/tracks/go/concepts/errors&quot; target=&quot;_blank&quot;&gt;Exercism&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Super minimal!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;However, this gives you the responsibility to be specific about your error message.&lt;/p&gt;
&lt;p&gt;I didn’t know that &lt;em&gt;by convention, the error message starts with a lowercase letter and not end with a period.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since most functions in Go include an error as one of the return values, you will see/use the if err != nil pattern all over the place in Go code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can use a struct to create a custom error type, as shown below:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; MyCustomError &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  message &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
  details &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;MyCustomError&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s, details: %s&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;details&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;someFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;MyCustomError&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    details&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Besides this, I also learned about Go’s &lt;code&gt;regexp&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&quot;zero-values&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/01/learning-go-week-4/#zero-values&quot;&gt;&lt;span&gt;Zero values&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Go does not have a concept of empty, null, or undefined for variable values. Variables declared without an explicit initial value default to the zero value for their respective type.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Zero Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;boolean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;numeric&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;string&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;“”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pointer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;slice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;channel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;map&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&quot;first-class-functions&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2024/01/learning-go-week-4/#first-class-functions&quot;&gt;&lt;span&gt;First class functions&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is the last concept on Exercism that I need to learn.&lt;/p&gt;
&lt;p&gt;Functions are first-class values. This means that you can do with functions the same things you can do with all other values - assign functions to variables, pass them as arguments to other functions or even return functions from other functions.&lt;/p&gt;
&lt;p&gt;For instance:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;engGreeting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello %s, nice to meet you!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// greeting is a variable of type func(string) string&lt;/span&gt;
greeting &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; engGreeting
fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;greeting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; greetingFunc &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;greetingFunc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;I&#39;m a dialog bot.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;dialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; greeting&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description>
      <pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/01/learning-go-week-4/</guid>
    </item>
    <item>
      <title>Learning Go — Week 3</title>
      <link>https://blog.imkhoi.com/posts/2024/01/learning-go-week-3/</link>
      <description>&lt;p&gt;It’s been a while! Yeah, I just graduated and spent some time traveling with my parents!&lt;/p&gt;
&lt;p&gt;Recently, I’ve been doing Go challenges on &lt;a href=&quot;https://exercism.org/&quot; target=&quot;_blank&quot;&gt;Exercism&lt;/a&gt;. I’ve learned a few more concepts like: pointers, &lt;code&gt;strconv&lt;/code&gt;, &lt;code&gt;struct&lt;/code&gt;, &lt;code&gt;interface&lt;/code&gt;. In my opinion, pointers seem like the most confusing concept to grasp when I started learning Go. After doing some challenges and slowly reading how it works, &lt;em&gt;I love it now&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pointers&lt;/strong&gt; help you share memory with other parts of our program. When we have a large amount of data, making copies to pass between functions is inefficient. By passing pointers, you can access the single copy of the data directly → any changes made by one function are immediately visible to other parts of the program when the function ends.&lt;/p&gt;
&lt;p&gt;I also tried to solve &lt;a href=&quot;https://adventofcode.com/&quot; target=&quot;_blank&quot;&gt;Advent of Code&lt;/a&gt; challenges using Go, and learned new syntax as I went. &lt;em&gt;It was tough&lt;/em&gt;, at least for me. Here is &lt;a href=&quot;https://github.com/KhoiUna/AdventofCode2023&quot; target=&quot;_blank&quot;&gt;my attempt to solve AoC challenges&lt;/a&gt;. &lt;em&gt;Please don’t judge my inconsistency. It was quite a challenge!&lt;/em&gt;&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/go-exercism.webp&quot; alt=&quot;My Go progress on Exercism&quot; /&gt;
&lt;p&gt;As you can see, I still have a few more Go concepts to go, then I’ll build some projects with it.&lt;/p&gt;
</description>
      <pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2024/01/learning-go-week-3/</guid>
    </item>
    <item>
      <title>Learning Go — Week 2</title>
      <link>https://blog.imkhoi.com/posts/2023/11/learning-go-week-2/</link>
      <description>&lt;p&gt;Speed-running has been my method of learning Go for the past week. Having learnt Python and C, I skipped some parts of &lt;a href=&quot;https://go.dev/tour/welcome/1&quot; target=&quot;_blank&quot;&gt;A Tour of Go&lt;/a&gt; that I felt confident. Also, doing exercises on &lt;a href=&quot;https://exercism.org/tracks/go/concepts&quot; target=&quot;_blank&quot;&gt;Exercism — Go track&lt;/a&gt; helps a lot!&lt;/p&gt;
&lt;p&gt;The parts that I think I need to work on more are probably pointers (&lt;em&gt;since I’ve worked with Python more than C) and choosing between _a value or pointer receiver&lt;/em&gt; for functions, still haven’t done much of that part.&lt;/p&gt;
&lt;p&gt;I also found this guide, &lt;a href=&quot;https://go.dev/talks/2013/bestpractices.slide&quot; target=&quot;_blank&quot;&gt;Twelve Go Best Practices&lt;/a&gt;, which I thinks is useful for Go learners like me. I still need to work on more apps to get these &lt;em&gt;best practices&lt;/em&gt; in my head.&lt;/p&gt;
&lt;p&gt;Anyway, I was just bored that I found this guide on how to build a &lt;a href=&quot;https://go.dev/doc/tutorial/web-service-gin&quot; target=&quot;_blank&quot;&gt;basic RESTful API with Go and Gin&lt;/a&gt;. It’s fun to build some small projects to learn. Also, love how Go’s package manager is already built in with the Go CLI. If you want to install a package, just do:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go get &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;package name / GitHub URL&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Learning about Go’s approach to format &lt;code&gt;time&lt;/code&gt; is interesting. Go uses a &lt;em&gt;special&lt;/em&gt; time string value &lt;code&gt;2006-01-02 15:04:05&lt;/code&gt; for its layout. You can tweak this &lt;em&gt;layout&lt;/em&gt; string to create multiple time formats. Eg:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; layout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2006-Jan-02&quot;&lt;/span&gt;
tm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;layout&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2014-Feb-04&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; layout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jan 2, 2006 at 3:04pm (MST)&quot;&lt;/span&gt;
tm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;layout&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Feb 4, 2014 at 6:05pm (PST)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</description>
      <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/learning-go-week-2/</guid>
    </item>
    <item>
      <title>Setting up CI/CD for your blog</title>
      <link>https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/</link>
      <description>&lt;p&gt;In this blog post, let’s learn how to set up a CI/CD workflow for your blog with CircleCI, GitHub, and a Linux Virtual Private Server (VPS) with &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-22-04&quot; target=&quot;_blank&quot;&gt;NGINX installed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that I’m using &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot;&gt;Eleventy&lt;/a&gt; as a static site generator for my blog.&lt;/p&gt;
&lt;h1 id=&quot;prerequisites&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#prerequisites&quot;&gt;&lt;span&gt;Prerequisites&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;A CircleCI account.&lt;/li&gt;
&lt;li&gt;A GitHub account.&lt;/li&gt;
&lt;li&gt;A Linux VPS from AWS / Azure / DigitalOcean / etc. (just make sure you have &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-ssh-to-connect-to-a-remote-server&quot; target=&quot;_blank&quot;&gt;set up &lt;strong&gt;SSH&lt;/strong&gt;&lt;/a&gt; and &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-22-04-quickstart&quot; target=&quot;_blank&quot;&gt;create a new sudo user&lt;/a&gt; for it).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;setup-user-for-deployment&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#setup-user-for-deployment&quot;&gt;&lt;span&gt;Setup user for deployment&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;SSH into your VPS (as a sudo user) and create a new user called &lt;code&gt;circleci&lt;/code&gt;. Run:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useradd&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /home/circleci &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /bin/bash circleci&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Setting up SSH for the new &lt;code&gt;circleci&lt;/code&gt; user.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;On your &lt;strong&gt;local&lt;/strong&gt; machine, to generate an SSH key pair, run:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; PEM &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ~/.ssh/circleci&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Copy &amp;amp; paste the content of the public key &lt;code&gt;.pub&lt;/code&gt; and add it your VPS &lt;code&gt;/home/circleci/.ssh/authorized_keys&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /home/circleci/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;If the directory &lt;code&gt;/.ssh&lt;/code&gt; doesn’t exist, create it with:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /home/circleci/.ssh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then create the &lt;code&gt;authorized_keys&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; /home/circleci/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Give the &lt;code&gt;circleci&lt;/code&gt; user its directory permissions so that it doesn’t run into permission issues during deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; circleci:circleci /home/circleci&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On your &lt;strong&gt;local&lt;/strong&gt; machine, test the new &lt;code&gt;circleci&lt;/code&gt; setup with:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; circleci@&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;your_server_ip&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; ~/.ssh/circleci&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it works, you are now logged in as &lt;code&gt;circleci&lt;/code&gt;!&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Setup &lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh&quot; target=&quot;_blank&quot;&gt;SSH connection with GitHub&lt;/a&gt;. This allows us to do &lt;code&gt;git fetch&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt;, and cloning private repos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;install-node&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#install-node&quot;&gt;&lt;span&gt;Install Node&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;SSH to your VPS with the user &lt;code&gt;circleci&lt;/code&gt; as we’ve set up above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;node&lt;/code&gt; (I find &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-22-04#option-3-installing-node-using-the-node-version-manager&quot; target=&quot;_blank&quot;&gt;installing Node using the Node Version Manager&lt;/a&gt; to be more convenient).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;node -v&lt;/code&gt; to make sure &lt;code&gt;node&lt;/code&gt; is installed&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm -v&lt;/code&gt; to make sure &lt;code&gt;npm&lt;/code&gt; is installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Run &lt;code&gt;npm i -g pnpm&lt;/code&gt; to install &lt;code&gt;pnpm&lt;/code&gt; globally.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;pnpm -v&lt;/code&gt; to make sure &lt;code&gt;pnpm&lt;/code&gt; is installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;setup-deployment-environment&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#setup-deployment-environment&quot;&gt;&lt;span&gt;Setup deployment environment&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Create a folder for our deployment, then move to that folder:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; web &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; web&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Clone your blog from GitHub:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;repo-url / ssh-string&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eg: &lt;code&gt;git clone git@github.com:KhoiUna/my-blog.git&lt;/code&gt; (I prefer using an SSH string since we’ve setup SSH connection with GitHub).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Note that in my GitHub repo, I’ve created a &lt;code&gt;.circleci/&lt;/code&gt; folder with a &lt;code&gt;config.yml&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .circleci/config.yml&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.1&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Define the jobs we want to run for this project&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;pull-and-build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; arvindr226/alpine&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ssh
        &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; checkout
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ssh &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;o StrictHostKeyChecking=no $USER@$IP &quot;./deploy&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;blog.sh&quot;
            &lt;span class=&quot;token comment&quot;&gt;# I tell CircleCI to SSH to my VPS,&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# and run my `deploy-blog.sh` script.&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Orchestrate our job run sequence&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;workflows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;build-project&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;pull-and-build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                  &lt;span class=&quot;token key atrule&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                      &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                          &lt;span class=&quot;token key atrule&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                              &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; main&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Create &lt;code&gt;deploy-blog.sh&lt;/code&gt; script: &lt;code&gt;vi ~/deploy-blog.sh&lt;/code&gt; with this content:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# /home/circle/deploy-blog.sh&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# replace this with the path of your project on the VPS&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/web/my-blog

&lt;span class=&quot;token comment&quot;&gt;# pull from the branch&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull origin main

&lt;span class=&quot;token comment&quot;&gt;# followed by instructions specific to your project that you used to do manually&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PNPM_HOME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/home/circleci/.local/share/pnpm&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$PNPM_HOME&lt;/span&gt;:&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Install dependencies&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; i

&lt;span class=&quot;token comment&quot;&gt;# Build my static blog.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# I&#39;m using 11ty so the out dir will be `_site/`&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;Login to your CircleCI account, create a new project and connect it to your blog repo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to your Project Settings, create 2 environment variables: &lt;code&gt;USER=circleci&lt;/code&gt; and &lt;code&gt;IP=&amp;lt;your_server_ip&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;Additional SSH Keys&lt;/strong&gt;, add your private key that you’ve created for &lt;code&gt;circleci&lt;/code&gt; user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;setup-nginx&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#setup-nginx&quot;&gt;&lt;span&gt;Setup NGINX&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;SSH into your server as a &lt;strong&gt;&lt;code&gt;sudo&lt;/code&gt; user&lt;/strong&gt;, &lt;em&gt;not as user &lt;code&gt;circleci&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure NGINX has been installed and is running:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;To make sure NGINX has been installed:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;nginx &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;To make sure NGINX is running:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status nginx&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;If it says &lt;em&gt;Active&lt;/em&gt;, proceed to the next step. If not, start NGINX with: &lt;code&gt;sudo systemctl enable nginx &amp;amp;&amp;amp; sudo systemctl start nginx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Create our NGINX site config file at &lt;code&gt;/etc/ngixn/sites-available/&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; /etc/nginx/sites-available/my-blog.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;with this content:&lt;/p&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;# /etc/nginx/sites-available/my-blog.conf
server {
                listen 80;
                listen [::]:80;

                root /home/circleci/web/my-blog/_site;
                index index.html index.htm index.nginx-debian.html;

                server_name yourdomain.com;
                error_page 404 = /404.html;

                location /404.html {
                        internal;
                }

                location / {
                        try_files $uri $uri/ =404;
                }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Check our NGINX config file:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nginx &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it says &lt;em&gt;OK&lt;/em&gt;, proceed to the next step!&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Restart NGINX:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your blog is now live at &lt;code&gt;yourdomain.com&lt;/code&gt;!&lt;/p&gt;
&lt;h1 id=&quot;a-few-notes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#a-few-notes&quot;&gt;&lt;span&gt;A few notes&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;From now on, each time you &lt;code&gt;git push&lt;/code&gt; successfully to the &lt;code&gt;main&lt;/code&gt; branch, CircleCI will run the steps in our &lt;code&gt;.circleci/config.yml&lt;/code&gt; file in our repo.&lt;/li&gt;
&lt;li&gt;Make sure to not make user &lt;code&gt;circleci&lt;/code&gt; a &lt;code&gt;sudo user&lt;/code&gt; for security purposes.&lt;/li&gt;
&lt;li&gt;Make sure to have &lt;code&gt;export PATH&lt;/code&gt; in your &lt;code&gt;deploy-blog.sh&lt;/code&gt; script. This is important as CircleCI won’t have access to user &lt;code&gt;circleci&lt;/code&gt;’s &lt;code&gt;$PATH&lt;/code&gt; when SSH to our VPS (&lt;em&gt;p/s: I spent &lt;strong&gt;hours&lt;/strong&gt; fixing this bug&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/#references&quot;&gt;&lt;span&gt;References&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-automate-deployment-using-circleci-and-github-on-ubuntu-18-04&quot; target=&quot;_blank&quot;&gt;How To Automate Deployment Using CircleCI and GitHub on Ubuntu 18.04 | DigitalOcean&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/setting-up-cicd-for-your-blog/</guid>
    </item>
    <item>
      <title>SOAR Playbooks</title>
      <link>https://blog.imkhoi.com/posts/2023/11/soar-playbooks/</link>
      <description>&lt;p&gt;This is Week 9 at &lt;a href=&quot;https://www.codepath.org/courses/cybersecurity&quot; target=&quot;_blank&quot;&gt;CodePath&lt;/a&gt;&#39;s Intermediate Cybersecurity course!&lt;/p&gt;
&lt;h1 id=&quot;soar&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/soar-playbooks/#soar&quot;&gt;&lt;span&gt;SOAR&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;SOAR stands for &lt;strong&gt;Security Orchestration, Automation and Response&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is a technology solution that aims to streamline and &lt;strong&gt;automate&lt;/strong&gt; the security operations process by integrating various security tools and processes (eg: SIEM, threat intelligence, etc.) into a single platform.&lt;/p&gt;
&lt;p&gt;SOAR platform can automatically collect and analyze security alerts from multiple sources, correlate events to identify potential threats, and initiate a response based on pre-defined playbooks.&lt;/p&gt;
&lt;p&gt;→ Help organizations respond more quickly and effectively.&lt;/p&gt;
&lt;h1 id=&quot;soar-playbooks&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/soar-playbooks/#soar-playbooks&quot;&gt;&lt;span&gt;SOAR Playbooks&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;SOAR platforms typically provide a range of pre-built playbooks that can be customized to meet an organization’s specific security needs.
These playbooks are based on industry-standard frameworks and best practices. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/demisto/COPS&quot; target=&quot;_blank&quot;&gt;COPS&lt;/a&gt; — provides a standardized way for SOAR platforms to communicate with different systems &amp;amp; devices to ensure that security policies are consistently enforced across an organization’s IT infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.oasis-open.org/cacao/security-playbooks/v1.0/security-playbooks-v1.0.html&quot; target=&quot;_blank&quot;&gt;OASIS CACAO&lt;/a&gt; — defines a set of reusable &amp;amp; shareable artifacts, including use case templates, workflows, &amp;amp; playbooks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/atc-project/atc-react&quot; target=&quot;_blank&quot;&gt;RE&amp;amp;ACT&lt;/a&gt; — provides a standardized way for SOAR platforms to exchange info &amp;amp; automate security operations. By using a common language and framework, RE&amp;amp;ACT aims to improve the ability of organizations to protect their assets &amp;amp; data.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Fri, 24 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/soar-playbooks/</guid>
    </item>
    <item>
      <title>Learning Go — Week 1</title>
      <link>https://blog.imkhoi.com/posts/2023/11/learning-go-week-1/</link>
      <description>&lt;p&gt;Here are a few things I found interesting about Go:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go is &lt;em&gt;sort of&lt;/em&gt; Object-Oriented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go has no classes → no type inheritance.&lt;/li&gt;
&lt;li&gt;You can define custom interfaces, custom structs (structs — data structures — can have member fields).&lt;/li&gt;
&lt;li&gt;Custom types can implement 1 or more interfaces. Custom types can have member methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s only one way to write a loop — the “for” loop. There is no “while…do…” or “do…while…”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Designed as a next-gen lang for C. Go borrows syntax from C, Pascal, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/learning-go-week-1/</guid>
    </item>
    <item>
      <title>CompTIA Roadmap</title>
      <link>https://blog.imkhoi.com/posts/2023/11/comptia-roadmap/</link>
      <description>&lt;p&gt;I attended the National Cyber Summit a few months ago and got this flyer. I think it might be helpful to share!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.imkhoi.com/assets/images/og/comptia-roadmap.webp&quot; target=&quot;_blank&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/og/comptia-roadmap.webp&quot; alt=&quot;CompTIA pathway to jobs&quot; /&gt;&lt;/a&gt;
&lt;sub&gt;CompTIA pathway to jobs&lt;/sub&gt;&lt;/p&gt;
</description>
      <pubDate>Tue, 14 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/comptia-roadmap/</guid>
    </item>
    <item>
      <title>Hosting my own ActivityPub server</title>
      <link>https://blog.imkhoi.com/posts/2023/11/hosting-my-own-activitypub-server/</link>
      <description>&lt;h1 id=&quot;intro&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/hosting-my-own-activitypub-server/#intro&quot;&gt;&lt;span&gt;Intro&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I love self-hosting. The idea of running someone else’s software is beautiful and satisfying. Like learning how to bake a cake from a recipe, if it turns out great, you relish the sweet taste of both success and independence.&lt;/p&gt;
&lt;p&gt;Lately, I have been passionate about the idea of decentralization. For me, decentralization &lt;em&gt;in a not technical way&lt;/em&gt; is independence. It is equality giving power to everyone.&lt;/p&gt;
&lt;p&gt;This leads me to experiment with platforms like Mastodon. Digging a bit deeper, the underlying tech that powers these platforms is a protocol — &lt;a href=&quot;https://activitypub.rocks/&quot; target=&quot;_blank&quot;&gt;ActivityPub&lt;/a&gt;. With a shared protocol, developers build social apps that can &lt;em&gt;talk&lt;/em&gt; to each other, build creative and sleek clients to interact with users on these platforms, &lt;em&gt;sort of like emails&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In this post, I’ll compare 2 open-source ActivityPub servers that you can run on your own VPS — &lt;a href=&quot;https://gotosocial.org/&quot; target=&quot;_blank&quot;&gt;GoToSocial&lt;/a&gt; and &lt;a href=&quot;https://pleroma.social/&quot; target=&quot;_blank&quot;&gt;Pleroma&lt;/a&gt;. These two are pretty lightweight compared to Mastodon so they won’t eat up your server’s resources.&lt;/p&gt;
&lt;h1 id=&quot;gotosocial-vs-pleroma&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/hosting-my-own-activitypub-server/#gotosocial-vs-pleroma&quot;&gt;&lt;span&gt;GoToSocial vs Pleroma&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: GoToSocial at this time of writing is still in alpha.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;GoToSocial&lt;/th&gt;
&lt;th&gt;Pleroma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Programming language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Elixir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easier in my opinion. Offers running from binary and Docker. However, you can customize more if running from binary.&lt;/td&gt;
&lt;td&gt;Has more compilation steps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Doesn’t have a web UI like Pleroma or Mastodon, so you’ll have to look for a web client. It only has a web UI for settings and profile page that you can &lt;a href=&quot;https://github.com/superseriousbusiness/gotosocial/blob/main/CONTRIBUTING.md#stylesheet--web-dev&quot; target=&quot;_blank&quot;&gt;customize&lt;/a&gt;.&lt;/td&gt;
&lt;td&gt;Has its own web UI and you can &lt;a href=&quot;https://docs-develop.pleroma.social/frontend/HACKING/#replacing-your-instances-frontend-with-custom-fe-build&quot; target=&quot;_blank&quot;&gt;customize&lt;/a&gt; it. However, it’s hard to maintain, not recommended.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Another issue I encountered was trying to use DNS proxy with Cloudflare. GoToSocial works fine, but not Pleroma. I had to disable &lt;em&gt;Proxied with Cloudflare&lt;/em&gt; in my DNS settings in order to access Pleroma.&lt;/p&gt;
&lt;p&gt;Now, go ahead and set up your own ActivityPub server then tell me what you think.&lt;/p&gt;
&lt;p&gt;Here are my favorite client apps to interact with the Fediverse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/elk-zone/elk&quot; target=&quot;_blank&quot;&gt;Elk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/woolly-for-mastodon/id6444360628&quot; target=&quot;_blank&quot;&gt;Woolly for iOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To comment or give feedback on this blog post, you can leave them &lt;a href=&quot;https://main.elk.zone/platopunk.com/@khoi/01HF3FD2Y01QEBV1Y0RDQ965XW&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/hosting-my-own-activitypub-server/</guid>
    </item>
    <item>
      <title>Threat hunting vs Security analytics</title>
      <link>https://blog.imkhoi.com/posts/2023/11/threat-hunting-vs-security-analytics/</link>
      <description>&lt;p&gt;This is Week 8 at &lt;a href=&quot;https://www.codepath.org/courses/cybersecurity&quot; target=&quot;_blank&quot;&gt;CodePath&lt;/a&gt;&#39;s Intermediate Cybersecurity course!&lt;/p&gt;
&lt;h1 id=&quot;hypothesis-driven-investigation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/threat-hunting-vs-security-analytics/#hypothesis-driven-investigation&quot;&gt;&lt;span&gt;Hypothesis-driven investigation&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This involves developing a specific hypothesis or theory about a potential security threat, based on available data or information, and then conducting investigations to confirm or refute the hypothesis.&lt;/p&gt;
&lt;p&gt;The hypothesis may be derived from various sources to gather evidence that supports or contradicts the hypothesis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Threat intelligence&lt;/li&gt;
&lt;li&gt;Network analysis&lt;/li&gt;
&lt;li&gt;System logs&lt;/li&gt;
&lt;li&gt;User behavior analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ Allows cybersecurity professionals to focus their investigations on potential threats that are most likely to pose a risk to their organization, rather than trying to identify and investigate every potential threat.&lt;/p&gt;
&lt;p&gt;→ Speed up the investigation process by providing a clear direction for the investigation and enabling analysts to prioritize their efforts based on the level of risk posed by the threat.&lt;/p&gt;
&lt;h2 id=&quot;scenario&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/threat-hunting-vs-security-analytics/#scenario&quot;&gt;&lt;span&gt;Scenario&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: A malicious actor has gained unauthorized access to a company’s network and is exfiltrating sensitive data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Investigation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Collect network logs and analyze them for any suspicious activity, such as unusual login attempts or data transfers.&lt;/li&gt;
&lt;li&gt;Check endpoint logs to see if any devices are communicating with known malicious domains or IP addresses.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;etc.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If the hypothesis is confirmed, take appropriate actions to remediate the threat, such as isolating affected devices and updating security protocols.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ By using a hypothesis-driven approach, the investigation is focused on a specific threat scenario and prioritizes the collection and analysis of data that is most likely to confirm or refute the hypothesis.&lt;/p&gt;
&lt;h1 id=&quot;threat-hunting-vs-security-analytics&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/threat-hunting-vs-security-analytics/#threat-hunting-vs-security-analytics&quot;&gt;&lt;span&gt;Threat Hunting vs Security Analytics&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Threat hunting&lt;/th&gt;
&lt;th&gt;Security analytics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A &lt;strong&gt;proactive&lt;/strong&gt; approach that focuses on finding and mitigating threats that may have gone undetected by other security controls&lt;/td&gt;
&lt;td&gt;A &lt;strong&gt;reactive&lt;/strong&gt; approach that analyzes data after an event has occurred to identify indicators of compromise (IoCs) and prevent similar incidents in the future.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hypothesis-driven&lt;/strong&gt; approach that involves formulating hypotheses about potential threats and searching for evidence to confirm or refute them.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Data-driven&lt;/strong&gt; approach that involves analyzing large volumes of data to identify patterns and anomalies that may indicate a potential threat.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Human expertise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relies on &lt;strong&gt;human expertise&lt;/strong&gt; and intuition to formulate hypotheses, identify potential threats, and make decisions about remediation.&lt;/td&gt;
&lt;td&gt;Can be &lt;strong&gt;automated&lt;/strong&gt; and relies on algorithms and machine learning models to analyze data and identify potential threats.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timeframe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An ongoing, continuous process that involves regular assessments of the environment and searching for potential threats.&lt;/td&gt;
&lt;td&gt;Typically focused on a specific timeframe, such as analyzing data from the past 24 hours or analyzing data related to a specific incident.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description>
      <pubDate>Fri, 10 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/threat-hunting-vs-security-analytics/</guid>
    </item>
    <item>
      <title>Guide to renting</title>
      <link>https://blog.imkhoi.com/posts/2023/11/guide-to-renting/</link>
      <description>&lt;p&gt;I’m about to graduate and looking to rent an apartment. Here’re some takeaways that I learned from these videos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/ORutIfxU8KM?si=6QGm7CZ_X9MlXXxJ&quot; target=&quot;_blank&quot;&gt;Renting an Apartment for the First Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/XYkDas7MBAQ?si=NZgO9gkTgmgR_11u&quot; target=&quot;_blank&quot;&gt;How Much Rent Can I Afford&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check them out!&lt;/p&gt;
&lt;h1 id=&quot;apartment-vs-condo&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/guide-to-renting/#apartment-vs-condo&quot;&gt;&lt;span&gt;Apartment vs Condo&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Apartment&lt;/th&gt;
&lt;th&gt;Condo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 owner for entire complex&lt;/td&gt;
&lt;td&gt;Separate owner for each unit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Likely to raise rent&lt;/td&gt;
&lt;td&gt;Less likely to raise rent; more responsive to repair requests&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&quot;cost-of-renting&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/guide-to-renting/#cost-of-renting&quot;&gt;&lt;span&gt;Cost of renting&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;There are fees to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application fees&lt;/li&gt;
&lt;li&gt;Parking fees&lt;/li&gt;
&lt;li&gt;Pet fees&lt;/li&gt;
&lt;li&gt;Move-in and move-out fees&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pro tip: avoid buying new furniture and ask about utilities cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;evaluate-the-unit&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/guide-to-renting/#evaluate-the-unit&quot;&gt;&lt;span&gt;Evaluate the unit&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Check the area: neighborhood, pests, etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check out &lt;a href=&quot;https://www.trulia.com/&quot; target=&quot;_blank&quot;&gt;Trulia&lt;/a&gt; and &lt;a href=&quot;https://spotcrime.com/&quot; target=&quot;_blank&quot;&gt;SpotCrime&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider buying renter’s insurance.&lt;/p&gt;
&lt;p&gt;Record a video of your unit before you move in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not pay a deposit or sign a lease until you have visited the place!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;how-much-rent-can-you-afford&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/11/guide-to-renting/#how-much-rent-can-you-afford&quot;&gt;&lt;span&gt;How much rent can you afford&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Use after-tax income for your rent budget.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rule of thumb: 25% of your monthly take-home pay after taxes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Try out this &lt;a href=&quot;https://smartasset.com/taxes/paycheck-calculator&quot; target=&quot;_blank&quot;&gt;calculator&lt;/a&gt;!&lt;/p&gt;
</description>
      <pubDate>Fri, 10 Nov 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/11/guide-to-renting/</guid>
    </item>
    <item>
      <title>Threat intelligence APT and MISP</title>
      <link>https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/</link>
      <description>&lt;p&gt;This is Week 7 of &lt;a href=&quot;https://www.codepath.org/&quot; target=&quot;_blank&quot;&gt;CodePath&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&quot;advanced-persistent-threat-(apt)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#advanced-persistent-threat-(apt)&quot;&gt;&lt;span&gt;Advanced Persistent Threat (APT)&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;APT aims to infiltrate a company’s computer systems and steal information or disrupt operations. APT is persistent, meaning they keep trying even if they fail at first, and adapt their tactics to get around defenses. They attack over a long period of time, trying to achieve their goals.&lt;/p&gt;
&lt;h2 id=&quot;who-is-concerned-about-apts%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#who-is-concerned-about-apts%3F&quot;&gt;&lt;span&gt;Who is concerned about APTs?&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Governments&lt;/li&gt;
&lt;li&gt;Corporations&lt;/li&gt;
&lt;li&gt;Any organizations holding sensitive info&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;who-uses-apts%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#who-uses-apts%3F&quot;&gt;&lt;span&gt;Who uses APTs?&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nation-States — steal military secrets or to gain access to sensitive government systems.&lt;/li&gt;
&lt;li&gt;Criminal Organizations — steal credit card information or other valuable data that can be sold on the black market.&lt;/li&gt;
&lt;li&gt;Insiders — steal data or intellectual property from their own organization for personal gain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dangers-of-apts&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#dangers-of-apts&quot;&gt;&lt;span&gt;Dangers of APTs&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;They are persistent:&lt;/strong&gt; they will continue to try to penetrate defenses until they succeed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They are adaptive:&lt;/strong&gt; they can change their tactics as defenders improve their security measures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They are a serious threat:&lt;/strong&gt; cause significant financial harm and/or compromise national security.&lt;/p&gt;
&lt;h1 id=&quot;threat-intelligence-%26-response&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#threat-intelligence-%26-response&quot;&gt;&lt;span&gt;Threat Intelligence &amp;amp; Response&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://attack.mitre.org/&quot; target=&quot;_blank&quot;&gt;Adversarial Tactics, Techniques &amp;amp; Common Knowledge (ATT&amp;amp;CK)&lt;/a&gt;: a framework that describes different tactics and techniques used by attackers during a cyber attack.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://car.mitre.org/&quot; target=&quot;_blank&quot;&gt;Cyber Analytics Repository (CAR)&lt;/a&gt;: A collection of analytics and rules that can be used to detect and respond to cyber threats. CAR is like a set of tools that help an organization monitor its network for signs of an attack.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://capec.mitre.org/&quot; target=&quot;_blank&quot;&gt;Common Attack Pattern Enumeration and Classification (CAPEC)&lt;/a&gt;: a catalog of different types of attacks that organizations might face; helps security teams understand the tactics and techniques used by attackers to exploit known weaknesses in cyber-enabled capabilities (e.g., SQL Injection, XSS, Session Fixation, Clickjacking); is like a &lt;em&gt;dictionary&lt;/em&gt; of different cyber attacks, with each attack type having a unique identifier and description.&lt;/p&gt;
&lt;h1 id=&quot;threat-intelligence-information-sharing&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#threat-intelligence-information-sharing&quot;&gt;&lt;span&gt;Threat Intelligence Information Sharing&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The exchange of relevant data and insights about potential cyber threats among individuals or organizations.&lt;/p&gt;
&lt;p&gt;Occurs via formal agreements or informal networks, and can involve the sharing of indicators of compromise, malware samples, or other data that can help identify and mitigate threats.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s like sharing information about suspicious activities with your neighbors so that everyone can take measures to protect themselves and their properties.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sharing threat indicators with other organizations is mutually beneficial but comes with challenges as well.&lt;/p&gt;
&lt;p&gt;You need to make sure &lt;strong&gt;not to share confidential information&lt;/strong&gt;. You need to share it in a way that makes it both timely and actionable. etc.&lt;/p&gt;
&lt;h1 id=&quot;misp---threat-intelligence-sharing-platform&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#misp---threat-intelligence-sharing-platform&quot;&gt;&lt;span&gt;MISP - Threat Intelligence Sharing Platform&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://misp-project.org/&quot; target=&quot;_blank&quot;&gt;Malware Information Sharing Platform (MISP)&lt;/a&gt; is an open source software solution for collecting, storing, distributing and sharing cyber security indicators and threats about cyber security incidents analysis and malware analysis. MISP is designed by and for incident analysts, security and ICT professionals or malware reversers to support their day-to-day operations to share structured information efficiently.&lt;/p&gt;
&lt;h2 id=&quot;threat-intelligence-feeds&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/#threat-intelligence-feeds&quot;&gt;&lt;span&gt;Threat Intelligence Feeds&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are &lt;em&gt;continuous&lt;/em&gt; streams of valuable info that provide timely and actionable details about potential or current threats. This info is collected from a variety of sources, analyzed, and then distributed by organizations dedicated to improving cybersecurity awareness. The content of these feeds varies widely, from comprehensive lists of malicious IPs and URLs to detailed malware analysis reports and risk ratings.&lt;/p&gt;
&lt;h3&gt;Advantage&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Visibility&lt;/strong&gt;: By adding this feed, you get visibility into potential threats that are using the TOR network to mask their activities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Threat Intelligence&lt;/strong&gt;: This feed helps you understand and identify trends or patterns that might indicate a threat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Incident Response&lt;/strong&gt;: If you detect activity from an IP address on this list, it could be an indicator of a security incident that needs to be investigated.&lt;/p&gt;
&lt;h3&gt;Caching a feed&lt;/h3&gt;
&lt;p&gt;When you cache a feed in MISP, you are essentially storing a local copy of the feed data in your MISP instance allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access and analyze the data faster because you don’t need to fetch the data from the feed source each time.&lt;/li&gt;
&lt;li&gt;Reduces the load on the feed source and can help prevent your access from being rate-limited or blocked if the feed source has such restrictions.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You don’t want to repeatedly ask the source for the exact same data!&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <pubDate>Sun, 29 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/threat-intelligence-apt-and-misp/</guid>
    </item>
    <item>
      <title>Incident response &amp;mdash; NIST vs SANS</title>
      <link>https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/</link>
      <description>&lt;p&gt;This is part of Week 6 of &lt;a href=&quot;https://www.codepath.org/&quot; target=&quot;_blank&quot;&gt;CodePath&lt;/a&gt;&#39;s Intermediate Cybersecurity course.&lt;/p&gt;
&lt;h1 id=&quot;nist-and-sans&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#nist-and-sans&quot;&gt;&lt;span&gt;NIST and SANS&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;National Institute of Standards and Technology&lt;/strong&gt; (&lt;a href=&quot;https://www.nist.gov/&quot; target=&quot;_blank&quot;&gt;NIST&lt;/a&gt;) is a U.S. government agency that specializes in all kinds of tech. The &lt;a href=&quot;https://www.nist.gov/cyberframework&quot; target=&quot;_blank&quot;&gt;NIST Cybersecurity Framework&lt;/a&gt; is one of the most popular methodologies for better understanding and managing cybersecurity risk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sysadmin, Audit, Network, and Security&lt;/strong&gt; (&lt;a href=&quot;https://www.sans.org/&quot; target=&quot;_blank&quot;&gt;SANS&lt;/a&gt;) is a private org that researches and educates industries in the 4 key cyber disciplines. The SANS framework &lt;em&gt;primarily focuses on security&lt;/em&gt; as opposed to NIST, which has a wider domain of operation.&lt;/p&gt;
&lt;h1 id=&quot;comparing-nist-and-sans-incident-response-steps&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#comparing-nist-and-sans-incident-response-steps&quot;&gt;&lt;span&gt;Comparing NIST and SANS incident response steps&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NIST&lt;/th&gt;
&lt;th&gt;SANS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Preparation&lt;/td&gt;
&lt;td&gt;1. Preparation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Detection and Analysis&lt;/td&gt;
&lt;td&gt;2. Identification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Containment, Eradication, and Recovery&lt;/td&gt;
&lt;td&gt;3. Containment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;4. Eradication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;5. Recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Post-Incident Activity&lt;/td&gt;
&lt;td&gt;6. Lesson Learned&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Placed side-by-side, NIST and SANS have all the same components and the same flow.&lt;/p&gt;
&lt;p&gt;The biggest difference lies in Step 3, where NIST believes that containment, eradication, and recovery overlap – meaning &lt;em&gt;you should not wait to contain all threats before beginning to eradicate them&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;preparation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#preparation&quot;&gt;&lt;span&gt;Preparation&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;No organization can spin up an effective Incident Response (IR) on a moment’s notice. A plan must be in place to both prevent and respond to events.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Defining the CSIRT (Computer Security Incident Response Team)&lt;/li&gt;
&lt;li&gt;Developing and updating a plan&lt;/li&gt;
&lt;li&gt;Acquiring and maintain the proper infrastructure tools&lt;/li&gt;
&lt;li&gt;Possessing up to date threat intelligence capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having tools and resources available that may be of value during an incident handling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Incident Handler Communication Facilities:&lt;/strong&gt; Contact information for IR team members, incident reporting mechanisms (such as phone numbers, email addresses, forms, etc), smartphones, war room, secure storage facility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident Analysis Hardware &amp;amp; Software:&lt;/strong&gt; Laptops, digital forensics workstations, blank removable media, portable printer, packet sniffers, digital forensic software.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident Analysis Resources:&lt;/strong&gt; Port lists, documentation (for OSs, applications, IDS, antivirus), network diagrams and lists of critical assets, current baselines, cryptographic hashes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident Mitigation Software:&lt;/strong&gt; Access to images of clean OS and application installations for restoration and recovery purposes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Preventing incident:&lt;/strong&gt; Keeping the number of incidents reasonably low with recommended practices: risk assessments, host and network security, malware prevention, user awareness and training.&lt;/p&gt;
&lt;h2 id=&quot;detection-and-analysis&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#detection-and-analysis&quot;&gt;&lt;span&gt;Detection and Analysis&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Attack vectors:&lt;/strong&gt; Some common ones include: external/removable media, attrition, web, email, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signs of an incident&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident analysis:&lt;/strong&gt; Once identified, the IR team has to determine if a precursor or indicator is part of an attack or if it is a false positive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident documentation:&lt;/strong&gt; If the signal proves valid, the IR team must begin documenting all facts in relation to the incident and continue logging all actions taken throughout the process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident Prioritization:&lt;/strong&gt; NIST designates this step as the &lt;strong&gt;most critical decision point&lt;/strong&gt; in the IR process. The IR team can’t simply prioritize incidents on a first come, first serve basis. Instead, they must score incidents on the impact it will have on the business functionality, the confidentiality of affected information, and the recoverability of the incident.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident notification&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;containment%2C-eradication%2C-%26-recovery&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#containment%2C-eradication%2C-%26-recovery&quot;&gt;&lt;span&gt;Containment, Eradication, &amp;amp; Recovery&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The purpose of the this phase is to halt the effects of an incident before it can cause further damage. Once an incident is contained, the IR team can take the time necessary to tailor its next steps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Containment:&lt;/strong&gt; an essential part of containment is decision-making (e.g. shut down a system, disconnect it from a network, disable certain functions). Criteria for determining the appropriate strategy include:
&lt;ul&gt;
&lt;li&gt;Potential damage to &amp;amp; theft of resources, need for evidence preservation, service availability, time &amp;amp; resources needed to implement strategy, effectiveness of strategy, &amp;amp; duration of solution.&lt;/li&gt;
&lt;li&gt;In some cases, the attacker is redirected to a sandbox so that they can monitor the attacker’s activity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence gathering and handling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identifying the attacking hosts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eradication and recovery:&lt;/strong&gt; during eradication, it is important to identify all affected hosts within the organization so that they can be remediated. For some incidents, eradication is either not necessary or is performed during recovery.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;post-incident-activity&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/#post-incident-activity&quot;&gt;&lt;span&gt;Post Incident Activity&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Every incident should be an opportunity to learn and improve, but many organizations give little time or attention to this step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lessons learned:&lt;/strong&gt; each incident response team should evolve to reflect new threats, improved technology, and lessons learned. If an organization doesn’t improve their systems after an incident, they are bound to have a repeat of events&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using collected incident data:&lt;/strong&gt; this data can be put back into the risk assessment process, ultimately leading to the selection and implementation of additional controls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit:&lt;/strong&gt; Audits will identify problems and deficiencies that  can then be corrected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence retention:&lt;/strong&gt;  A policy for how long evidence from an incident should be retained. Most choose to retain all evidence for months or years after the incident ends depending on data retention policies, cost, and potential legal actions.&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Tue, 24 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/incident-response-nist-vs-sans/</guid>
    </item>
    <item>
      <title>What are SIEM and UEBA?</title>
      <link>https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/</link>
      <description>&lt;p&gt;Week 5 of my &lt;a href=&quot;https://www.codepath.org/courses/cybersecurity&quot; target=&quot;_blank&quot;&gt;CodePath&lt;/a&gt;&#39;s Intermediate Cybersecurity course!&lt;/p&gt;
&lt;h1 id=&quot;security-information-%26-event-management-(siem)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#security-information-%26-event-management-(siem)&quot;&gt;&lt;span&gt;Security Information &amp;amp; Event Management (SIEM)&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;SIEM tools use rules and statistical correlations to turn log entries and events from security systems into actionable information.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detect threats in real time&lt;/li&gt;
&lt;li&gt;Manage incident response&lt;/li&gt;
&lt;li&gt;Forensic investigation on past security incidents&lt;/li&gt;
&lt;li&gt;Prepare audits for compliance purposes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SIEM combines 2 functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SIM — security information management.&lt;/li&gt;
&lt;li&gt;SEM — security event management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ Makes SIEM more well-rounded and an ubiquitous tool for any Security Operation Center (SOC).&lt;/p&gt;
&lt;p&gt;Some SIEM tools include: Splunk Enterprise Security, Datadog Security Monitoring, Fortinet FortiSIEM, etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In short, SIEM is a solution that helps organizations detect, analyze, and respond to security threats before they harm business operations. — &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/security-101/what-is-siem&quot; target=&quot;_blank&quot;&gt;Microsoft&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;next-gen-siem-capabilitites&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#next-gen-siem-capabilitites&quot;&gt;&lt;span&gt;Next-gen SIEM capabilitites&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next-gen SIEM utilizes &lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#user-and-entity-behavior-analytics-(ueba)&quot;&gt;User and entity behavior analytics (UEBA)&lt;/a&gt; to go beyond rules and correlations, leveraging AI and deep learning techniques to look at patterns of human behavior.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security orchestration and automation response (SOAR):&lt;/strong&gt; Next-gen SIEMs integrate with enterprise systems and &lt;em&gt;automate&lt;/em&gt; incident response. Eg: SIEM detects an alert for ransomware → SIEM performs containment steps automatically on affected systems before attackers encrypt the data → simultaneously creating communications or other notifications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complex threat identification:&lt;/strong&gt; Correlation rules can’t capture many complex attacks, because they lack context, or can’t respond to new types of incidents. With &lt;em&gt;automatic behavioral profiling&lt;/em&gt;, SIEMs detect behavior that suggests a threat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Detection without rules or signatures:&lt;/strong&gt; Many threats can’t be captured with manually-defined rules or known attack signatures. SIEMs use &lt;em&gt;machine learning&lt;/em&gt; to detect incidents without pre-existing definitions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lateral movement:&lt;/strong&gt; SIEMs analyze data from across the network and multiple system resources to detect lateral movements — attackers move across network, IP addresses, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entity behavior analysis:&lt;/strong&gt; Critical assets on the network — servers, medical equipments, etc. — have unique behavioral patterns. SIEMs learn these patterns and &lt;em&gt;automatically&lt;/em&gt; discover anomalies suggesting a threat.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;user-and-entity-behavior-analytics-(ueba)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#user-and-entity-behavior-analytics-(ueba)&quot;&gt;&lt;span&gt;User and entity behavior analytics (UEBA)&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;UEBA provides information on the behavior of users and other entities in the corporate network — &lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#insider-threats&quot;&gt;malicious insider&lt;/a&gt;, compromised user, etc.&lt;/p&gt;
&lt;h2 id=&quot;3-pillars-of-ueba&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#3-pillars-of-ueba&quot;&gt;&lt;span&gt;3 pillars of UEBA&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Analytics:&lt;/strong&gt; detects anomalies using a variety of analytics approaches — machine learning, statistical modeling, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; ingest data from a general data repository such as a data lake or data warehouse, or through a SIEM. Can be from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Business context&lt;/li&gt;
&lt;li&gt;HR and user context&lt;/li&gt;
&lt;li&gt;External threat intelligence&lt;/li&gt;
&lt;li&gt;Events and logs&lt;/li&gt;
&lt;li&gt;Network flows and packets&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;insider-threats&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/#insider-threats&quot;&gt;&lt;span&gt;Insider threats&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Negligent insider:&lt;/strong&gt; An employee with privileged access to IT systems unintentionally puts their org at risk because they don’t follow the procedures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Malicious Insider:&lt;/strong&gt; employee intends to perform a cyber attack against the org.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compromised insider:&lt;/strong&gt; infiltrate an org and compromise a privileged user account.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;610&quot; src=&quot;https://info.varonis.com/hs-fs/hubfs/Imported_Blog_Media/ueba-vs-siem-2.png?width=1241&amp;height=1304&amp;name=ueba-vs-siem-2.png&quot; alt=&quot;UEBA and SIEM comparison image&quot; /&gt;
&lt;p&gt;&lt;sub&gt;Source: &lt;a href=&quot;https://info.varonis.com/hs-fs/hubfs/Imported_Blog_Media/ueba-vs-siem-2.png?width=1241&amp;height=1304&amp;name=ueba-vs-siem-2.png&quot; target=&quot;_blank&quot;&gt;Varonis&lt;/a&gt;&lt;/sub&gt;&lt;/p&gt;
</description>
      <pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/what-are-siem-and-ueba/</guid>
    </item>
    <item>
      <title>Slowloris DDoS &amp; how to mitigate with NGINX</title>
      <link>https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/</link>
      <description>&lt;h3&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#what-is-denial-of-service-(ddos)-attack%3F&quot;&gt;What is denial-of-service (DDoS) attack?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#slowloris-ddos&quot;&gt;Slowloris DDoS&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#slowloris-attack-occurs-in-4-steps&quot;&gt;Slowloris attack occurs in 4 steps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#best-way-to-stop-a-slowloris-attack&quot;&gt;Best way to stop a Slowloris attack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#mitigate-ddos-with-nginx&quot;&gt;Mitigate DDoS with NGINX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;what-is-denial-of-service-(ddos)-attack%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#what-is-denial-of-service-(ddos)-attack%3F&quot;&gt;&lt;span&gt;What is denial-of-service (DDoS) attack?&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It’s a malicious attempt to disrupt the normal traffic of a targeted server by overwhelming the target with a flood of Internet traffic.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A DDoS attack is like an unexpected traffic jam clogging up the highway, preventing regular traffic from arriving at its destination.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Different types of DDoS attacks target varying components of a network connection. A network connection on the Internet is composed of many different components or “layers”.&lt;/p&gt;
&lt;p&gt;The OSI model is a conceptual framework used to describe network connectivity in 7 distinct layers.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/osi.png&quot; alt=&quot;OSI Model&quot; /&gt;
&lt;h1 id=&quot;slowloris-ddos&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#slowloris-ddos&quot;&gt;&lt;span&gt;Slowloris DDoS&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A Slowloris DDoS attack is a type of DDoS attack targeting Layer 7 of the OSI model.&lt;/p&gt;
&lt;p&gt;It was designed to overwhelm a single computer, web server, database, or API by opening and maintaining many simultaneous TCP connections to a target Fully Qualified Domain Name (FQDN) and generating a low rate and/or volumes of HTTP requests or HTTP connections per connected session.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FQDN is written with the hostname and the domain name, including the top-level domain, in that order: &lt;em&gt;[hostname].[domain].[tld]&lt;/em&gt;.&lt;br /&gt;
Eg: &lt;a href=&quot;http://www.microsoft.com/&quot;&gt;www.microsoft.com&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/&quot;&gt;en.wikipedia.org&lt;/a&gt;, etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This type of DDoS attack is a simple but elegant method that allows an attacker to take down a web server with very low complexity.&lt;/p&gt;
&lt;p&gt;Traditional application DDoS attacks are designed to take down a server by flooding it with an overwhelming number of HTTP requests. In contrast, a Slowloris attack only requires a few hundred requests at long, low, and regular intervals, rather than tens of thousands of HTTP requests on an ongoing basis.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fun fact: it’s named after the slow loris — a slow-moving, Asian primate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;slowloris-attack-occurs-in-4-steps&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#slowloris-attack-occurs-in-4-steps&quot;&gt;&lt;span&gt;Slowloris attack occurs in 4 steps&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Attacker opens multiple connections sending multiple partial HTTP request headers to the targeted server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The targeted server opens a thread for each incoming request with the intent of closing the thread once the connection is completed, or if a connection takes too long, the server will timeout the exceedingly long connection, freeing the thread up for the next request.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To prevent the target from timing out the connections, the attacker periodically sends partial request headers to the target in order to keep the request alive. In essence saying, &lt;em&gt;I’m still here! I’m just slow, please wait for me&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The targeted server is unable to release any of the open partial connections, eventually, the server will be unable to respond to additional requests made from regular traffic, resulting in DoS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;best-way-to-stop-a-slowloris-attack&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#best-way-to-stop-a-slowloris-attack&quot;&gt;&lt;span&gt;Best way to stop a Slowloris attack&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rate limit incoming requests&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Limiting the number of connections a single IP address may request to open.&lt;/li&gt;
&lt;li&gt;Increasing the minimum transfer speed allowed for any connection.&lt;/li&gt;
&lt;li&gt;Limiting the time a client is allowed to stay connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increase server availability&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Increasing the maximum number of clients making requests to the server will increase the number of connections the attacker must make before they can overload the server. Realistically, an attacker may scale the number of attacks to overcome server capacity regardless of increases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud-based protection&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Use a service that can function as a reverse proxy, protecting the origin server.&lt;/li&gt;
&lt;li&gt;Deploying robust cloud mitigation services, configuring robust load balancers, using web application firewalls (WAFs) or other virtual patching techniques, and rate-limiting the number of requests per source.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;mitigate-ddos-with-nginx&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#mitigate-ddos-with-nginx&quot;&gt;&lt;span&gt;Mitigate DDoS with NGINX&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;NGINX is designed to be a &lt;em&gt;shock absorber&lt;/em&gt; for your site/application. It has a non‑blocking, event‑driven architecture that copes with huge amounts of requests without a noticeable increase in resource utilization.&lt;/p&gt;
&lt;p&gt;Here are some code snippets to do so.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Limit the rate of requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
    # ...
    location /login.html {
        limit_req zone=one;
    # ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;Limiting the Number of connections&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    # ...
    location /store/ {
        limit_conn addr 10;
        # ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Closing Slow Connections&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;server {
    client_body_timeout 5s;
    client_header_timeout 5s;
    # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;strong&gt;Denylisting IP Addresses&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;location / {
    deny 123.123.123.0/28;
    # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or&lt;/p&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;location / {
    deny 123.123.123.3;
    deny 123.123.123.5;
    deny 123.123.123.7;
    # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;strong&gt;Allowlisting IP Addresses&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;location / {
    allow 192.168.1.0/24;
    deny all;
    # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;Blocking Requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;location /foo.php {
    deny all;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or if you discover that DDoS attack requests have a &lt;code&gt;User-Agent&lt;/code&gt; header value of &lt;code&gt;foo&lt;/code&gt; or &lt;code&gt;bar&lt;/code&gt;, you can block those requests.&lt;/p&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;location / {
    if ($http_user_agent ~* foo|bar) {
        return 403;
    }
    # ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;strong&gt;Limiting the Connections to Backend Servers&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-conf&quot;&gt;&lt;code class=&quot;language-conf&quot;&gt;upstream website {
    server 192.168.100.1:80 max_conns=200;
    server 192.168.100.2:80 max_conns=200;
    queue 10 timeout=30s;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There’re probably way more! But as an intermediate cyber enthusiasts, I only got my hand on a few of these.&lt;/p&gt;
&lt;p&gt;Thank you for reading this blog!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Also, check out &lt;a href=&quot;https://amplify.nginx.com/login&quot; target=&quot;_blank&quot;&gt;this free tool&lt;/a&gt; to monitor requests for your NGINX server!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/#references&quot;&gt;&lt;span&gt;References&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/&quot; target=&quot;_blank&quot;&gt;Cloudflare | What is a DDoS attack?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/learning/ddos/ddos-attack-tools/slowloris/&quot; target=&quot;_blank&quot;&gt;Cloudflare | Slowloris DDoS attack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.akamai.com/glossary/what-is-a-slowloris-ddos-attack&quot; target=&quot;_blank&quot;&gt;Akamai | What Is a Slowloris DDoS Attack?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/&quot; target=&quot;_blank&quot;&gt;NGINX | Mitigating DDoS Attacks with NGINX and NGINX Plus&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/slowloris-ddos-and-how-to-mitigate-with-nginx/</guid>
    </item>
    <item>
      <title>10 ways to prevent zero-day attacks</title>
      <link>https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/</link>
      <description>&lt;h3&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#10-ways-to-prevent-zero-day-attack-prevention-tips&quot;&gt;What is a zero-day?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#10-ways-to-prevent-zero-day-attack-prevention-tips&quot;&gt;10 ways to prevent zero-day attack prevention tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#tldr&quot;&gt;TLDR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#references&quot;&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;what-is-a-zero-day%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#what-is-a-zero-day%3F&quot;&gt;&lt;span&gt;What is a zero-day?&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A zero day (or 0-day) vulnerability is a security risk in a piece of software that is not publicly known about and the vendor is not aware of. These are severe security threats with high success rates as businesses do not have defenses in place to detect or prevent them. The attacker releases malware before the developer or vendor has had the opportunity to create a patch to fix the vulnerability.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The term “zero day” comes from the world of pirated digital media, since the pirated version is published zero days after the official version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;10-ways-to-prevent-zero-day-attack-prevention-tips&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#10-ways-to-prevent-zero-day-attack-prevention-tips&quot;&gt;&lt;span&gt;10 ways to prevent zero-day attack prevention tips&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vulnerability scanning:&lt;/strong&gt; Can detect zero-day exploits, but scanning alone isn’t enough. Organizations need to act on the results of a scan, perform code review and sanitize code accordingly. The entire process is time-consuming providing windows of opportunity to hackers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Patch management:&lt;/strong&gt; Critical, but can be time-consuming. Enterprises with a large number of endpoints should consider streamlining patch management through automation - from identifying missing patches, to testing patches, deploying them, updates and producing reports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Firewall:&lt;/strong&gt; A firewall reviews all incoming and outgoing network traffic based on predetermined security rules, filtering out malicious inputs that might target security vulnerabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced threat intelligence:&lt;/strong&gt; Invest in advanced threat intelligence services in order to get real-time info about emerging vulnerabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;XDR/XPR:&lt;/strong&gt; Extended Detection and Response (XDR) and Extended Prevention and Response (XPR) technology integrates data from a variety of sources to offer a comprehensive overview of an organization’s cyber security posture. This helps security teams detect and respond to threats more quickly and effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloud-specific measures:&lt;/strong&gt; Extend your zero-day prevention efforts to cloud environments. Implement cloud-specific cyber security measures, such as Security Information and Event Management (SIEM), data encryption, configuration management best practices, cloud-native security tools and zero-trust for cloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consolidation:&lt;/strong&gt; A unified security platform is essential in preventing zero-day attacks. A single solution that offers visibility and control across an organization’s entire IT ecosystem has the context and insight required to identify a distributed cyber attack.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incident response plan:&lt;/strong&gt; Every org needs this. Include a mission statement, formal documentation around roles and responsibilities during a possible attack, a recap of primary cyber threat vectors likely to affect a given organization, policies around making payments to cyber attackers, incident classification guidelines and under what circumstances an incident must be reported to law enforcement (and how quickly).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data backups:&lt;/strong&gt; Follow the &lt;strong&gt;3-2-1 rule&lt;/strong&gt;. Reliable backups provide peace-of-mind.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The 3-2-1 Rule: 3 copies of data on 2 different media with 1 copy being off-site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;&lt;strong&gt;Third-party risk management:&lt;/strong&gt; Ensure 3rd-party partners are enforcing standards that protect your business, and standardize your 3rd-party risk management (instead of using spreadsheets and consequently chasing business partners via email in the event of a major security threat).&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;tldr&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#tldr&quot;&gt;&lt;span&gt;TLDR&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Vulnerability scanning&lt;/li&gt;
&lt;li&gt;Patch management&lt;/li&gt;
&lt;li&gt;Firewall&lt;/li&gt;
&lt;li&gt;Advanced threat intelligence&lt;/li&gt;
&lt;li&gt;XDR/XPR&lt;/li&gt;
&lt;li&gt;Cloud-specific measures&lt;/li&gt;
&lt;li&gt;Consolidation&lt;/li&gt;
&lt;li&gt;Incident response plan&lt;/li&gt;
&lt;li&gt;Data backups&lt;/li&gt;
&lt;li&gt;Third-party risk management&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/#references&quot;&gt;&lt;span&gt;References&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.fortinet.com/resources/cyberglossary/zero-day-attack&quot; target=&quot;_blank&quot;&gt;Fortinet | What Is a Zero Day Attack?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cybertalk.org/2023/10/09/10-top-zero-day-attack-prevention-tips&quot; target=&quot;_blank&quot;&gt;CyberTalk.org | 10 top zero-day attack prevention tips&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/10-ways-to-prevent-zero-day-attacks/</guid>
    </item>
    <item>
      <title>Taking driver license test for international students in the US</title>
      <link>https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/</link>
      <description>&lt;h1 id=&quot;intro&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/#intro&quot;&gt;&lt;span&gt;Intro&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In the US, you need to pass 2 rounds to get the official permit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Computer test - tests you about rules, car signals, traffic signs, etc.&lt;/li&gt;
&lt;li&gt;Road test - a examiner will sit next to you and see how you drive, then evaluate.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;what-you-need-to-bring&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/#what-you-need-to-bring&quot;&gt;&lt;span&gt;What you need to bring&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Always bring a physical copy! Make sure to print the latest document!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To take a driver’s license (&lt;em&gt;both computer test and road test&lt;/em&gt;) in the US, &lt;strong&gt;YOU&lt;/strong&gt; will need your:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I-20&lt;/li&gt;
&lt;li&gt;I-94&lt;/li&gt;
&lt;li&gt;Letter of Good Standing — request this from your school’s Office of Internation Affairs/DSO; &lt;strong&gt;expires after 30 days&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;SSN &lt;em&gt;or&lt;/em&gt; Letter of authorization to bypass SSN&lt;/li&gt;
&lt;li&gt;Passport&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For taking the &lt;strong&gt;road test&lt;/strong&gt;, the &lt;strong&gt;CAR’S OWNER&lt;/strong&gt; has to provide his/her:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Driver license&lt;/li&gt;
&lt;li&gt;Insurance ID Card&lt;/li&gt;
&lt;li&gt;Car tag info&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;schedule-a-driver-license-test-in-alabama&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/#schedule-a-driver-license-test-in-alabama&quot;&gt;&lt;span&gt;Schedule a driver license test in Alabama&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Since I study at the University of North Alabama, here are the links I use the most at my closest DMV:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alabamadl.alea.gov/&quot; target=&quot;_blank&quot;&gt;Online Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dlschedule.alea.gov/qmaticwebbooking/&quot; target=&quot;_blank&quot;&gt;Schedule an appointment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;renew-your-driver-license&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/#renew-your-driver-license&quot;&gt;&lt;span&gt;Renew your driver license&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To renew, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I-20&lt;/li&gt;
&lt;li&gt;I-94&lt;/li&gt;
&lt;li&gt;Letter of Good Standing — request this from your school’s Office of Internation Affairs/DSO; &lt;strong&gt;expires after 30 days&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;SSN &lt;em&gt;or&lt;/em&gt; Letter of authorization to bypass SSN&lt;/li&gt;
&lt;li&gt;Passport&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure the program end date on your latest I-20 is &lt;strong&gt;at least 150 days away&lt;/strong&gt; (&lt;em&gt;may differ between states&lt;/em&gt;) from the day you try to renew your driver license. Or, you have to wait for your EAD card to arrive to renew, but not before.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s good practice to renew your driver license six months ahead of the expiration date.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In short, &lt;strong&gt;don’t apply for OPT unless you’ve renewed your driver license&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s illegal to drive with an expired driver license, and fines can be costly.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/taking-driver-license-test-for-international-students-in-the-us/</guid>
    </item>
    <item>
      <title>Unlocking Enterprise Sales: The Power of Permissionless Pilots</title>
      <link>https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/</link>
      <description>&lt;h3&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#intro&quot;&gt;Intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#the-catch-22&quot;&gt;The catch-22&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#how-to-create-a-permissionless-pilot&quot;&gt;How to create a permissionless pilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;intro&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#intro&quot;&gt;&lt;span&gt;Intro&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I recently learned about &lt;a href=&quot;https://matrix.vc/viewpoints/permissionless-pilots&quot; target=&quot;_blank&quot;&gt;Permissionless Pilots&lt;/a&gt; - a new pattern that’s enabling startups to close big contracts, &lt;em&gt;fast&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As we know, enterprise sales cycle is slow, and the faster your product can deliver that &lt;em&gt;wow&lt;/em&gt; feeling to customers, the better. However, too many products take forever to deliver that moment, due to a long slog of sales calls, procurement, contract negotiation, and technical integration.&lt;/p&gt;
&lt;h1 id=&quot;the-catch-22&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#the-catch-22&quot;&gt;&lt;span&gt;The catch-22&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ll give you my data once I know it works on my data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Enterprise software products generally require customer’s data to work. To get around this, demos use fake dummy data to simulate a theoretical user experience. It’s like watching someone else drive a car at the dealership. It’s a lot more exciting to test drive it yourself!&lt;/p&gt;
&lt;p&gt;But most prospects don’t give away their employer’s data until they’re convinced it’ll be worth their while. Getting the green light to share company data with a 3rd party involves jumping through hoops.&lt;/p&gt;
&lt;h1 id=&quot;how-to-create-a-permissionless-pilot&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#how-to-create-a-permissionless-pilot&quot;&gt;&lt;span&gt;How to create a permissionless pilot&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The 3 basic steps to a permissionless pilot are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get the public data. Eg: open-source repos, rental listings, YouTube videos, job postings, etc.&lt;/li&gt;
&lt;li&gt;Build a tool for it.&lt;/li&gt;
&lt;li&gt;Drive demand to that tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To help with idea generation, start by writing down all the public data sources relevant to your product. Next, ask yourself: &lt;em&gt;What could my product do assuming it never got any proprietary customer data, but could ingest all those public data sources?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In terms of your answer, you’re aiming for a demo that does &lt;em&gt;something cool&lt;/em&gt;. &lt;em&gt;Cool&lt;/em&gt; is the adjective that tends to come to mind for builders when they picture it. It doesn’t have to be perfect. It doesn’t have to be something customers would pay for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something cool is a good start.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/#conclusion&quot;&gt;&lt;span&gt;Conclusion&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Not every company is a candidate for permissionless pilots, but the steady proliferation of public data in the last 10 years means there are certainly untapped opportunities for more wow moment demos. Recent advances in ML techniques like computer vision, and natural language processing with LLMs allow us to structure vast amounts of unstructured data, creating additional permissionless pilot opportunities.&lt;/p&gt;
&lt;p&gt;Apply permissionless pilots to your advantage!&lt;/p&gt;
</description>
      <pubDate>Tue, 10 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/unlocking-enterprise-sales-the-power-of-permissionless-pilots/</guid>
    </item>
    <item>
      <title>What is a DNS SOA (Start of Authority)</title>
      <link>https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/</link>
      <description>&lt;h3&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#intro&quot;&gt;Intro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#what-is-an-soa&quot;&gt;What is an SOA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#what-makes-an-soa&quot;&gt;What makes an SOA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#resources&quot;&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;intro&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#intro&quot;&gt;&lt;span&gt;Intro&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I was trying to set up 4 VMs to configure a DNS as a class assignment, and &lt;em&gt;boy, are they confusing&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;There are so many things I’ve taken for granted like how easy it is to buy a domain, then you just have to configure the A and CNAME record all on the domain registrar’s dashboard.&lt;/p&gt;
&lt;p&gt;As a result, I spent more time to learn a few things about DNS, and that’s how &lt;a href=&quot;https://www.cloudflare.com/learning/dns/dns-records/dns-soa-record/&quot; target=&quot;_blank&quot;&gt;SOA (Start of Authority)&lt;/a&gt; became the subject of this blog post. Here is a brief intro to SOA!&lt;/p&gt;
&lt;h1 id=&quot;what-is-an-soa&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#what-is-an-soa&quot;&gt;&lt;span&gt;What is an SOA&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The DNS SOA record stores important information about a domain or zone such as the email address of the administrator, when the domain was last updated, how long the server should wait between refreshes, etc.&lt;/p&gt;
&lt;p&gt;All DNS zones need an SOA record in order to conform to &lt;a href=&quot;https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force&quot; target=&quot;_blank&quot;&gt;IETF&lt;/a&gt; standards. SOA records are also important for zone transfers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In DNS, zone is an area of control over namespace. A zone can include a single domain name, one domain and many subdomains, or many domain names. In some cases, zone is essentially equivalent with domain, but this is not always true.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;what-makes-an-soa&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#what-makes-an-soa&quot;&gt;&lt;span&gt;What makes an SOA&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Given this SOA record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;&lt;span&gt;example.com&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;record type&lt;/td&gt;
&lt;td&gt;SOA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MNAME&lt;/td&gt;
&lt;td&gt;&lt;span&gt;ns.primaryserver.com&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNAME&lt;/td&gt;
&lt;td&gt;&lt;span&gt;admin.example.com&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SERIAL&lt;/td&gt;
&lt;td&gt;1111111111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REFRESH&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETRY&lt;/td&gt;
&lt;td&gt;7200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXPIRE&lt;/td&gt;
&lt;td&gt;4000000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTL&lt;/td&gt;
&lt;td&gt;11200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Serial number:&lt;/strong&gt; is a version number for the SOA record. In the example above, the serial number is listed next to &lt;em&gt;SERIAL&lt;/em&gt;. When the serial number changes in a zone file, this alerts secondary nameservers that they should update their copies of the zone file via a zone transfer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MNAME:&lt;/strong&gt; is the name of the primary nameserver for the zone. Secondary servers that maintain duplicates of the zone’s DNS records receive updates to the zone from this primary server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REFRESH:&lt;/strong&gt; The length of time (in seconds) secondary servers should
wait before asking primary servers for the SOA record to see if it has
been updated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RETRY:&lt;/strong&gt; The length of time a server should wait for asking an unresponsive primary nameserver for an update again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EXPIRE:&lt;/strong&gt; If a secondary server does not get a response from the
primary server for this amount of time, it should stop responding to
queries for the zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is what SOA looks like on a Debian VM (that’s what I used for the assignment):&lt;/p&gt;
&lt;pre class=&quot;language-db&quot;&gt;&lt;code class=&quot;language-db&quot;&gt;$TTL    604800
@       IN      SOA     ns1.computingforgeeks.local. root.ns1.computingforgeeks.local. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
;@      IN      NS      localhost.
;@      IN      A       127.0.0.1
;@      IN      AAAA    ::1

;Name Server Information

@        IN      NS      ns1.computingforgeeks.local.

;IP address of Name Server

ns1     IN      A       192.168.1.12

;Mail Exchanger

computingforgeeks.local.   IN     MX   10   mail.computingforgeeks.local.

;A – Record HostName To Ip Address

www     IN       A      192.168.1.13
mail    IN       A      192.168.1.14

;CNAME record

ftp     IN      CNAME   www.computingforgeeks.local.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hope you learn something today!&lt;/p&gt;
&lt;h1 id=&quot;resources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/#resources&quot;&gt;&lt;span&gt;Resources&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://computingforgeeks.com/configure-master-bind-dns-server-on-debian/&quot; target=&quot;_blank&quot;&gt;ComputingforGeeks - Configure BIND Master DNS Server on Debian 11/10&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/what-is-a-dns-start-of-authority/</guid>
    </item>
    <item>
      <title>Limitations of lean startup</title>
      <link>https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/</link>
      <description>&lt;p&gt;I recently read an interesting &lt;a href=&quot;https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3427084&quot; target=&quot;_blank&quot;&gt;paper&lt;/a&gt; on lean startup. The paper points out 3 challenges of lean startup.&lt;/p&gt;
&lt;h1 id=&quot;challenge-1%3A-applying-lean-manufacturing-to-startups&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/#challenge-1%3A-applying-lean-manufacturing-to-startups&quot;&gt;&lt;span&gt;Challenge 1: Applying lean manufacturing to startups&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Lean&lt;/em&gt; got its origin from manufacturing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Toyota’s lean production system:&lt;/strong&gt; the approach seeks to address a series of operational issues, such as inventory management (just-in-time), waste reduction, the optimization of supply chains and &lt;em&gt;continuous improvement&lt;/em&gt; in manufacturing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The lean startup movement explicitly builds on these lean manufacturing principles. However, the central challenge is that lean production techniques were explicitly developed for continuous and incremental improvement of &lt;strong&gt;existing&lt;/strong&gt; processes and products.&lt;/p&gt;
&lt;h1 id=&quot;challenge-2%3A-experimentation-and-customer-validation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/#challenge-2%3A-experimentation-and-customer-validation&quot;&gt;&lt;span&gt;Challenge 2: Experimentation and customer validation&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Lean startups should quickly develop an MVP (minimum viable product) and get rapid customer feedback/input. Business plans are discouraged because &lt;em&gt;business plans fail on contact with customers&lt;/em&gt;. Instead, founders and managers are told to interact with potential customers as soon as possible to iterate.&lt;/p&gt;
&lt;p&gt;It’s hard to disagree with the importance of focusing on customers. But the question is, precisely &lt;em&gt;when (and for what types of products) does engaging with customers make sense&lt;/em&gt;? This is the reason Apple has historically shied away from the type of customer interaction suggested by lean startup. The problem is customer imagination is delimited by what is presently there.&lt;/p&gt;
&lt;p&gt;Steve Jobs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It isn’t the consumers’ job to know what they want.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Henry Ford:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I’d asked customers what they wanted, they would have told me, a faster horse!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Startup founders need to, in some sense, &lt;strong&gt;look beyond the present&lt;/strong&gt; and into some unknown future - &lt;strong&gt;beyond existing products&lt;/strong&gt; and realities.&lt;/p&gt;
&lt;h1 id=&quot;challenge-3%3A-canvas%2C-business-models-and-experimentation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/#challenge-3%3A-canvas%2C-business-models-and-experimentation&quot;&gt;&lt;span&gt;Challenge 3: Canvas, business models and experimentation&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Lean startup features a popular tool - the business model canvas.&lt;/p&gt;
&lt;p&gt;The canvas features 9 distinct boxes (key partners, key activities, key resources, value propositions, customer relationships, channels, customer segments, cost structure, and revenue streams) to fill in. The hope is that by addressing the 9 elements of the canvas that valuable hypotheses will emerge.&lt;/p&gt;
&lt;p&gt;However, in the authors’ perspective, the initial step is not to broadly canvas the environment in search of a full-fledged business model, but rather to develop a unique and potentially valuable hypothesis, built around an entrepreneur’s unique beliefs and coherent theory of value. This theoretical hypothesis development must be more than a mere guess. As in science, hypotheses originate and derive from sound theoretical logic, which at its best provides guidance for what to look for in the first place.&lt;/p&gt;
&lt;p&gt;In short, the entrepreneurial exercise should begin by &lt;strong&gt;deciding what to look for not cataloging what you see&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&quot;startup-strategy%3A-theory-and-commitment&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/#startup-strategy%3A-theory-and-commitment&quot;&gt;&lt;span&gt;Startup strategy: Theory and commitment&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Lean startup prompts &lt;strong&gt;low-cost&lt;/strong&gt; ideas: beta products can be rapidly developed; customers and investors can already easily understand and agree/disagree with what a startup is doing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Well-composed&lt;/strong&gt; theory enables experiments that permit unique and clearer conclusions about a startup theory’s merits leading to faster and more productive pivots.&lt;/p&gt;
&lt;p&gt;Entrepreneurs who were taught to carefully frame their problems, formulate falsifiable hypotheses, and compose rigorous experiments (&lt;em&gt;before taking up lean startup&lt;/em&gt;) are more likely to avoid pursuing bad ideas longer than they should, and unpromising ideas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Customers of course are the ultimate test. But listening to them prematurely - before a compelling theory of value is formed and testable hypotheses derived - may lead startups astray, or toward incremental value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The authors suggest that instead of quickly focusing on low-cost MVPs and customer feedback, startup founders may find &lt;strong&gt;social proof&lt;/strong&gt; a particularly important signal of value. Eg: funding sources, who join your startup, etc. However, they also note that public markets are poor at assessing truly novel strategies, and therefore alternative forms of validation and funding are needed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The mechanism of self-selection (into and out of organizations) then is a powerful tool for not only assessing the prospects of organizations in decline, but also the viability and potential of nascent organizations and startups.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The most valuable entrepreneurial ideas are those that are unlikely to permit an easy, immediately recognizable experiment. They require some kind of contrarian belief, vision about and commitment toward a counterfactual world that may not easily be recognizable by other market actors.&lt;/p&gt;
&lt;h1 id=&quot;my-conclusion&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/#my-conclusion&quot;&gt;&lt;span&gt;My conclusion&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;If there is anything to take out from this paper, it is acknowledging lean has its limitations, as anything else. However, there are a few good points to notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lean increases the value of existing products incrementally.&lt;/li&gt;
&lt;li&gt;Startup founders need to look beyond existing products and realities.&lt;/li&gt;
&lt;li&gt;Entrepreneurial exercise should begin by deciding what to look for not cataloging what you see.&lt;/li&gt;
&lt;li&gt;The most valuable entrepreneurial ideas are those that are unlikely to permit an easy, immediately recognizable experiment. They require some kind of contrarian belief that may not easily be recognizable by other market actors.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/limitations-of-lean-startup/</guid>
    </item>
    <item>
      <title>Presenting at Huntsville National Cyber Summit</title>
      <link>https://blog.imkhoi.com/posts/2023/10/presenting-at-national-cyber-summit/</link>
      <description>&lt;p&gt;I am proud to have presented at Huntsville’s &lt;a href=&quot;https://www.nationalcybersummit.com/&quot; target=&quot;_blank&quot;&gt;National Cyber Summit&lt;/a&gt; for the cybersecurity startup that I had interned with called &lt;a href=&quot;https://github.com/ossillate-inc&quot; target=&quot;_blank&quot;&gt;Ossillate Inc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We build a tool called &lt;a href=&quot;https://packj.dev/&quot; target=&quot;_blank&quot;&gt;Packj&lt;/a&gt; with a goal to stop Solarwinds, ESLint, and PyTorch-like attacks by flagging malicious/vulnerable open-source dependencies (“weak links”) in your software supply-chain.&lt;/p&gt;
&lt;p&gt;For me, I was fortunate to have this opportunity if not for my boss, &lt;a href=&quot;https://www.linkedin.com/in/ashishbijlani/&quot; target=&quot;_blank&quot;&gt;Ashish Bijlani&lt;/a&gt;. While interning at Ossillate, I told him to sign up for NCS, which I thought could help the company to reach out to more customers. But not long after (maybe a few months) I finished my internship, Ashish reached out to me again to present at NCS for him, since it was a long trip for him to come to Huntsville and travel compensation was not provided.&lt;/p&gt;
&lt;p&gt;So there you go, here are some photos of me presenting at the conference!&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/ncs/2.webp&quot; alt=&quot;Khoi presenting at Huntsville National Cyber Summit&quot; /&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/ncs/3.webp&quot; alt=&quot;Khoi presenting at Huntsville National Cyber Summit&quot; /&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/ncs/4.webp&quot; alt=&quot;Khoi presenting at Huntsville National Cyber Summit&quot; /&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/ncs/5.webp&quot; alt=&quot;Khoi presenting at Huntsville National Cyber Summit&quot; /&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/ncs/6.webp&quot; alt=&quot;Khoi presenting at Huntsville National Cyber Summit&quot; /&gt;
</description>
      <pubDate>Fri, 06 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/presenting-at-national-cyber-summit/</guid>
    </item>
    <item>
      <title>What are packet sniffers &amp; how to use Snort</title>
      <link>https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/</link>
      <description>&lt;h3&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#packet-sniffers&quot;&gt;Packet sniffers&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-they-work&quot;&gt;How they work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#ways-to-intercept-traffic&quot;&gt;Ways to intercept traffic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#tools-to-perform-packet-capture&quot;&gt;Tools To Perform Packet Capture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#snort&quot;&gt;Snort&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#what-it-is&quot;&gt;What it is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-it-works&quot;&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-to-use&quot;&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;packet-sniffers&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#packet-sniffers&quot;&gt;&lt;span&gt;Packet sniffers&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;how-they-work&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-they-work&quot;&gt;&lt;span&gt;How they work&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Packet sniffers work by &lt;strong&gt;intercepting&lt;/strong&gt; and &lt;strong&gt;logging network traffic&lt;/strong&gt; via the wired or wireless network interface on its host computer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the &lt;strong&gt;raw&lt;/strong&gt; packet data is captured, the packet sniffing software analyzes it and &lt;strong&gt;presents it in a readable form&lt;/strong&gt; so that the person using the software can make sense of it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ways-to-intercept-traffic&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#ways-to-intercept-traffic&quot;&gt;&lt;span&gt;Ways to intercept traffic&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Port Mirroring:&lt;/strong&gt; Used on a network switch to send a copy of network packets seen on one switch port to a network monitoring connection on another switch port.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network Tap:&lt;/strong&gt; A device that allows you to monitor and access data that is transmitted over a network.&lt;/p&gt;
&lt;h2 id=&quot;tools-to-perform-packet-capture&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#tools-to-perform-packet-capture&quot;&gt;&lt;span&gt;&lt;strong&gt;Tools To Perform Packet Capture&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Wireshark&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tcpdump&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Snort:&lt;/strong&gt; a &lt;strong&gt;packet sniffer&lt;/strong&gt; that monitors network traffic, scrutinizing each packet closely to detect a dangerous payload or suspicious anomalies.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;snort&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#snort&quot;&gt;&lt;span&gt;Snort&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;what-it-is&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#what-it-is&quot;&gt;&lt;span&gt;What it is&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.snort.org/&quot;&gt;Snort&lt;/a&gt; is the foremost Open Source Intrusion Prevention System (IPS) in the world.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Snort IPS uses a series of rules that help define malicious network activity and uses those rules to find packets that match against them and generates alerts for users.&lt;/p&gt;
&lt;p&gt;Snort has 3 primary uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As a &lt;strong&gt;packet sniffer&lt;/strong&gt; like tcpdump.&lt;/li&gt;
&lt;li&gt;As a &lt;strong&gt;packet logger&lt;/strong&gt; - which is useful for network traffic debugging.&lt;/li&gt;
&lt;li&gt;As a &lt;em&gt;full-blown&lt;/em&gt; &lt;strong&gt;network intrusion prevention system&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-it-works&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-it-works&quot;&gt;&lt;span&gt;How it works&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Snort works by taking in a text file - where you define all the rules - as an input, then Snort will act based on these rules.&lt;/p&gt;
&lt;p&gt;The below picture shows you what makes a Snort rule:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cyvatar.ai/wp-content/uploads/2022/01/Post15Graphic_6.1.22_-1536x768.png&quot; alt=&quot;Components of a Snort rule&quot; /&gt;
&lt;em&gt;&lt;sub&gt;Source: &lt;a href=&quot;https://cyvatar.ai/write-configure-snort-rules/&quot;&gt;https://cyvatar.ai/write-configure-snort-rules/&lt;/a&gt;&lt;/sub&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-use&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/#how-to-use&quot;&gt;&lt;span&gt;How to use&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To use Snort, first I write my rule in &lt;code&gt;local.rules&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;alert icmp any any -&gt; any any ( msg:&quot;ICMP Traffic Detected&quot;; sid:10000001; metadata:policy security-ips alert;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This rule alerts me any &lt;code&gt;icmp&lt;/code&gt; traffic on the network. Make sure to change Snort config file &lt;code&gt;snort.lua&lt;/code&gt; to include the &lt;code&gt;local.rules&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;ips =
{
  enable_builtin_rules = true,
  include = RULE_PATH .. &quot;/local.rules&quot;,
  variables = default_variables
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then run:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; snort &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; eth0 &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; alert_fast &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;65535&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-k&lt;/span&gt; none&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt;: This command is run with superuser privileges, as Snort typically requires administrative access to capture and analyze network traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;snort&lt;/code&gt;: This is the actual Snort command-line tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-c /usr/local/etc/snort/snort.lua&lt;/code&gt;: This option specifies the configuration file for Snort. In this case, it points to the configuration file located at &lt;code&gt;/usr/local/etc/snort/snort.lua&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-i eth0&lt;/code&gt;: This option specifies the network interface to monitor. In this case, it’s set to &lt;code&gt;eth0&lt;/code&gt;, which is a common network interface name in Linux systems. Snort will listen on this network interface to capture network traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-A alert_fast&lt;/code&gt;: This option specifies the alerting mode to use. The &lt;code&gt;alert_fast&lt;/code&gt; mode is a more efficient alerting mode that quickly alerts on suspicious traffic without extensive packet logging.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-s 65535&lt;/code&gt;: This option sets the &lt;em&gt;snaplen&lt;/em&gt; (snap length) for packet capture. It determines the maximum number of bytes to capture from each packet. A snaplen of 65535 means that Snort will capture the entire packet, up to the maximum allowed by the Ethernet frame size.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-k none&lt;/code&gt;: This option specifies how to handle sticky buffers. In this case, it’s set to &lt;code&gt;none&lt;/code&gt;, meaning that sticky buffers are not used.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;That’s it! Hope you enjoy this brief intro to Snort!&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/what-are-packet-sniffers-and-how-to-use-snort/</guid>
    </item>
    <item>
      <title>Windows logs vs Linux logs &amp; how they help with Vulnerability Scanning</title>
      <link>https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/</link>
      <description>&lt;h1 id=&quot;windows-vs-linux&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#windows-vs-linux&quot;&gt;&lt;span&gt;Windows vs Linux&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here’s a pretty simple to table showing the differences:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Windows&lt;/th&gt;
&lt;th&gt;Linux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;Free and open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graphical&lt;/td&gt;
&lt;td&gt;Can be terminal only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&quot;windows-event-log&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#windows-event-log&quot;&gt;&lt;span&gt;Windows Event Log&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Is an in-depth record of events related to the system, security, and application stored on a Windows operating system.&lt;/p&gt;
&lt;p&gt;Event logs can be used to track system and some application issues and forecast future problems.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Event logs ensure our server stay available. Ensure our files remain untampered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;main-elements-of-windows-event-log&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#main-elements-of-windows-event-log&quot;&gt;&lt;span&gt;Main elements of Windows Event Log&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Log Name:&lt;/strong&gt; Name of the event log to which events from different logging components will be written. Events are commonly logged for system, security, and applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Event Date/Time:&lt;/strong&gt; Includes the date and time when the event occurred.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Task Category:&lt;/strong&gt; Identifies the type of recorded event log. Application developers can also define task categories to serve as extra information about the event.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Event ID:&lt;/strong&gt; This Windows identification number helps network administrators uniquely identify a specific logged event.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; Name of the program or software causing the event log.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Level:&lt;/strong&gt; Event level represents the severity of the recorded event log. These include &lt;em&gt;information, error, verbose, warning, and critical&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt; Name of the user who logged onto the Windows computer when the event occurred.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Computer:&lt;/strong&gt; Name of the computer logging the event.&lt;/p&gt;
&lt;h2 id=&quot;types-of-windows-logs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#types-of-windows-logs&quot;&gt;&lt;span&gt;Types of Windows Logs&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Application:&lt;/strong&gt; events related to a software/application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; related to safety of system. Eg: failed logins, file deletions, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt; occur during installation of Windows OS. On domain controllers, this log record events related to Active Directory.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Domain controller — a server that responds to security authentication requests within a network domain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Active Directory — think of it as team grouping.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;System:&lt;/strong&gt; related to system &amp;amp; its components. Eg: failure to load boot-start driver.&lt;/p&gt;
&lt;h1 id=&quot;linux-event-logs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#linux-event-logs&quot;&gt;&lt;span&gt;Linux Event Logs&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Kernel is the brain of the computer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To view logs in Linux, here’re quite a few locations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/var/log/syslog&lt;/strong&gt; or &lt;strong&gt;/var/log/messages&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;RedHat-based systems store info in the &lt;strong&gt;&lt;em&gt;messages&lt;/em&gt;&lt;/strong&gt; folder while Debian-based store in &lt;strong&gt;&lt;em&gt;syslog&lt;/em&gt;&lt;/strong&gt; folder.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/var/log/auth.log&lt;/strong&gt; or &lt;strong&gt;/var/log/secure —&lt;/strong&gt; authentication &amp;amp; authorization logs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/var/log/kern.log —&lt;/strong&gt; kernel activity logs, including custom kernels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/var/log/faillog —&lt;/strong&gt; failed login attempts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/var/log/maillog&lt;/strong&gt; or &lt;strong&gt;/var/log/mail.log&lt;/strong&gt; — track issues like spam emails, suspicious use of postfix or smtpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;vulnerability-scanning&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#vulnerability-scanning&quot;&gt;&lt;span&gt;Vulnerability Scanning&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Enables organizations to &lt;strong&gt;monitor&lt;/strong&gt; their networks, systems, and applications for &lt;strong&gt;security vulnerabilities&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Vulnerabilities can include (but aren’t limited to):
&lt;ul&gt;
&lt;li&gt;Open ports&lt;/li&gt;
&lt;li&gt;Unpatched machines&lt;/li&gt;
&lt;li&gt;Out of date software&lt;/li&gt;
&lt;li&gt;SSL certificate anomalies&lt;/li&gt;
&lt;li&gt;Malware on a device&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember to close unused ports for security!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;vulnerability-scanning-%26-cves&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#vulnerability-scanning-%26-cves&quot;&gt;&lt;span&gt;Vulnerability Scanning &amp;amp; CVEs&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Vulnerability scan may include &lt;strong&gt;CVE numbers&lt;/strong&gt; in your results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE&lt;/strong&gt;: &lt;strong&gt;C&lt;/strong&gt;ommon &lt;strong&gt;V&lt;/strong&gt;ulnerabilities and &lt;strong&gt;E&lt;/strong&gt;xposures — refers to publicly known system vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;in-the-world-of-vulnerability-scanning%2C-there-are-2-main-types-of-system.&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#in-the-world-of-vulnerability-scanning%2C-there-are-2-main-types-of-system.&quot;&gt;&lt;span&gt;In the world of vulnerability scanning, there are 2 main types of system.&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;host-based-intrusion-detection-system-(hids)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#host-based-intrusion-detection-system-(hids)&quot;&gt;&lt;span&gt;Host-based Intrusion Detection System (HIDS)&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;This system is completely passive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analyzes traffic&lt;/strong&gt; that passes through the network. If it sees something that is &lt;strong&gt;abnormal&lt;/strong&gt; it’s going to &lt;strong&gt;send an alert&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;host-based-intrusion-prevention-system-(hips)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/#host-based-intrusion-prevention-system-(hips)&quot;&gt;&lt;span&gt;Host-based Intrusion Prevention System (HIPS)&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;This system is active.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Monitors a single host&lt;/strong&gt; for &lt;strong&gt;suspicious activity&lt;/strong&gt; by &lt;strong&gt;analyzing events&lt;/strong&gt; occurring within that host.&lt;/p&gt;
&lt;p&gt;HIPS aims to &lt;strong&gt;stop malware&lt;/strong&gt; by monitoring the behavior of code.&lt;/p&gt;
</description>
      <pubDate>Mon, 02 Oct 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/10/windows-logs-vs-linux-logs-and-how-they-help-with-vulnerability-scanning/</guid>
    </item>
    <item>
      <title>How to format a USB drive in Linux?</title>
      <link>https://blog.imkhoi.com/posts/2023/09/format-usb-on-linux/</link>
      <description>&lt;p&gt;No BS. Just the terminal and straightforward steps to format a USB drive in Linux:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Locate the USB drive.&lt;/li&gt;
&lt;li&gt;Unmount and format the USB drive.&lt;/li&gt;
&lt;li&gt;Verify the process was successful.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;1.-locate-the-usb-drive&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/format-usb-on-linux/#1.-locate-the-usb-drive&quot;&gt;&lt;span&gt;1. Locate the USB drive&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Use this command to locate your USB drive. In my case (when I plugged in my USB on my PopOS desktop), it is &lt;code&gt;/dev/sda&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;df&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man page:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;df - report file system disk space usage&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;2.-unmount-and-format&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/format-usb-on-linux/#2.-unmount-and-format&quot;&gt;&lt;span&gt;2. Unmount and format&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We will use &lt;strong&gt;FAT32&lt;/strong&gt; filesystem, because it is ideal since it offers maximum compatibility on Windows, Mac, and Linux. To build FAT32 filesystem on your USB drive, run:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; mkfs.vfat /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure to use your location. I used &lt;code&gt;/dev/sda&lt;/code&gt; because it is my location.&lt;/p&gt;
&lt;p&gt;Man page:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;mkfs - build a Linux filesystem&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;mkfs.fat - create an MS-DOS FAT filesystem&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;3.-verify-the-process&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/format-usb-on-linux/#3.-verify-the-process&quot;&gt;&lt;span&gt;3. Verify the process&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fsck&lt;/span&gt; /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man page:&lt;/p&gt;
&lt;pre class=&quot;language-txt&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;fsck - check and repair a Linux filesystem&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A USB drive with no files indicates successful formatting. Something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/sda: 0 files, ......
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;DONE!&lt;/strong&gt;&lt;/p&gt;
</description>
      <pubDate>Fri, 29 Sep 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/09/format-usb-on-linux/</guid>
    </item>
    <item>
      <title>What is a network layer?</title>
      <link>https://blog.imkhoi.com/posts/2023/09/network-layer/</link>
      <description>&lt;p&gt;I am getting into Cybersecurity and trying to learn a few things about the fundamentals.&lt;/p&gt;
&lt;h1 id=&quot;what-is-a-network%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/network-layer/#what-is-a-network%3F&quot;&gt;&lt;span&gt;What is a network?&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A network is a group of two or more connected computing devices.&lt;/p&gt;
&lt;p&gt;Usually all devices in the network are connected to a central hub — for instance, a &lt;a href=&quot;https://www.cloudflare.com/learning/network-layer/what-is-a-router/&quot;&gt;router&lt;/a&gt;. A network can also include &lt;a href=&quot;https://www.cloudflare.com/learning/network-layer/what-is-a-subnet/&quot;&gt;subnetworks&lt;/a&gt;, or smaller subdivisions of the network.&lt;/p&gt;
&lt;p&gt;Subnetworking is how very large networks, such as those provided by ISPs, are able to manage thousands of IP addresses and connected devices.&lt;/p&gt;
&lt;p&gt;Think of the &lt;strong&gt;Internet as a network of networks&lt;/strong&gt;: computers are connected to each other within networks, and these networks connect to other networks. This enables these computers to connect with other computers both near and far.&lt;/p&gt;
&lt;h1 id=&quot;what-is-a-packet%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/network-layer/#what-is-a-packet%3F&quot;&gt;&lt;span&gt;What is a packet?&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;All data sent over the Internet is broken down into smaller chunks called &lt;em&gt;packets&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;At the network layer, networking software attaches a header to each packet when the packet is sent out over the Internet, and on the other end, networking software can use the header to understand how to handle the packet.&lt;/p&gt;
&lt;p&gt;A header contains information about the content, source, and destination of each packet (somewhat like stamping an envelope with a destination and return address).&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Protocol&lt;/em&gt; is an agreed-upon way of formatting data so that two or more devices are able to communicate with and understand each other.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;osi-model&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/network-layer/#osi-model&quot;&gt;&lt;span&gt;OSI model&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/osi.png&quot; alt=&quot;OSI Model&quot; /&gt;
&lt;h1 id=&quot;tcp%2Fip-model&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/09/network-layer/#tcp%2Fip-model&quot;&gt;&lt;span&gt;TCP/IP model&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;4. Application layer:&lt;/strong&gt; This corresponds, approximately, to layer 7 in the OSI model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Transport layer:&lt;/strong&gt; Corresponds to layer 4 in the OSI model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Internet layer:&lt;/strong&gt; Corresponds to layer 3 in the OSI model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Network access layer:&lt;/strong&gt; Combines the processes of layers 1 and 2 in the OSI model.&lt;/p&gt;
</description>
      <pubDate>Mon, 25 Sep 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/09/network-layer/</guid>
    </item>
    <item>
      <title>Should you start a startup?</title>
      <link>https://blog.imkhoi.com/posts/2023/06/should-you-start-a-startup/</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://youtu.be/BUE-icVYRFU&quot; target=&quot;_blank&quot;&gt;YC YouTube Video&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Don’t worry about starting motivations. Curiosity is enough.&lt;/li&gt;
&lt;li&gt;Worst case scenario analysis.&lt;/li&gt;
&lt;li&gt;Find smart people to talk ideas with.&lt;/li&gt;
&lt;li&gt;Turn ideas into side projects and launch them!&lt;/li&gt;
&lt;li&gt;If you enjoy the process: make the jump!&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Sat, 24 Jun 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/06/should-you-start-a-startup/</guid>
    </item>
    <item>
      <title>Pivoting Out of a Tarpit Idea</title>
      <link>https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://youtu.be/GMIawSAygO4&quot; target=&quot;_blank&quot;&gt;YC YouTube video&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;what-are-tarpit-ideas%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/#what-are-tarpit-ideas%3F&quot;&gt;&lt;span&gt;What are tarpit ideas?&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tarpit ideas are ideas that people try but don’t pivot out quickly enough. It’s a cause of death for many companies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tarpit tends to be a great place to find fossilized remains. The reason is that tarpit resembles fresh water ponds so animals come across and get stuck, then die.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;tend-to-be-consumer-ideas&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/#tend-to-be-consumer-ideas&quot;&gt;&lt;span&gt;Tend to be consumer ideas&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;why-it%E2%80%99s-difficult&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/#why-it%E2%80%99s-difficult&quot;&gt;&lt;span&gt;Why It’s Difficult&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The bar is high. Founders don’t realize how good the current products are, or how many have been built and failed.&lt;/p&gt;
&lt;h2 id=&quot;timing&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/#timing&quot;&gt;&lt;span&gt;Timing&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 2000s, there was a boom in consumer products.&lt;/p&gt;
&lt;p&gt;In 2010s, consumer mobile apps were booming.&lt;/p&gt;
&lt;h2 id=&quot;why-they-don%E2%80%99t-work&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/#why-they-don%E2%80%99t-work&quot;&gt;&lt;span&gt;Why They Don’t Work&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The usual pitch: an app to discover new things …&lt;/p&gt;
&lt;/blockquote&gt;
&lt;aside&gt;💡 Know the game you&#39;re in.&lt;/aside&gt;
&lt;h3&gt;Web3&lt;/h3&gt;
&lt;p&gt;Web3 opens up many possibilities that things can be rebuilt. However, these startups are pretty theoretical.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eg: OpenSea is not theoretical at all. They have a product that’s easy to understand.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;aside&gt;💡 Think about the supply side &amp; demand side of your startup.&lt;/aside&gt;
</description>
      <pubDate>Sat, 24 Jun 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/06/pivoting-out-of-tarpit-ideas/</guid>
    </item>
    <item>
      <title>My Job Resources</title>
      <link>https://blog.imkhoi.com/posts/2023/04/my-job-resources/</link>
      <description>&lt;p&gt;As an international student from Vietnam studying in the US. I am currently pursuing a Dual Degree BBA in Computer Information Systems and BS in Information Technology at the &lt;a href=&quot;https://www.una.edu/&quot;&gt;University of North Alabama (UNA)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Throughout my time here, I have applied for a lot of internships, faced lots of rejections, and eventually landed some in the most unexpected way.&lt;/p&gt;
&lt;p&gt;I will share with you some resources that has been useful to me along the way to pursue a career in the US.&lt;/p&gt;
&lt;h1 id=&quot;tips&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/04/my-job-resources/#tips&quot;&gt;&lt;span&gt;Tips&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Invest in yourself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Buy reputable online courses &amp;amp; certificates to specialize your skills.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Post contents on LinkedIn, Twitter, YouTube, etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Post what you learn and don’t overthink it. Make sure you are providing values or showcase your knowledge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to networking events, career fairs, and conferences.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition, you can reach out to professors and alumnis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;💡 The most important thing: network, network, network!&lt;/aside&gt;
&lt;blockquote&gt;
&lt;p&gt;Luck matters! Don’t underestimate yourself! Try to increase your luck surface area. &lt;a href=&quot;https://twitter.com/SahilBloom/status/1669773168154738707?s=20&quot;&gt;Check out this tweet on luck&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h1 id=&quot;tools&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/04/my-job-resources/#tools&quot;&gt;&lt;span&gt;Tools&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;aside&gt;💡 Check out all the job tools &lt;a href=&quot;https://nfcorange.platopunk.com/job-tools/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/aside&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://una-csm.symplicity.com/&quot;&gt;Symplicity&lt;/a&gt; - this link is for my school, but your university might have its own, or they might use the next one…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is how I landed my first internship at &lt;a href=&quot;https://www.grubsouth.com/&quot;&gt;GrubSouth&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://joinhandshake.com/&quot;&gt;Handshake&lt;/a&gt; - this site is good for job hunting. You can also chat with other students and recruiters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/&quot;&gt;LinkedIn&lt;/a&gt; - this is crucial. LinkedIn profile is your own brand. Don’t be shy to post!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is how I landed my second internship (a Vietnamese startup) at &lt;a href=&quot;https://www.linkedin.com/company/vucar/&quot;&gt;Vucar&lt;/a&gt;. The founder actually reached out to me on LinkedIn after seeing some of my coding project videos!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I also landed my third internship (the most interesting one) at &lt;a href=&quot;https://in.linkedin.com/company/ossillate?trk=public_profile_experience-item_profile-section-card_image-click&quot;&gt;Ossillate&lt;/a&gt;. We had a chat before on LinkedIn and the founder reached out to me for a software engineering role.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://simplify.jobs/&quot;&gt;Simplify&lt;/a&gt; - this browser extension helps you autofill job applications in seconds!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.workatastartup.com/&quot;&gt;Work at a Startup&lt;/a&gt; - a job site from YC. Startups are always on the hunt!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I landed a gig doing bug hunting for a startup on this site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://otta.com/&quot;&gt;Otta&lt;/a&gt; - they have a mobile app with Tinder-like UI (&lt;em&gt;not that I use Tinder a lot&lt;/em&gt;) that recommends relevant jobs for you.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h1 id=&quot;curricular-practical-training-(cpt)---for-international-students&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/04/my-job-resources/#curricular-practical-training-(cpt)---for-international-students&quot;&gt;&lt;span&gt;Curricular Practical Training (CPT) - for &lt;em&gt;international students&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Below is the process of applying for &lt;a href=&quot;https://www.una.edu/international/international-student-services/cpt-curricular-practical-training.html&quot;&gt;CPT at UNA&lt;/a&gt;. If you study at a different college, the process might be slightly different.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPT is part of an established curriculum within a school so you have to register a course for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two types of CPT:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Part-time CPT: 20 hours or less per week&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Full-time CPT: 20 hours or more&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you do 12 months or more of full-time CPT, you are not allowed to do OPT.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Instructions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Talk to your employer and have them &lt;strong&gt;sign&lt;/strong&gt; these forms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Have them write a formal job description including job title, job responsibilities, your pay rate, your start and end date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://una.edu/career/experiential-learning/una-experential-learning-program-memorandum.pdf#Experiential%20Learning%20Application&quot;&gt;UNA Experiential Learning Program Memorandum of Understanding&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.una.edu/international/docs-services/cpt-request-form-fillable-form.pdf&quot;&gt;International Student CPT Authorization Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;a href=&quot;https://una-csm.symplicity.com/students/index.php?mode=list&amp;amp;s=profile&amp;amp;ss=explearning&quot;&gt;UNA Lion Jobs page&lt;/a&gt; and click &lt;strong&gt;ADD New&lt;/strong&gt; to fill out the Experiential Learning experience/CPT. Upload the signed forms here as attachments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Email instructor/professor of the internship course and have them signed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bring the signed &lt;strong&gt;International Student CPT Authorization Request&lt;/strong&gt; form to your DSO.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for approval.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Fri, 14 Apr 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/04/my-job-resources/</guid>
    </item>
    <item>
      <title>Before the Startup</title>
      <link>https://blog.imkhoi.com/posts/2023/02/before-the-startup/</link>
      <description>&lt;p&gt;&lt;a href=&quot;http://www.paulgraham.com/before.html&quot; target=&quot;_blank&quot;&gt;Paul Graham’s Before the Startup&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;1.-counterintuitive&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#1.-counterintuitive&quot;&gt;&lt;span&gt;1. Counterintuitive&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Startups are so weird that if you trust your instincts, you’ll make a lot of mistakes. If you know nothing more than this, you may at least pause before making them.&lt;/p&gt;
&lt;p&gt;You can, however, trust your instincts about people. And in fact one of the most common mistakes young founders make is not to do that enough. If you’re thinking about getting involved with someone — as a cofounder, an employee, an investor, or an acquirer — and you have misgivings about them, trust your gut. If someone seems slippery, or bogus, or a jerk, don’t ignore it.&lt;/p&gt;
&lt;h1 id=&quot;2.-expertise&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#2.-expertise&quot;&gt;&lt;span&gt;2. Expertise&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It’s not that important to know a lot about startups. The way to succeed in a startup is not to be an expert on startups, but to be an expert on your users and the problem you’re solving for them.&lt;/p&gt;
&lt;h1 id=&quot;3.-game&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#3.-game&quot;&gt;&lt;span&gt;3. &lt;strong&gt;Game&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Starting a startup is where gaming the system stops working. Gaming the system may continue to work if you go to work for a big company. Depending on how broken the company is, you can succeed by sucking up to the right people, giving the impression of productivity, and so on.&lt;/p&gt;
&lt;h1 id=&quot;4.-all-consuming&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#4.-all-consuming&quot;&gt;&lt;span&gt;4. All-Consuming&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Startups are all-consuming. If you start a startup, it will take over your life to a degree you cannot imagine. And if your startup succeeds, it will take over your life for a long time: for several years at the very least, maybe for a decade, maybe for the rest of your working life.&lt;/p&gt;
&lt;h1 id=&quot;5.-try&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#5.-try&quot;&gt;&lt;span&gt;5. Try&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Starting a startup will change you a lot. So what you’re trying to estimate is not just what you are, but what you could grow into.&lt;/p&gt;
&lt;h1 id=&quot;6.-ideas&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/before-the-startup/#6.-ideas&quot;&gt;&lt;span&gt;6. Ideas&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;So if you want to start a startup one day, what should you do in college? There are only two things you need initially: an idea and cofounders. And the m.o. for getting both is the same. Which leads to our sixth and last counterintuitive point: that the way to get startup ideas is not to try to think of startup ideas.&lt;/p&gt;
&lt;p&gt;How do you turn your mind into the type that startup ideas form unconsciously?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Learn a lot about things that matter.&lt;/li&gt;
&lt;li&gt;Work on problems that interest you with people you like and respect.&lt;/li&gt;
&lt;li&gt;Incidentally, is how you get cofounders at the same time as the idea.&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/02/before-the-startup/</guid>
    </item>
    <item>
      <title>Why to not not start a startup</title>
      <link>https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/</link>
      <description>&lt;p&gt;Takeaway from Paul Graham’s &lt;a href=&quot;http://www.paulgraham.com/notnot.html&quot; target=&quot;_blank&quot;&gt;Why to not not start a startup&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;1.-too-young&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#1.-too-young&quot;&gt;&lt;span&gt;1. Too young&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When you’re a little kid and you’re asked to do something hard, you can cry and say “I can’t do it” and the adults will probably let you off. As a kid there’s a magic button you can press by saying “I’m just a kid” that will get you out of most difficult situations. Whereas adults, by definition, are not allowed to flake. They still do, of course, but when they do they’re ruthlessly pruned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The other way to tell an adult is by how they react to a challenge. Someone who’s not yet an adult will tend to respond to a challenge from an adult in a way that acknowledges their dominance. If an adult says “that’s a stupid idea,” a kid will either crawl away with his tail between his legs, or rebel. But rebelling presumes inferiority as much as submission. The adult response to “that’s a stupid idea,” is simply to look the other person in the eye and say “Really? Why do you think so?”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;2.-too-inexperienced&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#2.-too-inexperienced&quot;&gt;&lt;span&gt;2. &lt;strong&gt;Too inexperienced&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;The best way to get experience if you’re 21 is to start a startup. So, paradoxically, if you’re too inexperienced to start a startup, what you should do is start one.&lt;/li&gt;
&lt;li&gt;I’d advise people to go ahead and start startups right out of college. There’s no better time to take risks than when you’re young. Sure, you’ll probably fail. But even failure will get you to the ultimate goal faster than getting a job.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;3.-not-determined-enough&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#3.-not-determined-enough&quot;&gt;&lt;span&gt;3. Not determined enough&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;How can you tell if you’re determined enough, when Larry and Sergey themselves were unsure at first about starting a company? I’m guessing here, but I’d say the test is whether you’re sufficiently driven to work on your own projects. Though they may have been unsure whether they wanted to start a company, it doesn’t seem as if Larry and Sergey were meek little research assistants, obediently doing their advisors’ bidding. They started projects of their own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;4.-not-smart-enough&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#4.-not-smart-enough&quot;&gt;&lt;span&gt;4. &lt;strong&gt;Not smart enough&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You may need to be moderately smart to succeed as a startup founder. But if you’re worried about this, you’re probably mistaken. If you’re smart enough to worry that you might not be smart enough to start a startup, you probably are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you don’t think you’re smart enough to start a startup doing something technically difficult, just write enterprise software. Enterprise software companies aren’t technology companies, they’re sales companies, and sales depends mostly on effort.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;5.-know-nothing-about-business&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#5.-know-nothing-about-business&quot;&gt;&lt;span&gt;5. Know nothing about business&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;You don’t need to know anything about business to start a startup. The initial focus should be the product. All you need to know in this phase is how to build things people want. If you succeed, you’ll have to think about how to make money from it. But this is so easy you can pick it up on the fly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;6.-no-cofounder&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#6.-no-cofounder&quot;&gt;&lt;span&gt;6. No cofounder&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Not having a cofounder is a real problem. A startup is too much for one person to bear. And though we differ from other investors on a lot of questions, we all agree on this. All investors, without exception, are more likely to fund you with a cofounder than without.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;7.-no-idea&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#7.-no-idea&quot;&gt;&lt;span&gt;7. No idea&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Find something that’s missing in your own life, and supply that need—no matter how specific to you it seems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;8.-no-room-for-more-startups&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#8.-no-room-for-more-startups&quot;&gt;&lt;span&gt;8. No room for more startups&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Nearly everyone who works is satisfying some kind of need. Breaking up companies into smaller units doesn’t make those needs go away. Existing needs would probably get satisfied more efficiently by a network of startups than by a few giant, hierarchical organizations, but I don’t think that would mean less opportunity, because satisfying current needs would lead to more.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;9.-family-to-support&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#9.-family-to-support&quot;&gt;&lt;span&gt;&lt;strong&gt;9. Family to support&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;What you can do, if you have a family and want to start a startup, is start a consulting business you can then gradually turn into a product business. Empirically the chances of pulling that off seem very small. You’re never going to produce Google this way. But at least you’ll never be without an income.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;10.-independently-wealthy&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#10.-independently-wealthy&quot;&gt;&lt;span&gt;10. Independently wealthy&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I’ve come close to starting new startups a couple times, but I always pull back because I don’t want four years of my life to be consumed by random schleps. I know this business well enough to know you can’t do it half-heartedly. What makes a good startup founder so dangerous is his willingness to endure infinite schleps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a bit of a problem with retirement, though. Like a lot of people, I like to work. And one of the many weird little problems you discover when you get rich is that a lot of the interesting people you’d like to work with are not rich. They need to work at something that pays the bills. Which means if you want to have them as colleagues, you have to work at something that pays the bills too, even though you don’t need to. I think this is what drives a lot of serial entrepreneurs, actually.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;11.-not-ready-for-commitment&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#11.-not-ready-for-commitment&quot;&gt;&lt;span&gt;11. Not ready for commitment&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;If you start a startup that succeeds, it’s going to consume at least three or four years. (If it fails, you’ll be done a lot quicker.) So you shouldn’t do it if you’re not ready for commitments on that scale. Be aware, though, that if you get a regular job, you’ll probably end up working there for as long as a startup would take, and you’ll find you have much less spare time than you might expect.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;12.-need-for-structure&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#12.-need-for-structure&quot;&gt;&lt;span&gt;12. Need for structure&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;In a good startup, you don’t get told what to do very much. There may be one person whose job title is CEO, but till the company has about twelve people no one should be telling anyone what to do. That’s too inefficient. Each person should just do what they need to without anyone telling them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;13.-fear-of-uncertainty&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#13.-fear-of-uncertainty&quot;&gt;&lt;span&gt;13. Fear of uncertainty&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Well, if you’re troubled by uncertainty, I can solve that problem for you: if you start a startup, it will probably fail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No one will blame you if the startup tanks, so long as you made a serious effort. I asked managers at big companies, and they all said they’d prefer to hire someone who’d tried to start a startup and failed over someone who’d spent the same time working at a big company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nor will investors hold it against you, as long as you didn’t fail out of laziness or incurable stupidity.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;14.-don%E2%80%99t-realize-what-you%E2%80%99re-avoiding&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#14.-don%E2%80%99t-realize-what-you%E2%80%99re-avoiding&quot;&gt;&lt;span&gt;14. Don’t realize what you’re avoiding&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Software companies don’t hire students for the summer as a source of cheap labor. They do it in the hope of recruiting them when they graduate. So while they’re happy if you produce, they don’t expect you to. That will change if you get a real job after you graduate. And since most of what big companies do is boring, you’re going to have to work on boring stuff. Easy, compared to college, but boring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The thing that really sucks about having a regular job is the expectation that you’re supposed to be there at certain times. Even Google is afflicted with this. And what this means, as everyone who’s had a regular job can tell you, is that there are going to be times when you have absolutely no desire to work on anything, and you’re going to have to go to work anyway and sit in front of your screen and pretend to. To someone who likes work, as most good hackers do, this is torture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a startup, you skip all that. There’s no concept of office hours in most startups. Work and life just get mixed together. But the good thing about that is that no one minds if you have a life at work. In a startup you can do whatever you want most of the time. If you’re a founder, what you want to do most of the time is work. But you never have to pretend to.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;15.-parents-want-you-to-be-a-doctor&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#15.-parents-want-you-to-be-a-doctor&quot;&gt;&lt;span&gt;15. Parents want you to be a doctor&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A significant number of would-be startup founders are probably dissuaded from doing it by their parents. One is that parents tend to be more conservative for their kids than they would be for themselves.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The other reason parents may be mistaken is that, like generals, they’re always fighting the last war. If they want you to be a doctor, odds are it’s not just because they want you to help the sick, but also because it’s a prestigious and lucrative career.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;16.-a-job-is-the-default&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/#16.-a-job-is-the-default&quot;&gt;&lt;span&gt;16. A job is the default&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;This leads us to the last and probably most powerful reason people get regular jobs: it’s the default thing to do. Defaults are enormously powerful, precisely because they operate without any conscious choice.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/02/why-to-not-not-start-a-startup/</guid>
    </item>
    <item>
      <title>Startup at uni</title>
      <link>https://blog.imkhoi.com/posts/2023/02/startup-at-uni/</link>
      <description>&lt;h1 id=&quot;some-time-in-2021&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#some-time-in-2021&quot;&gt;&lt;span&gt;Some time in 2021&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Avish and I were aspiring entrepreneurs at the University of North Alabama. We met at &lt;em&gt;the Generator&lt;/em&gt; — a facility for innovators, engineers, designers, etc. at our uni.&lt;/p&gt;
&lt;h1 id=&quot;around-sep-2022&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#around-sep-2022&quot;&gt;&lt;span&gt;Around Sep 2022&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We had an idea to work on NFC cards. We were surfing for a niche and decided to build NFC cards for student resumes since we had looked at &lt;em&gt;Popl, Linq, Dot, etc.&lt;/em&gt; and thought the market for networking-type NFC was already saturated.&lt;/p&gt;
&lt;p&gt;We came up with the name &lt;strong&gt;nTap&lt;/strong&gt;. However, it matched with the stock ticker from the company &lt;em&gt;NetApp&lt;/em&gt; so we spent 4 hours to find another name and decided to go with &lt;strong&gt;NFC Orange&lt;/strong&gt;, then bought the domain &lt;strong&gt;&lt;a href=&quot;https://nfcorange.platopunk.com/&quot; target=&quot;_blank&quot;&gt;nfcorange.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We applied to pitch at &lt;strong&gt;Idea Audition&lt;/strong&gt; (hosted by &lt;em&gt;Shoals Incubator&lt;/em&gt;) trying to go after the &lt;strong&gt;B2C&lt;/strong&gt; and &lt;strong&gt;B2B&lt;/strong&gt; model, and did not make it. However, we continued to work on our product.&lt;/p&gt;
&lt;h1 id=&quot;late-nov-2022&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#late-nov-2022&quot;&gt;&lt;span&gt;Late Nov 2022&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We were after the &lt;strong&gt;B2C&lt;/strong&gt; model, trying to sell the cards to students and roaming around campus at night to stick flyers.&lt;/p&gt;
&lt;h1 id=&quot;late-dec-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#late-dec-2023&quot;&gt;&lt;span&gt;Late Dec 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We figured it was hard to go after &lt;strong&gt;B2C&lt;/strong&gt; since they did not have the incentive to purchase the cards. We pivoted our product to &lt;strong&gt;B2B&lt;/strong&gt; completely and decided that our uni should be our first customer.&lt;/p&gt;
&lt;p&gt;It was difficult to talk to the head of the department so things got delayed and went downhill…&lt;/p&gt;
&lt;h1 id=&quot;christmas-%26-new-year%E2%80%99s-eve&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#christmas-%26-new-year%E2%80%99s-eve&quot;&gt;&lt;span&gt;Christmas &amp;amp; New Year’s Eve&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I was the sole programmer, so &lt;em&gt;coding through the holiday was my motto&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;strong&gt;Mr. Steven Puckett&lt;/strong&gt;, we built a NFC reader for recruiters that read our NFC Orange cards and save students’ info to their dashboard.&lt;/p&gt;
&lt;h1 id=&quot;feb-10-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#feb-10-2023&quot;&gt;&lt;span&gt;Feb 10 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We finally met with the &lt;em&gt;Head of Sales Deparment&lt;/em&gt; and the Dean of &lt;em&gt;College of Business and Technology&lt;/em&gt; at our uni to pitch him our product. They liked it and gave some feedback. The Dean said he would &lt;strong&gt;fund the project&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We took their feedback and after a week, we added new features.&lt;/p&gt;
&lt;h1 id=&quot;feb-21-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#feb-21-2023&quot;&gt;&lt;span&gt;Feb 21 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We purchased 100 printed NFC cards and they came out with the wrong color printed (&lt;em&gt;this was the night before our first public launch&lt;/em&gt;). Avish was frustrated.&lt;/p&gt;
&lt;p&gt;Later that night, some of the code did not work properly and a few hours spent fixing it. Then, we had to manually scan to write our URL to the NFC cards since we had not known how to do it more efficiently. We stayed up until 1 AM.&lt;/p&gt;
&lt;h1 id=&quot;feb-22-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#feb-22-2023&quot;&gt;&lt;span&gt;Feb 22 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We got 20 cards written for giving out.&lt;/p&gt;
&lt;p&gt;4 PM: We did our &lt;strong&gt;first launch&lt;/strong&gt; - a small one! A bit more than 20 students came to the info session. And, no one seemed to care about the color. They were hooked with the tech. So, &lt;em&gt;game on&lt;/em&gt; until March 8th when we did our first NFC Orange reader trial with &lt;em&gt;Boeing&lt;/em&gt; recruiter visit at our uni.&lt;/p&gt;
&lt;h1 id=&quot;march-6-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#march-6-2023&quot;&gt;&lt;span&gt;March 6 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We had another info session to distribute our NFC cards. This was the last session. I was in class hearing some friends talking about this digital resume cards. My expectation rose, not only me, Avish as well.&lt;/p&gt;
&lt;p&gt;Here came 4 PM on a Monday. Two students came. We were disappointed as the Boeing Recruiter Visit was approaching. Not only that, our NFC reader was also unstable and loose. Need to fix it tomorrow with Mr. Puckett!&lt;/p&gt;
&lt;h1 id=&quot;march-8-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#march-8-2023&quot;&gt;&lt;span&gt;March 8 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Boeing Recruiter Visit went well. One of the recruiters - &lt;a href=&quot;https://www.linkedin.com/in/melissasmalley/&quot; target=&quot;_blank&quot;&gt;Melissa Smalley&lt;/a&gt; — gave a compliment on the dashboard UI saying it was &lt;em&gt;“user-friendly”&lt;/em&gt;. After that, we nervously waited for their feedback email and thought they might have forgotten. Finally, here is what they sent us.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/boeing-feedback-email.png&quot; alt=&quot;Feedback email from Boeing&quot; /&gt;
&lt;p&gt;After the feedback, we added the search bar and prepared to launch more features.&lt;/p&gt;
&lt;h1 id=&quot;march-29-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#march-29-2023&quot;&gt;&lt;span&gt;March 29 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Things slowed down again, but this time, it put our startup on the verge of collapse. Avish’s time was running out. He had to leave the US because of his visa expiration.&lt;/p&gt;
&lt;p&gt;To go all-in, Avish and I sat down to craft our &lt;a href=&quot;https://blog.imkhoi.com/assets/nfc-orange-pitch-deck.pdf&quot; target=&quot;_blank&quot;&gt;pitch deck&lt;/a&gt; and sent to VCs that could help with immigration.&lt;/p&gt;
&lt;p&gt;We even built a company &lt;a href=&quot;https://www.linkedin.com/company/nfc-orange/&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; page and change our job title.&lt;/p&gt;
&lt;h1 id=&quot;april-7-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#april-7-2023&quot;&gt;&lt;span&gt;April 7 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We got rejected by &lt;a href=&quot;https://www.unshackledvc.com/&quot; target=&quot;_blank&quot;&gt;Unshackled Ventures&lt;/a&gt; — the one we hope for the most.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/unshackled-feedback.jpg&quot; alt=&quot;Feedback email from Unshackled VC&quot; /&gt;
&lt;h1 id=&quot;april-9-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#april-9-2023&quot;&gt;&lt;span&gt;April 9 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I think at this point, it is best to discontinue NFC Orange. We have had our ups and downs, however, these downs are still nothing compared to the real world.&lt;/p&gt;
&lt;p&gt;Avish might go back to India and start something of his own. I will pursue something else, learn about a new tech.&lt;/p&gt;
&lt;p&gt;And, we think this is part of entrepreneurship. You fail something, then you start all over again. The point is to keep trying and learn from your mistakes.&lt;/p&gt;
&lt;h1 id=&quot;september-25-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#september-25-2023&quot;&gt;&lt;span&gt;September 25 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;At this point, it is confirmed that Avish has to go back to India. I do not think I have energy left to continue pursuing NFC Orange.&lt;/p&gt;
&lt;p&gt;I joined Side Hustle Expo at our uni (we missed last time) to promote the product. Sold 2 cards. Got many rejections. That’s how it goes.&lt;/p&gt;
&lt;p&gt;I will graduate in December 2023 and will be looking for a full-time job soon.&lt;/p&gt;
&lt;p&gt;As an international student, it is either &lt;em&gt;finding a job or going home&lt;/em&gt; to stay in the US (I have no plan to pursue a Master’s Degree), so I will spend more time on that.&lt;/p&gt;
&lt;h1 id=&quot;november-12-2023&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/startup-at-uni/#november-12-2023&quot;&gt;&lt;span&gt;November 12 2023&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today, I sent Avish a text message &lt;em&gt;“im gonna open-source NFC Orange. Time to move on”&lt;/em&gt;. Yes, all the source code, all of our time and effort has been made public. You can view it &lt;a href=&quot;https://github.com/KhoiUna/nfc-orange&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Avish agreed it was time to move on and texted back &lt;em&gt;“I can try to keep the legacy alive.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I believe the journey of our entrepreneurship is not over.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is the end of &lt;em&gt;my college startup journey&lt;/em&gt;. Stay tune for &lt;em&gt;my startup journey&lt;/em&gt;!&lt;/p&gt;
</description>
      <pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/02/startup-at-uni/</guid>
    </item>
    <item>
      <title>How to get &amp; evaluate startup ideas?</title>
      <link>https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://youtu.be/Th8JoIan4dg&quot; target=&quot;_blank&quot;&gt;YC YouTube video&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;4-most-common-mistakes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/#4-most-common-mistakes&quot;&gt;&lt;span&gt;4 most common mistakes&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Not solving a real problem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not make solutions in search of a problem.&lt;/li&gt;
&lt;li&gt;Fall in love of a problem → Find a high-quality problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting stuck on &lt;em&gt;tarpit ideas&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;What causes tarpit ideas?&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Widespread problem that lots of potential founders encounter.&lt;/li&gt;
&lt;li&gt;Seems like it could be easily solvable with a startup.&lt;/li&gt;
&lt;li&gt;There’s a structural reason why it’s very difficult to solve.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How to avoid?&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Google! Look for previous founders who have tackled this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not evaluating your idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Waiting for the perfect idea.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;…your initial idea as a good starting point…ideas morph over time.&lt;/em&gt; - Paul Graham&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;10-key-questions-to-ask&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/#10-key-questions-to-ask&quot;&gt;&lt;span&gt;10 Key questions to ask&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Founder market fit
&lt;ul&gt;
&lt;li&gt;Are you the right team?&lt;/li&gt;
&lt;li&gt;Pick a good idea &lt;strong&gt;for your team&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How big is the market?
&lt;ul&gt;
&lt;li&gt;2 good markets for startups: big now &amp;amp; small but growing rapidly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How accute is the problem?&lt;/li&gt;
&lt;li&gt;Do you have competition?
&lt;ul&gt;
&lt;li&gt;Most good ideas have competition.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do you want this personally or know people who want this?&lt;/li&gt;
&lt;li&gt;Did this recently become possible or become necessary?
&lt;ul&gt;
&lt;li&gt;Eg: Checkr (API for background check) took off when Doordash, Uber were hiring a pool of gig workers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Are there good proxies?
&lt;ul&gt;
&lt;li&gt;Proxy: large company that does something similar to your startup.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Is this an idea you want to work on for years?&lt;/li&gt;
&lt;li&gt;Is this scalable?
&lt;ul&gt;
&lt;li&gt;Software is highly scalable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Is this a good idea space?
&lt;ul&gt;
&lt;li&gt;Idea space: one level abstraction out from a particular startup ideas. It’s a class of closely related startup ideas. Eg: software for hospitals, etc.&lt;/li&gt;
&lt;li&gt;If you are in a good idea space, the success rate is astonishingly high. Idea space becomes hot and cold over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;3-things-that-make-an-idea-seem-bad%2C-but-actually-make-it-good&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/#3-things-that-make-an-idea-seem-bad%2C-but-actually-make-it-good&quot;&gt;&lt;span&gt;3 things that make an idea seem bad, but actually make it good&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Hard to get started. Eg: Stripe&lt;/li&gt;
&lt;li&gt;Boring space. Eg: Gusto
&lt;ul&gt;
&lt;li&gt;The day to day stuff is gonna be the same anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Existing competitors.
&lt;ul&gt;
&lt;li&gt;Eg: Dropbox. When Dropbox was launched, there were 20 file storage companies. Dropbox found out that their UI suck. Competitors didn’t have a way to sync directly with the local filesystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;set-yourself-up&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/#set-yourself-up&quot;&gt;&lt;span&gt;Set yourself up&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;aside&gt;
💡 The best way to get a startup idea is to pick it organically.
&lt;/aside&gt;
&lt;ul&gt;
&lt;li&gt;Become an expert on something valuable.&lt;/li&gt;
&lt;li&gt;Work at a startup&lt;/li&gt;
&lt;li&gt;Build things you find interesting. Eg: Replit&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;generating-startup-ideas-(ordered-by-most-likely)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/#generating-startup-ideas-(ordered-by-most-likely)&quot;&gt;&lt;span&gt;Generating startup ideas (ordered by most likely)&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start with what your team is especially good at. → Founder market fit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start with a problem you’ve encountered.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Think of every job you’ve had (+ internships + life experience)
What are problems/opportunities you’ve been in a special condition to see?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Think of things you personally wish existed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for things in the world that have changed recently. Eg: Gathertown - fun way to hang out online during COVID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for new variants of successful companies. Eg: Nuvo Cargo - logistics/Flexport for LatAm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talk to people and ask them what problems they have.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;However, you need to have lots of skills.&lt;/li&gt;
&lt;li&gt;First, pick an idea space and talk to people within that space. Talk to founders in that space&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Eg: AtoB.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;They picked an idea space - Trucking industry.&lt;/li&gt;
&lt;li&gt;Drove to truck stops and talk to potential users.&lt;/li&gt;
&lt;li&gt;Asked other founders about the industry.&lt;/li&gt;
&lt;li&gt;Evaluated several ideas before picking fuel cards.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for big industries that seem broken.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for a co-founder.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;aside&gt;
💡 It’s hard to tell if an idea succeed or not. Just launch and find out!
&lt;/aside&gt;
</description>
      <pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/02/how-to-get-and-evaluate-startup-ideas/</guid>
    </item>
    <item>
      <title>Antifragile</title>
      <link>https://blog.imkhoi.com/posts/2023/01/antifragile/</link>
      <description>&lt;h1 id=&quot;don%E2%80%99t-chase-happiness.-become-antifragile-by-tal-ben-shahar&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/antifragile/#don%E2%80%99t-chase-happiness.-become-antifragile-by-tal-ben-shahar&quot;&gt;&lt;span&gt;&lt;em&gt;Don’t chase happiness. Become antifragile&lt;/em&gt; by Tal Ben-Shahar&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;what-is-antifragile%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/antifragile/#what-is-antifragile%3F&quot;&gt;&lt;span&gt;What is antifragile?&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is this misconception of a happy life is that one should always be happy. However, learning to embrace and accept painful emotions is part of a happy life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Antifragile&lt;/strong&gt; means putting pressure on a system and make it grow stronger and harder. For instance, we, humans, are antifragile. Think when we go to the gym and lift weights.&lt;/p&gt;
&lt;p&gt;On a psychological level, it is called &lt;strong&gt;PGT&lt;/strong&gt; (Post Traumatic Growth). The role of science of happiness is to teach us what conditions we can put in place to increase the likelihood of growing from hardship.&lt;/p&gt;
&lt;p&gt;From research by Iris Moss and others, it can be seen that happiness is a good thing, however, valuing it is problematic. So, the way to be happy is to pursue it indirectly. Here is the &lt;strong&gt;SPIRE model&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S&lt;/strong&gt;piritual: finding a sense of meaning in life, at work, at home.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P&lt;/strong&gt;hysical: reduce stress, do more recovery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt;ntellectual: curious people tend to live longer and be happier. In addition, they’re deeply engaging with material (text, work of art, nature, etc).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;elational: quality time with people we care and who care about us.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt;motional: cultivate gratitude.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;antifragile%3A-things-that-gain-from-disorder-by-nassim-nicholas-taleb&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/antifragile/#antifragile%3A-things-that-gain-from-disorder-by-nassim-nicholas-taleb&quot;&gt;&lt;span&gt;&lt;em&gt;Antifragile: Things That Gain from Disorder&lt;/em&gt; by Nassim Nicholas Taleb&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;In reality, we cannot measure risk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nassim Nicholas Taleb used to work as an option trader, and option traders view the world in two dimensions: things that don’t like volatility and things that like volatility.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/fragile.webp&quot; alt=&quot;Fragile graph&quot; /&gt;
&lt;sub&gt;Fragile graph (source: Antifragille: Things That Gain from Disorder | Nassim Nicholas Taleb | Talks at Google)&lt;/sub&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/antifragile.webp&quot; alt=&quot;Antifragile graph&quot; /&gt;
&lt;sub&gt;Antifragile graph (source: Antifragille: Things That Gain from Disorder | Nassim Nicholas Taleb | Talks at Google)&lt;/sub&gt;
&lt;p&gt;Here are some key takeaways from his talk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anthing organic communicates with its environment via stressors.&lt;/li&gt;
&lt;li&gt;A system that works very well is a system that has layers.
&lt;ul&gt;
&lt;li&gt;For instance, the restaurant business works well because they are fragile.&lt;/li&gt;
&lt;li&gt;However, in California (the epicenter of things), businesses strive because failure rates are converted into benefits for the system. → We should encourage entrepreneurs to fail, and remove the stigma.&lt;/li&gt;
&lt;li&gt;The reason we are healthy is because there’re fragile cells in us that break first under stress. → You always have the top layer require the fragility of a lower layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;references&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/antifragile/#references&quot;&gt;&lt;span&gt;References&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/e-or_D-qNqM&quot; target=&quot;_blank&quot;&gt;Don’t chase happiness. Become antifragile | Tal Ben-Shahar | Big Think&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/S3REdLZ8Xis&quot; target=&quot;_blank&quot;&gt;Antifragile: Things That Gain from Disorder | Nassim Nicholas Taleb | Talks at Google&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/01/antifragile/</guid>
    </item>
    <item>
      <title>My first Chrome extension</title>
      <link>https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/</link>
      <description>&lt;p&gt;As I was doing my final project for Harvard CS50x, I decided to build a Chrome extension because, &lt;em&gt;why not&lt;/em&gt;, I had never built one before so it would be a good learning experience for me.&lt;/p&gt;
&lt;h1 id=&quot;planning&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/#planning&quot;&gt;&lt;span&gt;Planning&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As this was my first time developing a Chrome extension, I did not want to start with something big.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My principle: start small when you want to learn something.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I would like to keep it small and simple, and more importantly, it had to solve a problem that was relevant to me.&lt;/p&gt;
&lt;p&gt;So I came up with an idea: a Chrome extension that notifies me to drink water while working (as I am too focus sometimes and forget to take a sip). I know it sounds simple, and there has to be similar extensions out there, but &lt;em&gt;hey&lt;/em&gt;, this is for learning!&lt;/p&gt;
&lt;p&gt;So this blog post will guide you through my thought process.&lt;/p&gt;
&lt;h1 id=&quot;development&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/#development&quot;&gt;&lt;span&gt;Development&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;So the goal was to build an extension that sent me a notification to take a sip every 15 minutes.&lt;/p&gt;
&lt;p&gt;Building the user interface was simple. The popup used basic web technologies such as HTML, CSS, and JavaScript.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;300&quot; class=&quot;w-full object-cover rounded-lg my-4&quot; src=&quot;https://blog.imkhoi.com/assets/images/posts/popup-ui.png&quot; alt=&quot;Popup user interface&quot; /&gt;
&lt;p&gt;While developing, I encountered a problem. If the extension popup disappeared, the timer would restart. In order to avoid this, a script called &lt;code&gt;background.js&lt;/code&gt; running in the background would help. However, the script had to be defined in &lt;code&gt;manifest.json&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;background&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;service_worker&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background.js&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To use the notifications feature, you have to declare it in &lt;code&gt;manifest.json&lt;/code&gt; as well:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;permissions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;notifications&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the end, &lt;code&gt;manifest.json&lt;/code&gt; should look like this:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;manifest_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sip &amp;amp; Work&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Helps you stay hydrated while working&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;default_popup&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;popup/popup.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;default_icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/icon-128.png&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;icons&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;16&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/icon-16.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;32&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/icon-32.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;48&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/icon-48.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;128&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;images/icon-128.png&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;permissions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;notifications&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;background&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;service_worker&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background.js&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;production&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/#production&quot;&gt;&lt;span&gt;Production&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To use this locally, you can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;Manage extensions&lt;/code&gt; in your browser and turn on &lt;code&gt;Developer mode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then, click &lt;code&gt;Load unpacked&lt;/code&gt; and you should see it in your extensions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To make it publicly available for everyone to download from the Chrome Store, you first have to &lt;a href=&quot;https://developer.chrome.com/docs/webstore/register/&quot;&gt;register as a Chrome Web Store developer&lt;/a&gt; that requires paying a one-time registration fee. After that, follow these steps &lt;a href=&quot;https://developer.chrome.com/docs/webstore/publish/#setup-a-developer-account&quot;&gt;here&lt;/a&gt; to submit your extension for publishing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;source-code&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/#source-code&quot;&gt;&lt;span&gt;Source code&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KhoiUna/sip-and-work-extension&quot; target=&quot;_blank&quot;&gt;GitHub - KhoiUna/sip-and-work-extension: Chrome extension that reminds users to drink water every 15 minutes&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;resources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/#resources&quot;&gt;&lt;span&gt;Resources&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/&quot;&gt;Extensions - Chrome Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/mv3/declare_permissions/&quot;&gt;Declare permissions - Chrome Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/mv3/manifest/&quot;&gt;Manifest file format - Chrome Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/mv3/service_workers/&quot;&gt;Manage events with service workers - Chrome Developers&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Tue, 03 Jan 2023 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2023/01/developing-my-first-chrome-extension/</guid>
    </item>
    <item>
      <title>Strategies for ICPC</title>
      <link>https://blog.imkhoi.com/posts/2022/12/strategies-for-icpc/</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;International Collegiate Programming Contest (ICPC)&lt;/em&gt;&lt;/strong&gt; is an algorithmic programming contest for college students. Teams of three, representing their university, work to solve the most real-world problems, fostering collaboration, creativity, innovation, and the ability to perform under pressure. Through training and competition, teams challenge each other to raise the bar on the possible. Quite simply, it is the oldest, largest, and most prestigious programming contest in the world.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I am about to participate in my first ICPC, I think it is a good idea to learn some strategies from the best. Here is my summary after watching &lt;a href=&quot;https://youtu.be/0rF3J1uqVkU&quot;&gt;Day Zero: Strategies from MIPT Coach Mikhail Tikhomirov&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the statement carefully. &lt;em&gt;Don’t rush to code!&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Don’t submit right away! Always test before submitting.
&lt;blockquote&gt;
&lt;p&gt;Go slow and steady.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;A computer time is spend when you work on one problem and your teammates work on the others.&lt;/li&gt;
&lt;li&gt;Communicate with your teammates as much as possible.
&lt;blockquote&gt;
&lt;p&gt;Sometimes all you need is an outside view.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Proper training schedule is important. Have at least one training per week.
&lt;blockquote&gt;
&lt;p&gt;Steady schedule &amp;gt; lots of training.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Good to have a coach.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Tue, 20 Dec 2022 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2022/12/strategies-for-icpc/</guid>
    </item>
    <item>
      <title>The Optimal Morning Routine</title>
      <link>https://blog.imkhoi.com/posts/2022/11/the-optimal-morning-routine/</link>
      <description>&lt;p&gt;I have recently watched a video by &lt;a href=&quot;https://www.youtube.com/@AfterSkool&quot;&gt;@AfterSkool&lt;/a&gt; on how to have &lt;a href=&quot;https://youtu.be/gR_f-iwUGY4&quot;&gt;The Optimal Morning Routing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is what I learn:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The number one important thing is sleep. &lt;em&gt;You should try to get good sleep 80% of the time.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Get natural light in your eyes within 1-hour of waking up
&lt;ul&gt;
&lt;li&gt;Try to get 5-10 minutes of sunlight in the morning.&lt;/li&gt;
&lt;li&gt;This sets your level of alertness, focus and mood.&lt;/li&gt;
&lt;li&gt;You need photons in sunlight. The light from your digital device is not enough.&lt;/li&gt;
&lt;li&gt;This triggers dopamine — which drives motivation, craving and pursuit. &lt;em&gt;Dopamine is not a molecul of pleasure&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delay the intake of caffeine 60-90 minutes after waking up.&lt;/li&gt;
&lt;li&gt;Excercise: hydrate and train to clear out adenosine.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Try to increase your body temperature during your time awake. Eg: cold shower can increase your body temperature.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      <pubDate>Fri, 18 Nov 2022 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2022/11/the-optimal-morning-routine/</guid>
    </item>
    <item>
      <title>Lessons learned from web designing for a small company</title>
      <link>https://blog.imkhoi.com/posts/2022/03/lessons-learned-from-web-designing-for-a-small-company/</link>
      <description>&lt;h1 id=&quot;tl%3Bdr&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2022/03/lessons-learned-from-web-designing-for-a-small-company/#tl%3Bdr&quot;&gt;&lt;span&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;My friends and I created a website for a small business. Here are some things I learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Looking into the company’s current tool&lt;/li&gt;
&lt;li&gt;Leverage the web editor’s template&lt;/li&gt;
&lt;li&gt;Goals can change&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;I have recently had a chance to work with a small company to develop a website for them. With a team of 3 people, our goal was to ship the website as soon as possible (during 1 month) under the budget of $200.&lt;/p&gt;
&lt;p&gt;This is our first time to do something like this. Therefore, drawbacks happenned. If we were to start again from the beginning, here are what we should have done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Looking into the company’s current tool:&lt;/strong&gt; Instead of spending time picking a better web editor, we should have utilized the company’s current tool, in this case, Wix. In the beginning, we spent too much time comparing what advantages other editors had. However, in the end, we chose Wix, because after taking a look at the company’s billing history, we noticed they had already purchased a 2-year plan. Plus, it would be easier to use Wix in the beginning, since they had their domain set up on Wix so we would not have to deal with transferring domain later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leverage the web editor’s template:&lt;/strong&gt; We should have taken a look at the editor’s pre-designed templates before designing our own. Templates is a fast way to make a website good-looking. After that, all we need to do is fill in the images, words, and contents written by the company.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goals can change:&lt;/strong&gt; Initially, we set deadlines. But we had to have the flexibility to change goals. Sometimes things will not work out right. For instance, client’s slow response, the mistakes we make along the way. The flexibility will give you ability not to judge yourself, and also the efficiency to move forward.&lt;/p&gt;
&lt;p&gt;In the end, with lots of learning, we got the $200 check and would give ourselves a happy dinner.&lt;/p&gt;
</description>
      <pubDate>Thu, 03 Mar 2022 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2022/03/lessons-learned-from-web-designing-for-a-small-company/</guid>
    </item>
    <item>
      <title>First failed investment</title>
      <link>https://blog.imkhoi.com/posts/2022/01/first-failed-investment/</link>
      <description>&lt;p&gt;First of all, I want to say that I am not a financial advisor or an expert and this blog is basically my opinion about the stock market. Now, here is my story!&lt;/p&gt;
&lt;p&gt;I am from Vietnam. I came to USA to study abroad. One of the things that I really want to do when I come here is to buy stocks. After the first semester studying here, finally, I found myself a part-time job. It was great news! I got my SSN and opened an account on Robinhood. I was so excited, but, to be honest, I had little knowledge about investing at that time. My knowledge was what stocks were, and I “taught” myself by watching some stock trading videos on YouTube, which was totally useless! I did not know finance or accounting or any kind of fundamental analysis. I had with me 2 books about stocks at that time, which were “&lt;em&gt;Market Wizards&lt;/em&gt;” by Jack D. Schwager and “&lt;em&gt;How to Make Money in Stocks&lt;/em&gt;” by William J. O’Neil, and I did not finish reading any of those 2 books.&lt;/p&gt;
&lt;p&gt;So the time I started was in the beginning February, which was prior to the moment COVID-19 hit the whole world. I deposited $100 to Robinhood. The first stock I bought was Softbank, which I bought based on my belief for its CEO Masayoshi Son. I also bought Virgin Galactic stock after it had crashed from its high $42. Basically, after that I was frustrated and sold everything. Then, I read some article on Investopedia about inverse ETFs. I bought one and recovered my small losses.&lt;/p&gt;
&lt;p&gt;After these unfortunate events, I pushed myself to do more research. I tried to learn the CANSLIM strategy from the book “&lt;em&gt;How to Make Money in Stocks&lt;/em&gt;”. Then, I bought $DELL and $YUMC. I made some profits. I became more confident and deposited more to my account. During that time, I made about $300 when the market hit all-time high. I got $AMD in my portfolio at that time, and it also rose to all-time high. I was a genius, I thought.&lt;/p&gt;
&lt;p&gt;Then, things started to turn around. I started to try stock options. I got lucky when I bought puts on $INO. I made a great sum from it. After that, the market stopped going up and started correcting itself, which was around beginning of September. I thought it was temporary and bought more shares on $XLK. It continued to go down. CNBC said it was the tech sell-off! Then, I sold all $XLK, which was basically erasing all my profit since I bought it during the summer. Not only that, I started to be aggressive on my account. I bought puts that were following no rules or disciplines. Since, I washed all my profits that I gained from the market recovery. Here’s the picture of my portfolio for you guys to see.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.imkhoi.com/assets/images/posts/robinhood.png&quot; alt=&quot;My Robinhood portfolio&quot; /&gt;&lt;/p&gt;
</description>
      <pubDate>Tue, 25 Jan 2022 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2022/01/first-failed-investment/</guid>
    </item>
    <item>
      <title>Lessons from developing an app for my university</title>
      <link>https://blog.imkhoi.com/posts/2022/01/lessons-learned-from-developing-an-app-for-my-university/</link>
      <description>&lt;h1 id=&quot;tl%3Bdr&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2022/01/lessons-learned-from-developing-an-app-for-my-university/#tl%3Bdr&quot;&gt;&lt;span&gt;TL;DR&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I build an app for my university. Here are some things I learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Focus on minimal UI.&lt;/li&gt;
&lt;li&gt;Utilize UI library.&lt;/li&gt;
&lt;li&gt;To maximize speed, prioritize usability over scalability.&lt;/li&gt;
&lt;li&gt;Pick a tech stack that you are comfortable with to build the product faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Building an app for my university is my first attempt to make a product for more than 200 users. Not a lot since the app is only used by a small group of international students on campus.&lt;/p&gt;
&lt;p&gt;The app is a student engagement tracking app. However, it is still simpler than that. The purpose of the app is for students to upload their selfies taken at events, and in return, they will have a signature or a proof of participation which is given by the &lt;em&gt;navigators&lt;/em&gt; - the ones who help manage international students.&lt;/p&gt;
&lt;p&gt;Anyway, before building an app, you should ask yourself why. &lt;em&gt;How can it improve the experience for the targeted users?&lt;/em&gt; In this case, I know this app will save a lot of time. Before this app, most of the things were done on paper. Students took their photos, brought them to the office, and showed them to the navigators. Navigators will then give them a signature on paper which they had to keep and tried not to lose it. With this app, students do not have to carry their signature sheets around. And, navigators do not have to deal with students coming to the office and give them the signatures. Additionally, the number of international students coming to the university was expected to rise.&lt;/p&gt;
&lt;p&gt;When making this app, there are 2 sides I have to focus on: the navigators and the students. I have to design a simple user experience for navigators to easily approve or reject students’ submissions. And for the students, a single page where they can submit their photos without logging in so they do not have to deal with the hassle of creating an account and forgetting their passwords.&lt;/p&gt;
&lt;p&gt;It was winter. And new students were supposed to arrive during the spring around January. I started developing the app around November. However, I wanted to build fast, get feedback from navigators, and iterate.&lt;/p&gt;
&lt;p&gt;My initial step was planning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sketching the user interface to get the basic components of the app.&lt;/li&gt;
&lt;li&gt;Think of what kind of data the app will display.&lt;/li&gt;
&lt;li&gt;Design the databases and relationships.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My second step was coding the app’s UI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Focus on minimal UI. Don’t spend time trying to add a hover effect on a button.&lt;/li&gt;
&lt;li&gt;Utilize UI library (I used Material UI) to avoid writing CSS code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The third step was building the prototype to show it to the navigators. I did not even use any database for this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I coded a little bit of Express and &lt;a href=&quot;http://socket.io/&quot;&gt;Socket.IO&lt;/a&gt; for the backend.&lt;/li&gt;
&lt;li&gt;The uploaded image was encoded to base64 and would be sent through the socket.&lt;/li&gt;
&lt;li&gt;On the admin page, I received data sent through the socket and stored it in the browser’s local storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A prototype was made with not much coding!&lt;/p&gt;
&lt;p&gt;After getting feedback and iterating the MVP, it is time to move to the next step: code the complete product! Here are some things I notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To maximize speed, prioritize usability over scalability. In this case, I know my users are a small group of international students and the information I am collecting is not sensitive so there are no reasons to implement a bunch of security measures.&lt;/li&gt;
&lt;li&gt;Pick a tech stack that you are comfortable with to build the product faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the launch, it was thrilling to see people start using what you had built. But problems would arise. For instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Students use different phones. And the app won’t work on some phones or browsers. One thing I remembered was that my website was blocked by WeChat’s in-app browser saying that “&lt;em&gt;This is an insecure website&lt;/em&gt;”.&lt;/li&gt;
&lt;li&gt;Some students want to see their submissions even though they are yet to be approved. So I put a text after they submit to tell them to wait for the approval. However, it was not read or ignored by some students probably because the text was green.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the lesson here is there will always be incompatibility somewhere along the road. And there will be ways to get around with it. Design is important, in this case, text placement, and color.&lt;/p&gt;
&lt;p&gt;In the end, the great thing after all of this is that I gain more experience as a developer, also as a designer. Another thing is, not trying to show off but, I was offered a $500 scholarship for the service.&lt;/p&gt;
&lt;h1 id=&quot;resources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.imkhoi.com/posts/2022/01/lessons-learned-from-developing-an-app-for-my-university/#resources&quot;&gt;&lt;span&gt;Resources&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KhoiUna/glc-apps&quot;&gt;GitHub | Global Lions Community Super App for University of North Alabama&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 24 Jan 2022 00:00:00 +0000</pubDate>
      <dc:creator>Khoi Nguyen</dc:creator>
      <guid>https://blog.imkhoi.com/posts/2022/01/lessons-learned-from-developing-an-app-for-my-university/</guid>
    </item>
  </channel>
</rss>