james mckay dot net
because there are few things that are less logical than business logic
C# / .NETSoftware / engineering practiceDev tools / editors / IDEsEssays / personal
- Posts
- 363 from 12 May 2005 to 24 Oct 2026
- Posting
- now and then (1 in the last year)
- Kind
- personal blog
- Feed
- https://jamesmckay.net/feed/
2026 1
2023 1
2021 1
2020 3
2019 5
2018 15
- Which .NET IOC containers pass Microsoft’s tests?
- The state of IOC containers in ASP.NET Core
- Just how clean is Uncle Bob’s Clean Architecture?
- Productivity suggestion: stop using the mouse
- First impressions of JetBrains Rider
- It’s not just an opinion, it’s scar tissue
- An update on Lambda Tools
- Some thoughts on DevOps
- Your Repository is not a Data Access Layer
- The Great Shorts Debate
- To throw or not to throw? Non-exceptional error conditions
- Returning.To()
- To throw or not to throw? Doing something that has already been done
- Positive, negative, or error?
- Supergiant stars are hot vacuums
2017 18
- What is xkcd “Time” all about?
- Error handling is the one thing that puts me off learning Go
- You have to tell AWS CLI that your EC2 instance is not in Virginia
- Design refresh
- Introducing Lambda Tools: a new framework for deployment to AWS Lambda
- Necessary and sufficient conditions
- Programmatically starting an AWS instance with an encrypted EBS volume attached
- New blog on creation and evolution
- Continuous Retrospectives are not a substitute for retrospective meetings
- Ten things you need to know about the age of the earth
- What should a .NET renaissance look like?
- You probably only need a t2.nano instance for that
- An example of software development lab notes
- So you want to talk about creation and evolution…
- How to keep lab notes as a software developer
- SQL injection is the FizzBuzz of web security
- Some thoughts on CQRS and Event Sourcing
- Martin Fowler and feature branches revisited
2016 7
- Productivity suggestion: keep lab notes
- Sharing data between Terraform configurations
- Password hashing as a microservice with Docker Compose
- The Continuous Retrospective
- The three essential files required by every Git repository
- Fuzzy dates aren’t as good an idea as you think
- Signing Git commits with GPG on Windows
2015 3
2014 15
- “That’s just your opinion” means “I’m not listening”
- Why you should use a general purpose scripting language for your build scripts
- Moving a problem from one part of your codebase to another does not eliminate it
- The Repository Facade
- Why feature switches?
- Dolstagis.Web 0.3 is out
- How not to do logging: catch-log-throw
- How not to do logging: unnecessary abstractions
- A maturity model for best practices
- Sorting out the confusion that is OWIN, Katana and IAppBuilder
- Query Objects: a better approach than your BLL/repository
- If your tests aren’t hitting the database, you might as well not write tests at all
- Interchangeable data access layers == stealing from your client
- The Anaemic Business Layer
- On dark matter developers and the role of GitHub in hiring
2013 8
2012 10
- Is ALM just a marketing buzzword?
- Your password hash algorithm is (probably) snake oil
- On Git’s growth and the reliability of the Eclipse survey
- You can no longer afford not to take Git seriously
- Arguments that annoy me
- Pigs and chickens
- In response to criticisms of CSS pre-processors
- How good is your JavaScript?
- What is Git’s market share?
- If you’re not using a CSS pre-processor, you’re doing it wrong
2011 27
- Reckless London cyclists
- We are the (Face)Borg. Resistance is futile.
- The two types of programmer
- :q!
- First impressions of MSpec
- Passion and pet projects
- Individuals and interactions over processes and tools
- Buying train tickets
- Feature branches versus continuous integration
- Why does Martin Fowler not understand feature branches?
- Keep the number of projects in your solution to a minimum
- No, WANdisco, Git does NOT promote anti-social development
- Tourists and residents, Visual Studio and vim
- Silverlight is dead. Long live HTML 5.
- Avoiding password re-use is not that easy
- Eight wrong reasons why you are storing passwords for clear text recovery
- Agile versus methodologies
- The purpose of auditing is to answer questions
- Why merges can (and should) be automated
- The great .NET productivity killer
- Abstracting your ORM is a futile exercise
- On named branches in Mercurial
- Google is not your doctor
- Team Foundation Server is the Lotus Notes of version control tools
- How often should you check in code?
- A photo a day
- Experimental photography
2010 31
- Finding bugs with a binary search of your source control history
- Understanding Planning Poker
- Programmer jargon: Blub
- How to host WCF services in ASP.NET applications without bloating your web.config
- The benefits of the command line
- Programmer jargon: Cargo Cult
- Why tabs versus spaces matters
- My driving instructor would shout at me
- Avoiding the sardine can
- Perforce Merge: a very nice free replacement for TortoiseMerge
- Solving the tangled working copy problem with hunk selection and Mercurial Queues
- Git
- On code generation
- Diaspora
- Why I like distributed source control
- Branching and merging in Subversion is worse than I thought
- Send patchbombs to the mailing list, not pull requests to the project lead
- Just how smart is Git?
- Phone faux pas
- TortoiseHg as a github client on Windows
- Someone must be wrong about solar weather
- The meaning of football
- Is Facebook really as essential as it’s made out to be?
- You have till Monday to talk me out of quitting Facebook
- Introductory videos on IOC containers
- On web deployment
- NAnt and MSBuild are completely pointless
- If part of your framework is not fit for purpose, don’t use it
- Command line instructions are not a good marketing strategy
- Catching Exception is almost never justified and almost always harmful
- Are deletionists harming Wikipedia?
2009 33
- Can your database versioning tool do this?
- Keep your passwords safe with KeePass
- A day of Stack Overflow
- How to validate a URL in .NET
- Book review: The Art of Unit Testing
- Joel Spolsky, cowboy coder
- If you are saving passwords in clear text, you are probably breaking the law
- Twitter through the eyes of a nine year old
- Why can't every call centre let you know how long you'll be waiting?
- Web development is hard, m’kay?
- Please untangle this great long conversation by COP today
- London Victoria’s sneaky back entrance
- Why SQL Server 2005 database projects in VSTS are a bad idea
- Keyboard switching in IE8 is insane
- Why would anyone not use source control?
- Inital SQL files breaking in Django syncdb
- Reinventing the wheel, badly
- Rear airflow rucksacks are a nice idea, but…
- Handling exceptions in assembly-level setup methods in MbUnit
- XsltArgumentList violates the Single Responsibility Principle
- Using jQuery? Check out jQuery UI
- Some thoughts on the role of open source experience in recruitment
- Beware of second hand contracts
- When technical debt becomes technical bankruptcy
- Continuous Deployment: radical idea or April fool?
- Django custom manage.py commands not committing transactions?
- OO: the lingua franca of modern software design
- Making the most of your source control summaries
- Sometimes, sweeteners can be a bit sour
- The case of the disappearing feeds
- Commercial flights are twenty-five times safer than private jets
- The top 25 most dangerous programming errors
- What did James McKay discover?
2008 48
- Django: ValueError: too many values to unpack
- Time for a new job
- Do antivirus scans really need to brick your computer?
- Del Boy versus Turing
- Another XSLT sweetener
- What to drink when you don't drink
- An XSLT sweetener
- A train of thought
- Unit testing URL generation and Html.ActionLink in ASP.NET MVC
- In defence of 24 hours
- ASP.NET MVC + jQuery – can things get any better for web developers?
- Why Stack Overflow’s reputation system is broken
- The leaf!
- Paths and file locations in ASP.NET
- Commenting your code for speed reading
- Internet Explorer painkillers
- A highly irresponsible metric for web hosting companies
- A first look at stackoverflow.com
- PHP gets closures. Rejoice!
- Don't stuff beans up your nose
- Comment Timeout and faulty WordPress themes
- Refactoring Databases
- What are valid reasons for hating a programming language?
- Trying out Python and Django
- Less is more
- What no night?
- Easy login recovery without compromising security
- How to become a better .NET developer
- The Church needs Creative Commons
- Productivity metrics: garbage in, garbage out
- What part of "no agencies" do you not understand?
- What is the difference between a web designer and a web developer?
- Where are all the passionate .NET developers?
- Code syntax highlighting in WordPress – take two
- How to match any character (including newlines) in a JavaScript regular expression
- Why I hate web.config
- The two golden rules of exception handling
- Code syntax highlighting in WordPress
- If you think you don’t need source control, you haven’t understood it
- Trying out speech recognition in Windows Vista
- Windows upgrades break Media Player 6.4
- Derailed
- Pro JavaScript Techniques
- 恭喜发财, now give me some Unicode
- Seventy-one
- Published
- Missing ASP.NET tab in IIS on Windows Server 2003
- On Colemak
2007 68
- Mrs Immery
- Making the "zoom" slider on the Microsoft Natural 4000 keyboard do something useful
- How to list the sizes of the tables in a SQL Server database
- Volta, GWT and leaky abstractions
- Britain's best motorway service station
- Is it time to kill off wikitext?
- Password Reminders Considered Harmful
- Procedural programming != functional programming
- Sorry, but who are you?
- Can we live without Wikipedia?
- How long does it take to unsubscribe from an e-newsletter?
- Make way for your MP
- Is your rudeness necessary?
- On ties
- Farewell to the Kinesis
- Is there a future for Rails?
- The future of my blog
- Church 2.0
- Is your code held together with bits of string?
- Where has all the disk space gone?
- Beginners' languages can have advanced features too
- On leaving Wikipedia
- You take the high road and I'll take the slow road
- Six weeks of Dvorak
- Selling domain names
- Comment Timeout 2.0 upgrade
- Yes, but what is the point of it?
- Blogging from the sheep shed — or maybe not
- I could have told you this would happen…
- Some thoughts on WordPress security
- Does the keyboard have a future?
- Ask the whole community, not just one of its members
- Facebook – the Swiss army knife of social networking
- My million dollar iPhone question
- Blogging offline
- Developers versus PR
- Another day, another OS reinstallation
- Case sensitivity is evil, but we still have to live with it
- Typing perfection?
- Another crack at Dvorak
- Bad Behavior does not like Windows Live Writer
- Comment Timeout 2.0 and friends
- Cycle helmets versus style and comfort
- The functional beauty of JavaScript
- .NET by day, Rails by night
- I am not as good at Trivial Pursuit as you think
- How to report issues with WordPress plugins
- The future of Comment Timeout
- Making website upgrades seamless: script the changes
- Mornington Crescent
- Whither blog?
- April MiniBar with Mark Shuttleworth
- Comment Timeout 1.3 beta 1
- Vertical monitors
- Dave 2.0
- Learning Rails
- On the rails
- Yes, it’s been snowing
- Bitten by PHP 4’s pass by value semantics
- Stopping the spam flood
- Hot drinks
- Comment Timeout 1.2 – with new features
- An evening in London at MiniBar
- Comment Timeout 1.0 release candidate 2
- Improving Akismet
- Comment Timeout on WordPress MU
- Replacing a spleen with something else
- I'm on your WordPress dashboard!
2006 36
- WordPress plugins update
- Comment Timeout: Automatically closing blog comments on WordPress
- Happy Christmelicious everybody!
- Firebug – the best Firefox extension ever?
- Firefox usage by country: the browser wars are back
- Pastors: get blogging!
- WordPress not notable?!!?
- Verrückte Idee vom Tage: die Deutschkentnisse mit Wikipedie verbessern
- The squawl^H^H^H^H^H^Hskirl of the pipes…
- The ultimate designer cat
- Windows Live Writer
- Online documentation pains
- Frame Buster update
- Dvorak update
- Roughing it – or not
- Apparently the in word is "blog"…
- Happy System Administrator Appreciation Day
- Ban Comic Sans
- Kinesis report at three months: Broken!
- Ready (or not?) meals
- Video blogs at Kingdom Faith
- Footy fever
- Errors in Wikipedia Considered Harmful
- Eolas v Microsoft and FlashObject (continued)
- Using Flash? Check out FlashObject…
- Will Ruby on Rails kill .net and Java?
- The Microsoft Time Warp
- Geeky but nice — my new keyboard
- So long qwerty, hello Dvorak
- iPod rebrand — by Microsoft?
- Why doesn’t C# have a synchronized keyword?
- New WordPress Plugin: The Frame Buster
- Gentoo
- MSN Spaces not working in Firefox?
- Root canal torture again
- A tie!
2005 33
- All change
- Alex in Wonderland
- Secure your contact form!
- Do you play the air guitar?
- IIS oddity
- Which programming language is the most popular?
- Sudoku
- Er … excuse me, I thought this was 2005 …
- The ongoing saga of my teeth
- Chain letters and hoax e-mails
- RSS? Why bother?
- Another anniversary
- Ergonomic keyboards
- Armchair physics!
- Quote of the day…
- Faith Camp so far…
- God is our refuge and strength
- It’s London!
- Happy birthday!
- Impenetrable Packaging of the Year Award
- Beeping Watch!
- The Way of the Spirit is on the move…
- The new KF website is about to go live
- All change at my blog
- Car update 1 @ 7 days
- Plagued by telemarketers? Try this…
- I’m mobile again!
- Busman’s Holiday!
- Gmail
- Mum on the radio and other matters
- Look out for…
- Fun with cookies
- Hello world