<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[EF.AI.EL]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://efaiel.com/</link><image><url>https://efaiel.com/favicon.png</url><title>EF.AI.EL</title><link>https://efaiel.com/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Wed, 29 Apr 2026 22:51:51 GMT</lastBuildDate><atom:link href="https://efaiel.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Yet Another Delicious Cornbread Recipe]]></title><description><![CDATA[Cornbread is a near and dear to my heart soul food. Growing up in the southern U.S., I remember having it served along side steaming hot bowls of chili or other stews, and sometimes served with creamy scrambled eggs and bacon for breakfast any time I visited my closest friend's homes.]]></description><link>https://efaiel.com/yet-another-delicious-cornbread-recipe/</link><guid isPermaLink="false">63cbdcba25f9590b7bad852f</guid><category><![CDATA[Food]]></category><dc:creator><![CDATA[Filmore Ha]]></dc:creator><pubDate>Sat, 21 Jan 2023 12:58:20 GMT</pubDate><content:encoded><![CDATA[<p>Cornbread is a near and dear to my heart soul food. Growing up in the southern U.S., I remember having it served along side steaming hot bowls of chili or other stews, and sometimes served with creamy scrambled eggs and bacon for breakfast any time I visited my closest friend&apos;s homes.</p><p>Below you&apos;ll find a recipe for cornbread that I developed after referencing several popular recipes found on online. Many recipes call for liquid buttermilk which is not an ingredient that is readily available where I live, so for this recipe we&apos;re using buttermilk powder and whole milk. If you have access to liquid buttermilk then feel free to use that instead. This is a fairly simple (but delicious!) cornbread, so feel free to use it as a base and customize to your own tastes.</p><h2 id="ingredients">Ingredients</h2><ul><li>150g corn meal</li><li>100g all-purpose or cake flour</li><li>15g cane sugar</li><li>5g salt</li><li>25g buttermilk powder</li><li>1 tsp baking powder</li><li>1/4 tsp baking soda</li><li>1 egg, well beaten</li><li>250ml whole milk</li><li>60-100g butter, melted</li></ul><h2 id="method">Method</h2><ol><li>Pre-heat oven to ~200C (400F).</li><li>In a large bowl, mix the dry ingredients until well combined and set aside.</li><li>In a separate bowl, combine the beaten egg, milk, and two-thirds of the melted butter. Mix well.</li><li>Pour the wet ingredients into the dry ingredients, and stir until just combined and set aside.</li><li>Heat a 26 cm (10 in) cast iron skillet on the stove until very hot.</li><li>Add your remaining butter to the pan and continue heating. If you like, allow the butter to brown.</li><li>Turn off the stove, then pour the batter into the hot pan and shake to even out the batter.</li><li>Bake in the pre-heated oven for up to 30 minutes until golden brown and a tooth pick inserted into the center comes out clean.</li><li>Remove the baked cornbread to a wire rack to cool for a few minutes before slicing and serving.</li></ol>]]></content:encoded></item><item><title><![CDATA[How to set up basic email sending with Ghost and Gmail SMTP]]></title><description><![CDATA[Self-hosted Ghost instances required additional configuration to send emails. Learn how to set up basic email sending for Ghost using Gmail SMTP]]></description><link>https://efaiel.com/how-to-set-up-basic-email-sending-with-ghost-and-gmail-smtp/</link><guid isPermaLink="false">63c24e2825f9590b7bad84ce</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Filmore Ha]]></dc:creator><pubDate>Sat, 14 Jan 2023 07:01:47 GMT</pubDate><content:encoded><![CDATA[<p>I previously wrote about how to <a href="https://efaiel.com/host-a-ghost-blog-on-google-cloud-for-free/">Host a Ghost Blog on Google Cloud for Free</a>. What I wasn&apos;t aware of at the time and didn&apos;t cover in that article is that Ghost requires additional configuration to send emails for user invitations, notifications, and password resets among other things. This article will cover how to set up Ghost to send email through Gmail SMTP.</p><h2 id="smtp-server-vs-smtp-relay">SMTP Server vs SMTP Relay</h2><p>Two options are available for routing email through Gmail. Free Gmail users and Google Workspace users alike can use the standard SMTP Server setup to route email. If you have ever set up Gmail&apos;s <a href="https://support.google.com/mail/answer/7126229?hl=en#zippy=%2Cstep-change-smtp-other-settings-in-your-email-client">Outgoing Mail Server</a> with an email a client, then you should already be familiar with this setup. </p><p>If you are a Workspace user, you additionally have access to <a href="https://apps.google.com/supportwidget/articlehome?hl=en&amp;article_url=https%3A%2F%2Fsupport.google.com%2Fa%2Fanswer%2F176600%3Fhl%3Den&amp;assistant_id=generic-unu&amp;product_context=176600&amp;product_name=UnuFlow&amp;trigger_context=a#smpt-relay-option">SMTP Relay</a> which can be configured to authenticate emails with IP addresses to add an additional layer of security. Whichever method you choose, you&apos;ll first need to generate a dedicated app password.</p><h2 id="generate-an-app-password-for-ghost">Generate an App Password for Ghost</h2><ol><li>Log in to your Gmail or Workspace account, then open <a href="https://myaccount.google.com">https://myaccount.google.com</a> and navigate to <strong>Security &gt; Signing in to Google &gt; App passwords</strong>.</li><li>Click <strong>Select app</strong>, choose &quot;Other&quot;, and provide a name (e.g. Ghost SMTP)</li><li>Click <strong>Generate</strong>, then copy down the password exactly as written and keep it handy.</li></ol><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x26A0;&#xFE0F;</div><div class="kg-callout-text">You will only have once chance to write down the password. If you miss this step or made a mistake, then delete the password and start over.</div></div><h2 id="set-up-smtp-server-for-ghost">Set up SMTP Server for Ghost</h2><p>Login to your VM instance via the <a href="https://cloud.google.com/compute/docs/instances/connecting-to-instance#connect_to_vms">Google Cloud Console</a> by clicking <strong>SSH</strong> in the row of the instance you want to login to.</p><h3 id="configure-ghost-email-settings">Configure Ghost email settings</h3><p>Ghost uses Nodemailer to send emails, and the configuration for Nodemailer can be found in the Ghost <code>config.production.json</code> file.</p><pre><code class="language-bash"># Navigate into your installation direcctory
cd /var/www/your_site_name

