December 18, 2025
The AI Dilemma: When Legacy Infrastructure Meets Modern Ambitions
Why large enterprises struggle to adopt AI at scale—and why the problem isn't the AI models, it's the decades of technical debt hiding in their data foundations.
Blog
Long-form thoughts on programming, leadership, product design, and more.
December 18, 2025
The AI Dilemma: When Legacy Infrastructure Meets Modern Ambitions
Why large enterprises struggle to adopt AI at scale—and why the problem isn't the AI models, it's the decades of technical debt hiding in their data foundations.
March 22, 2025
AI-Powered Compliance Reporting in Regulated Research Environments
Building a production-grade RAG system with React, Flask, and Databricks to automate audit-ready report generation from experimental data—eliminating manual effort while maintaining strict regulatory compliance.
November 10, 2024
Learning the AWS Cloud Ecosystem: A Practical Journey
Lessons learned navigating AWS's vast service catalog, earning the Solutions Architect Associate certification, and applying cloud-native patterns to real-world enterprise platforms.
August 15, 2024
Building an AI-Powered Evaluation Platform for Research Innovation
How we replaced fragmented Excel workflows with a cloud-native, multi-stage evaluation system using React, TypeScript, Node.js, and AI-powered decision support—saving nearly a week per reviewer per cycle.
May 28, 2021
Orthographic Camera and Perspective Camera in 3D Modelling
Understanding the key differences between orthographic and perspective cameras in 3D graphics, with practical Three.js examples for choosing the right projection.
May 26, 2021
Incorporate Three.js and Phaser3 on WeChat Minigame Platform
How to render a Three.js scene inside a Phaser 3 scene on WeChat by sharing the WebGL context, plus what to do when WebGL 2 compatibility breaks on real devices.
January 10, 2021
Run Phaser3 on WeChat Minigame Platform
A field guide to running Phaser 3 on WeChat Minigame: patching image loading (no blob support), updating touch event targets, adding a DOMParser shim for bitmap fonts, and handling sharedCanvas limitations.
November 25, 2019
A short reference to Red Blob Games' excellent hex grid guide, with a practical rule of thumb for choosing offset/doubled coordinates vs axial/cube coordinates.
July 15, 2019
A practical walkthrough of creating and enabling a swap file on a low-RAM Linux server (dd, mkswap, swapon), plus how to verify memory changes and disable swap later.
July 10, 2019
Install and configure PHP with httpd in Linux
Step-by-step notes for building PHP from source and wiring it into Apache (httpd), including configure flags, loading the PHP module, and a quick phpinfo() smoke test.
April 15, 2019
Collision detection with QuadTree in 2D games
A quick primer on using QuadTrees as a broad-phase spatial partitioning strategy to reduce collision checks in 2D games, with references for deeper dives and implementations.
April 5, 2019
Notes on working with unimelb gitlab
A quick fix for a common GitLab push redirect issue: use the correct remote URL (including `.git`) and remove/re-add `origin` when you’ve set it wrong.
March 26, 2019
Practical HTML5 canvas performance tips for games: reduce draw calls, use dirty rectangles/offscreen canvases, batch paths, avoid expensive state changes, and more.
March 25, 2019
Differences between JS touches variables
A clear explanation of TouchEvent `touches`, `targetTouches`, and `changedTouches`, with practical scenarios for multi-touch and gesture-heavy interactions.
March 24, 2019
Why object pools help smooth performance in GC-heavy JavaScript apps, plus a simple pool implementation and usage pattern suited to games and real-time loops.
March 23, 2019
Setup search functionality for Jekyll
Add client-side search to a Jekyll blog using Simple-Jekyll-Search: generate `search.json`, add input/results markup, and wire up the JS configuration.
March 22, 2019
Setup categories for Jekyll posts and pages
Add categories to a Jekyll site with simple Liquid snippets, plus a categories index page that groups posts and links to per-category archives.
March 20, 2019
Include Jekyll blocks and highlight HTML in Jekyll
A clean way to show Liquid/Jekyll tags as code: wrap snippets with `{% raw %}` to prevent execution, then apply syntax highlighting (even for nested raw tags).
March 19, 2019
Simple word guessing game in JS
A simple JavaScript word guessing game spec: how words are chosen, how letters are hidden, and how scoring and remaining guesses drive the game loop.
March 18, 2019
Implement pagination functionality for Jekyll
How to add pagination to a Jekyll blog with `jekyll-paginate`: configuration, paginate paths, and Liquid templates for navigation and per-page post lists.
March 17, 2019
The rate limits of Let's Encrypt
A practical summary of Let's Encrypt rate limits (per-domain, duplicate certs, renewals, failed validations) and how to plan issuance for many subdomains.
March 16, 2019
The advantages of putting default values for function arguments
A quick explanation of JavaScript default parameters—how they simplify APIs, avoid `undefined` checks, and make function calls safer with clear defaults.
March 15, 2019
Resolve failure of updating wordpress
Troubleshooting common WordPress update failures, from PHP execution time limits to clearing the core updater lock when an update gets stuck.
March 14, 2019
Redirecting from HTTPS to HTTP
Why HTTPS → HTTP redirects don’t work without a valid certificate, what that means for SEO, and the narrow cases where an `.htaccess` rewrite can help.
March 13, 2019
A compact pip cheat sheet for everyday Python package management: list, install, inspect, upgrade, and uninstall packages.
March 12, 2019
Commonly used firewall cmd commands
A practical `firewall-cmd` / firewalld cheat sheet: zones, services, ports, and the difference between runtime and permanent rules for common Linux setups.
March 11, 2019
Commonly used constants in PHP
A quick reference of commonly used PHP core constants (EOL markers, integer limits, float ranges) and why they matter for portable code.
March 10, 2019
Change domains or local directories for wordpress sites
A practical checklist for moving a WordPress site to a new domain or directory—covering backups, key database replacements, permalink fixes, and common migration pitfalls.
March 9, 2019
Quick guide to automating Let’s Encrypt renewals with Certbot, including dry-run testing and a safe cron pattern to keep certificates current.
March 8, 2019
Adding 'Keywords' and 'description' for wordpress site
A lightweight way to add SEO meta keywords and descriptions in WordPress without heavy plugins—using a small `functions.php` hook that derives values from content, tags, and categories.
March 1, 2019
Simple JS implementation of the bitmap fonts
A step-by-step bitmap font implementation for JavaScript (WeChat Mini Games): generating BMFont assets, converting `.fnt` to JSON, and drawing glyphs on canvas.
February 27, 2019
Practical notes on navigating China’s ICP filing process, including common approval messages and gotchas that can block access even after the filing is granted.