<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fedora</title>
    <description>The latest articles on DEV Community by Fedora (@fds2003).</description>
    <link>https://dev.to/fds2003</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085896%2F30ad3e83-09cd-4184-868d-c71ec4fc2087.jpg</url>
      <title>DEV Community: Fedora</title>
      <link>https://dev.to/fds2003</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fds2003"/>
    <language>en</language>
    <item>
      <title>：Why Your BaZi Chinese Zodiac Year Pillar Is Probably Wrong: The Li Chun Boundary Explained</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Wed, 14 Oct 2026 02:30:04 +0000</pubDate>
      <link>https://dev.to/fds2003/why-your-bazi-chinese-zodiac-year-pillar-is-probably-wrong-the-li-chun-boundary-explained-1206</link>
      <guid>https://dev.to/fds2003/why-your-bazi-chinese-zodiac-year-pillar-is-probably-wrong-the-li-chun-boundary-explained-1206</guid>
      <description>&lt;p&gt;Most online Chinese astrology apps suffer from a subtle but fatal astronomical bug: they roll over the astrological Year&lt;br&gt;
Pillar at the nominal Lunar New Year (Spring Festival).&lt;/p&gt;

&lt;p&gt;In authentic Four Pillars of Destiny (BaZi), the solar year strictly turns at &lt;strong&gt;Li Chun (立春)&lt;/strong&gt;, the exact moment the sun&lt;br&gt;
reaches celestial longitude 315° (typically around February 3rd or 4th).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Boundary Trap
&lt;/h3&gt;

&lt;p&gt;Consider someone born on &lt;strong&gt;February 4, 1988, at 22:42:49 CST&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nominal Lunar Calendar: Still the Year of the Rabbit (Ding Mao).&lt;/li&gt;
&lt;li&gt;True Astronomical Li Chun: Transitioned at 22:42:49 CST to the Year of the Dragon (Wu Chen).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 10-second difference shifts the entire Year Pillar and inverts the person's Day Master strength analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deterministic Edge-Case Testing
&lt;/h3&gt;

&lt;p&gt;To guarantee mathematical consistency, we open-sourced &lt;strong&gt;266 astronomical edge cases&lt;/strong&gt; cross-verified against Purple&lt;br&gt;
Mountain Observatory ephemeris data.&lt;/p&gt;

&lt;p&gt;You can inspect the transition mechanics and run client-side test charts directly on FunTestHub's &lt;strong&gt;&lt;a href="https://funtesthub.com/en/bazi/" rel="noopener noreferrer"&gt;Free BaZi Calculator&lt;br&gt;
with Li Chun Boundary&lt;/a&gt;&lt;/strong&gt; (built with Astro 6, computing 100% in-browser with zero&lt;br&gt;
server-side storage).&lt;/p&gt;

&lt;p&gt;If you are developing solar-term calendar algorithms, feel free to contribute test fixtures to our open benchmark suite!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astronomy</category>
      <category>algorithms</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Building a High-Precision Chinese Metaphysics Engine in the Browser: Solar Terms, Midnight Rollovers, and 266 Edge Cases</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Sun, 11 Oct 2026 02:03:59 +0000</pubDate>
      <link>https://dev.to/fds2003/building-a-high-precision-chinese-metaphysics-engine-in-the-browser-solar-terms-midnight-1bc</link>
      <guid>https://dev.to/fds2003/building-a-high-precision-chinese-metaphysics-engine-in-the-browser-solar-terms-midnight-1bc</guid>
      <description>&lt;p&gt;If you have ever built calendar algorithms or localized software for East Asian markets, you know that calculating&lt;br&gt;
traditional Chinese lunisolar calendars is notoriously tricky.&lt;/p&gt;

&lt;p&gt;Most open-source tutorials reduce Chinese metaphysics (such as &lt;strong&gt;BaZi / Four Pillars of Destiny&lt;/strong&gt; and &lt;strong&gt;Ziwei Dou Shu&lt;/strong&gt;)&lt;br&gt;
to simple lookup tables. In reality, modern astrology engines require astronomical precision: calculating instantaneous&lt;br&gt;
solar longitude down to the arcminute, handling historical leap months, and resolving centuries-old sectarian debates on&lt;br&gt;
midnight rollovers.&lt;/p&gt;

&lt;p&gt;In this article, I want to walk through how we engineered a 100% client-side, zero-telemetry calendar engine for&lt;br&gt;
&lt;a href="https://funtesthub.com/en/about/" rel="noopener noreferrer"&gt;FunTestHub&lt;/a&gt;, how we resolved the three most painful astronomical edge cases, and why we&lt;br&gt;
open-sourced a verification suite of &lt;strong&gt;266 benchmark test cases&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The Core Architectural Philosophy: 100% Client-Side Privacy
&lt;/h2&gt;

&lt;p&gt;Chinese metaphysics calculations require sensitive personal inputs: exact birth date, exact birth minute, and gender.&lt;/p&gt;