# Edit Ghost config
sudo nano config.production.json
</code></pre><p>The ghost configuration file may contain a default mail block. Comment out or remove the default configuration if it exists, an replace it with the following config.</p><pre><code>  &quot;mail&quot;: {
    &quot;from&quot;: &quot;your_email_address&quot;,
    &quot;transport&quot;: &quot;SMTP&quot;,
    &quot;options&quot;: {
      &quot;host&quot;: &quot;smtp.gmail.com&quot;,
      &quot;port&quot;: 587,
      &quot;auth&quot;: {
        &quot;user&quot;: &quot;your_email_address&quot;,
        &quot;pass&quot;: &quot;your_app_password&quot;
      }
    }
  },
</code></pre><p>Save your configuration file and run <code>ghost restart</code> to apply the updated configuration. After Ghost has restarted, open a new Incognito window and point your browser to <code>yourdomain.com/ghost</code> to open the login page. Type in your username and then click <code>Forgot</code> in the password box. If everything was configured correctly, you should receive a password reset email in your inbox.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">After you&apos;ve confirmed that Ghost is able to send transactional emails successfully, be sure to destroy the paper you wrote your password on for security.</div></div><h2 id="optional-send-email-with-smtp-relay">(optional) Send email with SMTP Relay</h2><p>If you use Google Workspace and want to add an additional layer of security, then follow the Workspace Admin instructions to <a href="https://support.google.com/a/answer/2956491?fl=1">set up SMTP Relay</a> for your workspace account.</p><h3 id="configure-smtp-relay-service-settings">Configure SMTP Relay Service Settings</h3><!--kg-card-begin: markdown--><ul>
<li><strong>Allowed Senders:</strong> Select &quot;Only registered Apps Users in my domains&quot;</li>
<li><strong>Authentication:</strong>
<ul>
<li>Check &quot;Only accept mail from the specified IP addresses&quot; and configure it to your VM instance&apos;s external IP address</li>
<li>Check &quot;Require SMTP Authentication&quot;</li>
</ul>
</li>
<li><strong>Encryption:</strong> Check &quot;Require TLS encryption&quot;</li>
</ul>
<!--kg-card-end: markdown--><h3 id="update-ghost-configuration-to-use-smtp-relay">Update Ghost configuration to use SMTP Relay</h3><p>Open your <code>config.production.json</code> file and update the configuration to be similar to the following code block.</p><pre><code>  &quot;mail&quot;: {
    &quot;from&quot;: &quot;your_email_adress&quot;,
    &quot;transport&quot;: &quot;SMTP&quot;,
    &quot;options&quot;: {
      &quot;name&quot;: &quot;your_hostname_or_arbitrary_string&quot;,
      &quot;host&quot;: &quot;smtp-relay.gmail.com&quot;,
      &quot;port&quot;: 587,
      &quot;auth&quot;: {
        &quot;user&quot;: &quot;your_email_address&quot;,
        &quot;pass&quot;: &quot;your_app_password&quot;
      }
    }
  },
