blog posts
in: Writings


Find programming work by increasing luck surface area
Extreme #include discipline for C++ code


@levelsio and survivorship bias
Lessons learned from 15 years of SumatraPDF, an open source Windows app
How I use Roam Research


The things we do to ship desktop software
Lessons learned porting 50k loc from Java to Go
Trade offs in designing versatile log format


How I implemented Oembed Proxy for GitHub
Powering a blog with Notion and Netlify


Business of Software talks
57 MicroConf videos for self-funded software businesses
Solo founders with profitable businesses, collected stories
Analyzing browserify bundles to minimize JavaScript bundle size
Tutorial for github.com/kjk/flex Go package (implementation of CSS flexbox algorithm)
Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.)


Optimizing JavaScript by using arrays instead of objects


Extracting files from .7z archives in Go
Go package for better guid generation
Accessing GitHub API from Go


SumatraPDF 3.0 released
Improving speed of SMAZ compressor by 2.6x/1.5x
Notes on Ansible
Tip for per-test verbose logging in Go
SumatraPDF 2.5.2 released


Using Fabric for deploying server software
SumatraPDF 2.4 released
Inspiration for programmers that want a passive business
How I ported pigz from Unix to Windows


Hiding duplicate content from your site via robots.txt
Speeding up Go with custom allocators
Thoughts on Go after writing 3 websites
Design and implementation of translation system for desktop software
SumatraPDF 2.2 released
How I sped up Go by 20% (or is Go really slower than Java?)
Websites with free ePub and mobi ebooks
SumatraPDF 2.0 released
SumatraPDF 2.1 released
Buying a certificate for signing windows applications


A list of chm readers/viewers for Windows
SumatraPDF 1.9 released
How to make software crash less
SumatraPDF 1.7 released
Showing html from memory in embedded web control on windows
SumatraPDF 1.8 released
Easy vs. probable or how to make money with software
SumatraPDF 1.6 released
SumatraPDF 1.5 released
90% of success is showing up - a proof
Experience porting 4k lines of C code to go
SumatraPDF 1.4 released
XML is really, really slow
Writing a custom installer for Windows software
SumatraPDF 1.3 released
My social marketing failure


Best captcha is exotic captcha
You have to implement to understand
Productivity ideas
E-books economics
Go vs. Python for a simple web server
Summary of talk on continuous deployment
uISV stories
SumatraPDF 1.1 release
SEO is harder than you think
Tools that find bugs in c and c++ code via static code analysis
Value your time
Simple duplicate post detection for your blog, forum or commenting software
Marketing lessons from WebP launch
Startup management lessons from “The Social Network”
8 habits for becoming a better programmer
SumatraPDF 1.2 released
Using averages - a common performance measurement mistake
Executable compressors comparisons: upx 3.07w vs. mpress 2.17


ssh tips
Where do bugs come from?
Sumatra 0.9.4 release
SumatraPDF 1.0 released


How to think
Sumatra 0.8 released
gflags - a debugging story
Variadic Macros (C++)
SumatraPDF 0.8.1 release
realloc() on Windows vs. Linux
SumatraPDF 0.9.3 released
SumatraPDF 0.9.1 released
SumatraPDF 0.9 released


A debugging story
SumatraPDF 0.4 released
SumatraPDF 0.5 released
Few things I’ve learned when writing Sumatra PDF
Sane #include hierarchy for C and C++
SumatraPDF 0.6 released
Sumatra PDF 0.7 released


Basics of mysql
Debugging adventure
Basics of writing DOS .bat batch files
Compile-time asserts in C
Embedding binary resources on Windows
Designing web forums software
Document your software
Sumatra PDF is born
Order of #include headers in C/C++
Deeply nested if statements
Sumatra PDF 0.2 released
Performance optimization story
Paradox of bad comments
How I improved Sumatra performance by ~60%
Sumatra PDF 0.3 released


High-resolution timer for timing code fragments
Accurate timers on Windows


Web writing that works
Review of “Hot text - web writing that works”
Alan Cox on writing better software


Given enough eyeballs make all bugs shallow
My future is so bright that I’ll need to wear sunglasses
Writing to sell


Bugs and eyeballs
Defining Professionalism for Software Engineers
Principle of good design: discoverability
The future is here, it’s just not evenly distributed
Good programming practices
Written on Jun 27 2018.
Found a mistake, have a comment? Let me know.

Feedback about page:

Optional: your email if you want me to get back to you: