A few weeks ago, in the middle of a difficult week, I realised I needed to step away for a while. I felt tense and had too much on my mind, so I set aside a couple of hours and went alone to a public sauna in Kallio. For the next two hours, I moved between the heat and the street outside. I would sit in the sauna, cool down, then return for another round, until something in me had settled. I had…
I started drinking coffee because, one warm morning, I wanted to feel like someone who drank coffee. It was early summer in 2020. I was sitting on the balcony of our apartment in Helsinki, looking out at the trees. The morning was warm and unhurried, and for a moment I could have been on holiday. In my head, coffee belonged to that scene. I imagined a person sitting outside an apartment in Paris,…
I’m Dean Clatworthy, a software architect and engineer based in Helsinki, Finland. I grew up in England and studied Computer Science, but most of what I know has come from the years spent designing, shipping and looking after real systems. I’ve been building for the web for more than two decades. My work stretches from cloud architecture and back-end services to the details of a front-end…
I have lived in Finland for 16 years. When I arrived, I failed hard at learning the language. Classes were only available in the evenings. I would go from work straight to class, sacrificing the very things that make integration possible: friendships, hobbies, community. I was spending all my time learning a language in order to integrate, without having any time to actually integrate. There was…
It’s 2026, and I’m writing this post without AI. That already feels like a confession. In the span of a year, AI has fundamentally changed how I work as a software engineer, architect, and consultant. We’ve gone from hallucination-prone Q&A toys to agents that can plan, debug, and implement features - largely on their own. This shift has led to many outcomes. I spend most of my time: Thinking…
Been trying to watch a live event on iPlayer in your browser only to have low quality streaming? It seems that the BBC iPlayer browser client doesn’t support above 480p. Fortunately there’s a solution. Install streamlink @ https://streamlink.github.io/install.html Install VLC player @ https://videolan.org Create an account on the BBC website and take note of your credentials. Create…
Crashplan for Small Business is not supported (as of the time of writing) on any other Ubuntu version than 18.04 LTS. This appears to be related to an Electron/glibc issue which has long been fixed. Unfortunately Crashplan seem unwilling to upgrade their client.
For those that haven’t yet heard about it Hugo is a lightning-fast, and powerful static generator built using golang. For the last couple of years I’ve used Jekyll to build this site, but even with this few pages & posts Jekyll takes between 5-10 seconds to generate my tiny site.
To get in touch, fill in the form below and I’ll get back to you. --> Your Email: Subject: Message: Submit Elsewhere Connect with me online. LinkedIn Professional profile ↗ X @deanclatworthy ↗
On this page I’ll detail my areas of expertise. ☁️ Cloud I am an AWS Certified Solutions Architect - Associate and AWS Certified Cloud Practioner . 🤖 AI & agentic development I have hands-on experience using large language models (LLMs) through agent harnesses, with a comprehensive understanding of how to design and build effective, reusable agent skills and workflows. 🗄️ Back-end Node.js…
I have been developing websites now for over twenty years and had the pleasure of working with some wonderful people over the course of my career so far. I have worked with small businesses & large corporations on their online presence and helped them become more successful as an online entity. I have won numerous awards for my work and will try to highlight them below. Below are some of my most…
One of the problems I’ve encountered using the Symfony Translation component in Silex is that when using a fully qualified locale (e.g. en_GB vs en ) it doesn’t use the translations that come shipped with the Validation component.
After spinning up a new server today at DigitalOcean and trying to set up a new vhost, I could not get the default Apache page to go away and load my vhost’s content.
Yosemite upgrade guide v1.0 Apache Apache will break as it’s upgraded from v2.2 to v2.4. It will revert the /etc/apache/httpd.conf file. In this file you need to do a few things: Search for vhosts and uncomment the line: Include /private/etc/apache2/extra/httpd-vhosts.conf Also find the <Directory /> block and make sure it reads as follows: <Directory / > AllowOverride All Require all granted…
Overview Cloudflare recently launched the biggest deployment of SSL in the history of the internet , and better yet they made it free. For users, it’s as simple as flicking a switch, but there a few steps you should take to make it more secure. Cloudflare offers two levels of SSL on their free package: Flexible SSL - When a visitor visits your site the connection between them goes first…
Rather than rehash all the information, let me point you in the direction of this great blog post: http://ethitter.com/2013/04/protecting-wp-login-in-nginx/ If you have problems with wp-login.php being downloaded to the user then your PHP configuration using this tutorial is wrong. See this article I wrote about it:…
I’ll keep this brief. Install Guzzle however you wish, but I recommend using composer: { 'require' : { 'guzzle/guzzle' : '~3.1.1' } } Then use the following code: $twitter_client = new \Guzzle\Http\Client ( 'https://api.twitter.com/{version}' , array ( 'version' => '1.1' )); $twitter_client -> addSubscriber ( new \Guzzle\Plugin\Oauth\OauthPlugin ( array ( 'consumer_key' =>…
Last week Facebook rolled out a new update that lets people tag what they’re doing in their post or say how they are feeling. Users can say they are watching a movie or reading a book – amongst other things. What makes this different from before is that your status update is providing more structured data to Facebook about your activity.
I encountered a peculiar issue today regarding web fonts on firefox. On all browsers except Firefox the web fonts were loading correctly. I found multiple references suggesting that Firefox was picky with using quotes when referencing where the font file is hosted. However my findings were more interesting: Firefox does not support embedding webfont files from a different domain The good news is…
Last week I deployed a new Facebook application into a production environment. Everything seemed to be working perfectly, but then I received a report that the application wasn’t working correctly in IE8+. I narrowed down the problem, and then realised that sessions weren’t working. It turns out IE8+ has a security policy that prevents iframes from setting cookies if the parent domain…
You should be using custom constraints to validate your form fields, however there are some use-cases where you need to quickly invalidate in a controller. To do this it’s quite easy: $form -> get ( 'username' ) -> addError ( new \Symfony\Component\Form\FormError ( 'This email is already in use' ));
Just a small gotcha for anyone using Symfony2’s DomCrawler component. The standard behaviour of the class (from the current docs) is: $crawler = new Crawler ( $html ); foreach ( $crawler as $domElement ) { print $domElement -> nodeName ; } However, this will assume the document is ISO-8859-1. If you want to crawl a UTF-8 page correctly do it like so: $crawler = new Crawler ; $crawler ->…
I’m writing this informative post to try and help anyone who had the same problem as me. I upgraded to OSX 10.8.3, and after it restarted the machine the Apple logo and spinner was on screen for about a minute followed by a stop/forbidden/no entry symbol that looks like this:
Today I migrated my whole site from apache to nginx. The main reason for this being that nginx seems to handle load and use less memory on smaller boxes. It’s also an opportunity for me to try something new. I’ll cut straight to the chase. There’s some great information already available . At the time of this writing though, both sets of instructions didn’t work for me.…
One of the things that recent github outages have highlighted is that although git is designed to be decentralized version control system, many people are not treating it that way. Rather than having multiple remotes, people push to the same place and generally rely too much on github. I’ve seen people build their whole infrastructure around github, including deploy scripts for their sites…
When logging in to a server via SSH using a private key with a password, OSX saves your password. The next time you try to login it will not prompt you for your password. To disable this behaviour simply run this command: launchctl unload -w /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist Hat tip to mr_dbr on reddit for this.
I’ll keep this short and sweet. This bash alias will allow you to export your git repo’s master branch to a zip file. To use it: Make sure that your work is committed. Make sure you are in the root directory of your project. To make this script work run the following commands: echo alias gitpack = \' git archive --format zip --output download_ $( date +%d-%m-%Y-%H.%M ) .zip master \'…
Edit: This article is a little out-dated now, as Bootstrap is on version 3 featuring a completely different and fluid grid. It’s still applicable if you are working with the older Bootstrap (up to version 2.3.2) One of the challenges I have faced when doing my front-end work is trying to communicate to designers who have not done too much responsive work with Bootstrap, how the grid works.…
I have spent the last few hours taking a look at the Google Analytics for my blog and whilst doing so I realised that it’s logging a lot of stuff that I don’t need. This tutorial will allow you to exclude any traffic to your wordpress admin, or login script (that which you see before landing on the admin page) from your Google Analytics. Log into Google Analytics Click…
I’ve been meaning to tweak my WordPress install for a while now. I’ve been using the WP Super Cache plugin for about half a year, but I’ve been unimpressed by the performance. Anyone who has spent time optimising a site will already know the basic following checklist (plenty of things left out): Minify and join CSS & Javascript files Load JS asynchronously at the bottom of the…
I’ve now tried to use gem install <package> on two fresh installs of OSX Lion on a Macbook Pro 13" 2011 and Macbook Pro 15" 2012. Both have suffered from the same issue of the gem installer hanging. This was my symptom. $ gem install cocoapods ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions into the /Library/Ruby/Gems/1.8 directory.</pre> The…
Just a quick tip for anyone doing web development on macs, it’s quite easy to get internet explorer running now with a brilliant tool created by Greg Thornton over at github. This essential automates the creation of the free Microsoft testing virtual machines for IE and builds them in to virtualbox. Make sure you install virtualbox first and then follow the instructions over at github:…
Getting twitter bootstrap’s responsive layout and masonry to play alongside each other is pretty simple. Assuming you are not using the fluid container (container-fluid) here’s the code: Javascript: $ ( document ). ready ( function () { $ ( '#posts' ). masonry ({ itemSelector : '.post' , isAnimated : true , columnWidth : function ( containerWidth ) { // do nothing for browsers with no…
I spent a large portion of my day today trying to customize the HTML produced by Symfony 2 for form errors. The documentation has a section on how to do this, but for the life of me, I could not make it work. Here is a working, re-usable solution, with a brief explanation of the mistake I made at the end. In your SF2 bundle create a new file /Resources/views/Form/field_errors.html.twig :
I came across a scenario today where I needed to ensure that files uploaded always had a unique name and wouldn’t over-write a file which has the same name. ZF provides this facility but it’s not particularly well documented and I had some troubles using a couple of examples I found across the web. Alas, here is the solution.
Occasionally on the Hype Machine , a song is linked to in an external blog that no longer exists or the path has changed. If the song works when clicking play on HM then there’s a simple way to find out the URL and download it using Google Chrome as your browser.
Let it be known, that I’m not a big fan of Facebook. I’ve not put out a status update or uploaded a photo in over 6 months, but the value in the service lies with being able to message friends and family in a country that I no longer live. It’s a great way of keeping in touch. I occasionally log on to the Facebook Chat to have conversations with friends, but recently to my…
Today at work I encountered a peculiar problem when working with some translations. I developed a system whereby we can send out translations to our translators and they’ll fill in the blanks and send it back to use which is then imported. Part of this project involved coding a parser for a custom file format to send out to our translators. The benefit of this is it allowed me to validate…
One of the common questions I see from new users to Selenium is how to insert random values into a form. Well it turns out this is quite easy. Simply change your value to some javascript surrounded by some special syntax:
I’ll use this post as a personal reference for useful GIT commands as I find them. Hopefully they’ll help you also. Scenario #1 You have accidentally made a few commits to a branch and you wish to undo them so they are identical to the origin. You’ll probably see something like this when you run git status # On branch devel # Your branch is ahead of origin/devel by 2 commits.…
Short Version: This script will allow you to manage your wordpress plugins in git, and deploy them to wordpress.org SVN. Long Version: Recently at work I was required to build a wordpress plugin. After trawling through the documentation to figure out what I needed to do, it became apparent that to get my plugin listed in the WordPress plugins directory I would be required to host the code in their…
Facebook has garnered a rather bad reputation over its privacy controls in recent months, but things are now beginning to stabilise. You can control the privacy of: Individual wall posts Almost all aspects of your profile (location, interests etc.) Individual photo albums Individual videos With the addition of friend lists it makes it fairly simple to filter content to certain people, as long as…
Just a heads up to anyone who’s planning on designing their next project using a grid. The folks over at Analog have created a nifty little tool called Hashgrid to overlay a grid over your web page like so: Installation is pretty simple but I ran into a couple of minor issues which hopefully can be remedied in a future version:
Welcome to my blog. Over the next few weeks, months, years (perhaps) I’ll be posting useful articles on the subjects that interest me and will hopefully interest others. I may even post random musings or rants ;-)
(Thanks to Derick Rethans for the picture) Introductions I was lucky enough to be given the opportunity last week to attend JumpInCamp , a developers conference/workshop ran by Microsoft in the beautiful setting of Zurich. The brief was as follows As a participant you will spend four unforgettable and instructive days in the Panorama Resort & Spa Feusisberg , Switzerland – all-inclusive, for free.…