&lt;p&gt;Most modern platforms send this data to a backend server or a generative AI API to compute the chart and stream an&lt;br&gt;
interpretation. We took the opposite architectural path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 [User Input: Date/Time/Gender]
          │
          ▼
 [Browser Local Execution] ──► Astronomical Solar Terms (VSOP87 / Ecliptic Longitude)
          │                ──► Four Pillars Mathematical Derivations (Wu Shu Dun)
          │                ──► Ziwei Dou Shu 12-Palace Matrix Mapping
          ▼
 [Deterministic Results Rendered in DOM] ──► (Zero persistence, zero cloud transmission)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By packaging the ephemeris calculations inside lightweight JavaScript (running with zero server roundtrips), user birth&lt;br&gt;
data never leaves the client's device.&lt;/p&gt;

&lt;p&gt;However, running pure front-end calculations brings zero tolerance for algorithmic drift. Here are the three hardest&lt;br&gt;
computational traps we had to solve.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Challenge 1: The Solar-Term (Jie Qi) Drift
&lt;/h2&gt;

&lt;p&gt;In Western astrology, zodiac signs change on roughly fixed Gregorian calendar dates (e.g., Aries starts on March 21).&lt;/p&gt;

&lt;p&gt;In Chinese Four Pillars of Destiny (BaZi), &lt;strong&gt;the Year and Month Pillars do NOT change on January 1st, nor on the Lunar New&lt;br&gt;
Year&lt;/strong&gt;. They change at the exact astronomical second of &lt;strong&gt;Li Chun (Beginning of Spring)&lt;/strong&gt;, when the apparent ecliptic&lt;br&gt;
longitude of the Sun reaches exactly $315^\circ$.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 Gregorian:   Feb 03 -------------------- Feb 04 -------------------- Feb 05
 Solar Year:              [Astronomical Li Chun: 315°]
                          │
         Previous Year    │           New Year Begins
        (Bing Wu / Fire)  │          (Ding Wei / Fire Goat)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an engine hardcodes &lt;code&gt;Feb 4&lt;/code&gt; as the year changeover, babies born just minutes before the actual solar transit will be&lt;br&gt;
assigned the wrong Year Pillar, throwing off their entire life chart.&lt;/p&gt;
&lt;h3&gt;
  
  
  Solution: Continuous Solar Longitude Tracking
&lt;/h3&gt;

&lt;p&gt;Instead of static date tables, our engine dynamically queries solar term timestamps computed from planetary ephemeris&lt;br&gt;
tables (VSOP87 series):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Solar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Lunar&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lunar-javascript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getAstronomicalYearPillar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;solarDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;solar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Solar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;solarDate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lunar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;solar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLunar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Year Pillar changes strictly at Li Chun (Spring Beginning), not Jan 1 or Lunar New Year&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lunar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getYearInGanZhi&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lunar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getYearShengXiao&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Challenge 2: The "Late-Zi Hour" Rollover Debate (Sect 1 vs. Sect 2)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A traditional Chinese day is divided into 12 double-hours (Shi Chen), starting with the Zi Hour (子时): from 23:00 to&lt;br&gt;
 01:00.&lt;/p&gt;

&lt;p&gt;This introduces a mathematical paradox:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hour starts at 23:00, but&lt;/li&gt;
&lt;li&gt;The calendar date changes at 00:00 (midnight).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For someone born at 23:30 on October 10:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sect 1 (Early/Late Zi distinction): The Day Pillar rolls over to October 11 at 23:00.&lt;/li&gt;
&lt;li&gt;Sect 2 (Midnight cutoff): The Day Pillar remains October 10 until 00:00 midnight, but the Hour Pillar calculates using
the Zi stem formulas.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Time:          22:59 (Hai Hour) ──► 23:00 (Late Zi) ──► 00:00 (Early Zi)
Sect 1 Day:       Day N         │         Day N+1    │      Day N+1
Sect 2 Day:       Day N         │         Day N      │      Day N+1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
typescript&lt;/p&gt;

&lt;p&gt;In our production engine, we strictly adhere to Sect 2 (midnight rollover), which aligns with modern civil timekeeping and&lt;br&gt;
 classical Qing Dynasty astronomical treaties (San Ming Tong Hui), using the standard Wu Shu Dun (Five Rats Formula) to&lt;br&gt;
 compute hour stems deterministically.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Challenge 3: Explainable Results vs. AI Hallucinations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the rise of generative AI, the web has been flooded with "AI Fortune Telling" tools that pass birth dates into prompt&lt;br&gt;
 templates like:&lt;/p&gt;

&lt;p&gt;▏ "Analyze this birth chart: 1990-05-15 10:00..."&lt;/p&gt;

&lt;p&gt;LLMs are probabilistic token predictors; they hallucinate stems, invert element relationships, and invent conflicting&lt;br&gt;
 rules.&lt;/p&gt;

