<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>nathan liu · blog</title>
    <link>https://nathanliu.dev/blog</link>
    <description>notes on data, classes, cameras, and matcha.</description>
    <language>en</language>
    <atom:link href="https://nathanliu.dev/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>quotes i live by</title>
      <link>https://nathanliu.dev/blog/inspirational</link>
      <guid>https://nathanliu.dev/blog/inspirational</guid>
      <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
      <description>Inpsirational quotes that I think about till the end of time</description>
      <content:encoded><![CDATA[<h2>My Top 5 Quotes</h2>
<ol>
<li><p>Your life isn&#39;t yours if you make it about what other people think</p>
</li>
<li><p>A pawn can become anything if it keeps moving forward</p>
</li>
<li><p>Never thought I couldn&#39;t</p>
</li>
<li><p>Killing time, murdering opportunities</p>
</li>
<li><p>A smooth sea never made a skilled sailor</p>
</li>
</ol>
]]></content:encoded>
      <category>life</category>
      <category>quotes</category>
      <category>random</category>
    </item>
    <item>
      <title>ranking and rating every class i took at uc berkeley</title>
      <link>https://nathanliu.dev/blog/berkeley-classes</link>
      <guid>https://nathanliu.dev/blog/berkeley-classes</guid>
      <pubDate>Thu, 20 Aug 2026 12:00:00 GMT</pubDate>
      <description>An honest review, rating matrix, and breakdown of every Computer Science, Data Science, Statistics, and Physics course I completed at Cal (Class of 2026).</description>
      <content:encoded><![CDATA[<p>During my four years at <strong>UC Berkeley</strong> studying <strong>Computer Science &amp; Data Science</strong>, I took over 20 rigorous technical courses spanning software systems, machine learning theory, data engineering pipelines, advanced probability, and physics.</p>
<p>Berkeley courses have a notorious reputation for intense problem sets, massive 40-hour projects, and brutal exams. Now that I&#39;ve graduated (Class of 2026, 3.70 GPA), I wanted to look back and give an honest, unvarnished review and rating of every single class I completed—including difficulty, workload, key takeaways, and whether they were worth the grind.</p>
<h2>Quick Summary Matrix</h2>
<p>Here is the breakdown across all courses grouped and ordered as in my academics section:</p>
<table>
<thead>
<tr>
<th align="left">Category</th>
<th align="left">Course</th>
<th align="left">Title</th>
<th align="left">Rating</th>
<th align="left">Difficulty</th>
<th align="left">Workload</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Computer Science</strong></td>
<td align="left"><strong>CS 61A</strong></td>
<td align="left">Structure &amp; Interpretation of Programs</td>
<td align="left"><strong>9/10</strong></td>
<td align="left">7/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 61B</strong></td>
<td align="left">Data Structures</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">9/10</td>
<td align="left">9/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 61C</strong></td>
<td align="left">Computer Architecture</td>
<td align="left"><strong>8/10</strong></td>
<td align="left">7/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 161</strong></td>
<td align="left">Computer Security</td>
<td align="left"><strong>8/10</strong></td>
<td align="left">7/10</td>
<td align="left">9/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 162</strong></td>
<td align="left">Operating Systems &amp; Systems Programming</td>
<td align="left"><strong>9/10</strong></td>
<td align="left">9/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 170</strong></td>
<td align="left">Algorithms &amp; Intractable Problems</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">10/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 186</strong></td>
<td align="left">Database Systems</td>
<td align="left"><strong>9/10</strong></td>
<td align="left">8/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 188</strong></td>
<td align="left">Artificial Intelligence</td>
<td align="left"><strong>7/10</strong></td>
<td align="left">6/10</td>
<td align="left">6/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 189</strong></td>
<td align="left">Machine Learning</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">10/10</td>
<td align="left">10/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>CS 198</strong></td>
<td align="left">Web Development DeCal</td>
<td align="left"><strong>5/10</strong></td>
<td align="left">2/10</td>
<td align="left">2/10</td>
</tr>
<tr>
<td align="left"><strong>Data Science</strong></td>
<td align="left"><strong>DATA 8</strong></td>
<td align="left">Foundations of Data Science</td>
<td align="left"><strong>8/10</strong></td>
<td align="left">4/10</td>
<td align="left">5/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>DATA 100</strong></td>
<td align="left">Principles of Data Science</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">6/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>DATA C101</strong></td>
<td align="left">Data Engineering</td>
<td align="left"><strong>9/10</strong></td>
<td align="left">7/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>DATA C104</strong></td>
<td align="left">Human Contexts &amp; Ethics of Data</td>
<td align="left"><strong>4/10</strong></td>
<td align="left">5/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>DATA 140</strong></td>
<td align="left">Probability for Data Science</td>
<td align="left"><strong>7/10</strong></td>
<td align="left">10/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"><strong>Engineering &amp; Analytics</strong></td>
<td align="left"><strong>EECS 127</strong></td>
<td align="left">Optimization Models in Engineering</td>
<td align="left"><strong>7/10</strong></td>
<td align="left">10/10</td>
<td align="left">8/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>INFO 159</strong></td>
<td align="left">Natural Language Processing</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">7/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>IEOR 162</strong></td>
<td align="left">Linear Programming &amp; Network Flows</td>
<td align="left"><strong>5/10</strong></td>
<td align="left">6/10</td>
<td align="left">6/10</td>
</tr>
<tr>
<td align="left"><strong>Physics</strong></td>
<td align="left"><strong>PHYSICS 7A</strong></td>
<td align="left">Mechanics &amp; Waves</td>
<td align="left"><strong>7/10</strong></td>
<td align="left">8/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>PHYSICS 7B</strong></td>
<td align="left">Electricity, Magnetism &amp; Thermodynamics</td>
<td align="left"><strong>7/10</strong></td>
<td align="left">10/10</td>
<td align="left">7/10</td>
</tr>
<tr>
<td align="left"></td>
<td align="left"><strong>PHYSICS 7C</strong></td>
<td align="left">Waves, Optics, Relativity &amp; Quantum</td>
<td align="left"><strong>10/10</strong></td>
<td align="left">8/10</td>
<td align="left">7/10</td>
</tr>
</tbody></table>
<h2>Top 5 Recommendations for Cal CS/DS Students</h2>
<ol>
<li><strong>CS 170 (Algorithms):</strong> Do not graduate without taking this. Essential for developing structured problem-solving intuition and succeeding in technical interviews. Even if you can learn yourself, makes life easier by starting somewhere.</li>
<li><strong>CS 189 (Introduction to ML):</strong> Getting your foot through the door, learning the basics in today&#39;s age.</li>
<li><strong>DATA C101 (Data Engineering):</strong> Hands-on experience with modern big data pipelines (Spark, streaming, distributed architectures).</li>
<li><strong>DATA 140 (Probability):</strong> The best math/probability course offered at Berkeley (there are alternatives).</li>
<li><strong>DATA 100 (Data Science):</strong> The class I actually learned and enjoyed taking the most.</li>
</ol>
<p>Overall, the Berkeley curriculum pushed me beyond what I thought I was capable of. The combination of deep theoretical rigor with large-scale systems implementation gave me the confidence to design, debug, and ship complex software in any domain. But learning in school is barely enough for real job applications and interviews. You have to network through clubs, hackathons, research, etc. But overall, Berkeley was an amazing experience that I would not trade for anything.</p>
]]></content:encoded>
      <category>uc berkeley</category>
      <category>course reviews</category>
      <category>academics</category>
    </item>
    <item>
      <title>ranking every matcha i tried!</title>
      <link>https://nathanliu.dev/blog/matcha</link>
      <guid>https://nathanliu.dev/blog/matcha</guid>
      <pubDate>Thu, 20 Aug 2026 12:00:00 GMT</pubDate>
      <description>Matcha this, matcha that. I love matcha, so here is every matcha I have tried.</description>
      <content:encoded><![CDATA[<p>Matcha. The taste of grass, I love it. Here is every place I have tried and my thoughts.</p>
<h2>My Top 5</h2>
<p>(Updated September 21, 2026)</p>
<ol>
<li>Airoma Cafe (Fountain Valley, CA): Matcha Einspanner -&gt; big cup and actually tastes the matcha</li>
<li>Brew Story (Huntington Beach, CA): Banana Cream Matcha -&gt; actually really good, decent cup, good flavors, strong matcha</li>
<li>Matsu Matcha (Cupertino, CA): Biscoff Matcha -&gt; best biscoff matcha (i love biscoff)</li>
<li>Community Goods (Los Angeles, CA): Rocky&#39;s Matcha -&gt; probably tastes the best but cups are a scam</li>
<li>Da Vien (Milpitas): Banana Matcha -&gt; was my go to, good value, big cup</li>
</ol>
<h2>My Bottom 5</h2>
<ol start="5">
<li>Starbucks (Anywhere) -&gt; last resort, decent after recipe change</li>
<li></li>
<li></li>
<li></li>
<li>La La Land (Glendale) -&gt; actually nasty</li>
</ol>
<h3>Airoma Cafe - Fountain Valley, CA (5/5)</h3>
<p>Actually too good of a cup. Worth the 10 minute line wait, the drive to LA, and the price.</p>
<h3>Brew Story - Huntington Beach, CA (4.9/5)</h3>
<p>Actually really good, decent cup, good flavors, strong matcha.</p>
<h3>Matsu Matcha - Cupertino, CA (4.6/5)</h3>
<p>Best biscoff matcha (i love biscoff).</p>
<h3>Community Goods - Los Angeles, CA (4.6/5)</h3>
<p>Probably tastes the best but cups are a scam.</p>
<h3>Da Vien - Milpitas, CA (4/5)</h3>
<p>Was my go to, good value, big cup.</p>
<h2>Berkeley</h2>
<h3>8 Gram Matcha - Berkeley, CA (4/5)</h3>
<p>Best in Berkeley for matcha.</p>
<h3>Binge Coffee House - Berkeley (Telegraph), CA (3/5)</h3>
<p>Earl grey matcha + biscoff only good drink, better than 8 gram if you like flavored matcha.</p>
<h3>De Matcha - Berkeley, CA (2.5/5)</h3>
<p>Was good for a few months, not the baseline it used to be. But heard it got better, have yet to try again.</p>
<h3>Yume Mori - Berkeley, CA (3/5)</h3>
<p>Good but cups are a scam.</p>
<h2>Livermore + Dublin + Pleasanton</h2>
<h3>Junbi Matcha - Livermore, CA (3.5/5)</h3>
<p>Good flavors, one of the better franchise matcha places.</p>
<h3>Boba Bliss - Dublin, CA (3/5)</h3>
<p>Milky matcha, but I do like their other drinks.</p>
<h3>Macchi - Pleasanton, CA (3/5)</h3>
<h2>San Francisco</h2>
<h3>Tadaima Mission - San Francisco, CA (3/5)</h3>
<p>Okay.</p>
<h3>Matcha Cafe Maiko - San Francisco, CA</h3>
<h3>Nagomi - San Francisco, CA</h3>
<h3>Kiss of Matcha - San Francisco, CA</h3>
<h3>Q Specialty Coffee - San Francisco, CA</h3>
<h2>San Jose + Milpitas</h2>
<h3>Academic Coffee - San Jose, CA (2.5/5)</h3>
<p>Best nextdoor to SJSU, but still not great, was good tho.</p>
<h3>Lacaphe - San Jose, CA (3.5/5)</h3>
<p>Good but not great.</p>
<h3>Izumi Matcha - San Jose, CA (2.5/5)</h3>
<p>Was the best, fell off, not the baseline.</p>
<h3>Aroma - San Jose, CA (4.8/5)</h3>
<p>Might be the best in San Jose.</p>
<h3>Maruwu Seicha - San Jose, CA</h3>
<h3>Matcha Matcha - San Jose, CA</h3>
<h3>Ceré Tea - San Jose, CA</h3>
<h3>UG Tea - Milpitas, CA (3.5/5)</h3>
<p>Decent. But really good cookie butter matcha smoothie.</p>
<h2>Los Angelos + Orange County</h2>
<h3>rōk coffee and tea - Los Angeles, CA (4/5)</h3>
<p>One of the best matchas, but one of the smallest cups ever.</p>
<h3>Stagger</h3>
<h3>ToroTea</h3>
<h3>La La Land - Glendale, CA (1/5)</h3>
<p>Save your soul but, I did hear they updated their recipe.</p>
<h2>Las Vegas</h2>
<h3>Hatoya Las Vegas - Las Vegas, NV (2/5)</h3>
<p>Most expensive matcha I tried ($15), not worth it.</p>
<h3>Urban Matcha - Las Vegas, NV (4/5)</h3>
<p>Good matcha, good price in Vegas.</p>
<h3>More to come....</h3>
]]></content:encoded>
      <category>food</category>
      <category>matcha</category>
      <category>drink</category>
    </item>
    <item>
      <title>building an event-driven market pipeline with vector search</title>
      <link>https://nathanliu.dev/blog/market-pipeline</link>
      <guid>https://nathanliu.dev/blog/market-pipeline</guid>
      <pubDate>Mon, 01 Jun 2026 12:00:00 GMT</pubDate>
      <description>An event-driven data pipeline using zero-shot extraction, vector embeddings, and clustering to process financial news into deduplicated market intelligence.</description>
      <content:encoded><![CDATA[<h2>The Noise in Financial Streams</h2>
<p>In financial intelligence, timing is everything—but volume is the enemy. When a major company reports quarterly earnings, announces an executive departure, or faces a regulatory inquiry, hundreds of news syndicates, RSS feeds, and social accounts publish nearly identical headlines within seconds.</p>
<p>Traditional keyword-based filtering breaks down quickly here. Exact-string matching misses reworded headlines, while basic keyword alerts flood analysts with overwhelming duplicate noise. To solve this, I designed an event-driven streaming pipeline that ingests raw financial news, extracts structured entities on the fly, and uses high-dimensional vector search to deduplicate breaking market stories into unified events.</p>
<h2>Pipeline Architecture Overview</h2>
<p>The system operates as an asynchronous, event-driven pipeline composed of three distinct stages:</p>
<ul>
<li><strong>Ingestion &amp; Normalization:</strong> Real-time streaming consumers pull raw news feeds, clean boilerplate markup, and normalize timestamps and author metadata.</li>
<li><strong>Zero-Shot Entity Extraction:</strong> Lightweight transformer models parse unstructured headline and body text to extract structured financial entities (tickers, monetary figures, sentiment indicators, and event categories).</li>
<li><strong>Semantic Deduplication &amp; Clustering:</strong> Dense vector embeddings are generated for incoming articles and queried against a rolling vector index to cluster related stories into a single canonical event.</li>
</ul>
<h2>Why Lexical Matching Fails: The Power of Vector Embeddings</h2>
<p>Consider two headlines published two minutes apart:</p>
<blockquote>
<p>&quot;Federal Reserve increases benchmark rate by 25 basis points amidst inflation concerns.&quot;</p>
<p>&quot;Fed hikes interest rates 0.25% as price pressures persist.&quot;</p>
</blockquote>
<p>Lexical approaches like Levenshtein edit distance or BM25 struggle because the token overlap is minimal (e.g., &quot;increases&quot; vs. &quot;hikes&quot;, &quot;25 basis points&quot; vs. &quot;0.25%&quot;, &quot;inflation concerns&quot; vs. &quot;price pressures&quot;).</p>
<p>By transforming each headline into a dense vector embedding, semantic concepts are mapped to nearby coordinates in vector space. Measuring cosine similarity between the incoming document embedding <code>u</code> and existing cluster centroids <code>v</code> enables the system to detect identical events regardless of vocabulary variation:</p>
<pre><code class="language-python"># Computing cosine similarity in embedding space
similarity = np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
if similarity &gt;= SIMILARITY_THRESHOLD:
    merge_into_event_cluster(incoming_article, cluster_id)
</code></pre>
<h2>Dynamic Rolling Window Clustering</h2>
<p>Market news has strong temporal locality: two stories about rate hikes from today belong to the same event, but a rate hike from six months ago does not. The pipeline implements a time-decayed vector index that clusters incoming articles within a sliding 6-to-12-hour window.</p>
<p>When an incoming article scores above the similarity threshold with an existing cluster, it is attached as an additional source citation. The canonical event&#39;s aggregate sentiment, confidence score, and key entities update incrementally in real time.</p>
<h2>Key Takeaways &amp; What&#39;s Next</h2>
<p>Building this pipeline reinforced several core principles in data engineering:</p>
<ul>
<li><strong>Decouple Extraction from Indexing:</strong> Asynchronous message queues between entity extraction and vector indexing prevent embedding generation bottlenecks from dropping incoming stream events.</li>
<li><strong>Index Sharding by Ticker:</strong> Pre-filtering vector search candidate spaces by extracted ticker symbols drastically reduces nearest-neighbor search latency.</li>
</ul>
<p>Next steps include experimenting with quantization techniques to reduce vector memory footprint and implementing automated real-time alert generation via webhooks.</p>
]]></content:encoded>
      <category>data engineering</category>
      <category>vector search</category>
      <category>nlp</category>
    </item>
    <item>
      <title>from tf-idf to bert: lessons from clickbait classifier</title>
      <link>https://nathanliu.dev/blog/clickbait-classifier</link>
      <guid>https://nathanliu.dev/blog/clickbait-classifier</guid>
      <pubDate>Sat, 28 Mar 2026 12:00:00 GMT</pubDate>
      <description>Fine-tuning a BERT classifier on 18K news titles to achieve 0.89 F1, outperforming TF-IDF by +0.14 points. Lessons in NLP, error analysis, and evaluation.</description>
      <content:encoded><![CDATA[<h2>The Anatomy of Clickbait</h2>
<p>Clickbait headlines are engineered to exploit cognitive curiosity gaps. Whether withholding crucial details (<em>&quot;You won&#39;t believe what happened next...&quot;</em>), leveraging exaggerated superlatives (<em>&quot;The most mind-blowing discovery ever...&quot;</em>), or using emotionally manipulative punctuation, clickbait thrives in the gray area between informative journalism and sensationalism.</p>
<p>During my machine learning work, I wanted to explore how well modern transformer architectures can differentiate authentic news headlines from manipulative clickbait compared to classical statistical NLP methods.</p>
<h2>The Baseline: TF-IDF + Logistic Regression</h2>
<p>Before jumping into heavy deep learning models, establishing a solid baseline is essential. I started by training a standard TF-IDF (Term Frequency-Inverse Document Frequency) vectorizer paired with a regularized Logistic Regression classifier across unigrams and bigrams:</p>
<ul>
<li><strong>Strength:</strong> Extremely fast training (&lt; 2 seconds) and high interpretability via feature importance coefficients. Obvious buzzwords (like &quot;SHOCKING&quot;, &quot;UNBELIEVABLE&quot;, &quot;THIS REASON&quot;) were quickly flagged with large positive weights.</li>
<li><strong>Weakness:</strong> Suffered from a total blindness to word order and syntax. Phrasing like <em>&quot;Why Scientists Are Shocked by New Battery Data&quot;</em> (legitimate report) versus <em>&quot;You Will Be Shocked by This Trick&quot;</em> (clickbait) received similar token representations.</li>
<li><strong>Baseline Performance:</strong> Achieved ~0.75 F1 score and 82% accuracy on the test set.</li>
</ul>
<h2>Fine-Tuning BERT for Sequence Classification</h2>
<p>To capture bidirectional context, sentence structure, and subtle semantic cues, I fine-tuned <code>bert-base-uncased</code> on a curated dataset of over 18,000 labeled social news headlines using PyTorch and HuggingFace Transformers.</p>
<pre><code class="language-python">from transformers import BertForSequenceClassification, AdamW

model = BertForSequenceClassification.from_pretrained(
    &#39;bert-base-uncased&#39;,
    num_labels=2,
    hidden_dropout_prob=0.3
)
optimizer = AdamW(model.parameters(), lr=2e-5, weight_decay=0.01)
</code></pre>
<p>Key training configurations included:</p>
<ul>
<li><strong>Learning Rate Warmup:</strong> Linear warmup over the first 10% of training steps followed by cosine decay, preventing destructive gradient updates to pre-trained weights.</li>
<li><strong>Dropout Regularization:</strong> Set hidden dropout to 0.3 to prevent overfitting on specific recurring publisher keywords.</li>
<li><strong>Stratified Split:</strong> Evaluated on a strictly held-out 20% test partition with balanced positive/negative clickbait distributions.</li>
</ul>
<h2>Results &amp; Error Analysis</h2>
<p>The fine-tuned BERT model reached <strong>0.89 F1</strong> and <strong>91% accuracy</strong> on the held-out test set, representing a massive <strong>+0.14 F1 point improvement</strong> over the baseline:</p>
<table>
<thead>
<tr>
<th align="left">Model</th>
<th align="left">Precision</th>
<th align="left">Recall</th>
<th align="left">F1 Score</th>
<th align="left">Accuracy</th>
</tr>
</thead>
<tbody><tr>
<td align="left">TF-IDF + Logistic Reg.</td>
<td align="left">0.78</td>
<td align="left">0.72</td>
<td align="left">0.75</td>
<td align="left">82.1%</td>
</tr>
<tr>
<td align="left"><strong>BERT (Fine-Tuned)</strong></td>
<td align="left"><strong>0.90</strong></td>
<td align="left"><strong>0.88</strong></td>
<td align="left"><strong>0.89</strong></td>
<td align="left"><strong>91.4%</strong></td>
</tr>
</tbody></table>
<p>Examining misclassified examples revealed intriguing edge cases:</p>
<ul>
<li><strong>Satire and Parody:</strong> Headlines from satirical outlets often mimic sensationalist structures while discussing real events, occasionally tripping up the classifier.</li>
<li><strong>Question-Formatted Headlines:</strong> Legitimate scientific inquiries formatted as questions (<em>&quot;Can Solar Geoengineering Reverse Warming?&quot;</em>) were sometimes flagged due to structural similarity to baiting questions.</li>
</ul>
<h2>Key Takeaways</h2>
<p>Fine-tuning pre-trained language models shines brightest when syntactic nuance and context outweigh raw keyword frequency. The jump in performance demonstrated that understanding <em>how</em> words are structured together is critical when classifying subjective linguistic phenomena like clickbait.</p>
]]></content:encoded>
      <category>machine learning</category>
      <category>nlp</category>
      <category>bert</category>
    </item>
    <item>
      <title>why my fujifilm x100vi</title>
      <link>https://nathanliu.dev/blog/fujifilm-x100vi</link>
      <guid>https://nathanliu.dev/blog/fujifilm-x100vi</guid>
      <pubDate>Wed, 12 Nov 2025 12:00:00 GMT</pubDate>
      <description>Comparing the tactile shooting experience, film simulations (Classic Chrome, Reala Ace), and the discipline of a fixed 23mm F2 lens versus computational smartphones.</description>
      <content:encoded><![CDATA[<h2>Friction as a Creative Tool</h2>
<p>Modern smartphones are marvels of computational engineering. With multi-frame HDR stacking, instant neural semantic rendering, and aggressive sharpening, your phone will almost never produce a technically &quot;underexposed&quot; image. It makes taking a picture effortless.</p>
<p>Yet, somewhere in that frictionless convenience, photography can lose its soul. When taking a photo requires only tapping a glass screen, you often stop looking at light and start capturing digital records. Carrying a dedicated camera like the <strong>Fujifilm X100VI</strong> brings back intentionality: friction becomes the catalyst for observation.</p>
<h2>The Tactile Joy of Dedicated Physical Dials</h2>
<p>What makes the X100VI special isn&#39;t just its 40.2-megapixel X-Trans V sensor—it&#39;s the physical, analog-inspired interface. There are no mode dials or nested touchscreen menus to change basic exposure parameters. Everything is mechanical:</p>
<ul>
<li>A knurled physical aperture ring on the fixed lens barrel.</li>
<li>A dedicated shutter speed dial with positive click detents.</li>
<li>A physical ISO dial integrated into the shutter collar.</li>
<li>A dedicated exposure compensation wheel under your right thumb.</li>
</ul>
<p>Adjusting these physical controls builds muscle memory. You look at a scene, gauge the ambient sunset light over the Berkeley hills or a neon-lit crosswalk in Shibuya, adjust your dials before ever lifting the camera to your eye, and compose with purpose.</p>
<h2>The Discipline of a Fixed Lens: Fujinon 23mm F2.0</h2>
<p>The defining characteristic of the X100VI is its built-in, non-interchangeable <strong>Fujinon 23mm F2.0 II fixed lens</strong> (a 35mm full-frame equivalent field of view). In an era of multi-lens zoom setups, choosing a fixed prime lens is liberating:</p>
<ul>
<li><strong>No Gear Paralysis:</strong> You never waste time agonizing over which lens to bring or swap mid-street. You master one focal length completely.</li>
<li><strong>Zooming with Your Feet:</strong> A fixed perspective forces you to move physically within your environment, shifting your distance and height to discover unique framing angles.</li>
<li><strong>True Optical Character:</strong> The fast F2.0 aperture delivers gradual optical depth falloff, organic micro-contrast, and a nearly silent leaf shutter that allows high-speed flash sync up to 1/4000s.</li>
</ul>
<h2>Color Science and In-Camera Film Simulation Recipes</h2>
<p>One of the biggest reasons I love the Fujifilm ecosystem is its legendary color science, rooted in over 85 years of photographic film manufacturing. Instead of flat RAW files that demand hours in Lightroom, the X100VI lets you craft custom film recipes directly in-camera:</p>
<ul>
<li><strong>Classic Chrome &amp; Reala Ace:</strong> Muted saturation with deep shadow contrast and accurate, rich skin tones.</li>
<li><strong>Acros Mono:</strong> Rich monochrome tonality with smooth tonal gradation and realistic grain simulation.</li>
<li><strong>Custom Highlights &amp; Shadows:</strong> Adjusting tone curves and color chrome effects produces ready-to-share JPEGs straight from the SD card.</li>
<li><strong>Built-in 4-Stop ND Filter:</strong> Allows shooting wide open at F2.0 even under harsh California midday sun without overexposing.</li>
</ul>
<h2>Reflections from the Street</h2>
<p>Whether capturing golden hour across the California coast or the bustling rhythm of urban transit, shooting with the X100VI transforms the creative process. It forces you to slow down, anticipate moments before they happen, and find beauty in the subtle interplay of light and shadow.</p>
<p>Check out some of my favorite shots on the <a href="/photography">Photography</a> page to see the X100VI in action!</p>
]]></content:encoded>
      <category>photography</category>
      <category>fujifilm</category>
      <category>design</category>
    </item>
    <item>
      <title>my gym routine</title>
      <link>https://nathanliu.dev/blog/gym</link>
      <guid>https://nathanliu.dev/blog/gym</guid>
      <pubDate>Wed, 28 May 2025 12:00:00 GMT</pubDate>
      <description>My weekly gym routine, tracking consistency, personal milestones, and how working out helps clear my head from coding.</description>
      <content:encoded><![CDATA[<h2>Clearing My Mind Through Movement</h2>
<p>Ever since high school, health was not a priority. But over the many years the gym has been my second home. To me, the gym was a place of mental clarity. Away from school work, grades, and other obligations, the gym was a space where I could just focus on working out and clearing my mind.</p>
<p>Consistency in physical training has directly improved my academic focus. It instills a sense of routine and discipline.</p>
<h2>The Weekly Split</h2>
<p>I follow a classic Push-Pull-Legs (PPL) split, training 4-5 times a week with active recovery days. However, as of recently I have been working on Chest/Back and Sharms (Shoulders + Arms) for a little diversity. Every workout is a 3 sets by 8 reps (as close or less than 8 is preferred: &quot;easily do 8, increase the weight&quot;) plus a warm up set and roughly 2 minutes of rest between. This allows for optimal muscle group targeting and plenty of rest:</p>
<ul>
<li><strong>Push Days:</strong> Chest, shoulders, and triceps.<ul>
<li><ol>
<li>Flat Barbell Bench Press</li>
</ol>
</li>
<li><ol start="2">
<li>Dumbbell Shoulder Press</li>
</ol>
</li>
<li><ol start="3">
<li>Incline Dumbbell Press</li>
</ol>
</li>
<li><ol start="4">
<li>Rope Pulldowns + Overhead Rope Pulls</li>
</ol>
</li>
<li><ol start="5">
<li>Chest Flys or Single-Arm Cable Reverse Fly</li>
</ol>
</li>
</ul>
</li>
<li><strong>Pull Days:</strong> Back and biceps.<ul>
<li><ol>
<li>Lateral Pulldowns or T-bar Rows</li>
</ol>
</li>
<li><ol start="2">
<li>Preacher Curls</li>
</ol>
</li>
<li><ol start="3">
<li>Seated Cable Rows</li>
</ol>
</li>
<li><ol start="4">
<li>Hammer Curls 3x12</li>
</ol>
</li>
<li><ol start="5">
<li>Pull Ups</li>
</ol>
</li>
</ul>
</li>
<li><strong>Leg Days:</strong> Quads, hamstrings, and calves.<ul>
<li><ol>
<li>Hacksquat</li>
</ol>
</li>
<li><ol start="2">
<li>Lying Leg Curls</li>
</ol>
</li>
<li><ol start="3">
<li>Leg Extensions</li>
</ol>
</li>
<li><ol start="4">
<li>Calf Raises</li>
</ol>
</li>
<li><ol start="5">
<li>Treadmill: 10 incline + 3 speed for 45 minutes</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2>The Weekly Split (Alternative)</h2>
<ul>
<li><strong>Chest + Back:</strong> Chest and back.<ul>
<li><ol>
<li>Incline Machine Press</li>
</ol>
</li>
<li><ol start="2">
<li>Lateral Pulldowns or T-bar Rows</li>
</ol>
</li>
<li><ol start="3">
<li>Machine Bench Press or Bench Press</li>
</ol>
</li>
<li><ol start="4">
<li>Machine Seated Rows</li>
</ol>
</li>
<li><ol start="5">
<li>Chest Flys or Pull Ups</li>
</ol>
</li>
</ul>
</li>
<li><strong>Sharms:</strong> Shoulders and arms.<ul>
<li><ol>
<li>Shoulder Press</li>
</ol>
</li>
<li><ol start="2">
<li>Preacher Curls</li>
</ol>
</li>
<li><ol start="3">
<li>Rope Pulldowns + Overhead Rope Pulls</li>
</ol>
</li>
<li><ol start="4">
<li>Hammer Curls 3x12</li>
</ol>
</li>
<li><ol start="5">
<li>Lateral Raises 3x15 or Single-Arm Cable Reverse Fly 3x15</li>
</ol>
</li>
</ul>
</li>
<li><strong>Leg Days:</strong> Quads, hamstrings, and calves.<ul>
<li><ol>
<li>Hacksquat</li>
</ol>
</li>
<li><ol start="2">
<li>Lying Leg Curls</li>
</ol>
</li>
<li><ol start="3">
<li>Leg Extensions</li>
</ol>
</li>
<li><ol start="4">
<li>Calf Raises</li>
</ol>
</li>
<li><ol start="5">
<li>Treadmill: 10 incline + 3 speed for 45 minutes</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2>Lessons in Consistency</h2>
<p>Progress in the gym doesn&#39;t happen overnight. It relies on progressive overload—small, incremental increases in weight and volume over weeks and months. Keeping a log of sets and weights helps track progress and keeps me accountable. Check out <a href="https://hevy.com/user/natedogl">My Hevy Profile</a>.</p>
]]></content:encoded>
      <category>fitness</category>
      <category>routine</category>
      <category>life</category>
    </item>
    <item>
      <title>why data engineering</title>
      <link>https://nathanliu.dev/blog/datascience</link>
      <guid>https://nathanliu.dev/blog/datascience</guid>
      <pubDate>Wed, 02 Apr 2025 12:00:00 GMT</pubDate>
      <description>A reflection on why data science excites me, statistical insights, and the power of data visualization.</description>
      <content:encoded><![CDATA[<h2>The Intersection of Curiosity and Impact</h2>
<p>Data science has always felt like magic to me. At its core, it is the art of translating raw, chaotic numbers into structured stories that guide decisions, predict outcomes, and uncover hidden truths about human behavior. Unlike traditional software engineering, where the bounds of code are deterministic, data science thrives in the domain of probability, patterns, and discovery.</p>
<p>My interest started when I began analyzing small public datasets in Python. I realized that a few lines of code utilizing libraries like Pandas and Matplotlib could reveal insights that were invisible to the naked eye. That &quot;aha!&quot; moment—where a clean line chart or cluster visualization solves a complex question—is what keeps me hooked.</p>
<h2>Power of Data Visualization</h2>
<p>They say a picture is worth a thousand words, and in data science, a good visualization is worth a million data points. The ability to take millions of rows of telemetry and distil it into an intuitive, interactive dashboard (like the stats dashboard on this portfolio!) is extremely satisfying. It bridges the gap between technical complexity and business communication.</p>
<p>During my coursework at UC Berkeley, specifically in DATA 100, we learned that visualization is not just the final step of an analysis; it is a critical exploratory tool. A simple scatter plot can instantly reveal non-linear relationships or data entry errors that summary statistics like mean and variance completely hide.</p>
<h2>Continuous Journey of Learning</h2>
<p>The field of data science is evolving at a breakneck pace. From classical regression models and Bayes estimators to deep learning neural networks and Large Language Models, there is always something new to learn. Balancing the theoretical foundations of linear algebra and probability (classes like EECS 127 and DATA 140) with the practical aspects of databases (CS 186) makes the discipline challenging but highly rewarding.</p>
<p>As I continue my studies and projects, I am excited to apply these techniques to real-world challenges, whether optimizing web application latency, predicting user engagement, or analyzing photography compositions.</p>
]]></content:encoded>
      <category>data science</category>
      <category>reflection</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
