Featured
On negotiation
Leaving EventXtra with 26 lessons learned
-
Enjoying DIY watch building
The many ways to enjoy the hobby of DIY watch building
-
Regulating NH36
Surviving and recovering from a drop
-
DIY watch making
If I can’t buy one I like, I could build one
-
Humans.txt
Footprint I left as an intern, still there, after like 7 years
-
Goodbye, X230
Finally, I am moving on from my 12-year old laptop ThinkPad X230
-
I can’t draw but AI can
I had never been a good drawer, except maybe I don’t have to draw anymore
-
Why “Add to Home screen” links to the incorrect page
“Add to Home screen” may not do what you expect it does on websites with web manifest
-
Be lazy and still respect DNT and GPC
Adding back DNT and GPC to my previous half-hearted analytic solution
-
Self-saving web app
An exploration with small web app and WebDAV
-
2021 was like
A retrospective, I think there are more to come
-
Website analytics for lazy people again, with Cloudflare Worker
With the serverless hammer everything looks like a nail, this time with page-wise view counts
-
2020 was like
Way too late a retrospective because I was busy gaming and reading blogs
-
Website analytics for lazy people
Being lazy and against self-hosting public-facing services, I made others do it for me
-
Not looking for a laptop anymore
Every now and then I rant about my ThinkPad X230 from 2012 being old and need to be replaced, but I never actually replaced it, and I don’t see myself doing so in the foreseeable future
-
A silent night in the IndieWeb district of the Web town
It’s Christmas Eve, I decorated my IndieWeb home, sat down with a glass of wine waiting to greet those who come visiting…
-
Remapping Insert to Delete key on Ubuntu 20.04
Delete key on my ThinkPad X230 fell off years ago, so I repurposed the rarely used Insert key into a Delete key
-
How the AGAT 18K turns out
I bought a AGAT 18K on eBay, and it turns out to be a pretty nice camera despite a number of flaws
-
Some more tricks on Kodak FunSaver
As I used and researched more and more about my FunSaver, I have found out a few more tricks that I want to share
-
No more Google Analytics
Google Analytics has been useless to me - not that I need know how many and what people read on my blog as I write whatever I want
-
7 additional tips on using disposable camera
A follow up to my previous post on disposable cameras, with tips I gathered after months of usage
-
Disposable camera for budget entry-level film photography
How I entered into film photography using disposable cameras, and why they are not as disposable as advertised
-
Deploying Komga on FreeNAS jail
How FreeNAS is capable of hosting lots of services in addition to file storage
-
Follow WordPress blogs using RSS reader
What to do when a WordPress blog you like does not have a RSS feed button
-
Fixing Wireguard Windows unable to start as service
How to workaround the issue with Wireguard service not starting on Windows when logging in as standard user
-
Controlling my home server with Syncthing
How I threw together a few files to come up with a solution controlling my laptop’s sleep/shutdown state
-
Send Telegram notification on SSH login via PAM
Every login to my VPS via SSH should now send out a Telegram message to notify me of a successful login. Not really bullet-proof, but good enough.
-
5 reasons every web developer should make a startpage
Why every web developer should be building startpages at some point in their web development journey
-
Easy access to Docker containers inside VPN
A follow-up to my previous post about hiding docker containers behind VPN, with an DNS for resolving internal hostnames
-
Editing my blog online
My blog used to be only editable on my a PC, which made me unable to edit on the go, until I have made this infrastructure change that is surprisingly simple
-
Debugging by testing assumptions
Recently I have wasted half an hour of my life troubleshooting an issue related to Apache2 and systemd when upgrading from Ubuntu 16.04 to Ubuntu 18.04, here is what I learned
-
Hide Docker containers behind Nginx proxy
How I ditched VPN and embrace basica HTTP authentication when I am too lazy to implement user authentication into individual app
-
Hide Docker containers behind a Docker VPN
How I safe-guarded my personal web services (many of which have no auth layer at all) without having to integrate authentication to every single of my services
-
Using Google Form to track my life: a lifelogging primer
Not only Google can track your every move, now you can track your own life using what Google is offering for free, and for your own good
-
How to be productive
There are many methods and tricks that don’t work on everybody. Instead, I am focusing on the principles that should make sense and work on most people
-
Oh my gosh SPACE!
If you have written any amount of HTML and is conscious enough to notice how whitespace (or the lack thereof) behave in a page, welcome to the club
-
A self-hosting lifecycle
How is it like to self-host something? This post describes the process of self-hosting from the initial thought process, to patching and housekeeping, all the way to the end-of-life of a self-hosted service
-
Dead Tutorials
In the frontier of web development, new frameworks rise and fall, upgrade to keep up with the trend and fade into obsolescence, yet there always have been those rusty old tutorials lurking around
-
My laptop refused to charge my phone
When powersaving measure is taken to the extreme, this may mean some functions stop working and leaving the user baffled
-
A case of Web Component: Revising wc-blink
What I learned upgrading a web component I wrote in 2015 from Custom Element v0 to Custom Element v1 standard
-
I switched from GNOME to i3wm
Ubuntu 18.04 ditched Unity in favor of GNOME as the default window manager, so I switched to i3wm to desperately save some pixels on my small laptop screen
-
Relocating from OpenShift v2
Documenting how I migrated my sites to other hosts at minimal cost as the free hosting platform OpenShift v2 I have been using will be closed down soon
-
Communication between C++ and PHP program using socket
How a C++ application can talk to a PHP application directly using socket without shard database or interprocess memory sharing
-
The “cat state” of boolean variable
A probably invalid case of using the boolean variable to determine application state where enum could have worked better
-
How to make EPUB ebooks with vertical layout?
Make CJK epub ebooks print texts vertically, just like how they are printed physically
-
My recipe book
I survived 3 months in San Francisco by cooking myself, these are the recipes of what I made for the 2-3 dudes I lived with
-
AppCache revisited
AppCache has been deprecated in favor or Service Worker for caching assets to be served when the device is offline
-
From Nexus 5X to Moto Z Play
Exploiting confirmation bias to justify my choice of new phone after my Nexus 5X has kicked the bucket
-
The hidden cost of self-hosting
The hidden costs behind self-hosting a note-taking service and why you should consider twice before self-hosting anything
-
Do I need a new laptop
Whenever I ask myself whether I need a new laptop, the answer has always been no because my old buddy Thinkpad X230 is so sturdy and and serviceable
-
Have fun building browser start page
Owning your browser’s start page is a good way to keep your mood up from the work, even though most of the start pages share similar designs
-
Doing things the layman way
Engineers may be tempted to solve a problem using the techincal/sophisticated way despite the layman way costs much less and (sometimes) works better
-
Feature ownership and motivation
The power to influence engineering and design choices in a project is one good way to keep everyone stay involved and motivated
-
Working in Taipei for a month
How it’s like being prototyping and testing a new product for a month in Taiwan
-
Looking for a laptop
There is an urge to buy a new shiny laptop despite the old one is functioning perfectly well every half-year or so
-
Think about the Physical Web
The amazing promise of the Physical Web of controlling any physical smart device using just the web browser
-
Integrating two-step two-factor authentication into Rails 4 project with devise
How I worked around Devise and a two-factor auth library to implement two-step (not to be confused with two-factor) auth that wasn’t available in gems
-
Persistent .env configurations across deployments on OpenShift for Laravel 5
How I implemented persistent .env configuration on OpenShift v2 across deployments using OpenShift data directory and post-receive hook
-
Prototyping with gulp-web-starter
A small prototying kit for front-end web app development
-
Multiple .env configurations in Laravel 5 using symbolic link
Use symbolic link to switch between multiple Laravel 5 environmental configurations without additional console command
-
An artisan command for using multiple environment configurations in Laravel 5
I developed an artisan command to switch between Laravel 5 environmental configurations
-
Building reusable things, FTW
Exploring the concept of encapsulation that I learned and building a reusable package for a pet project
-
Adding HTML5 application cache to speed up your web app in 5 minutes
Using AppCache API to cache your web app for faster loading and ability to run offline
-
Setting up Laravel 5.0 for Openshift
A guide to setting up Laravel 5.0 on OpenShift v2.0 platform and using the environmental variables provided by OpenShift v2.0
-
One project, one domain: Apache2 Virtual Host on Ubuntu 14.04
Using name-based virtual hosts of Apache2 to map one domain to one project instead of navigating to project folder from htdocs as root
-
Fixing the deployment to Openshift error of Hexo
I was trying out Hexo and apparently there is a bug in deployment command for the version I was using, and here is how I worked around it
-
Setup Gmail SMTP on Openshift hosted Laravel app
Instead of sending email through the server’s own mailing server, you can use Gmail to send email, but you need to deal with Gmail’s security policy first
-
Using Laravel resource controller with AngularJS ngResource
An example of a RESTful API-based web app using Laravel 4.2 resource controller and AngularJS 1.4 NgResource
-
Database config trick hosting Laravel on Openshift
Setting environmental variables when running the application on OpenShift without changing the config for each deployment
-
Create simple contact list application with Laravel and Openshift integration: Part 2
Part 2 of a 2-part tutorial about jump-starting a Laravel project on OpenShift, this part is about serving an API using Controller and talking to database using Model
-
Create simple contact list application with Laravel and Openshift integration: Part 1
Part 1 of a 2-part tutorial about jump-starting a Laravel project on OpenShift, this part is about making a “Hello World” page
-
Setup Gmail SMTP on Openshift hosted app
Using Swift Mailer to send email through Gmail’s SMTP server on OpenShift
-
My error checking statment is wrong
How a misconception on MySQL’s update mechanism led to an hour of potentially unnecessary debugging had I read the documentation
-
Resolve syntax conflict between AngularJS and Twig
Both AngularJS and Twig use {{curly braces}} to wrap the variables in HTML templates, here is a few ways to work around the syntax conflict
-
Write down your password and still be safe
Use mnemonic to remember password and even allow you to write it down as innocent quotes (security through obscurity is never a good idea though)
-
Set up port forwarding for your gaming pleasure
Setting up port forwarding on router for others to connect to your local game server
-
My friend got hacked (by me)
Screwing my friend over who has made a beginner mistake of not preventing SQL injection
-
Explaining Base64 encoding
Base64 encoding is a widely-used yet pretty simple encoding scheme to encode any binary/textual data into ASCII printable characters