</code></pre><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">The default hostname value that Nodemailer sends for EHLO handshake is an <a href="https://insights.rytass.com/gmail-smtp-relay-421-4-7-0-try-again-later-closing-connection-ehlo-cfcdac3cf9c7">invalid value for SMTP Relay</a> and will cause email sending to fail. For this reason we manually set the hostname using the <strong>name</strong> option. I use my instance&apos;s hostname, but it appears any arbitrary string will work.</div></div><p>Once the configuration has been updated, be sure to run the <code>ghost restart</code> command to apply the updated configuration, then try sending yourself another password reset link to make sure that emails can be successfully sent.</p>]]></content:encoded></item><item><title><![CDATA[Untitled No. 1]]></title><description><![CDATA[We should all remember to look up at our surroundings every once in awhile so we don't miss the beauty around us.]]></description><link>https://efaiel.com/untitled-no-1/</link><guid isPermaLink="false">63b9800ea8eccf040bdc73e3</guid><category><![CDATA[Journal]]></category><dc:creator><![CDATA[Filmore Ha]]></dc:creator><pubDate>Sat, 07 Jan 2023 14:48:27 GMT</pubDate><content:encoded><![CDATA[<p>Today marks seven days into 2023. That&apos;s one week down with 51 left to go. 51 weeks from now, what will you remember from your first week in 2023?</p><figure class="kg-card kg-image-card"><img src="https://efaiel.com/content/images/2023/01/motoarakawa-20230107.jpg" class="kg-image" alt loading="lazy" width="1024" height="771" srcset="https://efaiel.com/content/images/size/w600/2023/01/motoarakawa-20230107.jpg 600w, https://efaiel.com/content/images/size/w1000/2023/01/motoarakawa-20230107.jpg 1000w, https://efaiel.com/content/images/2023/01/motoarakawa-20230107.jpg 1024w" sizes="(min-width: 720px) 720px"></figure><p>Today I took a late afternoon stroll along the Moto-Arakawa River that passes through my town. As I strolled along the riverside, the sun was just beginning to set and I was struck by the beauty of the distant landscape. Winter can be so muted and drab, but when the sunlight is just right, the blue of the sky and the green of the grass along the riverbank can be so beautiful and picturesque. It reminded me that we should all remember to look up at our surroundings every once in awhile so we don&apos;t miss these tiny moments of pure beauty.</p>]]></content:encoded></item><item><title><![CDATA[Host a Ghost Blog on Google Cloud Platform for Free]]></title><description><![CDATA[Learn how to host a personal blog for free with Ghost CMS on Google Cloud Platform.]]></description><link>https://efaiel.com/host-a-ghost-blog-on-google-cloud-for-free/</link><guid isPermaLink="false">6363a26a910076126ba1cf55</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Filmore Ha]]></dc:creator><pubDate>Thu, 03 Nov 2022 13:45:32 GMT</pubDate><content:encoded><![CDATA[<p>There are so many ways to get started with a personal blog or website these days. For the majority of users, subscribing to a website-as-a-service provider such as Wix, Squarespace, or the hosted versions of Wordpress or Ghost is an easy and hassle-free way to get started. Others like myself who like to tinker, may instead be interested in serverless options like Github Pages or running their own webserver on a cloud provider such as Digital Ocean, Amazon Web Services (AWS), or Google &#xA0;Cloud Platform (GCP).</p><p>This post documents my personal experience setting up a self-hosted Ghost blog on GCP. At the time of writing Google Cloud offers a free trial that includes $300 USD or local equivalent of credit, which is intended to help you get your feet wet with the platform. In addition to the credit, they also offer a very generous <a href="https://cloud.google.com/free/docs/free-cloud-features">Free Tier</a> which is perfect for hosting a small blog or website.</p><p>Let&apos;s get started.</p><h2 id="register-a-domain">Register a domain</h2><p>Before you do anything else, you&apos;ll need to register a domain name if you haven&apos;t done so already. I personally use and highly recommend Google Domains. However, feel free to use any domain registrar you like. Hover and Name.com are also great options I have used in the past and can recommend.</p><h2 id="set-up-your-free-gcp-account">Set up your free GCP Account</h2><ol><li>Head over to <a href="https://cloud.google.com/free/">https://cloud.google.com/free/</a> to review the offerings and when you&apos;re ready, click &quot;Get started for free&quot; to begin.</li><li>If you&apos;re not already signed in, you&apos;ll be prompted to sign-in to your Gmail account. Agree to the GCP terms and conditions and then continue on to fill in our account and billing details.</li><li>Select the account type according to your needs, fill out the required account &amp; billing information, and finally click &quot;Start my free trial&quot; to complete account creation, after which you&apos;ll be redirected to the GCP Console.</li></ol><h2 id="set-up-an-ubuntu-vm-instance">Set up an Ubuntu VM Instance</h2><p>(optional) By default GCP creates a project for you named &quot;My First Project&quot;. Create a new project or rename the default project to fit your own organizational needs.</p><ul><li>To rename the default project, click &quot;Go to project settings&quot; on the Project Info Card found in the Project Dashboard. On the following screen update the Project Name and click save.</li><li>To create a new project, from the top navbar click the down arrow next to the current projects name and select &quot;New Proejct&quot;. On the next screen, fill in your project name, click &quot;Create&quot;. Once the new project has been successfully created, you&apos;ll receive a convient notification which you can click through to the new projects Dashboard.</li></ul><p>Enable Compute Engine for your project, then click Create Instance and configure a new VM instance with the following settings based on the <a href="https://cloud.google.com/free/docs/free-cloud-features">Free Tier</a> usage limits. Leave the other settings alone unless you know what they do:</p><ul><li>Name: you only have one chance, so name your instance something memorable</li><li>Region: <code>us-west1</code>, <code>us-central1</code>, <code>us-east1</code></li><li>Zone: any for the region you&apos;ve chosen</li><li>Machine Type: <code>e2-micro</code></li><li>Boot Disk</li><li>Operating System: Ubuntu 20.04 LTS or 22.04 LTS (x86/64)</li><li>Disk Type: Standard Persistent Disk</li><li>Disk Size: 30GB</li><li>Firewall: check to enable both <code>Allow HTTP</code> and <code>Allow HTTPS</code> --- by doing this your firewall configuration will be managed via GCP.</li></ul><p>Now that our instance is up and running, it&apos;s time to install and configure Ghost and the necessary software to run it. For the most part we&apos;ll be following the <a href="https://ghost.org/docs/install/ubuntu/">official guide to installing Ghost on Ubuntu</a>, but we&apos;ll be making some changes for use with GCP.</p><h2 id="configure-the-server">Configure the server</h2><p>Login to your new instance via the <a href="https://cloud.google.com/compute/docs/instances/connecting-to-instance#connect_to_vms">Google Cloud Console</a> by clicking <strong>SSH</strong> in the row of the instance you want to login to. Once you&apos;ve logged in, you&apos;ll notice that Google Cloud has already set up a non-root superuser for you, nice!</p><h3 id="update-ubuntu">Update Ubuntu</h3><p>Since this is a fresh install, we should first check for and install any updates available with the following commands.</p><pre><code class="language-bash"># Update package lists
sudo apt-get update

