<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tech, Games, and Everyday Life – Made Simple</title><link>https://takao.blog/</link><description>Recent content on Tech, Games, and Everyday Life – Made Simple</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Commentary of Takao</copyright><lastBuildDate>Wed, 08 Jul 2026 10:00:00 +0900</lastBuildDate><atom:link href="https://takao.blog/index.xml" rel="self" type="application/rss+xml"/><item><title>React 19 New Features: What Developers Need to Know</title><link>https://takao.blog/web/react-19-new-features/</link><pubDate>Wed, 08 Jul 2026 10:00:00 +0900</pubDate><guid>https://takao.blog/web/react-19-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-en.png" alt="Featured image of post React 19 New Features: What Developers Need to Know" /&gt;&lt;h2 id="what-changed-in-react-19"&gt;What Changed in React 19
&lt;/h2&gt;&lt;p&gt;React 19 is not a minor update but a paradigm shift. Stable Server Components, new hooks, and the React Compiler fundamentally change how developers write applications.&lt;/p&gt;
&lt;h2 id="stable-server-components"&gt;Stable Server Components
&lt;/h2&gt;&lt;p&gt;React Server Components (RSC) are now production-ready. By rendering on the server and sending HTML to the client, they reduce bundle size significantly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// app/page.jsx — Server Component (default)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Home&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;posts&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;SELECT * FROM posts&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#a6e22e"&gt;posts&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt; =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;}&amp;gt;{&lt;span style="color:#a6e22e"&gt;post&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ))}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Components using useState or useEffect must declare &amp;ldquo;use client&amp;rdquo; at the top.&lt;/p&gt;</description></item><item><title>Web Performance Monitoring Tools Compared 2026</title><link>https://takao.blog/web/web-performance-monitoring-tools-2026/</link><pubDate>Wed, 08 Jul 2026 10:00:00 +0900</pubDate><guid>https://takao.blog/web/web-performance-monitoring-tools-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-monitoring-tools-2026-en.png" alt="Featured image of post Web Performance Monitoring Tools Compared 2026" /&gt;&lt;h2 id="why-lighthouse-is-not-enough"&gt;Why Lighthouse Is Not Enough
&lt;/h2&gt;&lt;p&gt;Lighthouse is an excellent diagnostic tool, but it only measures lab data, not real user experience. Standard practice in 2026 combines lab measurements with Real User Monitoring (RUM).&lt;/p&gt;
&lt;h2 id="1-web-vitals--chrome-ux-report-and-crux-api"&gt;1. Web Vitals — Chrome UX Report and CrUX API
&lt;/h2&gt;&lt;p&gt;Google&amp;rsquo;s Chrome UX Report aggregates field data from real Chrome users. You can query it via API to analyze both your own and competitors&amp;rsquo; sites.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;response&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_KEY&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;method&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;origin&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;metrics&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;largest_contentful_paint&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;cumulative_layout_shift&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-sentry-performance"&gt;2. Sentry Performance
&lt;/h2&gt;&lt;p&gt;Well-known for error monitoring, Sentry also offers robust performance tracing. It captures transactions end-to-end, from frontend to backend, with automatic instrumentation for React and Next.js. Setup takes minutes.&lt;/p&gt;</description></item><item><title>Refactoring Large Codebases using Autonomous AI Agents</title><link>https://takao.blog/web/ai-agents-codebase-refactoring-future/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/ai-agents-codebase-refactoring-future/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-agents-codebase-refactoring-future-en.png" alt="Featured image of post Refactoring Large Codebases using Autonomous AI Agents" /&gt;&lt;h2 id="the-rise-of-ai-assisted-refactoring"&gt;The Rise of AI-Assisted Refactoring
&lt;/h2&gt;&lt;p&gt;Refactoring large codebases has traditionally been one of the most expensive and risk-prone activities in software engineering. Autonomous AI agents are now changing this landscape, offering the ability to reason about code structure, generate transformations, and validate correctness at a scale previously impossible.&lt;/p&gt;
&lt;h2 id="automated-code-cleanup"&gt;Automated Code Cleanup
&lt;/h2&gt;&lt;p&gt;AI agents excel at mechanical refactoring tasks. Dead code elimination, unused import removal, and consistent formatting can be handled by agents that parse the entire AST of a project. Tools like &lt;strong&gt;Codema&lt;/strong&gt; and &lt;strong&gt;OpenAI Codex CLI&lt;/strong&gt; already demonstrate how agents can identify deprecated patterns and suggest modern equivalents.&lt;/p&gt;</description></item><item><title>Double development Speeds with custom Git configuration Aliases</title><link>https://takao.blog/web/git-alias-setup-productivity/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-alias-setup-productivity/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-alias-setup-productivity-en.png" alt="Featured image of post Double development Speeds with custom Git configuration Aliases" /&gt;&lt;p&gt;How many times a day do you type commands like &lt;code&gt;git status&lt;/code&gt;, &lt;code&gt;git checkout&lt;/code&gt;, or &lt;code&gt;git commit&lt;/code&gt; in your terminal? For active developers, the answer is easily in the dozens or hundreds. Typing out these full commands repeatedly wastes keystrokes, increases typing errors, and slows down your development momentum.&lt;/p&gt;
&lt;p&gt;Git has a built-in feature to address this: &lt;strong&gt;Aliases&lt;/strong&gt;. By configuring aliases, you can map complex options or frequent commands to short, custom abbreviations.&lt;/p&gt;</description></item><item><title>Isolating Layout Computations via CSS contain Property</title><link>https://takao.blog/web/performance-css-contain-property/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/performance-css-contain-property/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-css-contain-property-en.png" alt="Featured image of post Isolating Layout Computations via CSS contain Property" /&gt;&lt;h2 id="the-rendering-cost-of-dynamic-content"&gt;The Rendering Cost of Dynamic Content
&lt;/h2&gt;&lt;p&gt;Every time the DOM changes, the browser must recompute styles, layout, and paint. For pages with many interactive widgets—chat feeds, stock tickers, infinite-scroll lists—these recalculations can ripple across the entire document, causing jank and dropped frames.&lt;/p&gt;
&lt;p&gt;The CSS &lt;code&gt;contain&lt;/code&gt; property tells the browser that a subtree is &lt;strong&gt;independent&lt;/strong&gt; from the rest of the page. This enables the engine to skip global recalculations and treat the element as an isolated island.&lt;/p&gt;</description></item><item><title>Strict Type Guarding using TypeScript's NoInfer Utility</title><link>https://takao.blog/web/typescript-unmapped-types-utility/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-unmapped-types-utility/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-unmapped-types-utility-en.png" alt="Featured image of post Strict Type Guarding using TypeScript's NoInfer Utility" /&gt;&lt;h2 id="the-widening-problem"&gt;The Widening Problem
&lt;/h2&gt;&lt;p&gt;When TypeScript infers types from multiple call-site arguments, it often &lt;strong&gt;widens&lt;/strong&gt; the inferred type to accommodate all candidates. This is usually helpful, but in certain generic scenarios it produces types that are too loose, letting invalid states slip through.&lt;/p&gt;
&lt;p&gt;Consider a function that accepts a default value alongside a specific key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createState&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;T&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;defaultValue&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;T&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;defaultValue&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createState&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// T inferred as &amp;#34;color&amp;#34; | &amp;#34;blue&amp;#34; — not what we want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScript infers &lt;code&gt;T&lt;/code&gt; as &lt;code&gt;&amp;quot;color&amp;quot; | &amp;quot;blue&amp;quot;&lt;/code&gt; instead of constraining &lt;code&gt;defaultValue&lt;/code&gt; to match &lt;code&gt;key&lt;/code&gt;. The result type loses precision for both parameters.&lt;/p&gt;</description></item><item><title>OWASP ZAP in 2026: Advanced Scanning and CI/CD Integration</title><link>https://takao.blog/web/owasp-zap-advanced-2026/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/owasp-zap-advanced-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/owasp-zap-advanced-2026-en.png" alt="Featured image of post OWASP ZAP in 2026: Advanced Scanning and CI/CD Integration" /&gt;&lt;h2 id="beyond-basic-scanning"&gt;Beyond Basic Scanning
&lt;/h2&gt;&lt;p&gt;OWASP ZAP has evolved significantly since its early days. In 2026, it is no longer just a point-and-click proxy scanner — it is a full-featured security automation platform with a powerful API, a scriptable automation framework, and deep CI/CD integration. If you need the basics first, read our &lt;a class="link" href="https://takao.blog/web/how-to-owasp-zap/" &gt;OWASP ZAP installation and setup guide&lt;/a&gt;. This article covers advanced workflows for teams running security tests at scale.&lt;/p&gt;
&lt;h2 id="api-scanning-with-zap"&gt;API Scanning with ZAP
&lt;/h2&gt;&lt;p&gt;Modern applications rely heavily on REST and GraphQL APIs. ZAP&amp;rsquo;s OpenAPI and GraphQL support allows you to scan APIs without a browser.&lt;/p&gt;</description></item><item><title>Designing Modern Content Security Policies for Hugo blogs</title><link>https://takao.blog/web/hugo-latest-csp-best-practices-2026/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/hugo-latest-csp-best-practices-2026/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/hugo-latest-csp-best-practices-2026-en.png" alt="Featured image of post Designing Modern Content Security Policies for Hugo blogs" /&gt;&lt;h2 id="why-csp-matters-for-static-sites"&gt;Why CSP Matters for Static Sites
&lt;/h2&gt;&lt;p&gt;Static sites built with Hugo are inherently more secure than dynamic applications, but they still execute third-party scripts for analytics, ads, and embeds. A &lt;strong&gt;Content Security Policy (CSP)&lt;/strong&gt; protects your visitors from XSS, data injection, and malicious script execution by controlling which resources can load.&lt;/p&gt;
&lt;h2 id="setting-csp-via-cloudflare-pages"&gt;Setting CSP via Cloudflare Pages
&lt;/h2&gt;&lt;p&gt;Cloudflare Pages supports custom &lt;code&gt;_headers&lt;/code&gt; files for controlling HTTP response headers:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# static/_headers
/*
 Content-Security-Policy: default-src &amp;#39;self&amp;#39;; script-src &amp;#39;self&amp;#39;; style-src &amp;#39;self&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For Hugo, place the &lt;code&gt;_headers&lt;/code&gt; file in your &lt;code&gt;static/&lt;/code&gt; directory so it gets copied to the output:&lt;/p&gt;</description></item><item><title>Choosing Crops to Maximize Profit in Stardew Valley</title><link>https://takao.blog/game/stardew-valley-crop-profit/</link><pubDate>Mon, 01 Jun 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/stardew-valley-crop-profit/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/stardew-valley-crop-profit-en.png" alt="Featured image of post Choosing Crops to Maximize Profit in Stardew Valley" /&gt;&lt;h1 id="choosing-crops-to-maximize-profit-in-stardew-valley"&gt;Choosing Crops to Maximize Profit in Stardew Valley
&lt;/h1&gt;&lt;p&gt;In Stardew Valley, growing crops, harvesting them, and shipping them is the basic cycle for earning income. However, if you just plant crops without much thought, you won&amp;rsquo;t be able to farm efficiently. By choosing high-profit crops for each season and being strategic about how you grow them, you can make the most of your limited time and money. This article introduces the most profitable crops for each season and the key principles for maximizing your profits.&lt;/p&gt;</description></item><item><title>Apex Legends Positioning Basics for Improvement</title><link>https://takao.blog/game/apex-basic-positioning/</link><pubDate>Thu, 28 May 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/apex-basic-positioning/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apex-basic-positioning-en.png" alt="Featured image of post Apex Legends Positioning Basics for Improvement" /&gt;&lt;h1 id="apex-legends-positioning-basics-for-improvement"&gt;Apex Legends Positioning Basics for Improvement
&lt;/h1&gt;&lt;p&gt;Apex Legends is a third-person battle royale where victory hinges not just on aiming skill but on &amp;ldquo;positioning.&amp;rdquo; Mastering the fundamentals of positioning—such as coordinating with teammates and using cover—can dramatically improve your kill rate and survival. Here, we explain practical positioning concepts you can use in matches.&lt;/p&gt;
&lt;h2 id="cover-is-the-foundation-of-everything"&gt;Cover is the Foundation of Everything
&lt;/h2&gt;&lt;p&gt;In Apex, getting hit doesn&amp;rsquo;t immediately decide the fight. What&amp;rsquo;s more important is always ensuring you have a place to hide quickly if you take fire. While moving, be mindful of the distance to the next cover and choose routes that keep you out of line of sight. When crossing open areas, using smokes or abilities to reduce risk is a standard tactic.&lt;/p&gt;</description></item><item><title>Using SSH Keys instead of GPG keys for Git Commit Signatures</title><link>https://takao.blog/web/git-signing-commits-ssh-keys/</link><pubDate>Mon, 25 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-signing-commits-ssh-keys/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-signing-commits-ssh-keys-en.png" alt="Featured image of post Using SSH Keys instead of GPG keys for Git Commit Signatures" /&gt;&lt;p&gt;For a long time, GPG (GNU Privacy Guard) keys were the industry standard for signing Git commits to prove identity and prevent tampering. However, setting up GPG involves generating keyrings, managing expiration dates, and debugging background agents, which introduces substantial friction for developers.&lt;/p&gt;
&lt;p&gt;To eliminate this complexity, Git version 2.34 introduced the ability to &lt;strong&gt;use your existing SSH keys to sign commits directly&lt;/strong&gt;, bypassing the need for GPG keys.&lt;/p&gt;
&lt;p&gt;In this guide, we will explore how to configure Git to use your SSH keys for signing commits, verify keys locally, and enable trust relationships across development teams.&lt;/p&gt;</description></item><item><title>Testing CSP Rules Safely with Content-Security-Policy-Report-Only</title><link>https://takao.blog/web/security-content-security-policy-csp-report-only/</link><pubDate>Fri, 15 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-content-security-policy-csp-report-only/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-content-security-policy-csp-report-only-en.png" alt="Featured image of post Testing CSP Rules Safely with Content-Security-Policy-Report-Only" /&gt;&lt;h2 id="the-broken-widget-problem"&gt;The Broken-Widget Problem
&lt;/h2&gt;&lt;p&gt;Deploying a Content Security Policy is one of the strongest defenses against XSS attacks. But a single misconfigured directive can silently break inline scripts, block CDN resources, or disable analytics. If you apply CSP directly via the &lt;code&gt;Content-Security-Policy&lt;/code&gt; header and a critical script gets blocked, your production site breaks—often without an obvious error console notification.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Report-Only mode&lt;/strong&gt; saves the day.&lt;/p&gt;
&lt;h2 id="report-only-vs-enforced-mode"&gt;Report-Only vs Enforced Mode
&lt;/h2&gt;&lt;p&gt;CSP supports two headers:&lt;/p&gt;</description></item><item><title>A Beginner's Guide to Map Awareness in Valorant</title><link>https://takao.blog/game/valorant-map-awareness/</link><pubDate>Tue, 12 May 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/valorant-map-awareness/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/valorant-map-awareness-en.png" alt="Featured image of post A Beginner's Guide to Map Awareness in Valorant" /&gt;&lt;h1 id="a-beginners-guide-to-map-awareness-in-valorant"&gt;A Beginner&amp;rsquo;s Guide to Map Awareness in Valorant
&lt;/h1&gt;&lt;p&gt;To improve your win rate in Valorant, aim alone isn&amp;rsquo;t enough—you need map awareness, which is the ability to understand the map as a whole. By predicting enemy positions and coordinating with teammates to take favorable positions, you can win fights before they even begin. This article covers the fundamental concepts for developing your map awareness.&lt;/p&gt;
&lt;h2 id="think-about-control-zones"&gt;Think About Control Zones
&lt;/h2&gt;&lt;p&gt;Every map has &amp;ldquo;zones you need to hold,&amp;rdquo; also known as control zones. For example, Ascent&amp;rsquo;s Mid or Bind&amp;rsquo;s Short—controlling these areas on both offense and defense gives you a significant advantage in navigating the map. The team that controls these zones can limit the enemy&amp;rsquo;s entry points, making defense much easier. Conversely, if your opponent takes control of these zones, you&amp;rsquo;ll be forced to watch multiple angles at once, putting you on the back foot.&lt;/p&gt;</description></item><item><title>Exporting Proper TypeScript Declaration Files (.d.ts) for NPM</title><link>https://takao.blog/web/typescript-declaration-files-dts/</link><pubDate>Sun, 10 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-declaration-files-dts/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-declaration-files-dts-en.png" alt="Featured image of post Exporting Proper TypeScript Declaration Files (.d.ts) for NPM" /&gt;&lt;h2 id="why-declaration-files-matter"&gt;Why Declaration Files Matter
&lt;/h2&gt;&lt;p&gt;When you publish an npm package written in TypeScript, consumers need type information to get IntelliSense and compile-time checking. Without &lt;code&gt;.d.ts&lt;/code&gt; files, your library is effectively typed as &lt;code&gt;any&lt;/code&gt;, defeating the purpose of using TypeScript in the first place.&lt;/p&gt;
&lt;p&gt;Declaration files describe the shape of your exports without shipping the implementation source. They enable tree-shaking, documentation hover tips, and strict type checking in consumer projects.&lt;/p&gt;
&lt;h2 id="generating-dts-files"&gt;Generating .d.ts Files
&lt;/h2&gt;&lt;p&gt;The TypeScript compiler generates declaration files when &lt;code&gt;declaration&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt; in &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Basic Guidelines for Stabilizing Base Management in Palworld</title><link>https://takao.blog/game/palworld-base-management/</link><pubDate>Thu, 07 May 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/palworld-base-management/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/palworld-base-management-en.png" alt="Featured image of post Basic Guidelines for Stabilizing Base Management in Palworld" /&gt;&lt;h1 id="basic-guidelines-for-stabilizing-base-management-in-palworld"&gt;Basic Guidelines for Stabilizing Base Management in Palworld
&lt;/h1&gt;&lt;p&gt;In Palworld, base management significantly impacts your overall progression speed. If you build your base in the right location and can efficiently assign tasks to your Pals, everything from resource gathering to item production will run smoothly. This article explains the basic guidelines for stabilizing your base management.&lt;/p&gt;
&lt;h2 id="choosing-a-base-location-is-the-most-important-factor"&gt;Choosing a Base Location Is the Most Important Factor
&lt;/h2&gt;&lt;p&gt;The location where you place your base is a critical factor that determines operational efficiency. For your first base, the Beginner&amp;rsquo;s Plateau area is recommended. It is a zone rich in resources with minimal temperature effects, making it easy to manage your Pals&amp;rsquo; stamina. From the mid-game onward, you can own multiple bases, so consider dividing them by role—such as a mining base or farming base. For each base, choose a location near a Great Eagle Statue (fast travel point) to reduce travel time.&lt;/p&gt;</description></item><item><title>2026 Static Site Generators: Astro, Hugo, and 11ty</title><link>https://takao.blog/web/static-site-generators-2026-comparison/</link><pubDate>Tue, 05 May 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/static-site-generators-2026-comparison/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/static-site-generators-2026-comparison-en.png" alt="Featured image of post 2026 Static Site Generators: Astro, Hugo, and 11ty" /&gt;&lt;h2 id="2026-static-site-generators-astro-hugo-and-11ty"&gt;2026 Static Site Generators: Astro, Hugo, and 11ty
&lt;/h2&gt;&lt;p&gt;The static site generator landscape in 2026 is more diverse than ever. Developers choose between blazing-fast Go-based &lt;strong&gt;Hugo&lt;/strong&gt;, the islands-architecture pioneer &lt;strong&gt;Astro&lt;/strong&gt;, and the minimalist, flexible &lt;strong&gt;11ty&lt;/strong&gt; (Eleventy). Each excels in different scenarios — understanding their trade-offs is essential for picking the right tool for your project.&lt;/p&gt;
&lt;p&gt;This comparison evaluates them across build speed, templating, content management, image optimization, i18n, and deployment.&lt;/p&gt;</description></item><item><title>Tips for a Smooth Early Game in Stardew Valley</title><link>https://takao.blog/game/stardew-valley-early-game-tips/</link><pubDate>Mon, 04 May 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/stardew-valley-early-game-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/stardew-valley-early-game-tips-en.png" alt="Featured image of post Tips for a Smooth Early Game in Stardew Valley" /&gt;&lt;h1 id="tips-for-a-smooth-early-game-in-stardew-valley"&gt;Tips for a Smooth Early Game in Stardew Valley
&lt;/h1&gt;&lt;p&gt;When you first start Stardew Valley, there&amp;rsquo;s so much to do that it&amp;rsquo;s hard to know where to begin. The key to a smooth early game is making the most of your limited stamina and time. This article explains how to prioritize and play efficiently from the start of the game through your first spring.&lt;/p&gt;
&lt;h2 id="your-first-day-sets-the-tone"&gt;Your First Day Sets the Tone
&lt;/h2&gt;&lt;p&gt;Right after starting the game, take a quick look around the map to get your bearings. Knowing where the villagers&amp;rsquo; houses, fishing spots, and foraging points are will come in handy later. Before you even start tilling your farm on the first day, rummage through the town trash cans and pick flowers or fruit to earn a little extra income. If you have energy to spare, cut grass and collect fiber — it can be used later for fences and sprinklers.&lt;/p&gt;</description></item><item><title>Convenient Settings Every Minecraft Beginner Should Know</title><link>https://takao.blog/game/minecraft-beginner-settings/</link><pubDate>Wed, 29 Apr 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/minecraft-beginner-settings/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/minecraft-beginner-settings-en.png" alt="Featured image of post Convenient Settings Every Minecraft Beginner Should Know" /&gt;&lt;h1 id="convenient-settings-every-minecraft-beginner-should-know"&gt;Convenient Settings Every Minecraft Beginner Should Know
&lt;/h1&gt;&lt;p&gt;When you first start playing Minecraft, the settings screen can feel overwhelming with its many options. However, even small adjustments to the default settings can greatly improve ease of operation and the overall gaming experience. This article covers essential settings that work across both the Java and Bedrock editions, which every beginner should know.&lt;/p&gt;
&lt;h2 id="reviewing-controls-settings"&gt;Reviewing Controls Settings
&lt;/h2&gt;&lt;p&gt;First, let&amp;rsquo;s check your key bindings. The default settings are perfectly fine, but changing a few keys to better suit your hand placement can make a big difference. For example, you could change the inventory key from E to Q, or enable scroll wheel switching for tools instead of only using the hotbar number keys. Adjust these to match your playstyle. Also, the double-tap to sprint setting can often lead to accidental activation, so switching to &amp;ldquo;Toggle Sprint&amp;rdquo; is recommended.&lt;/p&gt;</description></item><item><title>Recovering Deleted Branches and Commits using git reflog</title><link>https://takao.blog/web/git-recovery-deleted-branch-reflog/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-recovery-deleted-branch-reflog/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-recovery-deleted-branch-reflog-en.png" alt="Featured image of post Recovering Deleted Branches and Commits using git reflog" /&gt;&lt;p&gt;&amp;ldquo;I accidentally deleted a local branch using &lt;code&gt;git branch -D&lt;/code&gt;,&amp;rdquo; or &amp;ldquo;I ran &lt;code&gt;git reset --hard HEAD~1&lt;/code&gt; and lost my unpushed commits!&amp;rdquo; If you have worked with Git for any length of time, you have likely experienced one of these stomach-dropping moments.&lt;/p&gt;
&lt;p&gt;While standard &lt;code&gt;git log&lt;/code&gt; commands won&amp;rsquo;t display references to deleted branches or detached commits, you don&amp;rsquo;t need to panic. Git has a built-in safety net called &lt;strong&gt;&lt;code&gt;git reflog&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Designing Reusable Docker Compose Configs for Dev and Prod</title><link>https://takao.blog/web/docker-compose-production-best-practice/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-compose-production-best-practice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-compose-production-best-practice-en.png" alt="Featured image of post Designing Reusable Docker Compose Configs for Dev and Prod" /&gt;&lt;h2 id="designing-reusable-docker-compose-configs-for-dev-and-prod"&gt;Designing Reusable Docker Compose Configs for Dev and Prod
&lt;/h2&gt;&lt;p&gt;Docker Compose is the standard tool for defining and running multi-container applications. But many teams fall into the trap of maintaining separate &lt;code&gt;docker-compose.yml&lt;/code&gt; files for development, staging, and production — leading to duplication, drift, and configuration bugs.&lt;/p&gt;
&lt;p&gt;A better approach uses &lt;strong&gt;compose file overlays&lt;/strong&gt;, &lt;strong&gt;profiles&lt;/strong&gt;, and &lt;strong&gt;environment variables&lt;/strong&gt; to keep a single source of truth that adapts to each environment.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-base-composeyml-pattern"&gt;The Base &lt;code&gt;compose.yml&lt;/code&gt; Pattern
&lt;/h2&gt;&lt;p&gt;Start with a single &lt;code&gt;compose.yml&lt;/code&gt; that defines the shared service definitions — the image, command, ports, and environment that remain the same across environments.&lt;/p&gt;</description></item><item><title>Monster Hunter Wilds Weapon Choice Guide</title><link>https://takao.blog/game/monster-hunter-wilds-weapon-choice/</link><pubDate>Wed, 15 Apr 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/monster-hunter-wilds-weapon-choice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/monster-hunter-wilds-weapon-choice-en.png" alt="Featured image of post Monster Hunter Wilds Weapon Choice Guide" /&gt;&lt;h1 id="monster-hunter-wilds-weapon-choice-guide"&gt;Monster Hunter Wilds Weapon Choice Guide
&lt;/h1&gt;&lt;p&gt;Monster Hunter Wilds features 14 different weapons, each with completely unique controls and playstyles. Your choice of weapon drastically changes your hunting approach, so finding the right one for you is the first step toward improvement. This article explains the characteristics of each weapon type and how to choose the weapon that best suits you.&lt;/p&gt;
&lt;h2 id="broad-weapon-categories"&gt;Broad Weapon Categories
&lt;/h2&gt;&lt;p&gt;The 14 weapons can be broadly categorized into four groups: &amp;ldquo;reach-focused,&amp;rdquo; &amp;ldquo;mobility-focused,&amp;rdquo; &amp;ldquo;damage-focused,&amp;rdquo; and &amp;ldquo;support-oriented.&amp;rdquo; The Great Sword and Hammer deal high damage per hit but have large openings after attacks, requiring practice to use effectively. On the other hand, the Insect Glaive and Dual Blades are combo-oriented weapons that excel at landing consecutive hits while staying on the move. The Sword and Shield and Lance offer a good balance of offense and defense, making them approachable choices for beginners.&lt;/p&gt;</description></item><item><title>Speeding Up assets Loading using DNS-Prefetch and Preconnect</title><link>https://takao.blog/web/performance-dns-prefetch-preconnect/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/performance-dns-prefetch-preconnect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-dns-prefetch-preconnect-en.png" alt="Featured image of post Speeding Up assets Loading using DNS-Prefetch and Preconnect" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Every external resource — fonts, scripts, images, API endpoints — requires a network connection. The overhead of &lt;strong&gt;DNS resolution&lt;/strong&gt;, &lt;strong&gt;TCP handshake&lt;/strong&gt;, and &lt;strong&gt;TLS negotiation&lt;/strong&gt; can add hundreds of milliseconds to page load time. &lt;strong&gt;Resource hints&lt;/strong&gt; like &lt;code&gt;dns-prefetch&lt;/code&gt; and &lt;code&gt;preconnect&lt;/code&gt; let you tell the browser to perform these steps &lt;strong&gt;in advance&lt;/strong&gt;, before the resource is actually needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-cost-of-connection"&gt;The Cost of Connection
&lt;/h2&gt;&lt;p&gt;Establishing an HTTPS connection involves multiple round trips:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Step&lt;/th&gt;
					&lt;th&gt;Latency (approx.)&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DNS lookup&lt;/td&gt;
					&lt;td&gt;20-120 ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TCP handshake&lt;/td&gt;
					&lt;td&gt;1 RTT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TLS negotiation&lt;/td&gt;
					&lt;td&gt;2 RTT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;3+ RTT&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On a 3G connection (300ms RTT), that&amp;rsquo;s nearly &lt;strong&gt;1 second&lt;/strong&gt; of overhead before any data is transferred. Resource hints eliminate most of this.&lt;/p&gt;</description></item><item><title>Essential Techniques to Enjoy Minecraft Building Even More</title><link>https://takao.blog/game/minecraft-building-tips/</link><pubDate>Sun, 12 Apr 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/minecraft-building-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/minecraft-building-tips-en.png" alt="Featured image of post Essential Techniques to Enjoy Minecraft Building Even More" /&gt;&lt;h1 id="essential-techniques-to-enjoy-minecraft-building-even-more"&gt;Essential Techniques to Enjoy Minecraft Building Even More
&lt;/h1&gt;&lt;p&gt;Minecraft building is more than just stacking blocks. There are many techniques that can dramatically change the look of a build with just a little know-how. This article introduces fundamental concepts and techniques for beginners to intermediate players looking to take their building skills to the next level.&lt;/p&gt;
&lt;h2 id="start-with-the-framework-before-moving-to-details"&gt;Start with the Framework Before Moving to Details
&lt;/h2&gt;&lt;p&gt;The most common mistake in building is jumping straight into decorating walls and roofs. First, create a framework that defines the overall shape of your structure. Set up pillars to determine the general height, and lay out the floor area. At this stage, no decoration is needed. Focus on refining the proportions while checking whether the silhouette looks good. Once you have a solid framework in place, simply adding walls and windows will result in a great-looking building.&lt;/p&gt;</description></item><item><title>Building Complex string Parsers inside TypeScript Type System</title><link>https://takao.blog/web/typescript-template-literal-type-level-parsers/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-template-literal-type-level-parsers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-type-level-parsers-en.png" alt="Featured image of post Building Complex string Parsers inside TypeScript Type System" /&gt;&lt;h2 id="parsing-at-the-type-level"&gt;Parsing at the Type Level
&lt;/h2&gt;&lt;p&gt;TypeScript&amp;rsquo;s template literal types, combined with recursive conditional types and &lt;code&gt;infer&lt;/code&gt;, allow you to parse and transform string literals entirely within the type system. This is not a runtime parser—it is a compile-time parser that extracts structure from string constants, enabling strongly typed APIs for URL routing, SQL queries, command-line arguments, and more.&lt;/p&gt;
&lt;h2 id="template-literal-types-primer"&gt;Template Literal Types Primer
&lt;/h2&gt;&lt;p&gt;Template literal types can interpolate other types and infer parts of a string.&lt;/p&gt;</description></item><item><title>Transitioning from WebGL to WebGPU for Faster Graphics</title><link>https://takao.blog/web/webgpu-native-browser-graphics-generation/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/webgpu-native-browser-graphics-generation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/webgpu-native-browser-graphics-generation-en.png" alt="Featured image of post Transitioning from WebGL to WebGPU for Faster Graphics" /&gt;&lt;h2 id="transitioning-from-webgl-to-webgpu-for-faster-graphics"&gt;Transitioning from WebGL to WebGPU for Faster Graphics
&lt;/h2&gt;&lt;p&gt;For over a decade, &lt;strong&gt;WebGL&lt;/strong&gt; has been the sole standard for hardware-accelerated 3D graphics in the browser. Built on OpenGL ES, it exposed a state-machine API that worked well for its era but imposed significant CPU overhead and lacked direct access to modern GPU features. Enter &lt;strong&gt;WebGPU&lt;/strong&gt; — a next-generation graphics and compute API designed from the ground up for modern GPU architectures.&lt;/p&gt;</description></item><item><title>Migrating from git checkout to git switch and restore</title><link>https://takao.blog/web/git-checkout-restore-switch-commands/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-checkout-restore-switch-commands/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-checkout-restore-switch-commands-en.png" alt="Featured image of post Migrating from git checkout to git switch and restore" /&gt;&lt;p&gt;One of the very first commands developers learn when starting out with Git is &lt;code&gt;git checkout&lt;/code&gt;. However, &lt;code&gt;git checkout&lt;/code&gt; is a notoriously overloaded command. It handles too many responsibilities, making it a common source of confusion and accidental file loss for beginners and experienced developers alike.&lt;/p&gt;
&lt;p&gt;To solve this, Git version 2.23 (released in 2019) introduced two dedicated, task-focused alternatives: &lt;strong&gt;&lt;code&gt;git switch&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;git restore&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll discuss the design problems surrounding &lt;code&gt;git checkout&lt;/code&gt;, explain the roles of the newer commands, and show you how to transition to using them today.&lt;/p&gt;</description></item><item><title>Comparing JWT Tokens vs Stateful Sessions in Web Security</title><link>https://takao.blog/web/security-jwt-vs-session-auth/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-jwt-vs-session-auth/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-jwt-vs-session-auth-en.png" alt="Featured image of post Comparing JWT Tokens vs Stateful Sessions in Web Security" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Authentication is the backbone of every web application. Two dominant patterns have emerged: &lt;strong&gt;stateless JWT (JSON Web Token)&lt;/strong&gt; auth and &lt;strong&gt;stateful session-based&lt;/strong&gt; auth. Both solve the same problem — verifying who a user is on subsequent requests — but they differ fundamentally in storage, revocation, and security properties. This article provides a detailed comparison to help you choose the right approach for your application.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="jwt-structure"&gt;JWT Structure
&lt;/h2&gt;&lt;p&gt;A JWT is a self-contained token consisting of three base64url-encoded segments separated by dots:&lt;/p&gt;</description></item><item><title>Optimizing Web Font Loading: Preventing FOUT and FOIT</title><link>https://takao.blog/web/performance-fonts-loading-optimization/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/performance-fonts-loading-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-fonts-loading-optimization-en.png" alt="Featured image of post Optimizing Web Font Loading: Preventing FOUT and FOIT" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Web fonts enhance design but come at a cost. While a custom font loads, browsers must decide: show invisible text (&lt;strong&gt;FOIT&lt;/strong&gt; — Flash of Invisible Text) or show a fallback font (&lt;strong&gt;FOUT&lt;/strong&gt; — Flash of Unstyled Text). Either choice impacts &lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt; and user experience. This article covers strategies to load fonts reliably while minimizing layout shifts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-font-display-descriptor"&gt;The font-display Descriptor
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;font-display&lt;/code&gt; property in &lt;code&gt;@font-face&lt;/code&gt; controls how a font is displayed during loading:&lt;/p&gt;</description></item><item><title>Creative CSS Recipes with Parent Selector :has()</title><link>https://takao.blog/web/css-has-pseudo-selector-recipes/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-has-pseudo-selector-recipes/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-has-pseudo-selector-recipes-en.png" alt="Featured image of post Creative CSS Recipes with Parent Selector :has()" /&gt;&lt;h2 id="creative-css-recipes-with-parent-selector-has"&gt;Creative CSS Recipes with Parent Selector &lt;code&gt;:has()&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;For years, CSS developers dreamed of a &lt;strong&gt;parent selector&lt;/strong&gt; — a way to style an element based on its children. JavaScript and extra class names were the only workarounds. Then came &lt;code&gt;:has()&lt;/code&gt;, the CSS pseudo-class that finally makes &amp;ldquo;if this element contains X, style it accordingly&amp;rdquo; a native reality.&lt;/p&gt;
&lt;p&gt;As of 2026, &lt;code&gt;:has()&lt;/code&gt; is supported in all major browsers, opening a world of markup simplification and creative styling without touching JavaScript.&lt;/p&gt;</description></item><item><title>Building Apps using Gemini 1.5 Pro's Massive Context Length</title><link>https://takao.blog/web/gemini-api-pro-latest-utilization/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/gemini-api-pro-latest-utilization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/gemini-api-pro-latest-utilization-en.png" alt="Featured image of post Building Apps using Gemini 1.5 Pro's Massive Context Length" /&gt;&lt;h2 id="the-context-window-revolution"&gt;The Context Window Revolution
&lt;/h2&gt;&lt;p&gt;Gemini 1.5 Pro redefined what&amp;rsquo;s possible with large language models by offering a context window of up to &lt;strong&gt;2 million tokens&lt;/strong&gt;. This means you can pass entire codebases, hours of video, or thousands of pages of documents in a single request — fundamentally changing how we interact with AI.&lt;/p&gt;
&lt;h2 id="understanding-gemini-15-pros-capabilities"&gt;Understanding Gemini 1.5 Pro&amp;rsquo;s Capabilities
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feature&lt;/th&gt;
					&lt;th&gt;Capability&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Context window&lt;/td&gt;
					&lt;td&gt;Up to 2M tokens (1M standard)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Input modalities&lt;/td&gt;
					&lt;td&gt;Text, image, audio, video, code&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Output&lt;/td&gt;
					&lt;td&gt;Text, code, structured data&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Max output tokens&lt;/td&gt;
					&lt;td&gt;8,192&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Languages&lt;/td&gt;
					&lt;td&gt;100+ languages&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pricing (input)&lt;/td&gt;
					&lt;td&gt;$1.25–$10.00 per 1M tokens&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pricing (output)&lt;/td&gt;
					&lt;td&gt;$10.00–$40.00 per 1M tokens&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="multimodal-input-handling"&gt;Multimodal Input Handling
&lt;/h2&gt;&lt;p&gt;Gemini 1.5 Pro natively processes multiple modalities in a single request. You can combine text, images, audio, and video seamlessly:&lt;/p&gt;</description></item><item><title>Apex Legends Sensitivity Settings and Aim Practice</title><link>https://takao.blog/game/apex-sensitivity-aim-practice/</link><pubDate>Wed, 04 Mar 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/apex-sensitivity-aim-practice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apex-sensitivity-aim-practice-en.png" alt="Featured image of post Apex Legends Sensitivity Settings and Aim Practice" /&gt;&lt;h1 id="apex-legends-sensitivity-settings-and-aim-practice"&gt;Apex Legends Sensitivity Settings and Aim Practice
&lt;/h1&gt;&lt;p&gt;In Apex Legends, your sensitivity settings and the quality of your aim practice play a major role in how quickly you improve. However, practicing without a clear plan yields limited results. This article covers how to find the right sensitivity for you and build a practice routine tailored to your goals, so you can improve your aim efficiently even in limited time.&lt;/p&gt;
&lt;h2 id="how-to-find-your-ideal-sensitivity"&gt;How to Find Your Ideal Sensitivity
&lt;/h2&gt;&lt;p&gt;There is no single correct sensitivity setting — it depends on your personal preference and playstyle. As a general guideline, mouse users typically start with 400 DPI and an in-game sensitivity between 1.0 and 3.0, while controller users tend to make fine adjustments from the default settings. The key is balancing your &amp;ldquo;turn speed&amp;rdquo; and &amp;ldquo;fine-tuning.&amp;rdquo; A good starting point is a value that allows you to comfortably do a 180-degree turn while still being able to aim at distant targets. Test it by actually moving around in the Firing Range. Once you settle on a sensitivity, avoid changing it for a while and stick with it until you get used to it — this is one of the quickest paths to improvement.&lt;/p&gt;</description></item><item><title>Git Merge vs Git Rebase: Operational Guidelines</title><link>https://takao.blog/web/git-merge-vs-rebase-best-practice/</link><pubDate>Wed, 25 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-merge-vs-rebase-best-practice/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-merge-vs-rebase-best-practice-en.png" alt="Featured image of post Git Merge vs Git Rebase: Operational Guidelines" /&gt;&lt;p&gt;When integrating changes from one branch into another in Git, developers generally rely on two primary commands: &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt;. While both serve the same ultimate purpose—bringing code from two branches together—they approach the problem differently, resulting in vastly different commit histories.&lt;/p&gt;
&lt;p&gt;Understanding when and why to use each option is key to keeping your project&amp;rsquo;s repository clean, readable, and easy to debug.&lt;/p&gt;
&lt;p&gt;In this post, we will compare the mechanics, advantages, and drawbacks of &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt;, and outline a set of operational guidelines for teams.&lt;/p&gt;</description></item><item><title>Replacing LocalStorage: Dynamic IndexedDB wrapper localForage</title><link>https://takao.blog/web/js-indexeddb-localforage-localstorage/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-indexeddb-localforage-localstorage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-indexeddb-localforage-localstorage-en.png" alt="Featured image of post Replacing LocalStorage: Dynamic IndexedDB wrapper localForage" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Client-side storage is a fundamental requirement for modern web applications — offline caches, user preferences, draft data, and session state all need to persist in the browser. For years, &lt;strong&gt;localStorage&lt;/strong&gt; has been the simplest go-to solution, but its limitations become painful as applications grow. This article compares localStorage, raw IndexedDB, and the &lt;strong&gt;localForage&lt;/strong&gt; wrapper library, providing practical guidance for choosing the right storage engine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-limits-of-localstorage"&gt;The Limits of localStorage
&lt;/h2&gt;&lt;p&gt;localStorage offers a straightforward synchronous key-value API — &lt;code&gt;setItem(key, value)&lt;/code&gt; and &lt;code&gt;getItem(key)&lt;/code&gt; — but it comes with hard constraints:&lt;/p&gt;</description></item><item><title>Domain Safety: Setting Up SPF, DKIM, and DMARC Settings</title><link>https://takao.blog/web/web-security-dnssec-spf-dkim-dmarc/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-security-dnssec-spf-dkim-dmarc/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-dnssec-spf-dkim-dmarc-en.png" alt="Featured image of post Domain Safety: Setting Up SPF, DKIM, and DMARC Settings" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Email authentication is essential to prevent domain spoofing, phishing, and spam folder rejection. Three DNS-based standards — &lt;strong&gt;SPF&lt;/strong&gt;, &lt;strong&gt;DKIM&lt;/strong&gt;, and &lt;strong&gt;DMARC&lt;/strong&gt; — work together to verify that emails claiming to be from your domain are legitimate. Without these records, attackers can send forged emails on your behalf, and legitimate emails may land in recipients&amp;rsquo; spam folders. This guide explains each standard and shows how to configure them on Cloudflare or your DNS provider.&lt;/p&gt;</description></item><item><title>Common Mistakes Beginners Make in Valorant and How to Fix Them</title><link>https://takao.blog/game/valorant-common-mistakes/</link><pubDate>Wed, 11 Feb 2026 09:00:00 +0900</pubDate><guid>https://takao.blog/game/valorant-common-mistakes/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/valorant-common-mistakes-en.png" alt="Featured image of post Common Mistakes Beginners Make in Valorant and How to Fix Them" /&gt;&lt;h1 id="common-mistakes-beginners-make-in-valorant-and-how-to-fix-them"&gt;Common Mistakes Beginners Make in Valorant and How to Fix Them
&lt;/h1&gt;&lt;p&gt;Valorant is a tactical FPS where not only aim but also positioning and decision-making determine the outcome. Beginners in particular tend to unconsciously adopt habits that lower their win rate. This article introduces common pitfalls many players fall into and specific ways to improve.&lt;/p&gt;
&lt;h2 id="shooting-while-moving"&gt;Shooting While Moving
&lt;/h2&gt;&lt;p&gt;The most common mistake beginners make is &amp;ldquo;run-and-gun.&amp;rdquo; In Valorant, bullet spread while moving is extremely large — shooting while running will almost never hit. Get into the habit of always stopping before you shoot, a technique known as &amp;ldquo;tap-strafing&amp;rdquo; (tap-stopping). When stopping, don&amp;rsquo;t crouch; instead, lightly tap the A and D keys to bring your velocity to zero. Practicing the switch between moving and stopping in the shooting range will help you do it naturally in actual matches.&lt;/p&gt;</description></item><item><title>PPR (Partial Prerendering): Merging Static and Dynamic routes</title><link>https://takao.blog/web/nextjs-partial-prerendering-ppr/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-partial-prerendering-ppr/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-partial-prerendering-ppr-en.png" alt="Featured image of post PPR (Partial Prerendering): Merging Static and Dynamic routes" /&gt;&lt;h2 id="the-problem-static-vs-dynamic-tradeoffs"&gt;The Problem: Static vs Dynamic Tradeoffs
&lt;/h2&gt;&lt;p&gt;Traditionally, Next.js developers faced a binary choice: &lt;strong&gt;static generation&lt;/strong&gt; (fast but stale) or &lt;strong&gt;server-side rendering&lt;/strong&gt; (fresh but slower). Partial Prerendering (PPR) eliminates this tradeoff by combining both approaches in a single page — a static HTML shell streams instantly, while dynamic content is loaded via React Suspense.&lt;/p&gt;
&lt;h2 id="how-ppr-works"&gt;How PPR Works
&lt;/h2&gt;&lt;p&gt;PPR works by identifying &lt;strong&gt;static and dynamic boundaries&lt;/strong&gt; using React Suspense. During build time, Next.js prerenders the static shell. At request time, it replaces Suspense fallbacks with streaming dynamic content:&lt;/p&gt;</description></item><item><title>Tailwind CSS v4.0 Release and Pure CSS Configuration</title><link>https://takao.blog/web/tailwind-css-v4-release-changes/</link><pubDate>Thu, 05 Feb 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/tailwind-css-v4-release-changes/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/tailwind-css-v4-release-changes-en.png" alt="Featured image of post Tailwind CSS v4.0 Release and Pure CSS Configuration" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Tailwind CSS v4.0 marks a paradigm shift from JavaScript-based configuration to a &lt;strong&gt;CSS-first architecture&lt;/strong&gt;. The &lt;code&gt;tailwind.config.js&lt;/code&gt; file is gone; design tokens are now defined directly in CSS using &lt;code&gt;@theme&lt;/code&gt;. This release also integrates &lt;strong&gt;Lightning CSS&lt;/strong&gt; for blazing-fast builds, adopts modern CSS features like CSS nesting and &lt;code&gt;@layer&lt;/code&gt;, and ships a completely rewritten engine. This article breaks down the key changes and provides a practical migration guide from v3.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="css-first-configuration-with-theme"&gt;CSS-First Configuration with &lt;code&gt;@theme&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;In v3, customizing design tokens required JavaScript:&lt;/p&gt;</description></item><item><title>Conventional Commits for Automated Release Workflows</title><link>https://takao.blog/web/git-semantic-commit-messages-standard/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-semantic-commit-messages-standard/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-semantic-commit-messages-standard-en.png" alt="Featured image of post Conventional Commits for Automated Release Workflows" /&gt;&lt;p&gt;In a collaborative software development team, inconsistencies in commit message structures can make tracking changes difficult. Vague commit messages like &lt;code&gt;fix bug&lt;/code&gt;, &lt;code&gt;update code&lt;/code&gt;, or &lt;code&gt;minor changes&lt;/code&gt; complicate code auditing and delay release documentation.&lt;/p&gt;
&lt;p&gt;To resolve this issue and maintain a clean, machine-readable commit history, developers around the world adopt the &lt;strong&gt;Conventional Commits&lt;/strong&gt; specification.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain the structure of Conventional Commits, standard prefix classifications, and how this discipline enables automated release operations.&lt;/p&gt;</description></item><item><title>Robust Frontend Exception Management with Error Boundaries</title><link>https://takao.blog/web/frontend-error-boundaries-logging/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/frontend-error-boundaries-logging/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/frontend-error-boundaries-logging-en.png" alt="Featured image of post Robust Frontend Exception Management with Error Boundaries" /&gt;&lt;h2 id="why-error-boundaries-matter"&gt;Why Error Boundaries Matter
&lt;/h2&gt;&lt;p&gt;In React applications, a single uncaught JavaScript error in a component can crash the entire UI. Before Error Boundaries, this meant users would see a white screen with no indication of what went wrong. Error Boundaries are React components that catch JavaScript errors anywhere in their child component tree and render a fallback UI instead of crashing.&lt;/p&gt;
&lt;h2 id="implementing-an-error-boundary"&gt;Implementing an Error Boundary
&lt;/h2&gt;&lt;p&gt;Error Boundaries are class components that implement one or both of the static lifecycle methods &lt;code&gt;getDerivedStateFromError&lt;/code&gt; and &lt;code&gt;componentDidCatch&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Enforcing HTTPS Connections Securely using HSTS policies</title><link>https://takao.blog/web/web-security-http-strict-transport-hsts-hacks/</link><pubDate>Fri, 16 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-security-http-strict-transport-hsts-hacks/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-http-strict-transport-hsts-hacks-en.png" alt="Featured image of post Enforcing HTTPS Connections Securely using HSTS policies" /&gt;&lt;h2 id="the-first-request-problem"&gt;The First-Request Problem
&lt;/h2&gt;&lt;p&gt;HTTPS encrypts traffic after the connection is established, but the initial request to an HTTP URL is still sent in cleartext. An attacker on the same network can intercept that first request, perform an &lt;strong&gt;SSL stripping&lt;/strong&gt; attack, and downgrade the user to HTTP for the entire session.&lt;/p&gt;
&lt;p&gt;HTTP Strict Transport Security (HSTS) closes this window. Once a browser receives an HSTS header, it &lt;strong&gt;automatically upgrades all future HTTP requests&lt;/strong&gt; to HTTPS and refuses to connect if the certificate is invalid.&lt;/p&gt;</description></item><item><title>Branching in TS Type System: Intro to Conditional Types</title><link>https://takao.blog/web/typescript-conditional-types/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-conditional-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-conditional-types-en.png" alt="Featured image of post Branching in TS Type System: Intro to Conditional Types" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;TypeScript&amp;rsquo;s type system is &lt;strong&gt;Turing-complete&lt;/strong&gt;, and one of the key features that unlocks its full power is &lt;strong&gt;conditional types&lt;/strong&gt;. Just like ternary operators in JavaScript (&lt;code&gt;condition ? a : b&lt;/code&gt;), conditional types let you create type-level logic: &lt;code&gt;T extends U ? X : Y&lt;/code&gt;. This enables dynamic, context-aware type resolution.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-syntax"&gt;Basic Syntax
&lt;/h2&gt;&lt;p&gt;A conditional type checks whether a type &lt;strong&gt;extends&lt;/strong&gt; another type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;B&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IsString&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;42&lt;/span&gt;&amp;gt;; &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The condition &lt;code&gt;T extends U&lt;/code&gt; asks: &amp;ldquo;Is &lt;code&gt;T&lt;/code&gt; assignable to &lt;code&gt;U&lt;/code&gt;?&amp;rdquo; If yes, resolve to the true branch; otherwise, the false branch.&lt;/p&gt;</description></item><item><title>React Compiler: Say Goodbye to Manual Memoization</title><link>https://takao.blog/web/react-compiler-automated-memoization/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-compiler-automated-memoization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-compiler-automated-memoization-en.png" alt="Featured image of post React Compiler: Say Goodbye to Manual Memoization" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For years, React developers have manually optimized re-renders with &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, &lt;code&gt;React.memo&lt;/code&gt;, and various state-management heuristics. The &lt;strong&gt;React Compiler&lt;/strong&gt; (formerly known as React Forget) changes this paradigm entirely. It is a build-time tool that automatically memoizes React components, hooks, and values by analyzing reactive dependencies at compile time, eliminating the need for manual optimization hooks.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-problem-with-manual-memoization"&gt;The Problem with Manual Memoization
&lt;/h2&gt;&lt;p&gt;Consider a typical filtered list component:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserList&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt; }) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filtered&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useMemo&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;u&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;u&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#a6e22e"&gt;users&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleClick&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useCallback&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Clicked:&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, []);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#a6e22e"&gt;filtered&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;UserRow&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;handleClick&lt;/span&gt;} /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ))}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserRow&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memo&lt;/span&gt;(({ &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt; }) =&amp;gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{() =&amp;gt; &lt;span style="color:#a6e22e"&gt;onClick&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;)}&amp;gt;{&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;}&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works, but it is verbose, error-prone (missing or incorrect dependency arrays), and easy to forget. A missing &lt;code&gt;useMemo&lt;/code&gt; on a large list causes unnecessary re-renders; an incorrect dependency array causes stale closures.&lt;/p&gt;</description></item><item><title>Leveraging WebAssembly in Cloudflare Workers at the Edge</title><link>https://takao.blog/web/cloudflare-workers-wasm-edge-developments/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0900</pubDate><guid>https://takao.blog/web/cloudflare-workers-wasm-edge-developments/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-workers-wasm-edge-developments-en.png" alt="Featured image of post Leveraging WebAssembly in Cloudflare Workers at the Edge" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cloudflare Workers revolutionized serverless computing by bringing code execution to the network edge — over 330 locations worldwide. By integrating &lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt; modules into Workers, you can run computationally intensive tasks (image processing, cryptography, video encoding, scientific calculations) at near-native speeds while maintaining the low-latency benefits of edge distribution. This article explores how to compile languages like Rust and AssemblyScript to Wasm, deploy them on Workers, and the performance trade-offs involved.&lt;/p&gt;</description></item><item><title>Cleaning Orphan Remote Branches with git fetch --prune</title><link>https://takao.blog/web/git-prune-clean-remote-branches/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-prune-clean-remote-branches/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-prune-clean-remote-branches-en.png" alt="Featured image of post Cleaning Orphan Remote Branches with git fetch --prune" /&gt;&lt;p&gt;In modern development workflows using GitHub or GitLab, feature branches are typically deleted on the remote host as soon as their corresponding pull request (PR) is merged.&lt;/p&gt;
&lt;p&gt;However, when you run &lt;code&gt;git branch -a&lt;/code&gt; in your local terminal, you will notice that &lt;strong&gt;the references pointing to those deleted remote branches (e.g., &lt;code&gt;remotes/origin/feature-xxx&lt;/code&gt;) remain in your branch list indefinitely.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This occurs because Git does not automatically sync deletions from remote configurations to your local cache by default.&lt;/p&gt;</description></item><item><title>Optimizing Browser Rendering Pipelines (Critical Path)</title><link>https://takao.blog/web/performance-critical-rendering-path-optimizations/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/performance-critical-rendering-path-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-critical-rendering-path-optimizations-en.png" alt="Featured image of post Optimizing Browser Rendering Pipelines (Critical Path)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;Critical Rendering Path (CRP)&lt;/strong&gt; is the sequence of steps the browser performs to convert HTML, CSS, and JavaScript into visible pixels on the screen. Optimizing this pipeline directly impacts &lt;strong&gt;First Contentful Paint (FCP)&lt;/strong&gt; and &lt;strong&gt;Largest Contentful Paint (LCP)&lt;/strong&gt;. This article breaks down each CRP stage — DOM construction, CSSOM construction, render tree, layout, paint, and composite — and provides actionable optimization strategies.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="stage-1-dom-construction"&gt;Stage 1: DOM Construction
&lt;/h2&gt;&lt;p&gt;When the browser receives HTML bytes, it:&lt;/p&gt;</description></item><item><title>How CORS Works and Fixing Access Block Errors</title><link>https://takao.blog/web/web-security-http-headers-cors/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-security-http-headers-cors/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-security-http-headers-cors-en.png" alt="Featured image of post How CORS Works and Fixing Access Block Errors" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;CORS (Cross-Origin Resource Sharing)&lt;/strong&gt; is a browser security mechanism that controls how web pages from one origin can request resources from a different origin. When a frontend at &lt;code&gt;https://app.example.com&lt;/code&gt; tries to fetch data from &lt;code&gt;https://api.example.org&lt;/code&gt;, the browser enforces a &lt;strong&gt;same-origin policy&lt;/strong&gt; by default. CORS provides a controlled way to relax this policy through HTTP headers. This article explains the complete CORS flow, preflight requests, and how to fix common access-block errors.&lt;/p&gt;</description></item><item><title>Preventing Cumulative Layout Shift with CSS aspect-ratio</title><link>https://takao.blog/web/css-aspect-ratio-cumulative-layout-shift/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-aspect-ratio-cumulative-layout-shift/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-aspect-ratio-cumulative-layout-shift-en.png" alt="Featured image of post Preventing Cumulative Layout Shift with CSS aspect-ratio" /&gt;&lt;h2 id="understanding-cumulative-layout-shift"&gt;Understanding Cumulative Layout Shift
&lt;/h2&gt;&lt;p&gt;Cumulative Layout Shift (CLS) is one of Google&amp;rsquo;s &lt;strong&gt;Core Web Vitals&lt;/strong&gt; metrics that measures visual stability. It quantifies how often users experience unexpected layout shifts. A high CLS score harms user experience and SEO rankings. The primary cause? Media elements (images, videos, iframes) loading without reserved space.&lt;/p&gt;
&lt;h2 id="how-css-aspect-ratio-works"&gt;How CSS aspect-ratio Works
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;aspect-ratio&lt;/code&gt; CSS property lets you declare the ratio of width to height for any element. The browser reserves space accordingly, preventing the layout from jumping when content loads.&lt;/p&gt;</description></item><item><title>Third-Party Cookie Deprecation and Web Privacy APIs</title><link>https://takao.blog/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cloudflare-privacy-sandbox-thirdparty-cookie-deprecation-en.png" alt="Featured image of post Third-Party Cookie Deprecation and Web Privacy APIs" /&gt;&lt;h2 id="the-end-of-third-party-cookies"&gt;The End of Third-Party Cookies
&lt;/h2&gt;&lt;p&gt;The third-party cookie era is ending. After years of delays and industry pushback, Chrome has begun phasing out cross-site tracking cookies. This fundamentally changes how web analytics, advertising, and personalization function. Understanding the deprecation timeline and replacement APIs is essential for every web developer.&lt;/p&gt;
&lt;h2 id="chrome-phase-out-timeline"&gt;Chrome Phase-Out Timeline
&lt;/h2&gt;&lt;p&gt;Google&amp;rsquo;s Privacy Sandbox initiative has followed this trajectory:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Date&lt;/th&gt;
					&lt;th&gt;Milestone&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;2024 Q1&lt;/td&gt;
					&lt;td&gt;1% Chrome users have 3PC restricted&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2025 Q2&lt;/td&gt;
					&lt;td&gt;Testing phase with expanded cohorts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2025 Q3-Q4&lt;/td&gt;
					&lt;td&gt;Graduated rollout begins&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2026&lt;/td&gt;
					&lt;td&gt;Full deprecation for all Chrome users&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="privacy-sandbox-apis"&gt;Privacy Sandbox APIs
&lt;/h2&gt;&lt;p&gt;The Privacy Sandbox replaces third-party cookies with several purpose-built APIs:&lt;/p&gt;</description></item><item><title>Undoing Merge Commits Safely using git revert -m</title><link>https://takao.blog/web/git-revert-merge-commit-safe/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-revert-merge-commit-safe/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-revert-merge-commit-safe-en.png" alt="Featured image of post Undoing Merge Commits Safely using git revert -m" /&gt;&lt;p&gt;Directly after merging a feature branch into your primary release branch (&lt;code&gt;main&lt;/code&gt;), you might discover a severe bug that requires you to immediately roll back the integration.&lt;/p&gt;
&lt;p&gt;With standard commits, you can easily undo changes using &lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;&lt;/code&gt;. However, attempting to revert a merge commit directly results in a Git error: &lt;code&gt;fatal: commit &amp;lt;hash&amp;gt; is a merge but no -m option was given.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In this guide, we&amp;rsquo;ll explain why merge reverts require special handling, walk through using the &lt;code&gt;git revert -m&lt;/code&gt; option, and reveal the hidden trap of re-merging reverted features later.&lt;/p&gt;</description></item><item><title>Accelerating GitHub Actions Workflows via actions/cache</title><link>https://takao.blog/web/github-actions-caching-setup/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/github-actions-caching-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-actions-caching-setup-en.png" alt="Featured image of post Accelerating GitHub Actions Workflows via actions/cache" /&gt;&lt;p&gt;Automated CI/CD pipelines (like GitHub Actions) are a cornerstone of modern software quality control. However, if your workflows fetch external packages, boot container environments, and rebuild entire applications from scratch on every pull request, execution times can quickly balloon to several minutes.&lt;/p&gt;
&lt;p&gt;Long feedback loops slow developer productivity and lead to higher billing costs.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll demonstrate how to utilize GitHub&amp;rsquo;s official caching mechanisms to speed up your workflows from minutes to seconds.&lt;/p&gt;</description></item><item><title>Auditing NPM Dependencies: Snyk and automated patch management</title><link>https://takao.blog/web/security-dependency-vulnerabilities-npm-audit/</link><pubDate>Sat, 15 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-dependency-vulnerabilities-npm-audit/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-dependency-vulnerabilities-npm-audit-en.png" alt="Featured image of post Auditing NPM Dependencies: Snyk and automated patch management" /&gt;&lt;h2 id="the-supply-chain-problem"&gt;The Supply Chain Problem
&lt;/h2&gt;&lt;p&gt;Modern JavaScript applications ship tens of thousands of transitive dependencies. Each one is a potential attack vector. The &lt;strong&gt;event-stream&lt;/strong&gt; incident (2018), where a malicious package was injected into a popular dependency, demonstrated that vulnerabilities can come from anywhere in the tree. Relying solely on manual review is impossible at this scale.&lt;/p&gt;
&lt;p&gt;Automated tooling is the only practical defense.&lt;/p&gt;
&lt;h2 id="npm-audit"&gt;npm audit
&lt;/h2&gt;&lt;p&gt;The built-in &lt;code&gt;npm audit&lt;/code&gt; command compares your dependency tree against a curated database of known vulnerabilities.&lt;/p&gt;</description></item><item><title>Transforming Types dynamically using Mapped Types</title><link>https://takao.blog/web/typescript-mapped-types/</link><pubDate>Mon, 10 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-mapped-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-mapped-types-en.png" alt="Featured image of post Transforming Types dynamically using Mapped Types" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Mapped types&lt;/strong&gt; let you transform an existing object type by iterating over its keys. Think of them as &lt;code&gt;Array.prototype.map()&lt;/code&gt; but at the &lt;strong&gt;type level&lt;/strong&gt;. The syntax &lt;code&gt;{ [K in keyof T]: T[K] }&lt;/code&gt; creates a new type by applying a transformation to each property of &lt;code&gt;T&lt;/code&gt;. This is how many of TypeScript&amp;rsquo;s built-in utility types work under the hood.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-mapped-type"&gt;Basic Mapped Type
&lt;/h2&gt;&lt;p&gt;The simplest mapped type creates a clone of an existing type:&lt;/p&gt;</description></item><item><title>Node.js Stable Support for Requiring ESM Modules</title><link>https://takao.blog/web/node-esm-require-support-stable/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/node-esm-require-support-stable/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-require-support-stable-en.png" alt="Featured image of post Node.js Stable Support for Requiring ESM Modules" /&gt;&lt;h2 id="nodejs-stable-support-for-requiring-esm-modules"&gt;Node.js Stable Support for Requiring ESM Modules
&lt;/h2&gt;&lt;p&gt;For years, Node.js developers faced a painful divide: &lt;strong&gt;CommonJS&lt;/strong&gt; (CJS) and &lt;strong&gt;ES Modules&lt;/strong&gt; (ESM) coexisted with limited interoperability. CJS code could &lt;code&gt;import()&lt;/code&gt; ESM modules asynchronously, but &lt;code&gt;require()&lt;/code&gt; — the synchronous loading mechanism at the heart of CJS — could not load ESM at all. This forced codebase migrations to be all-or-nothing affairs.&lt;/p&gt;
&lt;p&gt;That changed with Node.js 22 and 23, which stabilized the &lt;code&gt;--experimental-require-module&lt;/code&gt; flag. As of Node 23, synchronous &lt;code&gt;require()&lt;/code&gt; can load ES modules, provided the ESM graph does not use top-level await.&lt;/p&gt;</description></item><item><title>Finding Regression Commits Quickly using git bisect</title><link>https://takao.blog/web/git-bisect-debug-regression/</link><pubDate>Mon, 20 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-bisect-debug-regression/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-bisect-debug-regression-en.png" alt="Featured image of post Finding Regression Commits Quickly using git bisect" /&gt;&lt;p&gt;&amp;ldquo;It worked yesterday, but it is broken today.&amp;rdquo; In any active software project, regression bugs are bound to slip in. Finding the exact commit that introduced a bug out of hundreds or thousands of commits can feel like searching for a needle in a haystack.&lt;/p&gt;
&lt;p&gt;Instead of manually checking out commits one by one or spending hours analyzing code changes, you can use Git&amp;rsquo;s built-in debugging tool: &lt;strong&gt;&lt;code&gt;git bisect&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explain how to use the binary search algorithm of &lt;code&gt;git bisect&lt;/code&gt; to locate the origin of a bug in minutes.&lt;/p&gt;</description></item><item><title>Unlocking JavaScript RegExp Power with the v Flag</title><link>https://takao.blog/web/js-regex-v-flag/</link><pubDate>Wed, 15 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-regex-v-flag/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-regex-v-flag-en.png" alt="Featured image of post Unlocking JavaScript RegExp Power with the v Flag" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Regular expressions in JavaScript have evolved significantly. ES2024 introduces the &lt;strong&gt;&lt;code&gt;v&lt;/code&gt; flag&lt;/strong&gt; — a superset of the &lt;code&gt;u&lt;/code&gt; flag that unlocks powerful set notation, character class subtraction, intersection, and proper Unicode emoji matching. If you&amp;rsquo;ve struggled with complex character class logic or emoji regex patterns, the &lt;code&gt;v&lt;/code&gt; flag is a game-changer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-is-the-v-flag"&gt;What Is the v Flag?
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;v&lt;/code&gt; flag replaces and extends the &lt;code&gt;u&lt;/code&gt; (unicode) flag. Enable it by appending &lt;code&gt;v&lt;/code&gt; to your regex:&lt;/p&gt;</description></item><item><title>Implementing Simple Dark Mode with CSS light-dark()</title><link>https://takao.blog/web/css-light-dark-color-scheme/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-light-dark-color-scheme/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-light-dark-color-scheme-en.png" alt="Featured image of post Implementing Simple Dark Mode with CSS light-dark()" /&gt;&lt;h2 id="the-problem-with-traditional-dark-mode"&gt;The Problem with Traditional Dark Mode
&lt;/h2&gt;&lt;p&gt;Implementing dark mode traditionally required duplicate CSS rules wrapped in &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bg: &lt;span style="color:#ae81ff"&gt;#ffffff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --text: &lt;span style="color:#ae81ff"&gt;#111111&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;prefers-color-scheme&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;dark&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :&lt;span style="color:#a6e22e"&gt;root&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --bg: &lt;span style="color:#ae81ff"&gt;#1a1a2e&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --text: &lt;span style="color:#ae81ff"&gt;#e0e0e0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works but creates maintenance overhead, especially when managing multiple color properties across large stylesheets. The &lt;code&gt;light-dark()&lt;/code&gt; CSS function eliminates this duplication entirely.&lt;/p&gt;
&lt;h2 id="the-light-dark-function"&gt;The light-dark() Function
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;light-dark()&lt;/code&gt; function accepts two color values and automatically returns the one matching the user&amp;rsquo;s current color scheme:&lt;/p&gt;</description></item><item><title>Next.js 15 Stable Release: Best Practices in Production</title><link>https://takao.blog/web/nextjs-15-stable-features-overview/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-15-stable-features-overview/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-15-stable-features-overview-en.png" alt="Featured image of post Next.js 15 Stable Release: Best Practices in Production" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js 15 ships as a stable release with &lt;strong&gt;React 19 support&lt;/strong&gt;, a redesigned caching model, and major API improvements for async request handling. This version defaults to &lt;strong&gt;no caching&lt;/strong&gt; for fetch requests and GET Route handlers, simplifying behavior predictability. It also introduces &lt;code&gt;async&lt;/code&gt; variants for &lt;code&gt;cookies()&lt;/code&gt;, &lt;code&gt;headers()&lt;/code&gt;, and &lt;code&gt;params()&lt;/code&gt;, aligning with React 19&amp;rsquo;s async rendering paradigm. This article covers every breaking change and best practice for production adoption.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="react-19-stable-compatibility"&gt;React 19 Stable Compatibility
&lt;/h2&gt;&lt;p&gt;Next.js 15 pairs with &lt;strong&gt;React 19 stable&lt;/strong&gt;, enabling the new &lt;strong&gt;React Compiler&lt;/strong&gt; to automatically memoize components and hooks. This eliminates the need for manual &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, and &lt;code&gt;React.memo&lt;/code&gt; in many cases.&lt;/p&gt;</description></item><item><title>Signing Git Commits with GPG or SSH and Verified Badges</title><link>https://takao.blog/web/git-commit-signing-gpg/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-commit-signing-gpg/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-commit-signing-gpg-en.png" alt="Featured image of post Signing Git Commits with GPG or SSH and Verified Badges" /&gt;&lt;p&gt;When reviewing commit logs on GitHub, you&amp;rsquo;ve likely noticed a green &amp;ldquo;&lt;strong&gt;Verified&lt;/strong&gt;&amp;rdquo; badge next to some commits. This label indicates that the commit has been cryptographically signed and confirmed to originate from a legitimate, validated user.&lt;/p&gt;
&lt;p&gt;By default, Git allows developers to configure any name and email address they choose using simple commands like &lt;code&gt;git config user.email&lt;/code&gt;. This means impersonation is trivial. To guarantee identity authentication and protect against unauthorized contributions, &lt;strong&gt;commit signing&lt;/strong&gt; is highly recommended.&lt;/p&gt;</description></item><item><title>Maximizing Docker Build Cache for Faster Deployment Pipelines</title><link>https://takao.blog/web/docker-build-caches-speedup/</link><pubDate>Sat, 20 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-build-caches-speedup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-build-caches-speedup-en.png" alt="Featured image of post Maximizing Docker Build Cache for Faster Deployment Pipelines" /&gt;&lt;p&gt;Whether you are trying to speed up local iterative container runs or aiming to shave minutes off your CI/CD pipelines, optimizing your &lt;strong&gt;Docker image build speeds&lt;/strong&gt; is a crucial aspect of engineering productivity. Long build wait times disrupt developer focus and drive up cloud computing costs.&lt;/p&gt;
&lt;p&gt;One of the most powerful and easiest ways to optimize build speeds is by configuring Docker files to maximize the use of the &lt;strong&gt;Docker Build Cache&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Accessibility Essentials: When and How to Write WAI-ARIA</title><link>https://takao.blog/web/web-accessibility-aria-basics/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-accessibility-aria-basics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-accessibility-aria-basics-en.png" alt="Featured image of post Accessibility Essentials: When and How to Write WAI-ARIA" /&gt;&lt;p&gt;In modern web development, digital accessibility (commonly abbreviated as A11y) is no longer a luxury or an afterthought—it is a core quality standard. Creating interfaces that everyone can navigate, regardless of physical or cognitive ability, begins with semantic HTML.&lt;/p&gt;
&lt;p&gt;However, when building complex, custom UI components like accordions, modal dialogs, and tab panels, standard native HTML elements sometimes fall short in describing their role or state to assistive technologies. That is where &lt;strong&gt;WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications)&lt;/strong&gt; comes into play.&lt;/p&gt;</description></item><item><title>Type-Safe State Transitions using Discriminated Unions</title><link>https://takao.blog/web/typescript-discriminated-unions/</link><pubDate>Wed, 10 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-discriminated-unions/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-discriminated-unions-en.png" alt="Featured image of post Type-Safe State Transitions using Discriminated Unions" /&gt;&lt;p&gt;In modern frontend and backend development with TypeScript, ensuring type safety during state transitions is a crucial element in building robust and crash-free applications. When handling asynchronous API communications (such as transitioning between loading, success, and error states) or complex user interactions, ambiguous type definitions can easily lead to unexpected runtime errors.&lt;/p&gt;
&lt;p&gt;In this article, we will explore how to harness the power of &lt;strong&gt;Discriminated Unions&lt;/strong&gt; (also known as Tagged Unions) in TypeScript to manage state safely, elegantly, and with minimum boilerplate.&lt;/p&gt;</description></item><item><title>How GitHub Copilot Workspace Alters Development Workflows</title><link>https://takao.blog/web/github-copilot-workspace-developer-agent/</link><pubDate>Fri, 05 Sep 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/github-copilot-workspace-developer-agent/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-copilot-workspace-developer-agent-en.png" alt="Featured image of post How GitHub Copilot Workspace Alters Development Workflows" /&gt;&lt;h2 id="beyond-autocomplete"&gt;Beyond Autocomplete
&lt;/h2&gt;&lt;p&gt;GitHub Copilot Chat and inline completions help developers write code faster, but they operate at the micro level—a function here, a comment there. &lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt; shifts the paradigm to the macro level: it takes a GitHub issue (a bug report, feature request, or task) and produces a complete pull request with multi-file changes, tests, and documentation.&lt;/p&gt;
&lt;p&gt;This is not an autocomplete tool. It is an &lt;strong&gt;AI-powered developer agent&lt;/strong&gt; that understands the full repository context and translates natural language specifications into executable code.&lt;/p&gt;</description></item><item><title>Mitigating CSRF: SameSite Cookie Attributes and CSRF Tokens</title><link>https://takao.blog/web/security-csrf-tokens-samesite-cookies/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-csrf-tokens-samesite-cookies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-csrf-tokens-samesite-cookies-en.png" alt="Featured image of post Mitigating CSRF: SameSite Cookie Attributes and CSRF Tokens" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cookies are a convenient mechanism for managing user authentication state. When a session ID is stored in a cookie, the browser automatically attaches it to outgoing HTTP requests targeting the domain.&lt;/p&gt;
&lt;p&gt;However, this automatic attachment feature is exploited by &lt;strong&gt;Cross-Site Request Forgery (CSRF)&lt;/strong&gt; attacks.&lt;/p&gt;
&lt;p&gt;Although modern browsers default to safer cookie behaviors (such as applying &lt;code&gt;SameSite=Lax&lt;/code&gt; automatically), developers must understand CSRF defense patterns to prevent serious authentication vulnerabilities. This article reviews SameSite cookie attributes and CSRF token verification patterns.&lt;/p&gt;</description></item><item><title>Advanced git stash: Saving Untracked and Restoring Partially</title><link>https://takao.blog/web/git-stash-advanced-techniques/</link><pubDate>Wed, 20 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-stash-advanced-techniques/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-stash-advanced-techniques-en.png" alt="Featured image of post Advanced git stash: Saving Untracked and Restoring Partially" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, you often need to switch branches to address an urgent bug fix while in the middle of writing code for a feature branch.&lt;/p&gt;
&lt;p&gt;While you can commit your half-finished work as a temporary &amp;ldquo;WIP&amp;rdquo; commit, a cleaner approach is to use &lt;strong&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This article covers advanced &lt;code&gt;git stash&lt;/code&gt; techniques, including saving untracked files, labeling stash items, and restoring specific files from a stash.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-basics-of-git-stash"&gt;1. The Basics of git stash
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s review the most common commands:&lt;/p&gt;</description></item><item><title>Standard Syntax of CSS Nesting without Preprocessors</title><link>https://takao.blog/web/css-nesting-standard-syntax/</link><pubDate>Fri, 15 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-nesting-standard-syntax/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-nesting-standard-syntax-en.png" alt="Featured image of post Standard Syntax of CSS Nesting without Preprocessors" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Historically, writing nested CSS rules required preprocessing tools like Sass (SCSS), Less, or PostCSS.&lt;/p&gt;
&lt;p&gt;However, browser vendors have standardized the &lt;strong&gt;CSS Nesting specification&lt;/strong&gt;. Today, you can write nested selectors directly in plain CSS files and run them natively in all modern web browsers.&lt;/p&gt;
&lt;p&gt;This article reviews the standard syntax of native CSS nesting and explains how its behavior differs from Sass compilations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-basics-of-native-css-nesting"&gt;1. The Basics of Native CSS Nesting
&lt;/h2&gt;&lt;p&gt;Standard CSS Nesting looks very similar to the nested structures used in Sass.&lt;/p&gt;</description></item><item><title>Designing Clean React Custom Hooks for Reusability</title><link>https://takao.blog/web/react-custom-hooks-rules/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-custom-hooks-rules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-custom-hooks-rules-en.png" alt="Featured image of post Designing Clean React Custom Hooks for Reusability" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As you develop React components, you may find that files grow to hundreds of lines. This happens when &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, API queries, and validation logic mix with rendering markup, making the component hard to read and maintain.&lt;/p&gt;
&lt;p&gt;This mixing of concerns makes writing unit tests difficult and increases the risk of copy-paste bugs when reusing logic across different views.&lt;/p&gt;
&lt;p&gt;The best way to separate UI (presentation) from business logic (behavior) in React is to create &lt;strong&gt;Custom Hooks&lt;/strong&gt;. This guide outlines the core design guidelines for building reusable custom hooks.&lt;/p&gt;</description></item><item><title>Current Trends: Vite 6 and Rust-based Bundler Rspack</title><link>https://takao.blog/web/vite-6-rspack-bundler-speeds/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/vite-6-rspack-bundler-speeds/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-6-rspack-bundler-speeds-en.png" alt="Featured image of post Current Trends: Vite 6 and Rust-based Bundler Rspack" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In frontend development, the speed of your development server startup and your production compilation cycles directly impact developer experience (DX).&lt;/p&gt;
&lt;p&gt;In recent years, the community has migrated away from standard Webpack configs toward native, Go-based (ESBuild) and Rust-based (SWC) build helpers.&lt;/p&gt;
&lt;p&gt;This trend has accelerated with the stable release of &lt;strong&gt;Vite 6&lt;/strong&gt; and the rise of &lt;strong&gt;Rspack&lt;/strong&gt;—a Webpack-compatible bundler written in Rust. This article reviews these two technologies and discusses how to select the right tool for your codebase.&lt;/p&gt;</description></item><item><title>ESM vs CommonJS Interop Challenges in Node.js</title><link>https://takao.blog/web/node-esm-cjs-interoperability/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/node-esm-cjs-interoperability/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/node-esm-cjs-interoperability-en.png" alt="Featured image of post ESM vs CommonJS Interop Challenges in Node.js" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Node.js has supported ECMAScript Modules (ESM) since v12, but the ecosystem remains deeply rooted in CommonJS (CJS). Mixing the two module systems in a single project — or consuming CJS packages from ESM code — introduces subtle pitfalls around exports, default imports, and globals. This article maps the interop boundary and provides concrete strategies for a smooth migration.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="cjs-vs-esm-at-a-glance"&gt;CJS vs ESM at a Glance
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;CommonJS&lt;/th&gt;
					&lt;th&gt;ESM&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;File extensions&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.cjs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.mjs&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Default in &lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;commonjs&amp;quot;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Loading&lt;/td&gt;
					&lt;td&gt;Synchronous (&lt;code&gt;require()&lt;/code&gt;)&lt;/td&gt;
					&lt;td&gt;Asynchronous (&lt;code&gt;import&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Top-level &lt;code&gt;this&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;module.exports&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;__dirname&lt;/code&gt; / &lt;code&gt;__filename&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Available&lt;/td&gt;
					&lt;td&gt;Not available&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Live bindings&lt;/td&gt;
					&lt;td&gt;Copy exports&lt;/td&gt;
					&lt;td&gt;Live bindings&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="configuring-the-module-system"&gt;Configuring the Module System
&lt;/h2&gt;&lt;p&gt;You control the module system via the &lt;code&gt;package.json&lt;/code&gt; &lt;code&gt;&amp;quot;type&amp;quot;&lt;/code&gt; field:&lt;/p&gt;</description></item><item><title>Executing Non-Blocking Scripts with requestIdleCallback</title><link>https://takao.blog/web/web-performance-requestidlecallback-optimizations/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-performance-requestidlecallback-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-requestidlecallback-optimizations-en.png" alt="Featured image of post Executing Non-Blocking Scripts with requestIdleCallback" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;When building complex web applications, maintaining smooth animations and responsive user inputs (ideally matching 60+ FPS frame rates) is essential for a good user experience.&lt;/p&gt;
&lt;p&gt;However, modern applications often require executing low-priority background operations—such as sending analytics data, syncing caches, parsing telemetry logs, or pre-fetching assets.&lt;/p&gt;
&lt;p&gt;Executing these non-urgent tasks as standard async promises or immediate timers can block the main thread mid-frame, causing interface jank or increasing your Interaction to Next Paint (INP) score.&lt;/p&gt;</description></item><item><title>Boosting Initial Page Speeds with Lazy-Loaded Frames and Images</title><link>https://takao.blog/web/web-performance-lazyloading-iframe/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-performance-lazyloading-iframe/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-lazyloading-iframe-en.png" alt="Featured image of post Boosting Initial Page Speeds with Lazy-Loaded Frames and Images" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;An effective but frequently overlooked strategy for optimizing web page speeds is &lt;strong&gt;deferring off-screen asset loading&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;By default, when a user loads a web page, the browser immediately requests all images and &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; elements (like YouTube embeds, interactive maps, social widgets, or advertising scripts) on the page, even if they are located far below the fold. This concurrent downloading blocks the main thread and slows down your page&amp;rsquo;s First Contentful Paint (FCP) time.&lt;/p&gt;</description></item><item><title>Ignoring Formatting Commits in git blame with .git-blame-ignore-revs</title><link>https://takao.blog/web/git-blame-ignore-revs/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-blame-ignore-revs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-blame-ignore-revs-en.png" alt="Featured image of post Ignoring Formatting Commits in git blame with .git-blame-ignore-revs" /&gt;&lt;p&gt;When auditing a codebase to find out when and why a line of code was introduced, &lt;code&gt;git blame&lt;/code&gt; is a developer&amp;rsquo;s best friend. However, large styling updates, code formatter adoptions (like Prettier), or global linter autofixes can clutter this history. A single bulk reformatting commit can rewrite code authorship labels for the entire repository, hiding the original developers and commits that introduced the actual business logic.&lt;/p&gt;
&lt;p&gt;To solve this problem, Git (since version 2.23) introduced a native feature that allows developers to ignore specific commits during blame evaluations: the &lt;strong&gt;&lt;code&gt;.git-blame-ignore-revs&lt;/code&gt;&lt;/strong&gt; file.&lt;/p&gt;</description></item><item><title>Optimizing Images: WebP vs. AVIF and Responsive Sizes</title><link>https://takao.blog/web/web-performance-image-optimizations/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-performance-image-optimizations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-performance-image-optimizations-en.png" alt="Featured image of post Optimizing Images: WebP vs. AVIF and Responsive Sizes" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Optimizing image assets is one of the most effective ways to improve web performance metrics like Lighthouse scores and LCP (Largest Contentful Paint).&lt;/p&gt;
&lt;p&gt;In many web applications, images make up more than half of the total payload size. Slow image loading times directly degrade user experience.&lt;/p&gt;
&lt;p&gt;Replacing legacy formats like JPEG and PNG with next-generation formats like &lt;strong&gt;WebP&lt;/strong&gt; and &lt;strong&gt;AVIF&lt;/strong&gt; has become standard practice in modern web development. This article compares these two formats and explains how to configure responsive, optimized image delivery.&lt;/p&gt;</description></item><item><title>Designing Modular layouts with CSS Container Queries</title><link>https://takao.blog/web/css-container-queries-vs-media-queries/</link><pubDate>Thu, 10 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-container-queries-vs-media-queries/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-container-queries-vs-media-queries-en.png" alt="Featured image of post Designing Modular layouts with CSS Container Queries" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For years, &lt;strong&gt;Media Queries (&lt;code&gt;@media&lt;/code&gt;)&lt;/strong&gt; have been the foundation of responsive web design.&lt;/p&gt;
&lt;p&gt;Media queries trigger layout changes based on the viewport width of the browser window. However, in modern component-driven development (using React, Vue, or Web Components), styling components based on the viewport has notable limitations.&lt;/p&gt;
&lt;p&gt;For example, if you want to reuse a card component in both a wide main column and a narrow sidebar, media queries cannot detect the space available to the component, causing the layout to break.&lt;/p&gt;</description></item><item><title>How to Use Standard Decorators in TypeScript</title><link>https://takao.blog/web/typescript-5-decorations-adoption/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-5-decorations-adoption/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-5-decorations-adoption-en.png" alt="Featured image of post How to Use Standard Decorators in TypeScript" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In TypeScript, &lt;strong&gt;decorators&lt;/strong&gt; have long been a key feature, popularized by major frameworks like Angular, NestJS, and TypeORM to manage metadata and dependency injection.&lt;/p&gt;
&lt;p&gt;However, for years, decorators remained an experimental feature (requiring the &lt;code&gt;experimentalDecorators&lt;/code&gt; flag), relying on a legacy proposal that differed from the evolving ECMAScript (JavaScript) standard.&lt;/p&gt;
&lt;p&gt;With the release of TypeScript 5.0, &lt;strong&gt;official support for the standard ECMAScript Decorators (Stage 3/4)&lt;/strong&gt; was introduced. This brings improved type safety and runtime consistency to the decorator syntax. This article explains how to write standard decorators in modern TypeScript.&lt;/p&gt;</description></item><item><title>Essential Linux Commands and Pipes for Web Developers</title><link>https://takao.blog/web/linux-shell-commands-for-webdevelopers/</link><pubDate>Wed, 25 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/linux-shell-commands-for-webdevelopers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/linux-shell-commands-for-webdevelopers-en.png" alt="Featured image of post Essential Linux Commands and Pipes for Web Developers" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Whether you work on the frontend or backend, shell command proficiency is an important skill for web developers.&lt;/p&gt;
&lt;p&gt;Command-line tasks arise constantly: sshing into AWS/VPS instances, debugging inside Docker containers, or writing automated CI/CD pipeline shell scripts (such as GitHub Actions).&lt;/p&gt;
&lt;p&gt;This article covers essential Linux commands and explains how to chain them together using &lt;strong&gt;pipelines (&lt;code&gt;|&lt;/code&gt;)&lt;/strong&gt; to troubleshoot server issues and parse log files.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-searching-files-and-parsing-logs"&gt;1. Searching Files and Parsing Logs
&lt;/h2&gt;&lt;p&gt;When a server crashes or behaves erratically, you must be able to search through massive text files quickly to locate the error.&lt;/p&gt;</description></item><item><title>Stop Overusing useMemo and useCallback in React</title><link>https://takao.blog/web/react-hooks-usememo-usecallback/</link><pubDate>Fri, 20 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-hooks-usememo-usecallback/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-hooks-usememo-usecallback-en.png" alt="Featured image of post Stop Overusing useMemo and useCallback in React" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;When optimizing React application performance, developers often reach for &lt;strong&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;useCallback&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is tempting to wrap every object and function in these hooks, assuming that caching outputs will automatically speed up the application. However, this is a common misconception.&lt;/p&gt;
&lt;p&gt;Unnecessary memoization does not just make code harder to read; it adds &lt;strong&gt;performance overhead from shallow dependency comparisons and garbage collection memory allocations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This article outlines the specific scenarios where these hooks are beneficial and when they should be avoided.&lt;/p&gt;</description></item><item><title>Why and How to Adopt 'strict-dynamic' in CSP</title><link>https://takao.blog/web/security-csp-strict-dynamic-implementation/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-csp-strict-dynamic-implementation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-csp-strict-dynamic-implementation-en.png" alt="Featured image of post Why and How to Adopt 'strict-dynamic' in CSP" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Implementing a &lt;strong&gt;Content Security Policy (CSP)&lt;/strong&gt; is a highly effective way to mitigate Cross-Site Scripting (XSS) risks. However, configuring and maintaining the policy can become a major headache.&lt;/p&gt;
&lt;p&gt;For websites utilizing third-party SDKs (such as Google Tag Manager, analytics beacons, payment widgets, or social sharing buttons), these scripts often dynamically load (inject) additional scripts from nested domains. This forces developers to maintain a long, fragile whitelist of external domains in the &lt;code&gt;script-src&lt;/code&gt; directive.&lt;/p&gt;</description></item><item><title>Creating Powerful String Types with TS Template Literals</title><link>https://takao.blog/web/typescript-template-literal-types/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-template-literal-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-template-literal-types-en.png" alt="Featured image of post Creating Powerful String Types with TS Template Literals" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;TypeScript offers an advanced type system that allows developers to model complex runtime constraints at compile time.&lt;/p&gt;
&lt;p&gt;Among these features, &lt;strong&gt;Template Literal Types&lt;/strong&gt; (introduced in TypeScript 4.1) allow you to define structured string constraints by combining string literals.&lt;/p&gt;
&lt;p&gt;By applying JavaScript&amp;rsquo;s template literal syntax (&lt;code&gt;`hello ${name}`&lt;/code&gt;) to type space, you can enforce safe CSS class name patterns, automate API route mappings, and construct typed design systems. This guide reviews the core patterns of Template Literal Types.&lt;/p&gt;</description></item><item><title>WWDC 25: Safari 19 and Web Platform Advancements</title><link>https://takao.blog/web/apple-wwdc-2025-safari-updates/</link><pubDate>Thu, 05 Jun 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/apple-wwdc-2025-safari-updates/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apple-wwdc-2025-safari-updates-en.png" alt="Featured image of post WWDC 25: Safari 19 and Web Platform Advancements" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;At Apple&amp;rsquo;s annual developer conference &lt;strong&gt;WWDC 2025&lt;/strong&gt;, major updates were announced for iOS 19 and macOS, along with the release of &lt;strong&gt;Safari 19&lt;/strong&gt; powered by the WebKit rendering engine.&lt;/p&gt;
&lt;p&gt;In recent years, the WebKit team has accelerated its adoption of web standards to improve layout compatibility across browser engines (Blink and Gecko).&lt;/p&gt;
&lt;p&gt;This article highlights key Safari 19 announcements from WWDC 2025, focusing on WebGPU integration, browser fingerprinting shields, and newly supported CSS properties.&lt;/p&gt;</description></item><item><title>Intro to DB Indexing: Resolving Query Latencies</title><link>https://takao.blog/web/backend-database-indexing-basics/</link><pubDate>Sun, 25 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/backend-database-indexing-basics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/backend-database-indexing-basics-en.png" alt="Featured image of post Intro to DB Indexing: Resolving Query Latencies" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As web applications scale and data volumes grow, backend systems often face database bottleneck issues like query latencies.&lt;/p&gt;
&lt;p&gt;Running join (&lt;code&gt;JOIN&lt;/code&gt;) operations or complex search queries on tables with hundreds of thousands of records without proper index optimizations can cause database CPU spikes, leading to slow response times for end users.&lt;/p&gt;
&lt;p&gt;Designing database indices is a powerful way to address these performance bottlenecks. This article explains how database indices work, details B-Tree structures, and shares guidelines for designing effective indices.&lt;/p&gt;</description></item><item><title>Using git worktree for Concurrent Branch Development</title><link>https://takao.blog/web/git-worktree-multi-branches/</link><pubDate>Tue, 20 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-worktree-multi-branches/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-worktree-multi-branches-en.png" alt="Featured image of post Using git worktree for Concurrent Branch Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In daily software development, it is common to get interrupted by an urgent hotfix request while in the middle of writing code for a feature branch.&lt;/p&gt;
&lt;p&gt;Traditionally, developers handle this in one of two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Temporarily shelf active changes using &lt;code&gt;git stash&lt;/code&gt;, switch branches to fix the bug, commit, switch back, and run &lt;code&gt;git stash pop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone a completely separate copy of the repository into another directory to work on the hotfix.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, stash runs the risk of conflict errors on restore, and cloning multiple copies of the same repository wastes disk space and complicates local commit synchronization.&lt;/p&gt;</description></item><item><title>Exciting Features in ECMAScript 2025 (ES16)</title><link>https://takao.blog/web/js-es2025-new-features/</link><pubDate>Thu, 15 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-es2025-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-es2025-new-features-en.png" alt="Featured image of post Exciting Features in ECMAScript 2025 (ES16)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Each year, the TC39 committee updates the ECMAScript specifications, introducing new language features and APIs to the JavaScript ecosystem.&lt;/p&gt;
&lt;p&gt;For the upcoming &lt;strong&gt;ECMAScript 2025 (ES16)&lt;/strong&gt; standard, several proposals have reached Stage 3 or Stage 4, indicating they are in the final stages of browser implementation and adoption.&lt;/p&gt;
&lt;p&gt;This article highlights some of the new features coming in ES2025, detailing how they simplify coding patterns.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-promisetry-unifying-synchronous-and-asynchronous-error-handling"&gt;1. Promise.try: Unifying Synchronous and Asynchronous Error Handling
&lt;/h2&gt;&lt;p&gt;A common challenge in JavaScript development is handling both synchronous exceptions and asynchronous Promise rejections in a clean, unified way.&lt;/p&gt;</description></item><item><title>Perfect Alignment with CSS Grid Subgrid</title><link>https://takao.blog/web/css-subgrid-grid-nesting/</link><pubDate>Sat, 10 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-subgrid-grid-nesting/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-subgrid-grid-nesting-en.png" alt="Featured image of post Perfect Alignment with CSS Grid Subgrid" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Aligning nested components across columns in card layouts is a common layout challenge in responsive web design.&lt;/p&gt;
&lt;p&gt;While CSS Grid and Flexbox make it easy to equalise the height of sibling card containers, aligning the internal elements (such as headers, body copy, and CTA buttons) remains difficult. If one card has a multi-line title and another has a single line, the following elements will misalign, resulting in an inconsistent UI.&lt;/p&gt;</description></item><item><title>Google I/O 2025: Integrating Web Technologies and AI</title><link>https://takao.blog/web/google-io-2025-web-updates/</link><pubDate>Mon, 05 May 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/google-io-2025-web-updates/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/google-io-2025-web-updates-en.png" alt="Featured image of post Google I/O 2025: Integrating Web Technologies and AI" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;At Google&amp;rsquo;s annual developer conference, &lt;strong&gt;Google I/O 2025&lt;/strong&gt;, major announcements highlighted the convergence of artificial intelligence and the web platform.&lt;/p&gt;
&lt;p&gt;For web developers, the focus has expanded beyond cloud-hosted model endpoints. The industry is seeing a shift toward &lt;strong&gt;on-device AI execution&lt;/strong&gt;, allowing developers to run lightweight LLMs directly inside the client browser.&lt;/p&gt;
&lt;p&gt;This article reviews the key web-focused AI announcements from Google I/O 2025 and explains how they will influence frontend application architecture.&lt;/p&gt;</description></item><item><title>Best Practices for Designing REST API Endpoints</title><link>https://takao.blog/web/web-api-design-rest-best-practices/</link><pubDate>Fri, 25 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-api-design-rest-best-practices/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-api-design-rest-best-practices-en.png" alt="Featured image of post Best Practices for Designing REST API Endpoints" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In modern web development, &lt;strong&gt;API consistency&lt;/strong&gt; plays a critical role in developer productivity.&lt;/p&gt;
&lt;p&gt;Inconsistent endpoints (URLs), improper HTTP methods, and wrapping all errors in &lt;code&gt;200 OK&lt;/code&gt; status codes lead to confusion, bugs, and wasted development cycles.&lt;/p&gt;
&lt;p&gt;This article reviews the best practices for designing scalable, self-documenting REST APIs that are easy to understand and integrate.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-principle-1-resource-oriented-urls-use-nouns"&gt;1. Principle 1: Resource-Oriented URLs (Use Nouns)
&lt;/h2&gt;&lt;p&gt;The core principle of REST is that &lt;strong&gt;URIs represent resources (nouns)&lt;/strong&gt;, while the &lt;strong&gt;HTTP methods (verbs)&lt;/strong&gt; represent the actions performed on those resources.&lt;/p&gt;</description></item><item><title>Automating Pre-Commit Checks with Husky and Git Hooks</title><link>https://takao.blog/web/git-hooks-husky-prevent-bugs/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-hooks-husky-prevent-bugs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-husky-prevent-bugs-en.png" alt="Featured image of post Automating Pre-Commit Checks with Husky and Git Hooks" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, simple mistakes like committing code with syntax errors or bad formatting are common. These issues can break the CI build or lead to messy formatting wars during code reviews.&lt;/p&gt;
&lt;p&gt;Instead of relying on developer vigilance to enforce guidelines, you can automate these checks.&lt;/p&gt;
&lt;p&gt;By combining &lt;strong&gt;Git Hooks&lt;/strong&gt; with &lt;strong&gt;Husky&lt;/strong&gt;, you can automatically trigger linters (ESLint), formatters (Prettier), and unit tests (Jest) before any commit or push is finalized. This guide walks you through setting up this workflow.&lt;/p&gt;</description></item><item><title>Comparing Package Managers: npm, pnpm, and yarn</title><link>https://takao.blog/web/npm-pnpm-yarn-package-managers/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/npm-pnpm-yarn-package-managers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/npm-pnpm-yarn-package-managers-en.png" alt="Featured image of post Comparing Package Managers: npm, pnpm, and yarn" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In JavaScript and Node.js development, package managers are essential daily tools.&lt;/p&gt;
&lt;p&gt;While &lt;strong&gt;npm&lt;/strong&gt; remains the default industry standard, modern alternatives like &lt;strong&gt;pnpm&lt;/strong&gt; (famous for saving disk space and speed) and &lt;strong&gt;yarn&lt;/strong&gt; (featuring zero-installs and Plug&amp;rsquo;n&amp;rsquo;Play modes) offer distinct architectures.&lt;/p&gt;
&lt;p&gt;Although they resolve the same &lt;code&gt;package.json&lt;/code&gt; specifications, their internal storage structures, dependency resolutions, and security features differ. This article compares these three package managers to help you choose the best tool for your next project.&lt;/p&gt;</description></item><item><title>Demystifying Next.js App Router Caching Mechanisms</title><link>https://takao.blog/web/nextjs-app-router-caching/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-app-router-caching/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-app-router-caching-en.png" alt="Featured image of post Demystifying Next.js App Router Caching Mechanisms" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js App Router features a robust caching architecture designed to optimize loading speeds and reduce backend API overhead.&lt;/p&gt;
&lt;p&gt;However, because Next.js integrates multiple caching layers, developers often run into debugging issues. Common issues include pages displaying stale data or APIs firing too frequently.&lt;/p&gt;
&lt;p&gt;This article clears up the confusion by explaining the &lt;strong&gt;four caching mechanisms&lt;/strong&gt; in Next.js, along with techniques to configure, refresh, and invalidate them.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-four-caching-layers-of-nextjs-app-router"&gt;1. The Four Caching Layers of Next.js App Router
&lt;/h2&gt;&lt;p&gt;The Next.js App Router uses four separate caching layers:&lt;/p&gt;</description></item><item><title>Smooth Page Transitions with View Transitions API</title><link>https://takao.blog/web/css-view-transitions-single-page-api/</link><pubDate>Sat, 05 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-view-transitions-single-page-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-view-transitions-single-page-api-en.png" alt="Featured image of post Smooth Page Transitions with View Transitions API" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Providing dynamic page transitions is a key factor in elevating the overall user experience (UX) of modern web applications.&lt;/p&gt;
&lt;p&gt;Historically, to morph or fade elements smoothly between page navigations, developers had to import heavy JavaScript libraries like Framer Motion or GSAP. These libraries require deep hooks into rendering lifecycles to delay unmounting while animating old DOM nodes.&lt;/p&gt;
&lt;p&gt;The introduction of the W3C standard &lt;strong&gt;View Transitions API&lt;/strong&gt; simplifies this. It allows browsers to natively capture states and interpolate page layout updates with minimal CSS and JavaScript.&lt;/p&gt;</description></item><item><title>Safe Usecases of git cherry-pick for Specific Commits</title><link>https://takao.blog/web/git-cherry-pick-usecases/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-cherry-pick-usecases/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-cherry-pick-usecases-en.png" alt="Featured image of post Safe Usecases of git cherry-pick for Specific Commits" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In team development, you often encounter situations where you need to deploy a specific bug fix from an ongoing feature branch to your production branch (&lt;code&gt;main&lt;/code&gt;) immediately, without releasing the half-finished feature itself.&lt;/p&gt;
&lt;p&gt;Merging the entire branch would pull in unfinished code.&lt;/p&gt;
&lt;p&gt;This is where the &lt;strong&gt;&lt;code&gt;git cherry-pick&lt;/code&gt;&lt;/strong&gt; command comes in handy. This article reviews how to safely apply individual commits to a target branch, handle conflicts during execution, and avoid common history pitfalls.&lt;/p&gt;</description></item><item><title>Reducing Docker Image Sizes with Multi-Stage Builds</title><link>https://takao.blog/web/docker-multi-stage-build-reduction/</link><pubDate>Thu, 20 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-multi-stage-build-reduction/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-multi-stage-build-reduction-en.png" alt="Featured image of post Reducing Docker Image Sizes with Multi-Stage Builds" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Keeping Docker image footprints small is critical for accelerating deployment cycles, lowering storage costs, and tightening security by shrinking the container&amp;rsquo;s attack surface.&lt;/p&gt;
&lt;p&gt;However, a naive Dockerfile construction often bundles compile-time dependencies (like gcc, headers, build caches) and testing tools directly into the final runtime image. This inflates the image size from a few megabytes to hundreds or gigabytes.&lt;/p&gt;
&lt;p&gt;To solve this, Docker introduced &lt;strong&gt;Multi-Stage Builds&lt;/strong&gt;. This article reviews the core practices of multi-stage architectures, demonstrating image footprint optimization using a TypeScript Node.js project.&lt;/p&gt;</description></item><item><title>Approaches to Improving Interaction to Next Paint (INP)</title><link>https://takao.blog/web/performance-web-vitals-inp/</link><pubDate>Sat, 15 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/performance-web-vitals-inp/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/performance-web-vitals-inp-en.png" alt="Featured image of post Approaches to Improving Interaction to Next Paint (INP)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In Google&amp;rsquo;s &lt;strong&gt;Core Web Vitals&lt;/strong&gt; metrics, which measure the user experience of web pages, FID (First Input Delay) has officially been replaced by &lt;strong&gt;INP (Interaction to Next Paint)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;While FID only measured the response speed of the very first user interaction, INP evaluates the responsiveness of all clicks, taps, and keyboard inputs across the entire lifecycle of the page visit. It logs the delay between an interaction and the subsequent visual update (the &amp;ldquo;Next Paint&amp;rdquo;).&lt;/p&gt;</description></item><item><title>Mastering the TypeScript satisfies Operator</title><link>https://takao.blog/web/typescript-satisfies-operator/</link><pubDate>Mon, 10 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-satisfies-operator/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-satisfies-operator-en.png" alt="Featured image of post Mastering the TypeScript satisfies Operator" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Introduced in TypeScript 4.9, the &lt;strong&gt;&lt;code&gt;satisfies&lt;/code&gt; operator&lt;/strong&gt; is a powerful feature designed to improve type safety while preserving developer flexibility.&lt;/p&gt;
&lt;p&gt;However, distinguishing the difference between &lt;code&gt;satisfies&lt;/code&gt;, type annotations (&lt;code&gt;: Type&lt;/code&gt;), and type assertions (&lt;code&gt;as Type&lt;/code&gt;) can be confusing. This guide breaks down the mechanics of the &lt;code&gt;satisfies&lt;/code&gt; operator and shares practical use cases for production codebases.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-the-limitation-of-standard-type-annotations-"&gt;1. The Limitation of Standard Type Annotations (:)
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s review the limitations of standard type annotations.&lt;/p&gt;</description></item><item><title>Monster Hunter Wilds: Complete Hunting Guide</title><link>https://takao.blog/game/monster-hunter-wilds/</link><pubDate>Mon, 10 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/game/monster-hunter-wilds/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/monster-hunter-wilds-en.png" alt="Featured image of post Monster Hunter Wilds: Complete Hunting Guide" /&gt;&lt;h1 id="monster-hunter-wilds-complete-hunting-guide"&gt;Monster Hunter Wilds: Complete Hunting Guide
&lt;/h1&gt;&lt;h2 id="overview-a-new-frontier"&gt;Overview: A New Frontier
&lt;/h2&gt;&lt;p&gt;Monster Hunter Wilds is the latest installment in Capcom&amp;rsquo;s flagship action RPG series, introducing vast open environments, dynamic weather systems, and a new generation of monsters. As a hunter in the Forbidden Lands, you track, hunt, and harvest massive creatures to craft ever-stronger gear. This guide covers everything you need to thrive.&lt;/p&gt;
&lt;h2 id="weapon-types-and-playstyles"&gt;Weapon Types and Playstyles
&lt;/h2&gt;&lt;p&gt;Monster Hunter Wilds features 14 weapon types, each with unique mechanics and combos. Here&amp;rsquo;s a breakdown of the most beginner-friendly options:&lt;/p&gt;</description></item><item><title>React 19 Official Release and Practical Features Guide</title><link>https://takao.blog/web/react-19-new-features-practical/</link><pubDate>Wed, 05 Mar 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-19-new-features-practical/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-19-new-features-practical-en.png" alt="Featured image of post React 19 Official Release and Practical Features Guide" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;React 19 represents a major paradigm shift for frontend development.&lt;/p&gt;
&lt;p&gt;Features that were previously restricted to meta-frameworks like Next.js—such as &lt;strong&gt;React Server Components (RSC)&lt;/strong&gt; and the &lt;strong&gt;Actions API&lt;/strong&gt; for form handling—are now officially integrated into the stable core React library.&lt;/p&gt;
&lt;p&gt;This guide highlights the most important features in React 19, offering practical code examples and upgrading tips to clean up your codebase.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-simplification-of-async-state-with-the-actions-api"&gt;1. Simplification of Async State with the Actions API
&lt;/h2&gt;&lt;p&gt;A standout feature in React 19 is the introduction of &lt;strong&gt;Actions&lt;/strong&gt;, designed to simplify managing asynchronous mutations, loader overlays, and form submissions.&lt;/p&gt;</description></item><item><title>Defense Principles of XSS in Web Development</title><link>https://takao.blog/web/security-basics-xss-prevention/</link><pubDate>Tue, 25 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/security-basics-xss-prevention/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/security-basics-xss-prevention-en.png" alt="Featured image of post Defense Principles of XSS in Web Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In web security, &lt;strong&gt;Cross-Site Scripting (XSS)&lt;/strong&gt; stands as one of the oldest and most persistent vulnerabilities.&lt;/p&gt;
&lt;p&gt;If malicious scripts run on a victim&amp;rsquo;s browser, they can compromise the entire session, steal session tokens (cookies), hijack accounts, or dynamically alter page content to harvest sensitive credentials.&lt;/p&gt;
&lt;p&gt;This article reviews the fundamental defense principles required to eliminate XSS vulnerabilities in modern web applications. We will explore contextual escaping, sanitization, secure DOM manipulation, and defensive depth mechanisms.&lt;/p&gt;</description></item><item><title>Cleaning Commit History with Interactive Git Rebase</title><link>https://takao.blog/web/git-rebase-interactive-flow/</link><pubDate>Thu, 20 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-rebase-interactive-flow/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-rebase-interactive-flow-en.png" alt="Featured image of post Cleaning Commit History with Interactive Git Rebase" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;During daily software development, it is common to end up with a messy commit history full of logs like &amp;ldquo;WIP,&amp;rdquo; &amp;ldquo;fix typo,&amp;rdquo; or &amp;ldquo;testing deployment.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If you merge these commits directly into your main branch, finding where a specific bug was introduced or understanding why a line of code was added becomes extremely difficult.&lt;/p&gt;
&lt;p&gt;Git&amp;rsquo;s &lt;strong&gt;interactive rebase (&lt;code&gt;git rebase -i&lt;/code&gt;)&lt;/strong&gt; allows you to clean up your commit history before creating a pull request. You can squash multiple commits into one, edit commit messages, reorder history, or delete redundant changes. This article covers the step-by-step workflow of utilizing interactive rebasing.&lt;/p&gt;</description></item><item><title>Patterns to Avoid with JavaScript Async/Await</title><link>https://takao.blog/web/javascript-async-await-tips/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/javascript-async-await-tips/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/javascript-async-await-tips-en.png" alt="Featured image of post Patterns to Avoid with JavaScript Async/Await" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Since the introduction of &lt;code&gt;async/await&lt;/code&gt; in ES2017, writing asynchronous JavaScript has become far more intuitive. It allows developers to express asynchronous logic in a synchronous-looking structure, drastically improving codebase readability compared to nested Promise chains (&lt;code&gt;.then().catch()&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;However, this clean synchronous-like syntax can hide performance pitfalls and error-handling bugs. In this article, we&amp;rsquo;ll dive into common async/await antipatterns and learn how to refactor them into high-performance, resilient code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="antipattern-1-unnecessary-serialization-sequential-awaiting"&gt;Antipattern 1: Unnecessary Serialization (Sequential Awaiting)
&lt;/h2&gt;&lt;p&gt;The most common mistake is executing independent asynchronous tasks sequentially, missing opportunities for parallel execution.&lt;/p&gt;</description></item><item><title>Introduction to CSS Anchor Positioning and Examples</title><link>https://takao.blog/web/css-anchor-positioning-guide/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-anchor-positioning-guide/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-anchor-positioning-guide-en.png" alt="Featured image of post Introduction to CSS Anchor Positioning and Examples" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In web development, positioning floating elements—such as tooltips, popovers, dropdown menus, and hover cards—relative to a specific reference element (the anchor) has historically been a complex challenge.&lt;/p&gt;
&lt;p&gt;To make floating elements follow anchor points on window resizing or page scrolling, developers traditionally relied on continuous JavaScript coordinate calculations (using &lt;code&gt;getBoundingClientRect()&lt;/code&gt;) to dynamically alter inline styles. Libraries like Popper.js or Floating UI became industry standards for this reason. However, executing script loops on the main thread during scroll events frequently caused rendering lag and jank, especially on mobile devices.&lt;/p&gt;</description></item><item><title>Understanding OpenAI's New Reasoning Models and Their Inner Workings</title><link>https://takao.blog/web/ai-reasoning-models-openai/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/ai-reasoning-models-openai/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-reasoning-models-openai-en.png" alt="Featured image of post Understanding OpenAI's New Reasoning Models and Their Inner Workings" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;In recent years, the evolutionary pace of generative AI has been nothing short of extraordinary. Among these developments, the new reasoning models released by OpenAI (such as the o1 and o3 series) employ a fundamentally different architecture and approach compared to conventional large language models like GPT-4o.&lt;/p&gt;
&lt;p&gt;Traditional Large Language Models (LLMs) excel at predicting and generating the &amp;ldquo;most likely next word&amp;rdquo; at high speeds. However, when faced with tasks demanding deep logical deduction—such as complex logic puzzles, advanced mathematics, or refactoring large-scale codebases—they often rely on intuitive leaps, leading to logical inconsistencies known as hallucinations.&lt;/p&gt;</description></item><item><title>Proxmox Backup Strategies: vzdump, PBS, and Disaster Recovery</title><link>https://takao.blog/web/proxmox-backup-disaster-recovery/</link><pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate><guid>https://takao.blog/web/proxmox-backup-disaster-recovery/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-backup-disaster-recovery-en.png" alt="Featured image of post Proxmox Backup Strategies: vzdump, PBS, and Disaster Recovery" /&gt;&lt;p&gt;Backups are not optional. Bit rot, accidental deletion, and ransomware all target hypervisor storage. Proxmox VE offers two backup paths: the built-in &lt;code&gt;vzdump&lt;/code&gt; and the dedicated Proxmox Backup Server (PBS).&lt;/p&gt;
&lt;h2 id="why-backup-matters"&gt;Why Backup Matters
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Threat&lt;/th&gt;
					&lt;th&gt;Impact&lt;/th&gt;
					&lt;th&gt;Mitigation&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Bit rot&lt;/td&gt;
					&lt;td&gt;Silent single-bit corruption&lt;/td&gt;
					&lt;td&gt;Integrity-verified (PBS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Accidental deletion&lt;/td&gt;
					&lt;td&gt;VM lost instantly&lt;/td&gt;
					&lt;td&gt;Retention + off-site&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ransomware&lt;/td&gt;
					&lt;td&gt;Encrypted disks&lt;/td&gt;
					&lt;td&gt;Immutable off-site backups&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vzdump-the-built-in-tool"&gt;vzdump: The Built-In Tool
&lt;/h2&gt;&lt;p&gt;vzdump creates consistent backups of VMs and containers. For VMs, install the Qemu Guest Agent so vzdump can quiesce the filesystem before snapshotting:&lt;/p&gt;</description></item><item><title>Task Management Tools for Beginners: Choosing the Right One</title><link>https://takao.blog/web/task-managenemt/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/web/task-managenemt/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/task-management-en.png" alt="Featured image of post Task Management Tools for Beginners: Choosing the Right One" /&gt;&lt;p&gt;Hello! Today, I will explain “how to choose a task management tool” to manage your daily tasks more efficiently. It is very important to organize “things to do” in your daily life, whether it is work, schoolwork, or housework. But finding the right tool for you may be a bit difficult. So, here are some tips for beginners to help you choose the right one without hesitation!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="to-begin-with-lets-take-a-look-at-some-task-management-tools"&gt;**To begin with, let&amp;rsquo;s take a look at some task management tools.
&lt;/h2&gt;&lt;h2 id="what-is-a-task-management-tool-anyway-"&gt;**What is a task management tool anyway? **
&lt;/h2&gt;&lt;p&gt;As the name suggests, a task management tool is a tool for organizing, recording, and tracking what you need to do on a daily basis. For example, they are useful in the following situations&lt;/p&gt;</description></item><item><title>CDN Caching Strategies: Maximize Performance and Freshness</title><link>https://takao.blog/web/cdn-caching-strategies/</link><pubDate>Mon, 30 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/cdn-caching-strategies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/cdn-caching-strategies-en.png" alt="Featured image of post CDN Caching Strategies: Maximize Performance and Freshness" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Content Delivery Networks (CDNs) are the backbone of modern web performance. By caching content at edge nodes distributed globally, CDNs dramatically reduce latency and offload traffic from origin servers. However, effective caching is not simply a matter of enabling a CDN and forgetting about it. Striking the right balance between performance — high cache hit rates and low latency — and freshness — minimal staleness and fast invalidation — requires deliberate strategy.&lt;/p&gt;</description></item><item><title>File System Access API: Powerful Local File Operations</title><link>https://takao.blog/web/file-system-access-api/</link><pubDate>Sat, 28 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/file-system-access-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/file-system-access-api-en.png" alt="Featured image of post File System Access API: Powerful Local File Operations" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For decades, web applications were limited to reading files through a clunky &lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt; element and had no reliable way to save changes back to the original file. The File System Access API changes this entirely. It enables web applications to read, write, and manage files and directories directly on the user&amp;rsquo;s local file system — with user permission, of course. This opens the door to building text editors, image editors, IDEs, and productivity tools that feel native.&lt;/p&gt;</description></item><item><title>Mobile Web Performance Optimization: 2024 Techniques</title><link>https://takao.blog/web/mobile-performance/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/mobile-performance/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/mobile-performance-en.png" alt="Featured image of post Mobile Web Performance Optimization: 2024 Techniques" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Mobile web performance is no longer a secondary concern. With mobile traffic accounting for over 60% of global web traffic and growing rapidly in emerging markets, the performance characteristics of your site on mobile devices directly impact user retention, conversion, and search rankings. Users expect fast, fluid experiences — 53% abandon sites that take longer than 3 seconds to load. This article covers the key techniques for optimizing mobile web performance in 2024, from network-aware loading to touch event optimization and Core Web Vitals.&lt;/p&gt;</description></item><item><title>Git Hooks for Automation: Beyond Code Quality</title><link>https://takao.blog/web/git-hooks-automation/</link><pubDate>Tue, 24 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-hooks-automation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-automation-en.png" alt="Featured image of post Git Hooks for Automation: Beyond Code Quality" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git hooks are executable scripts that run automatically at specific points in the Git lifecycle. While many developers associate them solely with code formatting and linting, their potential extends far beyond—into workflow automation, project management, and team collaboration. This article explores how to leverage Git hooks for comprehensive automation strategies.&lt;/p&gt;
&lt;h2 id="understanding-git-hooks"&gt;Understanding Git Hooks
&lt;/h2&gt;&lt;p&gt;Git hooks reside in the &lt;code&gt;.git/hooks/&lt;/code&gt; directory of every repository. They are standard executable scripts written in any language—bash, Python, Node.js, or Ruby. Hooks fall into two categories: &lt;strong&gt;client-side hooks&lt;/strong&gt; (pre-commit, pre-push, commit-msg) that run on a developer&amp;rsquo;s machine, and &lt;strong&gt;server-side hooks&lt;/strong&gt; (pre-receive, update, post-receive) that execute on the remote repository.&lt;/p&gt;</description></item><item><title>TypeScript Path Aliases: Clean Imports at Scale</title><link>https://takao.blog/web/typescript-path-aliases/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-path-aliases/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-path-aliases-en.png" alt="Featured image of post TypeScript Path Aliases: Clean Imports at Scale" /&gt;&lt;p&gt;TypeScript path aliases eliminate the pain of deep relative imports like &lt;code&gt;../../../utils/helpers&lt;/code&gt;, replacing them with clean, intention-revealing paths such as &lt;code&gt;@utils/helpers&lt;/code&gt;. This article covers configuration, bundler integration, testing, and migration strategies.&lt;/p&gt;
&lt;h2 id="configuring-baseurl-and-paths"&gt;Configuring baseUrl and paths
&lt;/h2&gt;&lt;p&gt;The foundation of path aliases is the &lt;code&gt;paths&lt;/code&gt; mapping in &lt;code&gt;tsconfig.json&lt;/code&gt;, combined with &lt;code&gt;baseUrl&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
 &amp;#34;compilerOptions&amp;#34;: {
 &amp;#34;baseUrl&amp;#34;: &amp;#34;.&amp;#34;,
 &amp;#34;paths&amp;#34;: {
 &amp;#34;@/*&amp;#34;: [&amp;#34;./src/*&amp;#34;],
 &amp;#34;@components/*&amp;#34;: [&amp;#34;./src/components/*&amp;#34;],
 &amp;#34;@utils/*&amp;#34;: [&amp;#34;./src/utils/*&amp;#34;]
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;baseUrl&lt;/code&gt; sets the base directory for resolving non-relative module names. &lt;code&gt;paths&lt;/code&gt; maps alias prefixes to file system locations relative to &lt;code&gt;baseUrl&lt;/code&gt;. The wildcard &lt;code&gt;*&lt;/code&gt; matches any path segment after the prefix.&lt;/p&gt;</description></item><item><title>Subresource Integrity: Protecting Your CDN Dependencies</title><link>https://takao.blog/web/subresource-integrity/</link><pubDate>Fri, 20 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/subresource-integrity/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/subresource-integrity-en.png" alt="Featured image of post Subresource Integrity: Protecting Your CDN Dependencies" /&gt;&lt;p&gt;Subresource Integrity (SRI) is a security feature that lets browsers verify that resources fetched from CDNs or third-party origins have not been tampered with. In an era of supply chain attacks — the British Airways Magecart breach, the Polyfill.io compromise, and numerous CDN incidents — SRI provides cryptographic assurance that the resource your page loads is exactly what you intended.&lt;/p&gt;
&lt;h2 id="how-sri-works"&gt;How SRI Works
&lt;/h2&gt;&lt;p&gt;When you add an &lt;code&gt;integrity&lt;/code&gt; attribute to a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;/code&gt; tag, the browser computes the hash of the fetched resource and compares it to the attribute value. If they don&amp;rsquo;t match, the browser refuses to execute or apply the resource.&lt;/p&gt;</description></item><item><title>Node.js Performance Monitoring: Metrics That Matter</title><link>https://takao.blog/web/nodejs-performance/</link><pubDate>Wed, 18 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nodejs-performance/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-performance-en.png" alt="Featured image of post Node.js Performance Monitoring: Metrics That Matter" /&gt;&lt;p&gt;Node.js performance monitoring requires a different approach than traditional server environments. The single-threaded event loop, garbage-collected memory model, and asynchronous I/O create unique failure modes that generic CPU and memory metrics alone cannot capture. This article covers the essential metrics and tools you need to keep Node.js applications running smoothly in production.&lt;/p&gt;
&lt;h2 id="why-nodejs-performance-monitoring-is-different"&gt;Why Node.js Performance Monitoring Is Different
&lt;/h2&gt;&lt;p&gt;Unlike multi-threaded servers where a slow operation blocks only one thread, a single CPU-heavy operation in Node.js blocks the entire event loop, stalling all concurrent requests. Garbage collection pauses can introduce unpredictable latency spikes. Common failure modes include event loop starvation, memory leaks from uncleaned closures, callback thrashing, and unhandled promise rejections silently swallowing errors. Understanding these characteristics is the first step toward effective monitoring.&lt;/p&gt;</description></item><item><title>CSS Scoped Styles: @scope and Encapsulation Strategies</title><link>https://takao.blog/web/css-scoped-styles/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-scoped-styles/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-scoped-styles-en.png" alt="Featured image of post CSS Scoped Styles: @scope and Encapsulation Strategies" /&gt;&lt;p&gt;CSS scoping has always been a challenge. Styles cascade globally by default, meaning a selector in one component can unintentionally affect elements in another. Over the years, developers have adopted naming conventions, build-time tools, and full DOM isolation to solve this. The newest addition to this toolkit is the CSS &lt;code&gt;@scope&lt;/code&gt; at-rule, which introduces proximity-based cascade control. This article compares all major scoping strategies and helps you choose the right one.&lt;/p&gt;</description></item><item><title>JavaScript Array Methods: From Basics to Advanced Patterns</title><link>https://takao.blog/web/js-array-methods/</link><pubDate>Thu, 12 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-array-methods/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-array-methods-en.png" alt="Featured image of post JavaScript Array Methods: From Basics to Advanced Patterns" /&gt;&lt;p&gt;JavaScript arrays are the backbone of data manipulation in modern web development. With the ES2023 specification introducing immutable alternatives to long-standing mutating methods, now is the perfect time to revisit how we work with arrays. This article covers the full landscape of array methods, from the familiar &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and &lt;code&gt;reduce&lt;/code&gt; to cutting-edge additions, with practical examples and performance insights.&lt;/p&gt;
&lt;h2 id="the-array-method-landscape"&gt;The Array Method Landscape
&lt;/h2&gt;&lt;p&gt;Array methods fall into two broad categories: mutating and non-mutating. Methods like &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pop&lt;/code&gt;, &lt;code&gt;splice&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, and &lt;code&gt;reverse&lt;/code&gt; modify the array in place, while &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;slice&lt;/code&gt;, and the ES2023 additions create new arrays. The industry trend is shifting toward immutability, which reduces bugs caused by unintended side effects.&lt;/p&gt;</description></item><item><title>Secure Cookie Configuration: A Complete Web Developer Guide</title><link>https://takao.blog/web/secure-cookies/</link><pubDate>Mon, 09 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/secure-cookies/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/secure-cookies-en.png" alt="Featured image of post Secure Cookie Configuration: A Complete Web Developer Guide" /&gt;&lt;p&gt;Cookies remain one of the most frequently misconfigured security controls on the web. A single missing attribute can expose your application to session hijacking, CSRF, or cross-site information leakage. Modern browsers have pushed stricter defaults, but understanding each attribute and combining them correctly is essential for defense-in-depth.&lt;/p&gt;
&lt;p&gt;The core security attributes are &lt;code&gt;Secure&lt;/code&gt;, &lt;code&gt;HttpOnly&lt;/code&gt;, &lt;code&gt;SameSite&lt;/code&gt;, and the &lt;code&gt;__Host-&lt;/code&gt; / &lt;code&gt;__Secure-&lt;/code&gt; prefixes. Each serves a distinct purpose, and they work best when combined.&lt;/p&gt;</description></item><item><title>React Concurrent Features: Building Responsive UIs</title><link>https://takao.blog/web/react-concurrent/</link><pubDate>Fri, 06 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-concurrent/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-concurrent-en.png" alt="Featured image of post React Concurrent Features: Building Responsive UIs" /&gt;&lt;p&gt;React 18 introduced concurrent features that fundamentally change how rendering works. These features let React prepare multiple versions of the UI at once, interrupt work in progress, and prioritize urgent updates over non-urgent ones. The result is more responsive applications without giving up the declarative programming model that makes React productive.&lt;/p&gt;
&lt;p&gt;Concurrency in React is not an all-or-nothing mode. Unlike the abandoned &amp;ldquo;Concurrent Mode&amp;rdquo; concept from earlier experimental builds, React 18+ makes concurrent features opt-in. You adopt them feature by feature, where they provide the most value. The underlying Fiber architecture makes this possible: React&amp;rsquo;s render phase can be paused and resumed, so the reconciler can switch between different units of work as priorities change.&lt;/p&gt;</description></item><item><title>GraphQL vs REST in 2024: Making the Right Choice</title><link>https://takao.blog/web/graphql-vs-rest-2024/</link><pubDate>Tue, 03 Dec 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/graphql-vs-rest-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/graphql-vs-rest-2024-en.png" alt="Featured image of post GraphQL vs REST in 2024: Making the Right Choice" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;The debate between GraphQL and REST has matured significantly by 2024. Both approaches have evolved, adopted features from each other, and found their niches. The question is no longer which is universally superior, but which fits your specific project context. This article provides a balanced comparison to help teams make informed API architecture decisions.&lt;/p&gt;
&lt;h2 id="state-of-rest-in-2024"&gt;State of REST in 2024
&lt;/h2&gt;&lt;p&gt;REST remains the dominant API paradigm, powering the majority of web APIs. Its strengths lie in maturity, simplicity, and universal HTTP caching. The OpenAPI 3.1 specification brought JSON Schema compatibility, improving interoperability. Tooling like Swagger UI, Redoc, and Postman collections provide excellent documentation and testing capabilities.&lt;/p&gt;</description></item><item><title>WebAssembly for Browser Applications: Beyond the Hype</title><link>https://takao.blog/web/wasm-browser-apps/</link><pubDate>Sat, 30 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/wasm-browser-apps/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wasm-browser-apps-en.png" alt="Featured image of post WebAssembly for Browser Applications: Beyond the Hype" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;WebAssembly has matured from a niche curiosity into a production-ready tool for browser-based applications. While early demos focused on gaming engines and scientific simulations, today Wasm is used in image editors, video transcoders, compression libraries, and cryptographic utilities — all running in the browser at near-native speed.&lt;/p&gt;
&lt;p&gt;The key shift in 2024 is ecosystem maturity. WasmGC ships in Chrome 119+, SIMD is available across all major browsers, and reference types allow passing DOM nodes directly into Wasm modules. This article cuts through the hype to examine realistic use cases, compile-target decisions, memory management strategies, and integration patterns for production applications.&lt;/p&gt;</description></item><item><title>Git LFS: Managing Large Files in Your Repository</title><link>https://takao.blog/web/git-lfs/</link><pubDate>Tue, 26 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-lfs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-lfs-en.png" alt="Featured image of post Git LFS: Managing Large Files in Your Repository" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git was designed for text files, not large binaries. When large files enter a Git repository, clone times increase, repository size balloons, and operations like &lt;code&gt;git log&lt;/code&gt; slow down. Git LFS (Large File Storage) solves this by replacing large files with text pointer files in the repository while storing the actual content on a remote server.&lt;/p&gt;
&lt;p&gt;A pointer file is a small text file that maps to content on the LFS server:&lt;/p&gt;</description></item><item><title>Third-Party Script Optimization: Taming Page Bloat</title><link>https://takao.blog/web/third-party-scripts/</link><pubDate>Tue, 19 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/third-party-scripts/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/third-party-scripts-en.png" alt="Featured image of post Third-Party Script Optimization: Taming Page Bloat" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Third-party scripts are the hidden tax of modern web development. The average page loads 15–25 third-party requests, accounting for 60–80% of total page weight. Data from the HTTP Archive confirms that third-party JavaScript is growing faster than first-party code. Each external script adds network latency, parse and compile time, main-thread contention, and potential security risks. The good news: you can optimize third-party scripts without removing their functionality. The goal is to minimize performance impact while preserving business value.&lt;/p&gt;</description></item><item><title>Docker Compose for Production: Deployment Best Practices</title><link>https://takao.blog/web/docker-compose-production/</link><pubDate>Tue, 12 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-compose-production/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-compose-production-en.png" alt="Featured image of post Docker Compose for Production: Deployment Best Practices" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Docker Compose is often relegated to local development, but it is increasingly used for single-host production deployments of small-to-medium applications. The common criticism that &amp;ldquo;Compose is not for production&amp;rdquo; overlooks a key point: for many workloads, a well-configured Compose stack on a single VM provides the right balance of simplicity and reliability.&lt;/p&gt;
&lt;p&gt;This guide covers production-grade Compose practices — treating your compose files as infrastructure-as-code with proper version control, CI/CD integration, and production-specific hardening.&lt;/p&gt;</description></item><item><title>CSS Trigonometric Functions: Math in Your Stylesheets</title><link>https://takao.blog/web/css-trig-functions/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-trig-functions/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-trig-functions-en.png" alt="Featured image of post CSS Trigonometric Functions: Math in Your Stylesheets" /&gt;&lt;p&gt;CSS has evolved from a simple styling language into a powerful computation engine. The introduction of trigonometric functions in CSS Values and Units Module Level 4 &amp;ndash; shipping in Chrome 111+, Firefox 108+, and Safari 15.4+ &amp;ndash; marks a paradigm shift. Developers can now perform geometric calculations directly in stylesheets without preprocessors or JavaScript.&lt;/p&gt;
&lt;h2 id="function-reference-and-syntax"&gt;Function Reference and Syntax
&lt;/h2&gt;&lt;p&gt;Six trigonometric functions are now available in CSS:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Function&lt;/th&gt;
					&lt;th&gt;Input&lt;/th&gt;
					&lt;th&gt;Output&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;sin(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;Sine of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;cos(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;Cosine of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;tan(angle)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;angle&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Tangent of an angle&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;atan2(y, x)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arctangent of y/x (full 360°)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;asin(value)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arcsine&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;acos(value)&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt; [-1, 1]&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Arccosine&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Angle units include &lt;code&gt;deg&lt;/code&gt;, &lt;code&gt;rad&lt;/code&gt;, &lt;code&gt;grad&lt;/code&gt;, and &lt;code&gt;turn&lt;/code&gt;. Common pitfalls include forgetting units, division by zero in &lt;code&gt;atan2&lt;/code&gt;, and domain errors with &lt;code&gt;asin&lt;/code&gt;/&lt;code&gt;acos&lt;/code&gt; inputs outside [-1, 1].&lt;/p&gt;</description></item><item><title>AI Content Generation Strategies for Developers in 2024</title><link>https://takao.blog/web/ai-content-generation/</link><pubDate>Tue, 29 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/ai-content-generation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-content-generation-en.png" alt="Featured image of post AI Content Generation Strategies for Developers in 2024" /&gt;&lt;p&gt;AI content generation has moved from experimentation to production. Developers are no longer asking whether AI can generate content but how to integrate it reliably, at scale, and with quality control. This article provides a practical guide for building content systems with AI, focusing on technical architecture, quality assurance, and ethical deployment rather than prompt engineering tips.&lt;/p&gt;
&lt;h2 id="llm-powered-content-pipelines"&gt;LLM-Powered Content Pipelines
&lt;/h2&gt;&lt;p&gt;A well-architected AI content pipeline consists of several stages. It starts with content specification input including structured metadata, topic briefs, and tone guidelines. A prompt construction layer uses a template system with variable injection, guardrails, and few-shot examples. The LLM API dispatch routes requests to providers such as OpenAI, Anthropic, or open-source models via vLLM or Ollama. Post-processing handles format validation, content extraction, and cleanup before the result enters a human review queue.&lt;/p&gt;</description></item><item><title>JavaScript Bundle Size Optimization: From Analysis to Action</title><link>https://takao.blog/web/bundle-size-optimization/</link><pubDate>Tue, 22 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/bundle-size-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/bundle-size-optimization-en.png" alt="Featured image of post JavaScript Bundle Size Optimization: From Analysis to Action" /&gt;&lt;p&gt;JavaScript bundle size directly impacts user experience. Larger bundles mean longer download times, slower parsing and compilation, and worse Core Web Vitals. A 100KB increase in JavaScript reduces conversion rates by 2 to 3 percent. Bundle optimization is an ongoing investment, not a one-time fix, and follows a cycle of analysis, identification, optimization, and monitoring.&lt;/p&gt;
&lt;h2 id="bundle-analysis-tools"&gt;Bundle Analysis Tools
&lt;/h2&gt;&lt;p&gt;Understanding what is in your bundle is the first step. webpack-bundle-analyzer provides an interactive treemap visualization that highlights large dependencies and duplicate modules. Vite users can leverage rollup-plugin-visualizer with sunburst and network graphs, while esbuild offers the &amp;ndash;metafile flag for detailed output analysis. source-map-explorer maps compiled code back to source files.&lt;/p&gt;</description></item><item><title>TypeScript Branded Types: Preventing Primitive Confusion</title><link>https://takao.blog/web/typescript-branded-types/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-branded-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-branded-types-en.png" alt="Featured image of post TypeScript Branded Types: Preventing Primitive Confusion" /&gt;&lt;p&gt;TypeScript uses structural typing (duck typing): two types with identical shapes are interchangeable. This causes bugs when primitive types back domain concepts — passing a &lt;code&gt;userId&lt;/code&gt; where an &lt;code&gt;orderId&lt;/code&gt; is expected, both typed as &lt;code&gt;string&lt;/code&gt;. Consider a function that sends an email but accidentally receives a database ID instead of an address because both are &lt;code&gt;string&lt;/code&gt;. Branded types solve this by adding a phantom type marker that differentiates structurally identical types at compile time with zero runtime cost.&lt;/p&gt;</description></item><item><title>Next.js Internationalization: Routing and Content Strategy</title><link>https://takao.blog/web/nextjs-i18n-routing/</link><pubDate>Tue, 08 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-i18n-routing/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-i18n-routing-en.png" alt="Featured image of post Next.js Internationalization: Routing and Content Strategy" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Internationalization is a fundamental requirement for modern web applications. Next.js has evolved its i18n support from an integrated routing system in Pages Router to a flexible middleware-based approach in App Router. This article covers routing strategies, locale detection, content management, and SEO optimization for multi-language Next.js applications.&lt;/p&gt;
&lt;p&gt;The key concepts are locales, default locale, locale detection, and the trade-offs between sub-path routing and domain routing. The App Router approach offers more flexibility but requires more manual setup than its predecessor.&lt;/p&gt;</description></item><item><title>SQL Injection Prevention: Modern Database Security Guide</title><link>https://takao.blog/web/sql-injection-prevention/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/sql-injection-prevention/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/sql-injection-prevention-en.png" alt="Featured image of post SQL Injection Prevention: Modern Database Security Guide" /&gt;&lt;p&gt;SQL injection remains in the OWASP Top 10 despite decades of awareness. The 2023-2024 period saw high-profile breaches in healthcare, e-commerce, and government sectors involving SQLi. While the classic &lt;code&gt;' OR 1=1 --&lt;/code&gt; attack is well-known, modern variants include second-order injection, blind SQLi (time-based and boolean-based), and out-of-band exfiltration. Prevention is well-understood but poorly executed due to legacy code, ORM misuse, and insufficient testing automation.&lt;/p&gt;
&lt;h2 id="parameterized-queries-and-prepared-statements"&gt;Parameterized Queries and Prepared Statements
&lt;/h2&gt;&lt;p&gt;Prepared statements are the gold standard for SQL injection prevention. They separate SQL logic from data at the database engine level, making it impossible for user input to alter query structure.&lt;/p&gt;</description></item><item><title>Monorepo Management with Turborepo: Scaling Development</title><link>https://takao.blog/web/monorepo-turborepo/</link><pubDate>Tue, 24 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/monorepo-turborepo/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/monorepo-turborepo-en.png" alt="Featured image of post Monorepo Management with Turborepo: Scaling Development" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As JavaScript monorepos grow, build times spiral, CI pipelines saturate, and developer productivity drops. Turborepo, created by Vercel, addresses these challenges with intelligent caching and parallel task execution. Unlike Lerna or Nx, Turborepo focuses on being a task runner rather than a build tool, delegating compilation to tools like esbuild, webpack, and tsc.&lt;/p&gt;
&lt;h2 id="core-architecture--the-cache-system"&gt;Core Architecture — The Cache System
&lt;/h2&gt;&lt;p&gt;Turborepo&amp;rsquo;s cache is its defining feature. Cache keys are computed from file contents, environment variables, and dependency graphs. The cache lives in &lt;code&gt;node_modules/.cache/turbo&lt;/code&gt; as tar.gz archives, and the cache hit/miss lifecycle determines whether a task executes or skips.&lt;/p&gt;</description></item><item><title>Serverless Architecture Patterns: Beyond Lambda Functions</title><link>https://takao.blog/web/serverless-patterns/</link><pubDate>Tue, 17 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/serverless-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/serverless-patterns-en.png" alt="Featured image of post Serverless Architecture Patterns: Beyond Lambda Functions" /&gt;&lt;p&gt;Serverless computing has evolved far beyond replacing simple REST APIs with Lambda functions behind API Gateway. Modern serverless architectures are fully event-driven, asynchronous, and decompose monoliths into coordinated function workflows. Major enterprises now run production workloads on AWS Lambda, Azure Functions, and Cloudflare Workers. This article explores patterns that go beyond the basics.&lt;/p&gt;
&lt;h2 id="event-driven-architecture-foundation"&gt;Event-Driven Architecture Foundation
&lt;/h2&gt;&lt;p&gt;At the core of serverless is the event-driven model: event producers emit events, event routers deliver them, and event consumers react. AWS offers multiple routing services — EventBridge for schema-aware event buses, SQS for queue-based decoupling, SNS for pub/sub messaging, and Kafka for high-throughput streaming.&lt;/p&gt;</description></item><item><title>JavaScript Typed Arrays: Binary Data Processing in the Browser</title><link>https://takao.blog/web/js-typed-arrays/</link><pubDate>Tue, 10 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-typed-arrays/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-typed-arrays-en.png" alt="Featured image of post JavaScript Typed Arrays: Binary Data Processing in the Browser" /&gt;&lt;p&gt;JavaScript&amp;rsquo;s native &lt;code&gt;Number&lt;/code&gt; type — an IEEE 754 double-precision float — is inefficient for binary data. Early solutions involved manual byte packing in plain arrays, which was slow and error-prone. ECMAScript 2015 formalized Typed Arrays, bringing C-like memory management to JavaScript. This three-layer architecture — &lt;code&gt;ArrayBuffer&lt;/code&gt;, TypedArray views, and &lt;code&gt;DataView&lt;/code&gt; — enables high-performance binary data processing in the browser and Node.js.&lt;/p&gt;
&lt;h2 id="arraybuffer-foundation"&gt;ArrayBuffer Foundation
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt; represents a fixed-length raw binary buffer. It cannot be read or written directly — you must use a view:&lt;/p&gt;</description></item><item><title>React Portals: Advanced Patterns for Modals and Overlays</title><link>https://takao.blog/web/react-portal-patterns/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-portal-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-portal-patterns-en.png" alt="Featured image of post React Portals: Advanced Patterns for Modals and Overlays" /&gt;&lt;p&gt;React portals solve a fundamental problem: DOM hierarchy constraints. A modal rendered inside a deeply nested component inherits its parent&amp;rsquo;s &lt;code&gt;z-index&lt;/code&gt; stacking context and can be clipped by &lt;code&gt;overflow: hidden&lt;/code&gt;. Portals let you render children into a different DOM node while preserving the React tree, so context, event handling, and component lifecycle all work as expected.&lt;/p&gt;
&lt;p&gt;The key insight is the separation of DOM position from React tree position. A portal&amp;rsquo;s children are physically rendered elsewhere in the DOM, but events bubble through the React component hierarchy, not the DOM hierarchy. This mental model is essential for understanding all portal patterns.&lt;/p&gt;</description></item><item><title>Docker Networking: From Bridge to Overlay Networks</title><link>https://takao.blog/web/docker-networking/</link><pubDate>Tue, 27 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-networking/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-networking-en.png" alt="Featured image of post Docker Networking: From Bridge to Overlay Networks" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Docker containers are designed to be portable and isolated, but they rarely run in isolation. Containers need to communicate with each other, with the host system, and with external services. Understanding Docker&amp;rsquo;s networking model is essential for building reliable, secure, and performant containerized applications.&lt;/p&gt;
&lt;p&gt;Docker provides several built-in network drivers — bridge, host, overlay, macvlan, ipvlan, and none — each suited to different use cases. This guide covers each driver in depth, along with DNS resolution, port mapping, security isolation, and Docker Compose networking patterns.&lt;/p&gt;</description></item><item><title>CSS Popover API: Native Overlays Without JavaScript</title><link>https://takao.blog/web/css-popover-api/</link><pubDate>Tue, 20 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-popover-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-popover-api-en.png" alt="Featured image of post CSS Popover API: Native Overlays Without JavaScript" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Building overlays like tooltips, dropdown menus, and modals has traditionally required a significant amount of JavaScript. Developers have relied on CSS &lt;code&gt;position: absolute&lt;/code&gt; with manual coordinate calculations, ARIA attributes for accessibility, and framework-specific solutions such as React portals or Floating UI. The CSS Popover API changes this by providing a native, declarative way to create overlays that handle positioning, show/hide toggling, focus management, and light dismiss without any JavaScript.&lt;/p&gt;</description></item><item><title>Proxmox VE ZFS Storage: Pool Setup, Snapshots, and Optimization</title><link>https://takao.blog/web/proxmox-zfs-storage/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/web/proxmox-zfs-storage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-zfs-storage-en.png" alt="Featured image of post Proxmox VE ZFS Storage: Pool Setup, Snapshots, and Optimization" /&gt;&lt;h2 id="why-zfs-on-proxmox"&gt;Why ZFS on Proxmox
&lt;/h2&gt;&lt;p&gt;ZFS brings enterprise-grade features to Proxmox VE: data integrity via checksumming (detects and repairs silent corruption), transparent compression, instant snapshots and clones, and flexible RAID-like pooling. It replaces traditional volume management and filesystem layers with a single, unified stack.&lt;/p&gt;
&lt;h2 id="creating-a-pool"&gt;Creating a Pool
&lt;/h2&gt;&lt;p&gt;A pool is built from virtual devices (vdevs). Common vdev types:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Vdev type&lt;/th&gt;
					&lt;th&gt;Minimum disks&lt;/th&gt;
					&lt;th&gt;Usable capacity&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Mirror&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Data mirrored across two disks&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ1&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;67%&lt;/td&gt;
					&lt;td&gt;Single parity (max 1 disk failure)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ2&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Double parity (max 2 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ3&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;40%&lt;/td&gt;
					&lt;td&gt;Triple parity (max 3 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stripe&lt;/td&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;100%&lt;/td&gt;
					&lt;td&gt;No redundancy (not recommended)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Create a mirrored pool:&lt;/p&gt;</description></item><item><title>TypeScript Project References: Scaling Large Codebases</title><link>https://takao.blog/web/typescript-project-references/</link><pubDate>Tue, 13 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-project-references/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-project-references-en.png" alt="Featured image of post TypeScript Project References: Scaling Large Codebases" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;As TypeScript codebases grow, the monolithic &lt;code&gt;tsconfig.json&lt;/code&gt; approach breaks down. Every invocation of &lt;code&gt;tsc&lt;/code&gt; type-checks and emits the entire project — a process that can take minutes even with &lt;code&gt;--noEmit&lt;/code&gt; in large monorepos. Worse, without module boundaries, any file can import any other file, creating tangled dependency graphs that are difficult to refactor. &lt;strong&gt;TypeScript Project References&lt;/strong&gt; solve this by allowing you to split your codebase into independent sub-projects, each with its own &lt;code&gt;tsconfig.json&lt;/code&gt;, enabling incremental builds, enforced API boundaries, and dramatically faster type-checking.&lt;/p&gt;</description></item><item><title>Node.js Logging Best Practices: Structured and Scalable</title><link>https://takao.blog/web/nodejs-logging/</link><pubDate>Tue, 06 Aug 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nodejs-logging/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-logging-en.png" alt="Featured image of post Node.js Logging Best Practices: Structured and Scalable" /&gt;&lt;p&gt;Production-grade logging is one of the most overlooked aspects of Node.js application development. While &lt;code&gt;console.log&lt;/code&gt; works for debugging locally, it falls apart in distributed environments where logs must be searchable, structured, and actionable. This article covers the essential patterns for building a logging strategy that scales.&lt;/p&gt;
&lt;h2 id="why-structured-logging"&gt;Why Structured Logging
&lt;/h2&gt;&lt;p&gt;Traditional unstructured logging outputs plain text that is difficult to parse programmatically. Consider &lt;code&gt;console.log(&amp;quot;User logged in:&amp;quot;, userId)&lt;/code&gt;. Grepping this across hundreds of service instances is slow and error-prone. Structured logging outputs each log event as a JSON object, making it machine-readable and queryable by log aggregation systems.&lt;/p&gt;</description></item><item><title>Machine Learning in the Browser with TensorFlow.js</title><link>https://takao.blog/web/ml-in-browser/</link><pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/ml-in-browser/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ml-in-browser-en.png" alt="Featured image of post Machine Learning in the Browser with TensorFlow.js" /&gt;&lt;p&gt;Machine learning in the browser eliminates server costs, preserves user privacy, and enables offline-capable intelligent applications. TensorFlow.js brings ML to JavaScript developers with GPU-accelerated inference and training, powered by WebGL and WebGPU backends. This article covers loading pre-trained models, transfer learning, real-time pose detection, and production deployment considerations.&lt;/p&gt;
&lt;h2 id="why-ml-in-the-browser"&gt;Why ML in the Browser?
&lt;/h2&gt;&lt;p&gt;Running ML models client-side offers four key advantages: zero server costs (inference runs on the user&amp;rsquo;s device), complete privacy (data never leaves the machine), offline capability (no network required after model load), and low latency (no round-trip for predictions). The trade-offs include limited compute power, memory constraints, battery drain on mobile devices, and large model download sizes (5-200 MB).&lt;/p&gt;</description></item><item><title>Web Bluetooth API: Connecting Hardware from the Browser</title><link>https://takao.blog/web/web-bluetooth-api/</link><pubDate>Tue, 23 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/web-bluetooth-api/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/web-bluetooth-api-en.png" alt="Featured image of post Web Bluetooth API: Connecting Hardware from the Browser" /&gt;&lt;p&gt;The Web Bluetooth API brings hardware interaction to the browser, enabling web applications to communicate with Bluetooth Low Energy (BLE) devices. This opens up IoT use cases like connecting heart rate monitors, temperature sensors, and smart lights directly from web pages.&lt;/p&gt;
&lt;h2 id="how-web-bluetooth-works"&gt;How Web Bluetooth Works
&lt;/h2&gt;&lt;p&gt;Web Bluetooth operates over the GATT (Generic Attribute Profile) protocol, which is standard for BLE communication. In this model, the BLE device acts as a peripheral that exposes services and characteristics, while the browser acts as the central that consumes them.&lt;/p&gt;</description></item><item><title>Container Security Scanning: Protecting Your Supply Chain</title><link>https://takao.blog/web/container-security/</link><pubDate>Tue, 16 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/container-security/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/container-security-en.png" alt="Featured image of post Container Security Scanning: Protecting Your Supply Chain" /&gt;&lt;p&gt;Container security is no longer optional. With supply chain attacks on the rise, securing container images from build to runtime is a fundamental requirement for any organization running containerized workloads. Runtime security alone is insufficient; supply chain security must start at the image build stage.&lt;/p&gt;
&lt;h2 id="the-container-supply-chain-threat-landscape"&gt;The Container Supply Chain Threat Landscape
&lt;/h2&gt;&lt;p&gt;Attack vectors in the container supply chain include compromised base images, vulnerable dependencies, leaked secrets, and malicious packages. Real-world incidents such as the Codecov breach exposing credentials, dependency confusion attacks, and cryptominers found in public images highlight the severity of these threats. The shared responsibility model means that while platforms like Docker provide base infrastructure, the security of your built images is your responsibility.&lt;/p&gt;</description></item><item><title>JavaScript Module Federation: Micro-Frontends in Practice</title><link>https://takao.blog/web/module-federation/</link><pubDate>Tue, 09 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/module-federation/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/module-federation-en.png" alt="Featured image of post JavaScript Module Federation: Micro-Frontends in Practice" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Module Federation, introduced in Webpack 5, provides a runtime integration mechanism for building micro-frontend architectures. Unlike build-time integration approaches, it enables independently deployed applications to share code at runtime, facilitating team autonomy and incremental migration without coordinated releases.&lt;/p&gt;
&lt;p&gt;At its core, Module Federation allows a JavaScript application to dynamically load code from another application at runtime. Each participating application exposes a &lt;code&gt;remoteEntry.js&lt;/code&gt; file that serves as the entry point. When a host application needs a component from a remote, it fetches the &lt;code&gt;remoteEntry.js&lt;/code&gt; at runtime and resolves the required module on demand.&lt;/p&gt;</description></item><item><title>Image Optimization Strategies 2024: AVIF, WebP, and Beyond</title><link>https://takao.blog/web/image-optimization-2024/</link><pubDate>Tue, 02 Jul 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/image-optimization-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/image-optimization-2024-en.png" alt="Featured image of post Image Optimization Strategies 2024: AVIF, WebP, and Beyond" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Images account for over half of the typical webpage&amp;rsquo;s total weight. As web applications grow more visual, optimizing image delivery has become critical for performance, user experience, and Core Web Vitals scores. This article explores modern image optimization strategies, from next-generation formats to responsive delivery techniques.&lt;/p&gt;
&lt;h2 id="image-formats-in-2024"&gt;Image Formats in 2024
&lt;/h2&gt;&lt;p&gt;The image format landscape has shifted dramatically. Three modern formats now compete for dominance alongside legacy JPEG and PNG.&lt;/p&gt;</description></item><item><title>CSS Scroll-Driven Animations: The Future of Scroll-Based Effects</title><link>https://takao.blog/web/css-scroll-driven-animations/</link><pubDate>Tue, 25 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-scroll-driven-animations/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-scroll-driven-animations-en.png" alt="Featured image of post CSS Scroll-Driven Animations: The Future of Scroll-Based Effects" /&gt;&lt;h2 id="the-problem-with-javascript-scroll-events"&gt;The Problem with JavaScript Scroll Events
&lt;/h2&gt;&lt;p&gt;Scroll-based effects have traditionally relied on JavaScript scroll event listeners running on the main thread, which often causes jank, dropped frames, and poor user experience. Even with passive listeners and &lt;code&gt;requestAnimationFrame&lt;/code&gt; throttling, layout thrashing remains a persistent issue. CSS Scroll-Driven Animations solve this by moving scroll tracking to the compositor thread, enabling smooth 60fps effects without any JavaScript overhead.&lt;/p&gt;
&lt;h2 id="key-concepts"&gt;Key Concepts
&lt;/h2&gt;&lt;p&gt;Three core concepts power this feature. A &lt;strong&gt;scroll-timeline&lt;/strong&gt; links an animation to the scroll position of a scroll container. A &lt;strong&gt;view-timeline&lt;/strong&gt; ties an animation to an element&amp;rsquo;s visibility within a scroll container. The &lt;strong&gt;animation-timeline&lt;/strong&gt; property binds a named animation to either timeline type. Use &lt;code&gt;timeline-scope&lt;/code&gt; to share timelines across elements in the DOM tree.&lt;/p&gt;</description></item><item><title>Managing SSH Keys with Vaultwarden and Bitwarden SSH Agent</title><link>https://takao.blog/web/vaultwarden-ssh-key/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/web/vaultwarden-ssh-key/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vaultwarden-ssh-key-en.png" alt="Featured image of post Managing SSH Keys with Vaultwarden and Bitwarden SSH Agent" /&gt;&lt;h2 id="why-store-ssh-keys-in-a-password-manager"&gt;Why Store SSH Keys in a Password Manager
&lt;/h2&gt;&lt;p&gt;SSH keys are the gold standard for authenticating to remote servers, Git providers, and internal infrastructure. Yet most developers store them as plain files under &lt;code&gt;~/.ssh/&lt;/code&gt; — unprotected, unsynced, and unaudited. Moving SSH keys into Vaultwarden (or Bitwarden) solves three fundamental problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralized management&lt;/strong&gt;: All keys live in one vault, not scattered across machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-device sync&lt;/strong&gt;: Add a key once; it appears on every device automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit trail&lt;/strong&gt;: Every key access and client operation is logged by the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Bitwarden SSH agent bridges the gap between a locked-down vault and the day-to-day need to use SSH keys transparently.&lt;/p&gt;</description></item><item><title>Next.js Middleware: Routing, Auth, and Edge Computing</title><link>https://takao.blog/web/nextjs-middleware/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-middleware/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-middleware-en.png" alt="Featured image of post Next.js Middleware: Routing, Auth, and Edge Computing" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Next.js Middleware executes before every request, running at the Edge or serverless region. A single &lt;code&gt;middleware.ts&lt;/code&gt; file at the project root intercepts incoming requests and can redirect, rewrite, manipulate headers, or perform authentication checks before the request reaches the matched route.&lt;/p&gt;
&lt;p&gt;Middleware is ideal for fast, edge-based decisions that should happen before page rendering. It does not run on static assets or &lt;code&gt;_next/static&lt;/code&gt; by default.&lt;/p&gt;
&lt;h2 id="basic-structure"&gt;Basic Structure
&lt;/h2&gt;&lt;p&gt;The middleware file exports a function that receives &lt;code&gt;NextRequest&lt;/code&gt; and returns &lt;code&gt;NextResponse&lt;/code&gt;, along with a &lt;code&gt;config&lt;/code&gt; object that defines which paths trigger execution.&lt;/p&gt;</description></item><item><title>Stardew Valley: Beginner's Guide to Farming and Adventure</title><link>https://takao.blog/game/stardew-valley/</link><pubDate>Sat, 15 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/game/stardew-valley/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/stardew-valley-en.png" alt="Featured image of post Stardew Valley: Beginner's Guide to Farming and Adventure" /&gt;&lt;h1 id="stardew-valley-beginners-guide-to-farming-and-adventure"&gt;Stardew Valley: Beginner&amp;rsquo;s Guide to Farming and Adventure
&lt;/h1&gt;&lt;h2 id="getting-started-your-first-day"&gt;Getting Started: Your First Day
&lt;/h2&gt;&lt;p&gt;You inherit your grandfather&amp;rsquo;s old farm in Stardew Valley with nothing but a few parsnip seeds and a rusty hoe. Your first task is to clear a small patch of soil, plant your parsnips, and water them daily. Parsnips take only 4 days to grow and sell for 35g each, making them the perfect starter crop.&lt;/p&gt;
&lt;p&gt;Visit Pierre&amp;rsquo;s General Store to buy additional seeds. The most profitable spring crops for beginners are:&lt;/p&gt;</description></item><item><title>CSS @layer: Managing Cascade with Layer Architecture</title><link>https://takao.blog/web/css-layer-architecture/</link><pubDate>Tue, 11 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-layer-architecture/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-layer-architecture-en.png" alt="Featured image of post CSS @layer: Managing Cascade with Layer Architecture" /&gt;&lt;p&gt;If you have ever battled specificity wars in a large CSS project — overriding third-party styles, sprinkling &lt;code&gt;!important&lt;/code&gt; declarations, or restructuring HTML just to win the cascade — &lt;code&gt;@layer&lt;/code&gt; is the solution you have been waiting for. The CSS &lt;code&gt;@layer&lt;/code&gt; at-rule gives developers explicit control over the cascade order, independent of specificity or source order.&lt;/p&gt;
&lt;h2 id="the-cascade-problem-before-layer"&gt;The Cascade Problem Before @layer
&lt;/h2&gt;&lt;p&gt;Before &lt;code&gt;@layer&lt;/code&gt;, cascade management relied entirely on conventions: BEM naming, SMACSS categories, ITCSS architecture. These conventions worked, but they were not enforced by the browser. Third-party CSS could override carefully crafted component styles, and source-order fragility meant that a single &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag reorder could break an entire design system.&lt;/p&gt;</description></item><item><title>JavaScript Proxy and Reflect API: Metaprogramming Patterns</title><link>https://takao.blog/web/js-proxy-reflect/</link><pubDate>Tue, 04 Jun 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-proxy-reflect/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-proxy-reflect-en.png" alt="Featured image of post JavaScript Proxy and Reflect API: Metaprogramming Patterns" /&gt;&lt;p&gt;JavaScript&amp;rsquo;s &lt;code&gt;Proxy&lt;/code&gt; and &lt;code&gt;Reflect&lt;/code&gt; APIs are among the most powerful metaprogramming tools available in the language. They allow developers to intercept and customize fundamental operations on objects — property access, assignment, enumeration, function invocation, and even constructor calls. This article explores all 13 proxy traps, the complementary &lt;code&gt;Reflect&lt;/code&gt; API, and real-world patterns used in production frameworks like Vue 3, MobX, and Immer.&lt;/p&gt;
&lt;h2 id="understanding-the-proxy-pattern"&gt;Understanding the Proxy Pattern
&lt;/h2&gt;&lt;p&gt;A &lt;code&gt;Proxy&lt;/code&gt; wraps a target object and intercepts operations via handler functions called traps:&lt;/p&gt;</description></item><item><title>AI Code Review Tools in 2024: Boosting Development Quality</title><link>https://takao.blog/web/ai-code-review-tools/</link><pubDate>Tue, 28 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/ai-code-review-tools/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/ai-code-review-tools-en.png" alt="Featured image of post AI Code Review Tools in 2024: Boosting Development Quality" /&gt;&lt;p&gt;Code review remains one of the most effective practices for improving software quality, yet it is time-consuming and subject to human fatigue. In 2024, AI-powered code review tools have matured significantly, offering automated analysis that complements human reviewers. This article surveys the leading tools, their capabilities, integration patterns, and guidance for incorporating them into development workflows.&lt;/p&gt;
&lt;h2 id="github-copilot-code-review"&gt;GitHub Copilot Code Review
&lt;/h2&gt;&lt;p&gt;GitHub Copilot&amp;rsquo;s code review capabilities extend well beyond inline code completion. The Copilot Chat integration provides pull request-level analysis including automated summaries of changes, specific improvement recommendations with code examples, security vulnerability identification within diffs, and consistency checks against project conventions. You can trigger a Copilot review directly from the CLI:&lt;/p&gt;</description></item><item><title>Proxmox LXC Containers: Complete Management Guide</title><link>https://takao.blog/web/proxmox-lxc-containers/</link><pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/web/proxmox-lxc-containers/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-lxc-containers-en.png" alt="Featured image of post Proxmox LXC Containers: Complete Management Guide" /&gt;&lt;h2 id="what-is-lxc"&gt;What is LXC?
&lt;/h2&gt;&lt;p&gt;LXC (Linux Containers) is an OS-level virtualization method that runs multiple isolated Linux systems on a single host using a shared kernel. Unlike full virtual machines, LXC containers share the host OS kernel while maintaining their own filesystem, processes, and network stack. This design makes them extremely lightweight and fast to start.&lt;/p&gt;
&lt;h2 id="lxc-vs-virtual-machines"&gt;LXC vs Virtual Machines
&lt;/h2&gt;&lt;p&gt;The choice between LXC containers and VMs depends on your isolation and performance requirements:&lt;/p&gt;</description></item><item><title>Git Squash Merge: Clean History Strategies for Teams</title><link>https://takao.blog/web/git-squash-merge/</link><pubDate>Tue, 21 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-squash-merge/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-squash-merge-en.png" alt="Featured image of post Git Squash Merge: Clean History Strategies for Teams" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Git history is a communication tool for your team and your future self. A clean, readable history makes debugging, code review, and release management significantly easier. Squash merge is one of the primary strategies for maintaining a clean history, but knowing when and how to use it—and when to choose alternatives—requires understanding the trade-offs involved. This article provides a comprehensive guide to squash merge strategies for teams.&lt;/p&gt;
&lt;h2 id="squash-merge-mechanics"&gt;Squash Merge Mechanics
&lt;/h2&gt;&lt;p&gt;A squash merge combines all commits from a feature branch into a single commit on the target branch. Consider a feature branch with commits C, D, and E that need to be merged into main:&lt;/p&gt;</description></item><item><title>WebSocket for Real-Time Applications: Complete Guide</title><link>https://takao.blog/web/websocket-applications/</link><pubDate>Tue, 14 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/websocket-applications/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/websocket-applications-en.png" alt="Featured image of post WebSocket for Real-Time Applications: Complete Guide" /&gt;&lt;p&gt;Real-time functionality has become a baseline expectation for modern web applications. WebSocket provides full-duplex communication channels over a single TCP connection, enabling low-latency data exchange between client and server. This guide covers the WebSocket protocol, implementation patterns, scaling strategies, and practical considerations for building production-grade real-time applications.&lt;/p&gt;
&lt;h2 id="websocket-protocol-overview"&gt;WebSocket Protocol Overview
&lt;/h2&gt;&lt;p&gt;WebSocket begins with an HTTP upgrade handshake. The client sends an HTTP request with an &lt;code&gt;Upgrade: websocket&lt;/code&gt; header, and the server responds with &lt;code&gt;101 Switching Protocols&lt;/code&gt; to establish the connection. Once established, the connection transitions from HTTP to the WebSocket protocol on the same underlying TCP socket.&lt;/p&gt;</description></item><item><title>API Rate Limiting Strategies: Protecting Your Services</title><link>https://takao.blog/web/api-rate-limiting/</link><pubDate>Tue, 07 May 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/api-rate-limiting/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/api-rate-limiting-en.png" alt="Featured image of post API Rate Limiting Strategies: Protecting Your Services" /&gt;&lt;p&gt;Rate limiting is a critical component of any production API. It protects backend services from abuse, ensures fair resource allocation, maintains performance under load, and mitigates denial-of-service attacks. This article examines the major rate limiting algorithms, their trade-offs, and best practices for designing robust systems.&lt;/p&gt;
&lt;h2 id="token-bucket-algorithm"&gt;Token Bucket Algorithm
&lt;/h2&gt;&lt;p&gt;The token bucket is one of the most widely used rate limiting algorithms. A bucket holds tokens that refill at a steady rate, and each request consumes one token. If the bucket is empty, the request is denied. This approach allows bursts up to the bucket capacity while smoothing traffic over time.&lt;/p&gt;</description></item><item><title>LLM Prompt Engineering: A Developer's Practical Guide</title><link>https://takao.blog/web/llm-prompt-engineering/</link><pubDate>Tue, 30 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/llm-prompt-engineering/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/llm-prompt-engineering-en.png" alt="Featured image of post LLM Prompt Engineering: A Developer's Practical Guide" /&gt;&lt;p&gt;Prompt engineering has become an essential skill for developers building applications with large language models. As LLMs integrate deeper into software products, effective prompt design directly impacts output quality, reliability, and cost. This article provides a practical, developer-focused guide to prompt engineering techniques that work in production.&lt;/p&gt;
&lt;h2 id="prompt-structure-fundamentals"&gt;Prompt Structure Fundamentals
&lt;/h2&gt;&lt;p&gt;A well-structured prompt follows a consistent architecture: system message (behavior and persona), context (background information), task description (what the model should do), examples (few-shot demonstrations), input (the actual data), and output format (expected response structure).&lt;/p&gt;</description></item><item><title>Node.js Worker Threads: Parallel Processing in Practice</title><link>https://takao.blog/web/nodejs-worker-threads/</link><pubDate>Tue, 23 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nodejs-worker-threads/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-worker-threads-en.png" alt="Featured image of post Node.js Worker Threads: Parallel Processing in Practice" /&gt;&lt;p&gt;Node.js has traditionally been single-threaded, relying on asynchronous I/O for concurrency. While this model excels at I/O-bound workloads, CPU-intensive operations block the event loop and degrade application responsiveness. Worker Threads, stabilized in Node.js 12, provide true parallel execution within a single process by running JavaScript in separate V8 isolates. This article covers practical patterns for using worker threads in production.&lt;/p&gt;
&lt;h2 id="worker-lifecycle-and-communication"&gt;Worker Lifecycle and Communication
&lt;/h2&gt;&lt;p&gt;Creating a worker requires a separate JavaScript file that executes in its own V8 isolate with its own heap and event loop.&lt;/p&gt;</description></item><item><title>GitHub Actions Advanced: Workflows Beyond CI/CD Basics</title><link>https://takao.blog/web/github-actions-advanced/</link><pubDate>Tue, 16 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/github-actions-advanced/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/github-actions-advanced-en.png" alt="Featured image of post GitHub Actions Advanced: Workflows Beyond CI/CD Basics" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;GitHub Actions has evolved from a simple CI/CD tool into a comprehensive automation platform. While basic workflows are well-documented, the platform&amp;rsquo;s advanced features—reusable workflows, composite actions, matrix strategies, and deployment patterns—enable sophisticated automation pipelines. This article explores these advanced capabilities for teams building complex CI/CD systems.&lt;/p&gt;
&lt;h2 id="reusable-workflows"&gt;Reusable Workflows
&lt;/h2&gt;&lt;p&gt;Reusable workflows allow you to define a workflow in one repository and call it from others, following the DRY principle. They are triggered with &lt;code&gt;workflow_call&lt;/code&gt; and accept inputs and secrets.&lt;/p&gt;</description></item><item><title>Schedule I: Complete Guide to the Open-World Drug Empire Game</title><link>https://takao.blog/game/schedule-i/</link><pubDate>Mon, 15 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/game/schedule-i/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/schedule-i-en.png" alt="Featured image of post Schedule I: Complete Guide to the Open-World Drug Empire Game" /&gt;&lt;h1 id="schedule-i-complete-guide-to-the-open-world-drug-empire-game"&gt;Schedule I: Complete Guide to the Open-World Drug Empire Game
&lt;/h1&gt;&lt;p&gt;Schedule I is an open-world crime simulation game developed and published by TVGS (Tyler&amp;rsquo;s Video Game Studios), a solo Australian developer. Released in Early Access on March 24, 2025 for Windows via Steam, the game skyrocketed to over 400,000 concurrent players within its first week, earning an &amp;ldquo;Overwhelmingly Positive&amp;rdquo; rating from over 190,000 reviews. Set in the grungy west-coast city of Hyland Point, Schedule I combines business management, tactical strategy, and dark comedy as players build a drug empire from nothing.&lt;/p&gt;</description></item><item><title>CSS Custom Properties: Strategic Patterns for Scalable Styles</title><link>https://takao.blog/web/css-custom-properties/</link><pubDate>Tue, 09 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-custom-properties/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-custom-properties-en.png" alt="Featured image of post CSS Custom Properties: Strategic Patterns for Scalable Styles" /&gt;&lt;p&gt;CSS Custom Properties (also known as CSS variables) have fundamentally changed how we write and maintain stylesheets. Unlike preprocessor variables from Sass or Less, custom properties are live, dynamic, and participate in the cascade and inheritance. This article explores strategic patterns for using them in production applications — from design token management to runtime manipulation.&lt;/p&gt;
&lt;h2 id="design-token-management"&gt;Design Token Management
&lt;/h2&gt;&lt;p&gt;Custom properties are the ideal vehicle for design tokens — the atomic values that define a design system&amp;rsquo;s visual language. A well-organized token structure groups colors, spacing, typography, and shadows under a clear naming convention.&lt;/p&gt;</description></item><item><title>WebAuthn and Passkeys: Passwordless Authentication in 2024</title><link>https://takao.blog/web/webauthn-passkeys/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/webauthn-passkeys/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/webauthn-passkeys-en.png" alt="Featured image of post WebAuthn and Passkeys: Passwordless Authentication in 2024" /&gt;&lt;p&gt;Passwords have been the primary authentication mechanism for decades, but they come with well-documented security and usability problems. WebAuthn (Web Authentication) and the emerging passkey ecosystem promise to replace passwords with cryptographically secure, phishing-resistant authentication. As of 2024, passkey support has reached critical mass across all major platforms, making this the ideal time to implement passwordless authentication.&lt;/p&gt;
&lt;h2 id="understanding-webauthn"&gt;Understanding WebAuthn
&lt;/h2&gt;&lt;p&gt;WebAuthn is a W3C standard that enables public-key cryptography-based authentication on the web. The core flow involves two operations: registration and authentication. During registration, the server sends a cryptographic challenge to the client, the authenticator creates a new key pair, and the public key is stored on the server. During authentication, the server sends a challenge, the authenticator signs it with the private key, and the server verifies the signature against the stored public key.&lt;/p&gt;</description></item><item><title>Next.js Image Optimization: From Setup to Advanced Patterns</title><link>https://takao.blog/web/nextjs-image-optimization/</link><pubDate>Tue, 26 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nextjs-image-optimization/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nextjs-image-optimization-en.png" alt="Featured image of post Next.js Image Optimization: From Setup to Advanced Patterns" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Images account for over 50% of total webpage bytes on average, making optimization essential for performance. Next.js provides a comprehensive image optimization pipeline through the &lt;code&gt;next/image&lt;/code&gt; component and its built-in Image Optimization API. This article covers setup, configuration, and advanced patterns with a focus on Core Web Vitals impact.&lt;/p&gt;
&lt;h2 id="the-nextimage-component"&gt;The next/image Component
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;next/image&lt;/code&gt; component extends the HTML &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element with automatic optimization features: lazy loading, responsive srcset generation, width and height enforcement to prevent Cumulative Layout Shift, blur-up placeholders, and automatic format negotiation.&lt;/p&gt;</description></item><item><title>React State Management in 2024: Choosing the Right Tool</title><link>https://takao.blog/web/react-state-management-2024/</link><pubDate>Tue, 19 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-state-management-2024/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-state-management-2024-en.png" alt="Featured image of post React State Management in 2024: Choosing the Right Tool" /&gt;&lt;p&gt;By 2024, React&amp;rsquo;s state management landscape has matured to the point where choosing the right tool is a matter of understanding state categories rather than picking a winner. The core library provides &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useReducer&lt;/code&gt; for local concerns, while the ecosystem offers specialized solutions for global UI state and server state. The key insight is that different categories of state benefit from different tools, and mixing them appropriately produces the most maintainable applications.&lt;/p&gt;</description></item><item><title>Vaultwarden: Self-Hosted Password Manager Installation Guide</title><link>https://takao.blog/web/vaultwarden-install/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/web/vaultwarden-install/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vaultwarden-install-en.png" alt="Featured image of post Vaultwarden: Self-Hosted Password Manager Installation Guide" /&gt;&lt;h2 id="what-is-vaultwarden"&gt;What is Vaultwarden?
&lt;/h2&gt;&lt;p&gt;Vaultwarden is an open-source, self-hosted implementation of the Bitwarden server API, written in Rust. It is designed to be lightweight and resource-efficient compared to the official Bitwarden server, which requires a Microsoft SQL Server database and substantial system resources. Vaultwarden supports all official Bitwarden clients — desktop, browser extensions, mobile apps, and CLI — without any modification.&lt;/p&gt;
&lt;p&gt;By self-hosting Vaultwarden, you retain full control over your password data. No third-party service ever touches your encrypted vault. The project is mature, actively maintained, and suitable for both single-user deployments and small teams.&lt;/p&gt;</description></item><item><title>ES2024 New Features: What's Coming in JavaScript</title><link>https://takao.blog/web/es2024-new-features/</link><pubDate>Tue, 12 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/es2024-new-features/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/es2024-new-features-en.png" alt="Featured image of post ES2024 New Features: What's Coming in JavaScript" /&gt;&lt;p&gt;ECMAScript 2024 (ES15) introduces several long-anticipated features to JavaScript. This article covers the new capabilities with practical examples and guidance on adoption timelines.&lt;/p&gt;
&lt;h2 id="array-grouping-objectgroupby-and-mapgroupby"&gt;Array Grouping: Object.groupBy and Map.groupBy
&lt;/h2&gt;&lt;p&gt;One of the most requested JavaScript features has finally arrived. &lt;code&gt;Object.groupBy&lt;/code&gt; and &lt;code&gt;Map.groupBy&lt;/code&gt; partition array elements into groups based on a callback:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;inventory&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;asparagus&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vegetables&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bananas&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fruit&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;goat&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;meat&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;quantity&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;23&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;byType&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;groupBy&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;inventory&lt;/span&gt;, ({ &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; }) =&amp;gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// { vegetables: [{ name: &amp;#34;asparagus&amp;#34;, ... }],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// fruit: [{ name: &amp;#34;bananas&amp;#34;, ... }],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// meat: [{ name: &amp;#34;goat&amp;#34;, ... }] }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Map.groupBy&lt;/code&gt; preserves non-string keys, making it ideal for grouping by objects or symbols. This eliminates the need for external libraries or manual &lt;code&gt;reduce&lt;/code&gt; patterns.&lt;/p&gt;</description></item><item><title>TypeScript Generic Constraints: Building Type-Safe APIs</title><link>https://takao.blog/web/typescript-generic-constraints/</link><pubDate>Tue, 05 Mar 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-generic-constraints/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-generic-constraints-en.png" alt="Featured image of post TypeScript Generic Constraints: Building Type-Safe APIs" /&gt;&lt;p&gt;TypeScript generics let you write reusable, type-safe code, but without constraints they are too permissive. The &lt;code&gt;extends&lt;/code&gt; keyword restricts type parameters to shapes that have specific properties, giving you both flexibility and safety.&lt;/p&gt;
&lt;h2 id="the-extends-constraint"&gt;The extends Constraint
&lt;/h2&gt;&lt;p&gt;The foundation of generic constraints is the &lt;code&gt;extends&lt;/code&gt; keyword. It ensures a type parameter satisfies a required structure:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;function getProperty&amp;lt;T, K extends keyof T&amp;gt;(obj: T, key: K): T[K] {
 return obj[key];
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here &lt;code&gt;K extends keyof T&lt;/code&gt; guarantees &lt;code&gt;key&lt;/code&gt; is a valid property of &lt;code&gt;obj&lt;/code&gt;. Attempting to pass an invalid key triggers a compile-time error. Common patterns include constraining to interfaces (&lt;code&gt;T extends { id: string }&lt;/code&gt;), union members, or primitive types.&lt;/p&gt;</description></item><item><title>ESLint Flat Config: Migration Guide from Legacy .eslintrc</title><link>https://takao.blog/web/eslint-flat-config/</link><pubDate>Mon, 26 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/eslint-flat-config/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/eslint-flat-config-en.png" alt="Featured image of post ESLint Flat Config: Migration Guide from Legacy .eslintrc" /&gt;&lt;p&gt;ESLint v9.0, released in 2024, made the flat config system (&lt;code&gt;eslint.config.js&lt;/code&gt;) the default, replacing the legacy &lt;code&gt;.eslintrc&lt;/code&gt; format that had been in use for over a decade. This migration guide covers the complete transition process, new concepts, and practical examples.&lt;/p&gt;
&lt;h2 id="why-flat-config"&gt;Why Flat Config?
&lt;/h2&gt;&lt;p&gt;The legacy &lt;code&gt;.eslintrc&lt;/code&gt; system had several problems: configuration cascading made behavior unpredictable, directory-based resolution was complex, JSON/YAML lacked support for functions and comments, and shareable configs were difficult to compose. Flat config addresses these with a single configuration file, explicit composition via JavaScript arrays, simplified plugin resolution, and full JavaScript-native syntax.&lt;/p&gt;</description></item><item><title>Palworld: The Pokémon-with-Guns Survival Game Guide</title><link>https://takao.blog/game/palworld/</link><pubDate>Tue, 20 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/game/palworld/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/palworld-en.png" alt="Featured image of post Palworld: The Pokémon-with-Guns Survival Game Guide" /&gt;&lt;h1 id="palworld-the-pokémon-with-guns-survival-game-guide"&gt;Palworld: The Pokémon-with-Guns Survival Game Guide
&lt;/h1&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Palworld&lt;/em&gt;, developed by Pocket Pair, launched into Early Access in January 2024 and became an instant phenomenon. Blending creature collection, open-world survival, third-person shooting, and base-building automation, the game has been described as &amp;ldquo;Pokémon with guns&amp;rdquo; — though it goes far deeper than that label suggests. Set across sprawling islands inhabited by over 100 species of Pals, players must gather resources, build bases, craft weapons, and fight alongside their captured creatures against hostile factions and towering boss Pals.&lt;/p&gt;</description></item><item><title>JavaScript Event Loop Deep Dive: Microtasks, Macrotasks, and Beyond</title><link>https://takao.blog/web/js-event-loop/</link><pubDate>Mon, 19 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-event-loop/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-event-loop-en.png" alt="Featured image of post JavaScript Event Loop Deep Dive: Microtasks, Macrotasks, and Beyond" /&gt;&lt;p&gt;The JavaScript event loop is one of the most important yet misunderstood concepts in the language. Despite JavaScript being single-threaded, its event loop enables non-blocking concurrency through a sophisticated queue system. This article builds a complete mental model of how JavaScript handles asynchronous execution, from the call stack to the microtask queue and everything in between.&lt;/p&gt;
&lt;h2 id="the-call-stack-and-execution-model"&gt;The Call Stack and Execution Model
&lt;/h2&gt;&lt;p&gt;JavaScript uses a call stack with a LIFO (Last In, First Out) structure. When a function is called, a new stack frame is pushed onto the stack. When the function returns, the frame is popped off. The key principle is run-to-completion: each function runs to completion before any other code can interrupt it.&lt;/p&gt;</description></item><item><title>Proxmox VE VM Management: From Creation to Optimization</title><link>https://takao.blog/web/proxmox-vm-management/</link><pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/web/proxmox-vm-management/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-vm-management-en.png" alt="Featured image of post Proxmox VE VM Management: From Creation to Optimization" /&gt;&lt;h2 id="creating-a-vm-step-by-step"&gt;Creating a VM Step by Step
&lt;/h2&gt;&lt;p&gt;Proxmox VE provides a guided wizard for VM creation accessible from the web UI at &lt;strong&gt;Create VM&lt;/strong&gt; or via the &lt;code&gt;qm&lt;/code&gt; CLI tool. The wizard walks through eight configuration pages.&lt;/p&gt;
&lt;h3 id="general"&gt;General
&lt;/h3&gt;&lt;p&gt;Set a unique VM ID (an integer, typically starting at 100) and a descriptive name. The name does not affect guest networking — it is purely for identification. Optionally, select a resource pool to organize related VMs.&lt;/p&gt;</description></item><item><title>Service Workers: Advanced Offline Strategies for Web Apps</title><link>https://takao.blog/web/service-workers-offline/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/service-workers-offline/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/service-workers-offline-en.png" alt="Featured image of post Service Workers: Advanced Offline Strategies for Web Apps" /&gt;&lt;p&gt;Service workers are the foundation of offline-capable progressive web apps. With browser support now universal across Chrome, Firefox, Safari, and Edge, building resilient offline experiences is a production requirement, not a progressive enhancement. This guide covers advanced strategies for caching, synchronization, and offline-first architecture.&lt;/p&gt;
&lt;h2 id="service-worker-lifecycle-and-fundamentals"&gt;Service Worker Lifecycle and Fundamentals
&lt;/h2&gt;&lt;p&gt;A service worker goes through three key events: &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;activate&lt;/code&gt;, and &lt;code&gt;fetch&lt;/code&gt;. During installation, you pre-cache static assets. Activation handles cleanup of old caches. Every fetch request passes through the worker, giving you full control over the response.&lt;/p&gt;</description></item><item><title>Vite Plugin Development: From Zero to Production</title><link>https://takao.blog/web/vite-plugin-dev/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/vite-plugin-dev/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/vite-plugin-dev-en.png" alt="Featured image of post Vite Plugin Development: From Zero to Production" /&gt;&lt;p&gt;Vite&amp;rsquo;s plugin system is one of its most powerful features, allowing developers to extend and customize the build pipeline. Whether you need to transform file types, inject build-time constants, or integrate with other tools, the Vite plugin API gives you full control.&lt;/p&gt;
&lt;h2 id="understanding-vites-plugin-system"&gt;Understanding Vite&amp;rsquo;s Plugin System
&lt;/h2&gt;&lt;p&gt;Vite plugins are objects with hook functions that execute at specific points in the build lifecycle. Plugins operate in three phases: serve (dev server), build (production), and SSR. A basic plugin looks like this:&lt;/p&gt;</description></item><item><title>OAuth 2.0 and OpenID Connect: Modern Authentication Guide</title><link>https://takao.blog/web/oauth-oidc/</link><pubDate>Mon, 29 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/oauth-oidc/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/oauth-oidc-en.png" alt="Featured image of post OAuth 2.0 and OpenID Connect: Modern Authentication Guide" /&gt;&lt;p&gt;OAuth 2.0 and OpenID Connect form the backbone of modern web authentication and authorization. Despite their ubiquity, these protocols are frequently misunderstood and misconfigured, leading to preventable security vulnerabilities. This guide covers the core concepts, implementation patterns, and security best practices you need to integrate authentication securely in your applications.&lt;/p&gt;
&lt;h2 id="oauth-20-fundamentals"&gt;OAuth 2.0 Fundamentals
&lt;/h2&gt;&lt;p&gt;OAuth 2.0 is an authorization framework, not an authentication protocol. This distinction is critical: OAuth defines how a client application can obtain delegated access to protected resources, but it does not specify how to verify the user&amp;rsquo;s identity. That is where OpenID Connect comes in.&lt;/p&gt;</description></item><item><title>Git Submodules: Managing Nested Repositories Effectively</title><link>https://takao.blog/web/git-submodules/</link><pubDate>Mon, 22 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/git-submodules/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-submodules-en.png" alt="Featured image of post Git Submodules: Managing Nested Repositories Effectively" /&gt;&lt;p&gt;Git submodules allow you to nest one Git repository inside another while maintaining independent version control for each. They are useful for managing shared libraries, third-party dependencies, or configuration collections where you need precise commit-level control. However, submodules come with complexity that requires understanding their underlying mechanics.&lt;/p&gt;
&lt;h2 id="understanding-git-submodules"&gt;Understanding Git Submodules
&lt;/h2&gt;&lt;p&gt;A submodule is a reference from your parent repository to a specific commit in another repository. Git stores this as a tree object in the parent&amp;rsquo;s index, and the mapping of submodule paths to repository URLs lives in a &lt;code&gt;.gitmodules&lt;/code&gt; file at the root of the parent repository.&lt;/p&gt;</description></item><item><title>Core Web Vitals Optimization: Complete 2024 Guide</title><link>https://takao.blog/web/core-web-vitals/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/core-web-vitals/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/core-web-vitals-en.png" alt="Featured image of post Core Web Vitals Optimization: Complete 2024 Guide" /&gt;&lt;p&gt;Core Web Vitals (CWV) are the set of user-centric performance metrics that Google uses to measure real-world experience on the web. In March 2024, Google replaced First Input Delay (FID) with Interaction to Next Paint (INP), making it critical to understand all three metrics: Largest Contentful Paint (LCP), INP, and Cumulative Layout Shift (CLS). This guide covers every aspect of optimizing your site for good CWV scores.&lt;/p&gt;
&lt;h2 id="understanding-core-web-vitals-in-2024"&gt;Understanding Core Web Vitals in 2024
&lt;/h2&gt;&lt;p&gt;The three CWV metrics measure distinct aspects of user experience. LCP tracks loading performance — how quickly the main content appears. INP measures interactivity — how responsive the page feels when users click, tap, or type. CLS quantifies visual stability — how much the layout shifts unexpectedly during load.&lt;/p&gt;</description></item><item><title>React Server Components: The Future of Web Rendering</title><link>https://takao.blog/web/react-server-components/</link><pubDate>Mon, 08 Jan 2024 00:00:00 +0900</pubDate><guid>https://takao.blog/web/react-server-components/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/react-server-components-en.png" alt="Featured image of post React Server Components: The Future of Web Rendering" /&gt;&lt;p&gt;React Server Components (RSC) represent a paradigm shift in how React applications render. Components run exclusively on the server, sending zero JavaScript to the client. This is not the same as Server-Side Rendering (SSR), which renders components on the server but still sends all the JavaScript for them to the client for hydration. RSC produces a special serialized format — the RSC payload — that the React reconciler on the client uses to reconstruct the component tree without executing the component code.&lt;/p&gt;</description></item><item><title>Docker Health Checks and Container Monitoring Best Practices</title><link>https://takao.blog/web/docker-health-checks/</link><pubDate>Mon, 25 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/docker-health-checks/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/docker-health-checks-en.png" alt="Featured image of post Docker Health Checks and Container Monitoring Best Practices" /&gt;&lt;p&gt;Docker health checks are essential for building self-healing container infrastructure. They enable automatic detection of application failures and trigger container restarts, ensuring your services remain available. This guide covers everything from basic &lt;code&gt;HEALTHCHECK&lt;/code&gt; implementation to advanced production patterns.&lt;/p&gt;
&lt;h2 id="the-healthcheck-instruction"&gt;The HEALTHCHECK Instruction
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;HEALTHCHECK&lt;/code&gt; instruction in a Dockerfile tells Docker how to test whether a container is still working correctly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HEALTHCHECK&lt;/span&gt; --interval&lt;span style="color:#f92672"&gt;=&lt;/span&gt;30s --timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;3s --start-period&lt;span style="color:#f92672"&gt;=&lt;/span&gt;40s --retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CMD curl -f http://localhost:3000/health &lt;span style="color:#f92672"&gt;||&lt;/span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker tracks three states: &lt;code&gt;starting&lt;/code&gt; (during the start period), &lt;code&gt;healthy&lt;/code&gt; (checks pass), and &lt;code&gt;unhealthy&lt;/code&gt; (checks fail after retries). The &lt;code&gt;--start-period&lt;/code&gt; is critical for applications with slow startup times &amp;ndash; it suppresses failures during initialization.&lt;/p&gt;</description></item><item><title>Node.js Streams: Practical Guide for Data Processing</title><link>https://takao.blog/web/nodejs-streams/</link><pubDate>Wed, 20 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/nodejs-streams/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/nodejs-streams-en.png" alt="Featured image of post Node.js Streams: Practical Guide for Data Processing" /&gt;&lt;p&gt;Node.js streams are one of the most powerful yet underutilized features of the platform. They enable processing data piece by piece as it arrives, rather than loading entire datasets into memory. This makes them essential for working with large files, network communication, and real-time data transformation. This guide covers stream fundamentals and practical patterns for building robust data pipelines.&lt;/p&gt;
&lt;h2 id="understanding-stream-types"&gt;Understanding Stream Types
&lt;/h2&gt;&lt;p&gt;Node.js provides four fundamental stream types, each serving a distinct role in data processing pipelines.&lt;/p&gt;</description></item><item><title>CSS Grid Advanced Patterns: Complex Layouts Made Simple</title><link>https://takao.blog/web/css-grid-advanced/</link><pubDate>Fri, 15 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/css-grid-advanced/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/css-grid-advanced-en.png" alt="Featured image of post CSS Grid Advanced Patterns: Complex Layouts Made Simple" /&gt;&lt;p&gt;CSS Grid has transformed web layout design, but many developers only scratch the surface. Beyond the basic &lt;code&gt;grid-template-columns: 1fr 1fr 1fr&lt;/code&gt; lies a powerful set of features that handle complex, responsive layouts with minimal code. This article explores advanced Grid patterns that every professional front-end developer should know.&lt;/p&gt;
&lt;h2 id="named-grid-areas-for-semantic-layouts"&gt;Named Grid Areas for Semantic Layouts
&lt;/h2&gt;&lt;p&gt;Line-based placement works, but it becomes unreadable as layouts grow complex. Named grid areas let you define layouts that read like a wireframe directly in CSS.&lt;/p&gt;</description></item><item><title>TypeScript Utility Types: Complete Guide with Real Examples</title><link>https://takao.blog/web/typescript-utility-types/</link><pubDate>Sun, 10 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/typescript-utility-types/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/typescript-utility-types-en.png" alt="Featured image of post TypeScript Utility Types: Complete Guide with Real Examples" /&gt;&lt;p&gt;TypeScript provides a rich set of built-in utility types that transform and manipulate other types. Understanding these tools lets you write more expressive and type-safe code without reinventing the wheel.&lt;/p&gt;
&lt;h2 id="property-modification-types"&gt;Property Modification Types
&lt;/h2&gt;&lt;p&gt;These types modify the optionality, mutability, and requirement of object properties:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;interface User {
 id: number;
 name: string;
 email?: string;
}

type PartialUser = Partial&amp;lt;User&amp;gt;;
// { id?: number; name?: string; email?: string; }

type RequiredUser = Required&amp;lt;User&amp;gt;;
// { id: number; name: string; email: string; }

type ImmutableUser = Readonly&amp;lt;User&amp;gt;;
// { readonly id: number; readonly name: string; readonly email?: string; }
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Effect&lt;/th&gt;
					&lt;th&gt;Common Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties optional&lt;/td&gt;
					&lt;td&gt;PATCH request bodies&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Required&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties required&lt;/td&gt;
					&lt;td&gt;Form submission validation&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Readonly&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All properties read-only&lt;/td&gt;
					&lt;td&gt;Configuration objects&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Partial&lt;/code&gt; is especially useful for API update operations where clients should be able to send a subset of fields:&lt;/p&gt;</description></item><item><title>Advanced JavaScript Promise Patterns: Async Control Flow Mastery</title><link>https://takao.blog/web/js-promise-patterns/</link><pubDate>Tue, 05 Dec 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/js-promise-patterns/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/js-promise-patterns-en.png" alt="Featured image of post Advanced JavaScript Promise Patterns: Async Control Flow Mastery" /&gt;&lt;p&gt;Promises are fundamental to modern JavaScript, but mastering asynchronous control flow requires going beyond basic &lt;code&gt;.then()&lt;/code&gt; chains. This article explores advanced Promise patterns that intermediate to senior developers need for production applications, from concurrency control to error handling and cancellation.&lt;/p&gt;
&lt;h2 id="the-promise-landscape-beyond-basics"&gt;The Promise Landscape Beyond Basics
&lt;/h2&gt;&lt;p&gt;JavaScript provides four static methods on Promise for composing async operations, each suited to different scenarios:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Method&lt;/th&gt;
					&lt;th&gt;Resolves When&lt;/th&gt;
					&lt;th&gt;Rejects When&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises resolve&lt;/td&gt;
					&lt;td&gt;Any promise rejects&lt;/td&gt;
					&lt;td&gt;Parallel API calls, all required&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;All promises settle&lt;/td&gt;
					&lt;td&gt;Never&lt;/td&gt;
					&lt;td&gt;Mixed results, log all outcomes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.race&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise settles&lt;/td&gt;
					&lt;td&gt;First promise rejects&lt;/td&gt;
					&lt;td&gt;Timeout race conditions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Promise.any&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;First promise resolves&lt;/td&gt;
					&lt;td&gt;All promises reject&lt;/td&gt;
					&lt;td&gt;First-successful-response pattern&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;results&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; Promise.&lt;span style="color:#a6e22e"&gt;allSettled&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/users&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/posts&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fetch&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/comments&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;json&lt;/span&gt;()),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;successful&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;results&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fulfilled&amp;#34;&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Promise.allSettled&lt;/code&gt; is particularly useful when you need to process partial results even if some operations fail, such as batch data synchronization where individual record failures should not abort the entire batch.&lt;/p&gt;</description></item><item><title>Cloudflare Pages: Static Site Hosting Guide</title><link>https://takao.blog/web/cloudflare-pages/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/cloudflare-pages/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-pages-en.png" alt="Featured image of post Cloudflare Pages: Static Site Hosting Guide" /&gt;&lt;h1 id="cloudflare-pages-static-site-hosting-for-modern-websites"&gt;Cloudflare Pages: Static Site Hosting for Modern Websites
&lt;/h1&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Cloudflare Pages is a static site hosting platform built on top of Cloudflare&amp;rsquo;s global network infrastructure. It combines the speed of a world-class CDN with an intuitive deployment pipeline, making it an excellent choice for developers who want to focus on building rather than configuring servers. From portfolio sites to full-featured web applications, Cloudflare Pages handles the heavy lifting of content delivery, SSL termination, and scaling — all with a generous free tier. This guide walks through every step of setting up and optimizing a site on Cloudflare Pages.&lt;/p&gt;</description></item><item><title>Cloudflare Setup Guide: Security and Performance</title><link>https://takao.blog/web/cloudflare/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/cloudflare/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-cloudflare-en.png" alt="Featured image of post Cloudflare Setup Guide: Security and Performance" /&gt;&lt;h1 id="cloudflare-setup-improving-website-security-and-performance"&gt;Cloudflare Setup: Improving Website Security and Performance
&lt;/h1&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;For any website owner, security and speed are two sides of the same coin. A slow site frustrates visitors and hurts conversions; an insecure site puts data and reputation at risk. Cloudflare addresses both challenges with an integrated platform that sits between your visitors and your origin server, acting as a reverse proxy, content delivery network, and security gateway all at once. This guide walks through configuring Cloudflare&amp;rsquo;s core features — from basic DNS setup to advanced security rules — so you can protect and accelerate your site with confidence.&lt;/p&gt;</description></item><item><title>Overwatch 2: The Next Era of Team-Based Action</title><link>https://takao.blog/game/overwatch2/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/overwatch2/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/overwatch2-en.png" alt="Featured image of post Overwatch 2: The Next Era of Team-Based Action" /&gt;&lt;h1 id="overwatch-2-the-next-era-of-team-based-action"&gt;Overwatch 2: The Next Era of Team-Based Action
&lt;/h1&gt;&lt;p&gt;Overwatch 2, developed by Blizzard Entertainment, launched in early access on October 5, 2022, marking a bold new chapter for the franchise. Rather than a simple expansion, Blizzard positioned it as a true sequel — rebuilding the core experience while carrying forward the vibrant world and diverse cast that made the original a phenomenon. The game is available on PC (Windows 10), PlayStation 5, PlayStation 4, Xbox Series X/S, Xbox One, and Nintendo Switch, with full cross-play support.&lt;/p&gt;</description></item><item><title>Proxmox VE Installation and Initial Setup Guide</title><link>https://takao.blog/web/proxmox-install-setup/</link><pubDate>Wed, 15 Nov 2023 00:00:00 +0000</pubDate><guid>https://takao.blog/web/proxmox-install-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-install-setup-en.png" alt="Featured image of post Proxmox VE Installation and Initial Setup Guide" /&gt;&lt;h2 id="what-is-proxmox-ve"&gt;What is Proxmox VE?
&lt;/h2&gt;&lt;p&gt;Proxmox Virtual Environment (Proxmox VE) is an open-source server virtualization platform that combines KVM-based virtual machines and LXC-based containers under a single web interface. Built on Debian Linux, it integrates enterprise features such as live migration, high availability, software-defined storage, and a built-in firewall. Its agentless design and central management interface make it a popular choice for homelabs, small businesses, and data centers alike.&lt;/p&gt;
&lt;p&gt;The platform supports ZFS, Ceph, and LVM for storage, and includes a RESTful API for automation. The installation process is straightforward, but proper configuration immediately after setup is critical for a stable and secure environment.&lt;/p&gt;</description></item><item><title>Google Analytics: Implementation and Analytics Guide</title><link>https://takao.blog/web/google-analytics/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/google-analytics/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-google-analytics-en.png" alt="Featured image of post Google Analytics: Implementation and Analytics Guide" /&gt;&lt;h1 id="google-analytics-implementation-and-analytics-guide"&gt;Google Analytics: Implementation and Analytics Guide
&lt;/h1&gt;&lt;p&gt;Understanding how visitors interact with your website is essential for growth. Google Analytics (GA) is the industry standard for web analytics, providing deep insights into traffic sources, user behavior, and conversion performance. This guide walks through the complete implementation process, from account creation to advanced optimization, so you can start making data-driven decisions with confidence.&lt;/p&gt;
&lt;h2 id="step-1-creating-a-google-analytics-account"&gt;Step 1: Creating a Google Analytics Account
&lt;/h2&gt;&lt;p&gt;Before collecting any data, you need a Google Analytics account:&lt;/p&gt;</description></item><item><title>OWASP ZAP: Web Application Security Testing Guide</title><link>https://takao.blog/web/owasp-zap/</link><pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/owasp-zap/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-owasp-zap-en.png" alt="Featured image of post OWASP ZAP: Web Application Security Testing Guide" /&gt;&lt;h1 id="owasp-zap-web-application-security-testing-guide"&gt;OWASP ZAP: Web Application Security Testing Guide
&lt;/h1&gt;&lt;p&gt;Web application security is no longer optional — it is a fundamental requirement for protecting user data and maintaining trust. OWASP ZAP (Zed Attack Proxy) is one of the most popular open-source security testing tools available. It helps developers and security professionals identify vulnerabilities in web applications through automated scanning and manual testing features. This guide covers the full workflow, from installation to remediation.&lt;/p&gt;</description></item><item><title>Fantasy Life i: The Girl Who Steals Time — Complete Guide</title><link>https://takao.blog/game/fantasy-life-i/</link><pubDate>Tue, 10 Oct 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/fantasy-life-i/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/fantasy-life-i-en.png" alt="Featured image of post Fantasy Life i: The Girl Who Steals Time — Complete Guide" /&gt;&lt;h1 id="fantasy-life-i-the-girl-who-steals-time--complete-guide"&gt;Fantasy Life i: The Girl Who Steals Time — Complete Guide
&lt;/h1&gt;&lt;h2 id="overview-of-the-game"&gt;Overview of the Game
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Fantasy Life i: The Girl Who Steals Time&lt;/em&gt; is the long-awaited sequel to Level-5&amp;rsquo;s 2012 cult classic &lt;em&gt;Fantasy Life&lt;/em&gt; for Nintendo 3DS. Originally announced as a Nintendo Switch title, the game blends open-world action RPG combat with deep life simulation mechanics. The story follows a mysterious girl who manipulates time, granting players the ability to revisit past eras and reshape the world. With over a dozen Life Classes (jobs), a fully customizable island hub, and a sprawling narrative spanning multiple timelines, the game offers hundreds of hours of content.&lt;/p&gt;</description></item><item><title>Wayback Machine: Exploring the Internet Archive</title><link>https://takao.blog/web/waybackmachine/</link><pubDate>Mon, 11 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/waybackmachine/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/wayback-machine-en.png" alt="Featured image of post Wayback Machine: Exploring the Internet Archive" /&gt;&lt;h1 id="wayback-machine-exploring-the-internet-archive"&gt;Wayback Machine: Exploring the Internet Archive
&lt;/h1&gt;&lt;p&gt;The Wayback Machine is a digital time capsule for the World Wide Web. Operated by the Internet Archive, a non-profit organization founded in 1996, it preserves snapshots of web pages across decades, allowing anyone to travel back in time and see what websites looked like years ago. Whether you are conducting research, recovering lost content, or simply curious about the internet&amp;rsquo;s history, the Wayback Machine is an indispensable tool.&lt;/p&gt;</description></item><item><title>Git Tutorial: From Basics to Advanced Workflows</title><link>https://takao.blog/web/how-to-git/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/how-to-git/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-git-en.png" alt="Featured image of post Git Tutorial: From Basics to Advanced Workflows" /&gt;&lt;h1 id="git-tutorial-project-management-and-version-control-fundamentals"&gt;Git Tutorial: Project Management and Version Control Fundamentals
&lt;/h1&gt;&lt;p&gt;Git is the de facto standard for version control in modern software development. It tracks every change to your codebase, enables seamless team collaboration, and provides safety nets for experimentation. Whether you are a solo developer maintaining a personal project or part of a large engineering team, mastering Git is essential. This guide covers Git from first principles through advanced workflows, with practical commands and real-world scenarios.&lt;/p&gt;</description></item><item><title>GitHub Guide: Collaboration and Project Management</title><link>https://takao.blog/web/how-to-github/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/how-to-github/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/how-to-github-en.png" alt="Featured image of post GitHub Guide: Collaboration and Project Management" /&gt;&lt;h1 id="github-guide-collaboration-and-project-management"&gt;GitHub Guide: Collaboration and Project Management
&lt;/h1&gt;&lt;p&gt;GitHub has become an essential platform for software developers and project managers alike. It combines powerful version control with social coding features that make team collaboration seamless. Whether you are contributing to open-source projects or managing a private team repository, GitHub provides the tools you need to track changes, review code, and automate workflows. This guide walks through everything from account setup to advanced project management.&lt;/p&gt;</description></item><item><title>How to install Apex Legends</title><link>https://takao.blog/game/apex-install/</link><pubDate>Sun, 27 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/apex-install/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/apex-install-en.png" alt="Featured image of post How to install Apex Legends" /&gt;&lt;h1 id="how-to-install-the-steam-version-of-apex-legends"&gt;How to install the Steam version of Apex Legends
&lt;/h1&gt;&lt;p&gt;Apex Legends is a thrilling battle royale game that can be played through Steam. This article details the steps to install the Steam version of Apex Legends.&lt;/p&gt;
&lt;h2 id="step-1-install-the-steam-client"&gt;Step 1: Install the Steam client
&lt;/h2&gt;&lt;p&gt;First, you will need to download and install the Steam client in order to play Apex Legends. Follow these steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go to the &lt;a class="link" href="https://store.steampowered.com/" target="_blank" rel="noopener"
 &gt;official Steam website&lt;/a&gt;. 2.&lt;/li&gt;
&lt;li&gt;click on the &amp;ldquo;Install&amp;rdquo; button at the top right of the page to download the Steam client. 3.&lt;/li&gt;
&lt;li&gt;after the download is complete, run the downloaded file to install the Steam client.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step-2-create-a-steam-account"&gt;Step 2: Create a Steam account
&lt;/h2&gt;&lt;p&gt;After installing the Steam client, create an account or login with your existing account. Follow these steps: 1.&lt;/p&gt;</description></item><item><title>How to Set Up Hugo: Complete Guide for Beginners</title><link>https://takao.blog/web/hugo-setup/</link><pubDate>Wed, 23 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/web/hugo-setup/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/hugo-setup-en.png" alt="Featured image of post How to Set Up Hugo: Complete Guide for Beginners" /&gt;&lt;h1 id="how-to-install-hugo---static-site-generator-installation-instructions"&gt;How to install Hugo - Static Site Generator Installation Instructions
&lt;/h1&gt;&lt;p&gt;Hugo is a fast and simple static site generator and tool that makes building websites easy. This article details the steps to install Hugo.&lt;/p&gt;
&lt;h2 id="step-1-download-hugo"&gt;Step 1: Download Hugo
&lt;/h2&gt;&lt;p&gt;To install Hugo, first download the appropriate version of the Hugo binary from the official download page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go to &lt;a class="link" href="https://gohugo.io/getting-started/installing/" target="_blank" rel="noopener"
 &gt;the official Hugo download page&lt;/a&gt;. 2.&lt;/li&gt;
&lt;li&gt;select the installation method appropriate for your operating system (Windows, macOS, Linux, etc.)&lt;/li&gt;
&lt;li&gt;open a terminal (command prompt) and follow the instructions to download the Hugo binary.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step-2-confirm-installation"&gt;Step 2: Confirm installation
&lt;/h2&gt;&lt;p&gt;After the Hugo binary has been downloaded, verify that the installation was successful. 1.&lt;/p&gt;</description></item><item><title>How to install Minecraft</title><link>https://takao.blog/game/minecraft-install/</link><pubDate>Tue, 22 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/minecraft-install/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/minecraft-install-en.png" alt="Featured image of post How to install Minecraft" /&gt;&lt;h1 id="how-to-install-minecraft---first-steps-guide"&gt;How to Install Minecraft - First Steps Guide
&lt;/h1&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;Minecraft is a popular game for adventuring and building in creative worlds. This article details the steps to install Minecraft on your computer.&lt;/p&gt;
&lt;h2 id="step-1-visit-the-official-website"&gt;Step 1: Visit the official website
&lt;/h2&gt;&lt;p&gt;First, visit the official Minecraft website at &lt;a class="link" href="https://www.minecraft.net/" target="_blank" rel="noopener"
 &gt;https://www.minecraft.net/&lt;/a&gt;. From here you can purchase the official game.&lt;/p&gt;
&lt;h2 id="step-2-create-an-account-and-purchase-the-game"&gt;Step 2: Create an account and purchase the game
&lt;/h2&gt;&lt;p&gt;Once on the website, create an account by clicking the &amp;ldquo;Login&amp;rdquo; or &amp;ldquo;Create Account&amp;rdquo; button in the upper right corner. Once you have created an account, you can purchase games. Select the appropriate option and complete the payment process.&lt;/p&gt;</description></item><item><title>Recommended Mods for Minecraft</title><link>https://takao.blog/game/minecraft-mod-recommend/</link><pubDate>Mon, 21 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/minecraft-mod-recommend/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/minecraft-mod-recommend-en.png" alt="Featured image of post Recommended Mods for Minecraft" /&gt;&lt;h1 id="10-recommended-minecraft-mods---add-new-adventure-and-fun"&gt;10 Recommended Minecraft Mods - Add New Adventure and Fun
&lt;/h1&gt;&lt;p&gt;The beauty of Minecraft is that mods allow you to customize your gameplay and add new adventures and fun. In this article, we present 10 recommended Minecraft mods. By implementing these mods, you can enjoy the game more deeply.&lt;/p&gt;
&lt;h2 id="1-optifine"&gt;1. Optifine
&lt;/h2&gt;&lt;p&gt;Optifine is a mod that optimizes Minecraft&amp;rsquo;s graphics and increases the frame rate. It allows for beautiful textures and shaders and also contributes to improved performance.
&lt;a class="link" href="https://optifine.net/downloads" target="_blank" rel="noopener"
 &gt;download at&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How to install Valorant</title><link>https://takao.blog/game/valorant-install/</link><pubDate>Sun, 20 Aug 2023 00:00:00 +0900</pubDate><guid>https://takao.blog/game/valorant-install/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/valorant-install-en.png" alt="Featured image of post How to install Valorant" /&gt;&lt;h1 id="how-to-install-valorant---first-time-steps-guide"&gt;How to install Valorant - First Time Steps Guide
&lt;/h1&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;Valorant is a popular tactical shooter game that is gaining attention in the competitive scene. This article details the steps to install Valorant on your computer.&lt;/p&gt;
&lt;h2 id="step-1-create-a-riot-games-account"&gt;Step 1: Create a Riot Games account
&lt;/h2&gt;&lt;p&gt;First, you will need a Riot Games account in order to play Valorant. Go to the official website (&lt;a class="link" href="https://playvalorant.com/" target="_blank" rel="noopener"
 &gt;https://playvalorant.com/&lt;/a&gt;) and click on the &amp;ldquo;Create Account&amp;rdquo; button in the upper right corner to create an account.&lt;/p&gt;</description></item></channel></rss>