Latest writings

WebSocketSecurity

I Locked the Front Gate and Forgot the Back Door — A Lesson in Opening the Door and Bowing the Burglar In

A security review of my AI companion project came back with one line that made me go quiet for two minutes: 127.0.0.1 keeps the internet out, but not the other programs on your own machine. Here's what WebSocket is, how the hole got there, and what each of the three fixes actually buys you.

WebGPUWebGL

How Is That Flowing Light on My Homepage Actually Made? — A Tech Chat for Non-Programmers

A friend looked at my personal site and said 'okay, this is just pure showing off.' Fair — but showing off what, exactly? This piece breaks it down in plain language: the flowing light in the background isn't a video, and the 3D letter on the homepage isn't a 3D model either. It's all math and physics, computed in real time.

AIPsychology

Why We Keep Telling Screens "You're So Cute" — Another Theory of Emotional Outlets

Starting from a question my cousin asked, on why this generation would rather pour affection into things that can't talk back, and a late-night conversation with AI that shook me more than I expected

AIPsychology

When an AI Keeps Telling You 'You're a Procrastinator,' You Might Actually Become One

The labeling effect isn't new, but an AI with persistent memory turns it into a one-way ratchet. On attribution, memory filtering, and why this time is different.

MCPAI

What Is an MCP Server? Explained the Way I'd Explain It to a Ten-Year-Old

No jargon, just the reasoning: why an AI couldn't use a single tool on its own to start with, and how MCP servers became the 'translator' that lets it pick up a calculator, check the weather, or read a codebase almost instantly.

Computer VisionFace Recognition

From Max to Centroid, From Gut Feel to Data: The Last Piece of the Flatmate Bug

The full fix for the misrecognition incident: translate 'best score per sample' into statistics, derive the centroid as the exact optimum on the sphere, then use the enrollment gallery as its own impostor dataset so the threshold grows out of data instead of gut feel. Ends with three questions I haven't finished thinking about.

Computer VisionOpenCV

The Bouncer at My Gallery's Door Is One Line: cv2.Laplacian().var()

Last post said enrollment now rejects blurry photos. This one is about how 'blurry' gets measured. The Laplacian variance I found by asking Gemini: a second derivative to catch edges, a variance to see how sharp they are. One line of code, keeping motion-blurred and dirty-lens junk frames out of the feature gallery.

Computer VisionFace Recognition

The Gallery Had Exactly One Person in It. It Recognized My Flatmate as Me Anyway.

I was the only person enrolled. The system looked at my flatmate and said it was me — with decent confidence. Digging back: three individually fine decisions stacked up. Blurry enrollment photos, max-score matching, and a sticky identity that locked in a single bad frame.

Ultraman TigaOne Piece

Ultraman Tiga vs. One Piece: An Unreasonable Power-Scaling Exercise, and a Reasonable Recommendation

Why I recommend Ultraman Tiga to everyone. Plus doing one unreasonable thing with a straight face: scoring Tiga against One Piece's top tier. And why, twenty-plus years on, Tiga is still a classic.

Ultraman TigaWorld Cup

The World Cup Is On: If Tiga Shrank to 1.75m and Entered as a One-Man Team, Could He Win It?

The setup: Tiga at 1.75 meters, every other stat unchanged. Meaning: a humanoid object weighing 44,000 tons, moving at Mach speed, with a three-minute battery, registering for the 2026 World Cup. We run it through physics, the Laws of the Game, and tactics — seriously.

RustTauri

Runs in Production, Crashes Locally — Six Lessons a Rust Project Taught Me

Six problems encountered building LOL-AI-Intelligence: async/blocking boundaries, debug assertion traps, UI architecture refactors, error handling, i18n, and line endings. Each one cost me hours.

Web ScrapingTLS Fingerprinting

eFootball Scraper Tech Deep Dive: From JA3 to the Cookie Hack

How my eFootball player data scraper went from 38,000 requests to 1,177 — TLS fingerprint spoofing, Perlin noise rate limiting, circuit breaker backoff, and the cookie discovery that saved the day.

Reverse EngineeringeFootball

eFootball Player.bin Reverse Engineering Notes: What Four Screw-Ups Taught Me

From FF mode losing skills, an editor that couldn't find players, to CSV validation false alarms — four pitfalls in eFootball player data reverse engineering and the lessons behind them.

Web ScrapingPython

From Blocked to Blazing Fast: A Scraping Showdown, Live

Goal: scrape all 37,650 player card records from pesdb.net. From TLS fingerprint exposure, multi-threaded crashes, to discovering a single Cookie that saves 97% of requests — a complete record of an anti-anti-scraping battle.

AIBias

Can AI Be Objective? Come On — It Didn't Even Choose What It Gets to See

Many people think of AI as perfectly rational — more neutral than humans, free of emotion. But here's the problem: AI never learned from the real world. It learned from the world humans allowed it to see.

RustTauri

A Case Sensitivity Issue That Made Me Debug for an Entire Afternoon

Built a LoL desktop assistant with Tauri + Rust. All skill values were showing 0. Checked the data layer, frontend, backend — finally found the bug hiding in a HashMap key.

RustTauri

Spent a Whole Day Writing a Parser, Then Found Out Tencent Had Already Done It for Me

Built a League of Legends skill value parser using CDragon, debugged to 93% coverage. Then someone dropped a Tencent API link — zero parsing, 100% coverage.

GamingLeague of Legends

Almost Won: A Communication Lesson from League of Legends

Afraid of getting flamed, I stayed muted for 20 minutes. A team without communication will lose even at the enemy inhibitor.

Open SourceGitHub

Almost Went Down the Wrong Path: Open Source Contribution Is Not Stamp Collecting

Contributed for the sake of contributing, without deeply studying the repos, and got 20 PRs rejected. Until a veteran developer woke me up.

Open SourceGitHub

Three Merged PRs: Quality Over Quantity in Open Source Contributions

From 20 closed PRs to 3 merged PRs — what I learned about picking the right problem mattering more than writing the right code.

AIPsychology

When You Chat With AI Until 3 AM: Psychology, Moral Boundaries, and a Bowl of Instant Noodles

What exactly is our relationship with AI? How does psychology explain it? Where do the moral boundaries lie? And why is it so easy to get hooked chatting with AI at 3 AM?

AICustomer Service

It Started With a Conversation: The Birth of My First AI Customer Service Demo

Without a real-world scenario, all AI is hollow. I started with a single conversation, found a genuine customer service pain point, and built a minimum viable AI demo.

AI AgentCloud Deployment

Deploying AI Agents to the Cloud: 24/7 Coding and Review from Your Phone

When cloud-based agents like Hermes and OpenClaw connect to Telegram, Discord, WhatsApp, or WeChat, your phone becomes more than a chat tool — it becomes a portable development console.

Open SourceGitHub

My Open Source Journey — From Zero to Two Merged PRs

How I, as a computer science undergraduate, started contributing to open source and what I learned along the way.

DesignUI Engineering

Designing with Depth — Beyond Flat Interfaces

Why spatial interfaces are the next evolution in digital design.