# Update installed packages
sudo apt-get upgrade
</code></pre><h3 id="install-nginx">Install NGINX</h3><p>Run the following command to install NGINX. Since GCP is handling our firewall configuration, we can skip the step to configure <code>ufw</code> documented in the official instructions.</p><pre><code class="language-bash"># Install NGINX and MySQL
sudo apt-get install nginx
</code></pre><p>After installation has finished, confirm that NGINX is running by copying your <strong>external IP address</strong> from the row that corresponds with your instance in the GCP dashboard, and enter it into a new browser window &#xA0;in the following format (note that it should be HTTP, not HTTPS)</p><pre><code>http://your_ip_address
</code></pre><p>If you&apos;re greeted with the default &quot;Welcome to Nginx&quot; splash page, then Nginx has been successfully installed.</p><p>Now that we&apos;ve confirmed NGINX is installed and working, we should disable the default site.</p><pre><code class="language-bash"># Navigate to the Nginx enabled sites directory
cd /etc/nginx/sites-enabled

# Remove default site
sudo rm default

# Restart Nginx
sudo systemctl restart nginx
</code></pre><h3 id="install-and-configure-mysql">Install and configure MySQL</h3><p>Run the following commands to install and start MySQL.</p><pre><code class="language-bash"># Install MySQL
sudo apt-get install mysql-server</code></pre><p>Next we&apos;ll need to secure MySQL by running the <code>mysql_secure_installation</code> script which will walk through a series of prompts to secure the installation. As part of this process, we&apos;ll be asked to set a password for the <strong>root</strong> MySQL user. However, on Ubuntu the <strong>root</strong> MySQL user is not configured to authenticate with a password, which at the time of writing will cause an error to occur preventing us from completing the script. Before we run the script, we&apos;ll need to complete the following steps to manually set a <strong>root</strong> password. If you&apos;re interested to learn more about this problem, <a>Digital Ocean has a handy write up</a> that goes into more detail.</p><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Note: If you ran the script before setting a password, you&apos;ll need to close the console and log back in to proceed.</div></div><p>Open the MySQL shell.</p><pre><code class="language-bash"># Enter MySQL Shell
sudo mysql
</code></pre><p>Run the following <code>ALTER USER</code> command to change the <strong>root</strong> user&apos;s authentication method and set a password.</p><pre><code class="language-mysql"># Set a root password and temporarily change the authentication method
ALTER USER &apos;root&apos;@&apos;localhost&apos; IDENTIFIED WITH mysql_native_password BY &apos;password&apos;;