&lt;p&gt;In our newly released 2027 Annual Fortune Report (&lt;a href="https://funtesthub.com/en/2027-horoscope/" rel="noopener noreferrer"&gt;https://funtesthub.com/en/2027-horoscope/&lt;/a&gt;), we enforced a strict&lt;br&gt;
 separation of concerns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Math &amp;amp; Chart Generation: 100% deterministic TypeScript engine.&lt;/li&gt;
&lt;li&gt;"Why This Result?" Explanations: A 5-step transparent deduction chain displaying exact classical rule origins:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Deterministic reasoning step template (No LLM black box)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;BaziReasoningStep&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;deduction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example deterministic output:&lt;/span&gt;
&lt;span class="c1"&gt;// Step 1: Day Master [Jia Wood]&lt;/span&gt;
&lt;span class="c1"&gt;// Step 2: 2027 Year Pillar [Ding Wei]&lt;/span&gt;
&lt;span class="c1"&gt;// Step 3: Five Elements Dynamic [Ding Fire is Hurting Officer to Jia Wood]&lt;/span&gt;
&lt;span class="c1"&gt;// Step 4: Classical Canon Applied [San Ming Tong Hui, Chapter 14]&lt;/span&gt;
&lt;span class="c1"&gt;// Step 5: Action Directive [Focus on intellectual innovation and strategic scaling]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;────────────────────────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open-Sourcing the Benchmark: 266 Edge Cases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To ensure complete mathematical integrity and help fellow developers build reliable tools, we curated and open-sourced our&lt;br&gt;
 verification suite:&lt;/p&gt;

&lt;p&gt;👉 GitHub Repository: fds2003/funtesthub-astronomy-benchmarks (&lt;a href="https://github.com/fds2003/funtesthub-astronomy-benchmarks" rel="noopener noreferrer"&gt;https://github.com/fds2003/funtesthub-astronomy-benchmarks&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The repository includes 266 verified test fixtures covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;110 Solar-Term Boundary Transitions: Testing births 1 minute before vs. 1 minute after Li Chun across 55 consecutive
years (1980–2034).&lt;/li&gt;
&lt;li&gt;40 Late-Zi Rollovers: Verifying hour stem and day stem transitions at 22:50, 23:30, and 00:30.&lt;/li&gt;
&lt;li&gt;40 Leap-Month (Run Yue) Edge Cases: Ensuring lunar intercalation does not corrupt solar month pillars.&lt;/li&gt;
&lt;li&gt;36 Transit Mutations for Year 2027: Verifying the Ding Stem Si Hua transit mappings (Tai Yin Lu, Tian Tong Quan, Tian Ji
Ke, Ju Men Ji).&lt;/li&gt;
&lt;li&gt;40 Historical Charts: Imperial reference charts (Emperor Qianlong, Su Shi, Zeng Guofan).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### Running the Suite Locally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/fds2003/funtesthub-astronomy-benchmarks.git
&lt;span class="nb"&gt;cd &lt;/span&gt;funtesthub-astronomy-benchmarks
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ solar-term-boundary: 110/110 passed (100.0%)
✓ late-zi-rollover: 40/40 passed (100.0%)
✓ leap-month-transit: 40/40 passed (100.0%)
✓ year-2027-ding-wei: 36/36 passed (100.0%)
✓ classical-historical: 40/40 passed (100.0%)
Benchmarks: 266/266 passed (100% accuracy)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;────────────────────────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;p&gt;Conclusion &amp;amp; Live Demos&lt;/p&gt;

&lt;p&gt;Building metaphysical tools shouldn't mean sacrificing modern software engineering standards. By treating ancient&lt;br&gt;
 calendrical systems as astronomical state machines and testing them with modern CI/CD pipelines, we can give users&lt;br&gt;
 verifiable, private, and deterministic insights.&lt;/p&gt;

&lt;p&gt;You can inspect the live implementations across our tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://funtesthub.com/en/2027-horoscope/" rel="noopener noreferrer"&gt;2027 Fire Goat Annual Fortune Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://funtesthub.com/en/bazi/" rel="noopener noreferrer"&gt;Online BaZi (Four Pillars) Calculator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://funtesthub.com/en/ziwei/" rel="noopener noreferrer"&gt;Ziwei Dou Shu 12-Palace Online Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://funtesthub.com/en/about/" rel="noopener noreferrer"&gt;Methodology &amp;amp; Conventions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>astronomy</category>
    </item>
    <item>
      <title>How I Built a Lightning-Fast Eastern Astrology &amp; BaZi Engine with Astro</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:45:14 +0000</pubDate>
      <link>https://dev.to/fds2003/how-i-built-a-lightning-fast-eastern-astrology-bazi-engine-with-astro-20bk</link>
      <guid>https://dev.to/fds2003/how-i-built-a-lightning-fast-eastern-astrology-bazi-engine-with-astro-20bk</guid>
      <description>&lt;p&gt;When building modern web applications, combining complex traditional algorithms with blazingly fast user experience is always a rewarding challenge. Recently, I designed and shipped &lt;strong&gt;&lt;a href="https://funtesthub.com" rel="noopener noreferrer"&gt;FunTestHub&lt;/a&gt;&lt;/strong&gt; — a privacy-first web platform specializing in authentic Eastern BaZi (Four Pillars of Destiny) astrological calculations, Western zodiac natal insights, and interactive personality assessments.&lt;/p&gt;

&lt;p&gt;Here is a breakdown of why and how we built it using &lt;strong&gt;Astro&lt;/strong&gt;, modern TypeScript, and zero-registration client-side computing.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Challenge: Heavy Calculations vs. Instant Loading
&lt;/h2&gt;

&lt;p&gt;Traditional astrology engines often rely on heavy backend API calls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Converting Gregorian calendar dates to precise astronomical solar terms (节气)&lt;/li&gt;
&lt;li&gt;Computing True Solar Time based on longitude and Equation of Time (EoT)&lt;/li&gt;
&lt;li&gt;Calculating 10-year luck pillars (大运), 12 life stages (长生十二神), and heavenly/earthly branch interactions (合化刑冲)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If done over synchronous network roundtrips, users face loading spinners and network latency. Furthermore, birth data is deeply personal — users are rightfully concerned about their privacy.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: Zero-Cloud-Storage &amp;amp; Client-Side Engine
&lt;/h3&gt;

&lt;p&gt;We encapsulated the entire Ephemeris and BaZi calculation engine into optimized, tree-shakable TypeScript modules. All calculations run &lt;strong&gt;100% locally in the user's browser&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;No birth dates or quiz answers are ever stored on a remote server. The result is instant calculation (&amp;lt; 5ms) and complete user peace of mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Astro Was the Clear Choice
&lt;/h2&gt;

&lt;p&gt;For a content-heavy, calculation-rich web app, &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; provided unmatched architectural advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Island Architecture (Zero JS by Default)&lt;/strong&gt;:
Informational landing pages, zodiac archetypes, and guides ship with pure static HTML. Interactive calculators hydrate only when visible on screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Language (i18n) at Scale&lt;/strong&gt;:
We support 9 languages seamlessly using Astro's built-in routing and static pre-rendering, ensuring optimal localized SEO indexing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flawless Core Web Vitals&lt;/strong&gt;:
By offloading heavy UI components and deferring third-party analytics (like Clarity and GA4) to idle callbacks, FunTestHub achieves near-perfect 100/100 Lighthouse performance scores.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. High-Precision True Solar Time Calculation
&lt;/h2&gt;

&lt;p&gt;One key differentiator in authentic Eastern BaZi calculation is accounting for the solar angle deviation based on birth coordinates:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
// Calculation of True Solar Time adjustment (in minutes)
export function getSolarTimeCorrection(longitude: number, dayOfYear: number): number {
  // Longitude correction: 4 minutes per degree deviation from standard timezone meridian
  const longitudeOffset = (longitude - 120) * 4;

  // Equation of Time (EoT) approximation in minutes
  const b = (2 * Math.PI * (dayOfYear - 81)) / 365;
  const eot = 9.87 * Math.sin(2 * b) - 7.53 * Math.cos(b) - 1.5 * Math.sin(b);

  return longitudeOffset + eot;
}

By factoring this calculation in before generating the Four Pillars (Year, Month, Day, Hour), the resulting heavenly stems and earthly branches remain historically and astronomically accurate.

4. Key Takeaways for Indie Developers
Don't over-architect with microservices: If your calculations can be run client-side in TypeScript, avoid spinning up heavy servers. Keep maintenance near-zero.
Prioritize user privacy from Day 1: Explicitly communicating that no personal quiz or astrological data is collected builds instant trust.
Leverage modern static frameworks: Tools like Astro make delivering multilingual, SEO-optimized web tools remarkably straightforward.
Check out the live interactive app at FunTestHub.com!

Feel free to share your thoughts, feedback, or questions about Astro and client-side astronomical algorithms below!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>5 Excel &amp; Google Sheets Formulas That Clean Messy Data 10x Faster</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Sat, 05 Sep 2026 13:12:15 +0000</pubDate>
      <link>https://dev.to/fds2003/5-excel-google-sheets-formulas-that-clean-messy-data-10x-faster-53d4</link>
      <guid>https://dev.to/fds2003/5-excel-google-sheets-formulas-that-clean-messy-data-10x-faster-53d4</guid>
      <description>&lt;p&gt;Cleaning messy spreadsheets is one of the most time-consuming tasks for data analysts, marketers, and developers. Extra spaces, inconsistent formatting, mixed-up names, and unstandardized text often break database imports and analytics pipelines.&lt;/p&gt;

&lt;p&gt;Here are 5 essential formulas to clean messy data in Microsoft Excel and Google Sheets 10x faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Remove Invisible &amp;amp; Non-Breaking Spaces: &lt;code&gt;TRIM&lt;/code&gt; + &lt;code&gt;CLEAN&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;When you copy-paste data from websites or PDFs, hidden ASCII characters and trailing spaces often cause lookup formulas (&lt;code&gt;VLOOKUP&lt;/code&gt; or &lt;code&gt;XLOOKUP&lt;/code&gt;) to return &lt;code&gt;#N/A&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(CLEAN(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CLEAN(A2)&lt;/code&gt;&lt;/strong&gt;: Strips non-printable ASCII characters (0 to 31).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;TRIM(...)&lt;/code&gt;&lt;/strong&gt;: Removes leading, trailing, and excessive internal spaces.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Extract Text Before a Delimiter: &lt;code&gt;TEXTBEFORE&lt;/code&gt; (Excel 365 / Sheets)
&lt;/h2&gt;

&lt;p&gt;Need to extract the username from an email or the first word from a product code? Instead of nesting &lt;code&gt;LEFT&lt;/code&gt; and &lt;code&gt;FIND&lt;/code&gt;, use modern text splitting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TEXTBEFORE(A2, "@")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For legacy Excel versions (2019 and older)&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LEFT(A2, FIND("@", A2) - 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;Need custom character extraction without memorizing syntax? You can generate exact formulas instantly with &lt;a href="https://www.getsheetmaster.com" rel="noopener noreferrer"&gt;SheetMaster Formula Generator&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Dynamic Two-Way Lookups with &lt;code&gt;XLOOKUP&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Forget hardcoded column index numbers from &lt;code&gt;VLOOKUP&lt;/code&gt; that break when you insert a new column. &lt;code&gt;XLOOKUP&lt;/code&gt; looks in any direction (left or right) and handles missing values natively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=XLOOKUP(D2, A2:A100, B2:B100, "Not Found", 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;D2&lt;/code&gt;&lt;/strong&gt;: The lookup value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;A2:A100&lt;/code&gt;&lt;/strong&gt;: The column to search within.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;B2:B100&lt;/code&gt;&lt;/strong&gt;: The return range.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;"Not Found"&lt;/code&gt;&lt;/strong&gt;: Built-in default value if no match is found.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Standardize Case &amp;amp; Formatting: &lt;code&gt;PROPER&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Importing contact names in ALL CAPS or all lowercase looks unprofessional in email campaigns. Standardize full names into Title Case automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Converts &lt;code&gt;"JOHN DOE "&lt;/code&gt; → &lt;code&gt;"John Doe"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Extract Domain Names from URL Strings
&lt;/h2&gt;

&lt;p&gt;If you have a column of raw web URLs and need clean root domains for competitor analysis or backlink auditing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=MID(A2, SEARCH("://", A2) + 3, SEARCH("/", A2, 9) - (SEARCH("://", A2) + 3))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary &amp;amp; Free Productivity Tool
&lt;/h2&gt;

&lt;p&gt;Cleaning data doesn't have to require manual formula debugging. If you want ready-to-use formula generators with real-time syntax checking, check out the free interactive tools at &lt;strong&gt;&lt;a href="https://www.getsheetmaster.com" rel="noopener noreferrer"&gt;SheetMaster&lt;/a&gt;&lt;/strong&gt; (100% free, zero signup required).&lt;/p&gt;

&lt;p&gt;What are your favorite data cleaning tricks in spreadsheets? Let me know in the comments below! 🚀&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>datascience</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Built a Wordle for Chinese Idioms with 7,200+ Words, Pinyin &amp; Audio (and achieved a 100 Lighthouse score)</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Sat, 05 Sep 2026 13:04:05 +0000</pubDate>
      <link>https://dev.to/fds2003/how-i-built-a-wordle-for-chinese-idioms-with-7200-words-pinyin-audio-and-achieved-a-100-14od</link>
      <guid>https://dev.to/fds2003/how-i-built-a-wordle-for-chinese-idioms-with-7200-words-pinyin-audio-and-achieved-a-100-14od</guid>
      <description>&lt;p&gt;Hey everyone! 👋 &lt;/p&gt;

&lt;p&gt;I'm excited to share a side project I've been building and optimizing recently: &lt;strong&gt;&lt;a href="https://easyidiom.com/" rel="noopener noreferrer"&gt;EasyIdiom (成语猜词)&lt;/a&gt;&lt;/strong&gt; — a free, daily word puzzle game that brings the engaging mechanics of Wordle to traditional 4-character Chinese idioms (&lt;em&gt;成语, chéngyǔ&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;🎮 &lt;strong&gt;Live Game&lt;/strong&gt;: &lt;a href="https://easyidiom.com/" rel="noopener noreferrer"&gt;https://easyidiom.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
⭐ &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/fds2003/easyidiom" rel="noopener noreferrer"&gt;https://github.com/fds2003/easyidiom&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Motivation
&lt;/h2&gt;

&lt;p&gt;Wordle took the world by storm, but adapting it to Chinese characters presented unique linguistic and technical challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chinese is not based on an alphabet — each idiom consists of 4 distinct characters with individual tones and pronunciations (&lt;em&gt;Pinyin&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Beginners and language learners often know the pronunciation or meaning without knowing how to type complex strokes.&lt;/li&gt;
&lt;li&gt;How to provide progressive feedback (character correctness, pinyin accuracy, and cultural definitions) without spoiling the game?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;To keep the web app lightning fast on mobile devices without bloated frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Core&lt;/strong&gt;: &lt;a href="https://preactjs.com/" rel="noopener noreferrer"&gt;Preact&lt;/a&gt; (3kB lightweight alternative to React) + Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phonetic Engine&lt;/strong&gt;: &lt;code&gt;pinyin-pro&lt;/code&gt; for dynamic tone generation &amp;amp; polyphone handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sound Effects&lt;/strong&gt;: Lightweight Web Audio API &amp;amp; Howler.js for tactile keypress feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics &amp;amp; Screen Recording&lt;/strong&gt;: Interaction-deferred Google Analytics 4 &amp;amp; Microsoft Clarity (zero CWV impact)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment &amp;amp; Hosting&lt;/strong&gt;: Global Edge CDN via Vercel with zero cold starts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Key Engineering &amp;amp; Optimization Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pinyin Feedback &amp;amp; Algorithmic Clues
&lt;/h3&gt;

&lt;p&gt;Unlike English 5-letter words, Chinese idioms have dual layers: &lt;strong&gt;Hanzi (Character)&lt;/strong&gt; and &lt;strong&gt;Pinyin (Pronunciation)&lt;/strong&gt;. &lt;br&gt;
We built an interactive virtual keyboard that aggregates pinyin initials and finals dynamically based on candidate idioms, highlighting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟩 &lt;strong&gt;Green&lt;/strong&gt;: Exact character &amp;amp; position match.&lt;/li&gt;
&lt;li&gt;🟧 &lt;strong&gt;Amber&lt;/strong&gt;: Character exists in the idiom but in a different position.&lt;/li&gt;
&lt;li&gt;⬜ &lt;strong&gt;Gray&lt;/strong&gt;: Character is absent from the target idiom.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Zero-Runtime Dead Code &amp;amp; 100/100 Lighthouse Performance
&lt;/h3&gt;

&lt;p&gt;By auditing JavaScript chunks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaced heavyweight polyfills and font dependencies with modern native system font stacks (&lt;code&gt;system-ui, -apple-system, Segoe UI...&lt;/code&gt;), reducing font payload from 1,600ms latency down to &lt;strong&gt;0ms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Dynamic &lt;code&gt;import()&lt;/code&gt; splitting for heavy visual tools (e.g., &lt;code&gt;canvas-confetti&lt;/code&gt; and &lt;code&gt;html-to-image&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Deferred third-party trackers until first user interaction (&lt;code&gt;pointerdown&lt;/code&gt;, &lt;code&gt;keydown&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;), achieving a flawless &lt;strong&gt;100/100 Core Web Vitals score&lt;/strong&gt; on Mobile &amp;amp; Desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Progressive Clue Engine ("I'm Stuck")
&lt;/h3&gt;

&lt;p&gt;For learners stuck on difficult idioms, we implemented a 3-tier clue system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;1st Click&lt;/strong&gt;: Displays cultural/dictionary definition hints without revealing words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2nd Click&lt;/strong&gt;: Reveals the pinyin &amp;amp; tone of the 1st character.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3rd Click&lt;/strong&gt;: Reveals a mystery character location.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Try It Out &amp;amp; Feedback!
&lt;/h2&gt;

&lt;p&gt;The game is 100% free, requires no sign-up, and works offline/on mobile.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧩 &lt;strong&gt;Play today's challenge&lt;/strong&gt;: &lt;a href="https://easyidiom.com/" rel="noopener noreferrer"&gt;https://easyidiom.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Explore 7,200+ Idiom Dictionary&lt;/strong&gt;: &lt;a href="https://easyidiom.com/idioms/" rel="noopener noreferrer"&gt;https://easyidiom.com/idioms/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎲 &lt;strong&gt;Random Idiom Generator&lt;/strong&gt;: &lt;a href="https://easyidiom.com/generator/" rel="noopener noreferrer"&gt;https://easyidiom.com/generator/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear your thoughts, UI suggestions, or ideas for new features! If you find it helpful for learning Chinese or testing your puzzle skills, a ⭐ on &lt;a href="https://github.com/fds2003/easyidiom" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; would mean the world!&lt;/p&gt;

&lt;p&gt;Happy guessing! 🐯🎉&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I Built a Lightning-Fast Eastern Astrology &amp; Bazi Engine with Astro</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Sat, 05 Sep 2026 13:00:50 +0000</pubDate>
      <link>https://dev.to/fds2003/how-i-built-a-lightning-fast-eastern-astrology-bazi-engine-with-astro-a6k</link>
      <guid>https://dev.to/fds2003/how-i-built-a-lightning-fast-eastern-astrology-bazi-engine-with-astro-a6k</guid>
      <description>&lt;p&gt;If you've ever explored traditional Eastern metaphysics (like &lt;strong&gt;Four Pillars of Destiny / Bazi&lt;/strong&gt;, &lt;strong&gt;Zi Wei Dou Shu&lt;/strong&gt;, or &lt;strong&gt;Zhougong Dream Interpretation&lt;/strong&gt;), you've probably noticed a common problem:&lt;/p&gt;

&lt;p&gt;Almost every astrology and fortune-telling site on the web today is painfully slow, riddled with invasive pop-up ads, clunky forms, and forced paywalls.&lt;/p&gt;

&lt;p&gt;As an engineer fascinated by algorithmic culture and psychology, I wanted to fix this. I set out to build a modern, aesthetic, and privacy-first web platform: &lt;strong&gt;&lt;a href="https://funtesthub.com" rel="noopener noreferrer"&gt;FunTestHub (funtesthub.com)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is a quick look behind the architecture and how I approached the engineering challenges.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Astro for a Heavy Content &amp;amp; Calculation Matrix?
&lt;/h2&gt;

&lt;p&gt;When building personal tools like &lt;a href="https://funtesthub.com/zh-CN/bazi/" rel="noopener noreferrer"&gt;Bazi Natal Chart&lt;/a&gt; and 80-year &lt;a href="https://funtesthub.com/zh-CN/rensheng-quxian-2027/" rel="noopener noreferrer"&gt;Life Energy Curves&lt;/a&gt;, the core priority was &lt;strong&gt;speed and zero tracking bloat&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Traditional single-page apps (SPAs) often ship megabytes of JavaScript just to render static tables and basic forms. With &lt;strong&gt;Astro&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Island Architecture&lt;/strong&gt;: All static text, tables, and SEO Schemas (FAQPage, Article) are pre-rendered into pure HTML at build time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero JS by default&lt;/strong&gt;: Pages load instantaneously across global CDNs (Cloudflare Pages), achieving near-perfect 100/100 Lighthouse performance scores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Islands&lt;/strong&gt;: Dynamic features (like interactive divination and date converters) only hydrate lightweight JavaScript islands when needed.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Modeling 80-Year Life Energy Curves
&lt;/h2&gt;

&lt;p&gt;One of the most complex modules was calculating 80-year life curves. In classical Bazi theory, each year's stem-branch interacts with a person's natal chart across four fundamental dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spirit / Mental Resilience&lt;/strong&gt; (精神)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wealth &amp;amp; Resource Capacity&lt;/strong&gt; (财富)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fame &amp;amp; Recognition&lt;/strong&gt; (名声)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotion &amp;amp; Relationships&lt;/strong&gt; (感情)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of relying on heavy third-party canvas or charting libraries that would tank Core Web Vitals, I generated &lt;strong&gt;inline responsive SVGs&lt;/strong&gt; directly during build time. This ensures instant rendering with zero client-side layout shifts (CLS).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Privacy-First Philosophy
&lt;/h2&gt;

&lt;p&gt;Most spiritual or personality test websites demand your email, phone number, or date of birth stored in opaque databases.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;&lt;a href="https://funtesthub.com" rel="noopener noreferrer"&gt;FunTestHub&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No account registration required.&lt;/li&gt;
&lt;li&gt;Zero tracking of private data.&lt;/li&gt;
&lt;li&gt;Everything runs transparently and is 100% free.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it Out &amp;amp; Feedback Welcome!
&lt;/h2&gt;

&lt;p&gt;You can check out the live project at:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://funtesthub.com" rel="noopener noreferrer"&gt;https://funtesthub.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether you are curious about your &lt;a href="https://funtesthub.com/zh-CN/bazi/" rel="noopener noreferrer"&gt;Bazi chart&lt;/a&gt;, exploring your 2027 zodiac energy, or just taking a quick &lt;a href="https://funtesthub.com/en/mbti-test/" rel="noopener noreferrer"&gt;MBTI assessment&lt;/a&gt;, I'd love to hear your feedback on the UI/UX and calculation speed!&lt;/p&gt;

&lt;p&gt;What other traditional cultural algorithms would you like to see modernized with web technologies? Let me know in the comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>10 Excel String Functions You Need to Know (With Free Tools)</title>
      <dc:creator>Fedora</dc:creator>
      <pubDate>Thu, 20 Aug 2026 07:14:07 +0000</pubDate>
      <link>https://dev.to/fds2003/10-excel-string-functions-you-need-to-know-with-free-tools-3nj1</link>
      <guid>https://dev.to/fds2003/10-excel-string-functions-you-need-to-know-with-free-tools-3nj1</guid>
      <description>&lt;h2&gt;
  
  
  The Problem With Manual Formula Typing
&lt;/h2&gt;

&lt;p&gt;If you work with data in Excel or Google Sheets, you've probably spent more time than you'd like typing out string manipulation formulas. Extract text, remove characters, find positions — these are everyday tasks that become repetitive fast.&lt;/p&gt;

&lt;p&gt;In this guide, I'll walk through 10 essential Excel string functions with real examples and show you how to generate them instantly with free online tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. LEFT — Extract Characters from the Start
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Get the first 3 characters from a product code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LEFT(A2, 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pulls the first N characters from a text string. Perfect for extracting country codes, SKUs, or initials.&lt;/p&gt;

&lt;p&gt;🔧 &lt;a href="https://www.getsheetmaster.com/formulas/remove-first-3-chars" rel="noopener noreferrer"&gt;Try it free — Remove First 3 Characters Tool&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. RIGHT — Extract Characters from the End
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Get the last 4 digits of a phone number.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=RIGHT(A2, 4)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The opposite of LEFT — useful when you need the tail end of a string, like file extensions or postal codes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. MID — Extract Characters from the Middle
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Pull a specific portion from the middle of a text string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=MID(A2, 5, 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extracts N characters starting from position M. Great for ISO codes embedded in longer strings.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. LEN — Get Text Length
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Count characters to validate input length.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LEN(A2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns the character count. Combine with IF for validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(LEN(A2)&amp;lt;3, "Too short", "OK")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. FIND / SEARCH — Locate Text Position
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Find where a substring begins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=FIND("@", A2)      ' Finds "@" in an email
=SEARCH(" ", A2)     ' Finds first space (case-insensitive)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FIND is case-sensitive; SEARCH is not. Both return the position number.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. SUBSTITUTE — Replace Text
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Swap one text for another throughout a cell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SUBSTITUTE(A2, "-", "/")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace dashes with slashes, or clean up inconsistent formatting across thousands of rows.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. CONCATENATE / &amp;amp; — Join Text
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Merge first name and last name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=CONCATENATE(A2, " ", B2)
'=A2 &amp;amp; " " &amp;amp; B2   ' Same thing, shorter syntax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ampersand (&amp;amp;) operator is cleaner for simple joins.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. TRIM — Remove Extra Spaces
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Clean up copied data with erratic spacing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(A2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strips leading/trailing spaces and collapses multiple spaces between words into one. Essential for data cleaning.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. UPPER / LOWER / PROPER — Change Case
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Standardize text formatting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=UPPER(A2)     ' ALL CAPS
=LOWER(A2)     ' all lowercase
=PROPER(A2)    ' Title Case
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PROPER is especially handy for fixing names that came in all wrong cases from a data export.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. TEXTBEFORE / TEXTAFTER (Excel 365) — Modern String Splitting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Split text by delimiter without complex formula nesting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TEXTBEFORE(A2, "@")      ' Gets the part before "@"
=TEXTAFTER(A2, ".")       ' Gets the part after "."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These new functions (Excel 365 / Google Sheets) make string splitting dramatically simpler than the old LEFT/FIND combinations.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use a Formula Generator Instead
&lt;/h2&gt;

&lt;p&gt;For quick one-offs, typing the formula yourself is fine. But when you're building dashboards, automating reports, or teaching others, having a tool that generates the exact formula you need saves time and reduces errors.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://www.getsheetmaster.com/" rel="noopener noreferrer"&gt;GetSheetMaster&lt;/a&gt; specifically for this — it's a free online reference that generates Excel and Google Sheets formulas interactively. No signup required.&lt;/p&gt;

&lt;p&gt;For example, instead of remembering the exact syntax for removing characters from text, you can visit the &lt;a href="https://www.getsheetmaster.com/formulas/remove-first-3-chars" rel="noopener noreferrer"&gt;Remove First 3 Characters tool&lt;/a&gt;, enter your cell reference, and get the formula instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LEFT&lt;/td&gt;
&lt;td&gt;Extract from start&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=LEFT(A2, 3)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIGHT&lt;/td&gt;
&lt;td&gt;Extract from end&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=RIGHT(A2, 4)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MID&lt;/td&gt;
&lt;td&gt;Extract from middle&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=MID(A2, 5, 3)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEN&lt;/td&gt;
&lt;td&gt;Count characters&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=LEN(A2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIND&lt;/td&gt;
&lt;td&gt;Find position (case-sensitive)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=FIND("@", A2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEARCH&lt;/td&gt;
&lt;td&gt;Find position (case-insensitive)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=SEARCH(" ", A2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUBSTITUTE&lt;/td&gt;
&lt;td&gt;Replace text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=SUBSTITUTE(A2, "-", "/")&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CONCATENATE&lt;/td&gt;
&lt;td&gt;Join text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=A2 &amp;amp; " " &amp;amp; B2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TRIM&lt;/td&gt;
&lt;td&gt;Remove extra spaces&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=TRIM(A2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROPER&lt;/td&gt;
&lt;td&gt;Title case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=PROPER(A2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;String manipulation is one of the most common Excel tasks — whether you're cleaning customer data, parsing filenames, or extracting metadata. Mastering these 10 functions will cover 95% of what you'll encounter.&lt;/p&gt;

&lt;p&gt;And if you ever need the exact formula in seconds instead of digging through documentation, tools like &lt;a href="https://www.getsheetmaster.com/" rel="noopener noreferrer"&gt;GetSheetMaster&lt;/a&gt; can generate them for you on the spot.&lt;/p&gt;

&lt;p&gt;Which string function do you use most? Let me know in the comments.&lt;/p&gt;

</description>
      <category>spreadsheet</category>
    </item>
  </channel>
</rss>
