All blogs / Software / engineering practice
Coffee on the Keyboard
James writes stuff about programming, mostly
Software / engineering practiceEngineering management / careersDistributed systems / cloudAI / ML
- Posts
- 272 from 18 Jun 2009 to 29 Mar 2026
- Posting
- now and then (4 in the last year)
- Kind
- personal blog
- Feed
- https://www.coffeeonthekeyboard.com/rss/
2026 4
2025 4
2024 6
2023 17
- Debt, Depreciation, and Sustaining Engineering Work
- Starring our Monolith in the Role of...
- Introducing API Boundaries to Prepare for Bigger Changes
- When to use Feature Flags: Extra-Ordinary Unconfidence
- Code is Knowledge
- Using Timers to Learn
- Go Interfaces as Requirements, not Capabilities
- Changing the Meaning: Breaking Semantic Changes
- Three Models of Value
- Constrain Your Data Access for Fun and Scale
- Conceptual, Logical and Physical Data Models
- Building Extensibility into APIs from the Start
- In defense of unit tests
- Sliding Windows of Compatibility
- Caller-controlled Rollouts
- The Creative Power of Zero
- Zero Downtime and the Art of Continuous Deployment
2022 7
2019 1
2015 6
2014 11
2013 14
- Don't Do, Write
- TIC #sttp
- Onward.ly!
- Valley vs Alley
- Pseudonymity and Consequences
- Simple out-of-process lock with Python and Memcached
- Using supervisorctl with linux permissions but without root or sudo
- Quo Vado?
- A New Chapter
- Our Daily Errors
- Just One WebKit
- Elegance
- Working from Home
- Actually Starting an Open Source Project
2012 24
- Web Advent
- Mozilla's Security Best Practices
- Mass Assignment - Security Part 10
- Intermission
- Stay Up to Date - Basic Security Part 9
- Click-Jacking and a little Phishing - Basic Security Part 8
- Server Configuration - Basic Security Part 7
- Session Fixation and Hijacking - Basic Security Part 6
- Access Control - Basic Security Part 5
- Injections, SQL and otherwise - Basic Security Part 4
- CSRF: Cross-Site Request Forgeries - Basic Security Part 3
- XSS: Cross-Site Scripting - Basic Security Part 2
- Password Storage - Basic Security Part 1
- Best Basic Security Practices (Especially with Django)
- Putting My Slides Where My Mouth Is
- High MySQL CPU Load Today? Quick Fix
- Calling all Mozilla Community Members in New York!
- Where are James' Slides?
- Why Django Sucks, Except When It Doesn't
- That's What He... is Sorry For
- Developing a Culture of Testing
- Better 632
- Not OK
- Performance is a Feature
2011 20
- Thank You, Steve
- So You Want Me to Hire You
- Acronyms you should know: MTTD and MTTR
- Say hi to Scottbot
- Pride and Joy: Firefox 4 is Out!
- The Thing About Twitter
- A brief SumoDev update
- Weekly Update for 11/3/11
- Weekly Update 04/03/2011
- O Hai Django AdminPlus
- SUMO in Q2
- The Future of TodaysMeet
- The Problem with TodaysMeet
- Bleach 1.0rc2
- Introducing Waffle for Django
- Bleach 1.0rc
- Project365: January 6
- Broken Social Scene 2010-09-18
- 2011 Goals
- Top 5 Albums of 2010
2010 30
- The future of SUMO development
- First Impressions of RockMelt
- An End and a Beginning
- Django Fixtures with Circular Foreign Keys
- Things I Love about Fall
- Semi-disconnected this weekend
- Moving to New York
- Weekly Update for 21/06/2010
- Developing at Scale: Database Replication
- How Hulu Should Use My Data
- Weekly Update for 06/14/2010
- Weekly Update for 07/06/2010
- Weekly Update for 24/05/2010
- Surviving Pac Man
- Weekly Update for 17/05/2010
- Weekly Update for 10/05/2010
- Playing with the Real-Time Web
- Farewell, Facebook
- Weekly Update for 03/05/2010
- Weekly Update for 27/04/2010
- Weekly Update for 12/04/2010
- Testing with Legacy Data in Django
- Weekly(?) Update for 5/4/2010
- SUMO's Black Triangle
- All Starred Messages in Thunderbird 3
- Weekly Update for 3/15/2010
- Code-sharing Update
- Bleach, HTML sanitizer and auto-linker
- The Evolution of SUMO
- How to Install VirtualBox Guest Additions in Fedora 12
2009 21
- Local Web Development
- So You Wanna Help Mozilla?
- Mistakes: Importing Data with MySQL
- Getting Involved with Mozilla Web Dev
- Mozilla Web Development is Open Source
- (Don't) Close Firefox with Last Tab
- Upgrade Flash in Firefox
- Nextup 282
- Excitement about HTML5: Forms
- What Time Is It There?
- Reservations about HTML5
- EzGz: WordPress GZip Plugin
- Programming in Middle School?
- My New Job
- Why do I have to learn this?
- The Fallacy of the "Singularity"
- Google Loves Competition
- New Information Processes
- WP: Better Search Widget 1.1
- Widget l10n
- A Personal Update
Undated 107
- The fallacy of microservice infrastructures 1344
- Open source update bleach 1359
- Open source update jingo 1373
- Open source update waffle 1358
- New year new role 1388
- Piefection slides up
- Remembering todaysmeet
- Small fish big pond using your computer on the msu network 11
- Europe 06 12
- Hitchhiking 13
- December 14
- Happy new year 15
- February 16
- Dublin to paris 17
- Travelpunk 18
- Counter clockwise 19
- Thank you 20
- And the big steel rail gonna carry me 21
- Mail call 22
- Stephen colbert 23
- 8 days and counting 24
- Happy birthday 25
- So long fare well auf 26
- Ah paris 27
- Ac milan and the geesinks 28
- Out of roma 29
- Another italian city 30
- Deutschland deutschland 31
- Home again 32
- Css good everything else bad 33
- Theres a special place 34
- A bleeding heart christmas 35
- May you always 36
- Localindie 37
- Modular 38
- Sushi 40
- Crazy german 41
- Hoodies 42
- Voodoo lighthouse 43
- No checks cache 44
- Photoshop silkscreen effect 45
- Victims of capitalism 46
- Mysql subqueries 48
- Adapting wikiddiction for profit 49
- Redesign 50
- Reading material anorexic writing 51
- Organization 52
- Use semantics to guide design 53
- Technology conference 2007 54
- Picofiction 55
- Amazon mp3s 56
- Yahoo pipes 57
- Crysis 58
- How to upgrade or recompile php on rhel5 59
- To read a list 60
- Charlie browns football duke nukem forever 61
- Game independent 62
- Wordpress plugin insert ad code 63
- Universal accessibility 64
- What is universal accessibility part one in a trilogy 66
- Assessing accessibility part two in a trilogy 67
- Bobby offline 68
- Building accessible sites part three in a trilogy 69
- Ie8 and version targeting 70
- Episode iv a new domain 71
- Microsoft listened 72
- Winnie cooper answers your math questions 75
- Skinningleatherworking 76
- Cartwheel 78
- Systemoutprintlnhello world 79
- The hunt 80
- Dr voyeurism or how i learned to stop worrying and love twitter 81
- Shortcc makes shortcuts 84
- The new blog 89
- Better living through memcached 85
- The w3c sucks 92
- Work pattern designing web sites 93
- Your internet classroom 95
- Do you designed by 96
- Help me scale 97
- Computer related injury 98
- How do you find new things 99
- Exploring the web 102
- A twitterers tipping point 103
- Expertise and authority 20 104
- Organizing css 105
- User interface be nice 107
- New twitter name 108
- Identity 20 a primer 106
- Chrome is not a browser 111
- Wp plugin better search widget 113
- Does the web hate school 123
- Connecting php iis 6 and sql server 2005 129
- In the shadows of media giants 136
- Go vote today 142
- Responsible sql how to authenticate 144
- Oh the humanity of twitter 155
- Stop supporting ie6 163
- Why i unfollowed you 169
- When to ask when to google 174
- Private variables in javascript 177
- A twitter turn around 195
- Firefox open in blank tab 197
- Communities within communities 204
- Javascript private static members part 1 208
- Social media marketing this is your chance 215
- Javascript private static members part 2 218