# Exit MySQL shell
exit
</code></pre><p>Next, run the <code>mysql_secure_installation</code> script and follow the prompts.</p><pre><code class="language-bash"># Run mysql_secure_installation
sudo mysql_secure_installation
</code></pre><p>If this is your first time running the script, you&apos;ll first be asked whether you want to install the Validate Password Plugin which will provide feedback on the strength of your password.</p><p>Next you&apos;ll be asked whether you want to change the <strong>root</strong> password. Select <code>N</code> here since we&apos;ll be reseting the authentication method later. Finally select <code>Y</code> for the following prompts to secure the installation and complete the script.</p><p>After securing the installation, open the MySQL shell again and reset the <strong>root</strong> MySQL user&apos;s authentication method back to the default setting.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Hold your horses! Disabling password authentication for the root user here will cause database configuration to fail during the Ghost installation process. Come back to this step after you finish installing and setting up Ghost.</div></div><pre><code class="language-bash"># Open the MySQL prompt as the root using the password we set earlier
sudo mysql -u root -p
</code></pre><pre><code class="language-mysql"># Reset the authentication method back to auth_socket
ALTER USER &apos;root&apos;@&apos;localhost&apos; IDENTIFIED WITH auth_socket;

# Exit MySQL shell
exit</code></pre><h3 id="install-nodejs">Install Node.js</h3><p>At the time of writing, Ghost requires either Node v14 or v16, with the latter being recommended. I had issues installing Ghost using v16 --- the installation would process would hang --- and instead switched to v14 which worked without any issues.</p><pre><code class="language-bash"># Make sure we&apos;re in our Home Directory
cd ~

# Add the NodeSource APT repository for Node 14
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash

# Install Node.js
sudo apt-get install -y nodejs</code></pre><h3 id="install-ghost-cli">Install Ghost-CLI</h3><p>Now that we have Node installed, we can use <code>npm</code> to install the Ghost-CLI which will help us install and configure Ghost.</p><pre><code class="language-bash">sudo npm install ghost-cli@latest -g
</code></pre><h2 id="install-and-configure-ghost">Install and configure Ghost</h2><p>Now that we have the necessary software packages installed, we can proceed with installing and configuring Ghost. For this process, we&apos;re can simply follow the <a href="https://ghost.org/docs/install/ubuntu/#install-ghost">official instructions</a>. Be sure to replace <code>your_site_name</code> and <code>your_user_name</code> with your own values.</p><p>Note: Your username can be found in the console to the left of the prompt in the following format: <code>your_user_name@your_instance</code></p><pre><code class="language-bash"># Create an installation directory with correct user and permissions
cd ~
sudo mkdir -p /var/www/your_site_name
sudo chown your_user_name:your_user_name /var/www/your_site_name
sudo chmod 775 /var/www/your_site_name
</code></pre><p>Finally run the <code>ghost install</code> command.</p><pre><code class="language-bash"># Navigate into your installation direcctory
cd /var/www/your_site_name

# Install Ghost
ghost install
</code></pre><p>The installation process can take awhile, so sit back and relax. After the files have been downloaded, the installation process will kick off a series of questions to help you configure your site:</p><ul><li>Blog URL: enter <code>your_domain_name</code> including either HTTP or HTTPS</li><li>MySQL Host Name: press enter to accept <code>localhost</code> unless you have a different setup</li><li>MySQL User / Pass: enter <code>root</code> and the associated password --- this will be used to create the new database and setup a specific user for the database</li><li>Ghost database name: press enter and let Ghost set this up</li><li>Set up a ghost MySQL user: yes</li><li>Set up Nginx: press enter to accept and let Ghost handle this. you can customize the configuration later if you need to</li><li>Set up SSL: If you entered an HTTPS domain name earlier, then you can let Ghost setup SSL for you using acme.sh (LetsEncrypt)</li><li>Set up systemd: yes</li><li>Start Ghost: yes</li></ul><p>If you ran into any issues during this process, you can always rerun <code>ghost setup</code> to reconfigure the installation. If you disabled password authentication for the root MySQL user earlier, you probably ran into an issue setting up the Ghost MySQL user. Refer back to the MySQL installation step to re-enable password authentication and then rerun <code>ghost setup</code> to reconfigure your site.</p><p>That&apos;s it! You&apos;ve successfully installed Ghost on Google Cloud Platform. Now just point your browser to <code>yourdomain.com/ghost</code> to create a user and start writing! </p>]]></content:encoded></item><item><title><![CDATA[Why I bought an M1 Macbook Air instead of waiting for the new M2 version]]></title><description><![CDATA[<p><em>tl;dr -- I personally don&apos;t think the new design and slight performance boost are worth the extra cost and would rather spend the extra money on memory and storage that I will actually need.</em></p><p>Around the end of May 2022, I began looking into replacing my aging</p>]]></description><link>https://efaiel.com/why-i-bought-an-m1-macbook-air-instead-of-waiting-for-the-new-m2-version/</link><guid isPermaLink="false">6363a26a910076126ba1cf53</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[Filmore Ha]]></dc:creator><pubDate>Sat, 09 Jul 2022 13:23:15 GMT</pubDate><content:encoded><![CDATA[<p><em>tl;dr -- I personally don&apos;t think the new design and slight performance boost are worth the extra cost and would rather spend the extra money on memory and storage that I will actually need.</em></p><p>Around the end of May 2022, I began looking into replacing my aging mid-2012 Macbook Pro. A week or so later Apple announced their new M2 Macbook models at WWDC 2022, after which I spent several days considering whether or not to wait for the new machines. Ultimately I opted instead for M1 Macbook Air and put the cost savings towards more memory and storage.</p><h2 id="what-i%E2%80%99m-using-it-for">What I&#x2019;m using it for</h2><p>I&apos;ve resisted replacing my old Macbook Pro with a newer model for a long time. The main reason being that I couldn&apos;t justify the cost --- Apple hardware is expensive! --- compared with what I was actually using the laptop for. At one point, I switched over to a Windows laptop because it was more affordable and allowed me to do some gaming, and ended up relegating my aging Macbook to being experiment machine and &#xA0;family computer.</p><p>Recently however, I made the decision to commit time to deepening my knowledge of coding / app development. I&apos;m also starting my journey to build a <a href="https://fortelabs.co/blog/basboverview/">Second Brain</a> to manage the random tidbits that I come across through my daily life, after reading about the concept for the first time on <a href="https://aliabdaal.com/building-a-second-brain/">Ali Abdal&apos;s blog</a>. While these things don&apos;t exactly necessitate the use of a Mac or even the latest hardware, I plan to work with Xcode and dig into the fancy new features that were released with iOS / iPadOS 14+ which does require hardware capable of supporting the latest versions of Xcode.</p><h2 id="why-i-chose-the-m1-instead-of-the-m2">Why I chose the M1 instead of the M2</h2><p>At WWDC Apple announced that the new M2 chips promise up to 18% more performance than the M1, but I personally don&apos;t think this extra boost is going to be noticeable in my everyday usage. Given how well the M1 already performs and based on my own computing needs, I wager the small boost would be negligible unless you use very specific applications or do work that would take full advantage of the chip. For myself, I&apos;m mostly experimenting with code and writing, and will likely not even take full advantage of the M1 chip&apos;s performance. That said, from a more simplisic point of view, I am upgrading from a very old Intel based Macbook, so technically any new hardware is going to feel faster comparatively.</p><p>On the design end, the new body design of the M2 Macbook Air is very beautiful, and with the inclusion of Magsafe it is a bit more functional now that both USB ports can be used. The icing on the cake for many people may also be the slightly brighter screen and slightly larger display, as well as the inclusion of four speakers to support spatial audio. While these things are all great to have, for myself these bells and whistles aren&apos;t justified by the extra cost because they simply are not that important to me. I&apos;m not a graphic designer or photographer, nor do I really consume any media on my laptop --- even if I did I&apos;d normally have earbuds or headphones on --- so the bigger, brighter screen and swanky speaker setup don&apos;t add much value for me. And while charging by Magsafe is great, the battery life of the Macbook Air is so long that I don&apos;t actually need to keep it plugged in so both my USB ports are already available when I need them. This leaves me with just the new body design as the only major difference that might matter, but it&apos;s one that I can&apos;t justify paying more for.</p><p>Since the minor boost in performance and the new design were not important to me, I instead chose to go with the existing M1 model and to invest my money into more storage and memory. I plan to keep this new laptop for a long time, so maxing the memory and increasing storage only made sense. After pricing out my options and making a decision, I was able to purchase an 8 core GPU M1 Macbook Air equipped with 16GB memory and 1TB of storage from a local retailer for less than the cost of an equivalently spec&apos;d 7 core GPU M1 model which is now the only M1 model available direct from Apple.</p><p>At the time of this posting, the M2 Macbook Pro has been out for a few weeks and the M2 Macbook Air is now available to order. I&apos;m looking forward to reading about how they perform, but I&apos;m very happy with my decision to go with the M1. It&apos;s a fantastic little machine.</p>]]></content:encoded></item></channel></rss>