<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>keithp&#39;s blog</title>
    <link>https://keithpblog.org/</link>
    <description>Recent content on keithp&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>&amp;copy; 2025 Keith P | Follow on &lt;a href=&#34;https://twitter.com/007KeithP&#34; target=&#34;_blank&#34;&gt;Twitter&lt;/a&gt; | &lt;a href=&#34;https://github.com/KeithP&#34; target=&#34;_blank&#34;&gt;Git&lt;/a&gt;  ♥</copyright>
    <lastBuildDate>Mon, 28 Jul 2025 09:12:19 +0100</lastBuildDate><atom:link href="https://keithpblog.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Run Docker-Selenium as a Kamal Accessory</title>
      <link>https://keithpblog.org/post/run-docker-selenium-as-a-kamal-accessory/</link>
      <pubDate>Mon, 28 Jul 2025 09:12:19 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/run-docker-selenium-as-a-kamal-accessory/</guid>
      <description>The task: To scrape a javascript-heavy web page you will need a web browser to load the dynamic page into. To automate the browser, you will need something like Puppeteer or Selenium.
We opted for the selenium-webdriver gem with Google-chrome running in headless mode.
It was useful to install the chrome dev package locally for developing and testing. However running this way in production wont cut it. The Rails App server will grind to a halt after some hours when it eventually runs out of memory.</description>
    </item>
    
    <item>
      <title>Migrate to Kamal to deploy anywhere</title>
      <link>https://keithpblog.org/post/migrate-to-kamal-to-deloy-anywhere/</link>
      <pubDate>Fri, 29 Mar 2024 18:01:15 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/migrate-to-kamal-to-deloy-anywhere/</guid>
      <description>How we successfully used Kamal to leave AWS Beanstalk and deploy anywhere. We were new to containers, so this was part of the learning curve as well.
In Part 1 We simply wanted to replicate the example by DHH and use Kamal to deploy to a single server on Hetzner. Includes some errors we overcame.
In Part 2 We added the pieces in preparation for deploying the product.
The Gotchas are some errors we saw and how to fix them.</description>
    </item>
    
    <item>
      <title>How We Moved Rails Development to Windows WSL2 Linux</title>
      <link>https://keithpblog.org/post/how-we-moved-rails-development-to-windows-wsl2-linux/</link>
      <pubDate>Wed, 29 Jul 2020 11:13:51 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/how-we-moved-rails-development-to-windows-wsl2-linux/</guid>
      <description>Up till now we had been developing Rails 6 applications on linux using VMWare on a windows laptop. But now with the general availability of WSL 2, we can retire the old laptop and do everything together in one place.
Given that WSL 2 does not currently support GUI applications, we cant expect to replicate the Pepermint distro that was so nice to use. Instead we are taking the opportunity to retool to use VS codeOur toolset uncludes &amp;ldquo;Git&amp;rdquo;, &amp;ldquo;Rails&amp;rdquo;, &amp;ldquo;PostgreSQL&amp;rdquo;, and deployment to &amp;ldquo;AWS Beanstalk&amp;rdquo;</description>
    </item>
    
    <item>
      <title>Moving Rails Development to Windows WSL 2 Linux</title>
      <link>https://keithpblog.org/post/moving-rails-development-to-windows-wsl2-linux/</link>
      <pubDate>Sun, 03 Nov 2019 10:32:14 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/moving-rails-development-to-windows-wsl2-linux/</guid>
      <description>New Opportunity: Linux on Windows via WSL 2With the now general availability of WSL 2 on Windows 10, it has now become possible to run Linux desktop on a Windows PC without the need of a Virtual Machine. WSL 2 is the 2nd iteration of the Windows Subsystem for Linux, this time with a Linux kernel. We can already utilize WSL 1 with the availability of Bash shell which is vastly superior to the command window (Cmd).</description>
    </item>
    
    <item>
      <title>Upgrade to Ruby 2.6 on Linux</title>
      <link>https://keithpblog.org/post/upgrade-to-ruby-2.6.1-on-linux/</link>
      <pubDate>Tue, 26 Feb 2019 11:53:09 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/upgrade-to-ruby-2.6.1-on-linux/</guid>
      <description>To be ready for Rails 6 upgrade we needed to install Ruby 2.5 or above, so we went for ruby 2.6.1
Up till now we had been running Rails 5.2.2 on Ruby 2.4.1.
So here are the steps we took:-  update ruby version in /.ruby-version file
  Intall Ruby 2.6
  $ sudo apt-get update $ rvm get stable --autolibs=enable gpg: Signature made Sun 30 Dec 2018 10:44:46 GMT using RSA key ID 39499BDB gpg: Can&#39;t check signature: No public key Warning, RVM 1.</description>
    </item>
    
    <item>
      <title>Fixing a Memory-bottlenecked Rails App</title>
      <link>https://keithpblog.org/post/fixing-a-memory-bottlenecked-rails-app/</link>
      <pubDate>Mon, 02 Jul 2018 11:50:45 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/fixing-a-memory-bottlenecked-rails-app/</guid>
      <description>On Jun 29 Nate Berkopec (@nateberkopec) tweeted this:
 &amp;ldquo;Observation: when scaling on AWS/AWS-based VPS services, newer, lower-volume Rails applications tend to be memory-bottlenecked, older, high-volume Rails applications tend to be cpu-bottlenecked.&amp;rdquo;
 This is really useful to know. We recently saw our tiny new Rails app running on an AWS t2.micro server getting into a &amp;ldquo;WARN&amp;rdquo; state after running a sucker punch job. It was using over 90% of its RAM, and stayed that way until we restarted the server.</description>
    </item>
    
    <item>
      <title>Rails Security</title>
      <link>https://keithpblog.org/post/rails-5-security/</link>
      <pubDate>Wed, 06 Jun 2018 11:15:22 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/rails-5-security/</guid>
      <description>Here are two quick wins for security that will help you sleep better at night:
 If you are running Rails 5.2 or higher, chances are you are already using the new Content-Security-Policy feature for Cross-Site-Scripting (XSS) protection, it just needs configuring. The Rack-attack gem for throttling spammy clients, and preventing brute-force login attacks.  Both of these are quick to get started with, but will benefit from monitoring and fine tuning.</description>
    </item>
    
    <item>
      <title>Minimal Email Receiving</title>
      <link>https://keithpblog.org/post/minimal-email-receiving/</link>
      <pubDate>Tue, 01 May 2018 10:51:12 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/minimal-email-receiving/</guid>
      <description>How we receive email for our domain using email forwarding on Amazon SES, with minimum effort.
Our web-app sends emails no problem, but we also want to receive emails into the same accounts. For example our web-app sends an automatic email from info@mySite.com, but if it receives an email sent to info@mySite.com, we want to handle that too.
The simplest way is to implement email forwarding.
(The hard way would be to build an email client inside our web-app, then decide how and when to notify whoever needs to handle it).</description>
    </item>
    
    <item>
      <title>Simple GDPR Compliance</title>
      <link>https://keithpblog.org/post/simple-gdpr-compliance/</link>
      <pubDate>Wed, 04 Apr 2018 10:51:12 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/simple-gdpr-compliance/</guid>
      <description>How we aim to meet the requirements for GDPR compliance on a website with minimal use of personal data, using minimum effort.
*Disclaimer - we are not lawyers, so don&amp;rsquo;t take any of this as legal advice!
What is GDPR?:
 GDPR is the EU &amp;ldquo;General Data Protection Regulation&amp;rdquo;. It is more detailed and specific than the UK Data Protection Act 1998. It will be enforced from 25 May 2018.  Compliance for simple cases like ours appears to be mainly about implementing effective privacy notice(s) and reveiwing how you ask for, manage and record consent.</description>
    </item>
    
    <item>
      <title>Rails 5.2: encrypted secrets</title>
      <link>https://keithpblog.org/post/encrypted-secrets/</link>
      <pubDate>Thu, 22 Mar 2018 11:15:22 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/encrypted-secrets/</guid>
      <description>How we started to use Rails 5.2 Encrypted Secrets for securing Amazon S3 key pairs for use with Active Storage.
Here is a useful starting point: Rails Encrypted Credentials on Rails 5.2
Our development and production envionment is Linux, and we precompile our assets before deployment.
Part 1: Encrypt your secrets With Rails 5.2 a sort of &amp;lsquo;password safe&amp;rsquo; is introduced, whereby you commit your encrypted secret credentials to source control, but not your master password.</description>
    </item>
    
    <item>
      <title>Rails Active Storage: Uploading files to Amazon S3</title>
      <link>https://keithpblog.org/post/active-storage-on-amazon-s3/</link>
      <pubDate>Tue, 20 Mar 2018 11:15:22 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/active-storage-on-amazon-s3/</guid>
      <description>How we used Rails Active Storage and got it working with Amazon S3.
If you are new to Active Storage, here are a couple of useful links:
  A great video introduction to Active Storage: File uploading with ActiveStorage in Rails 5.2
  A useful overview on creating your bucket on Amazon S3: Tutorial: How to use Amazon S3 and CloudFront CDN to serve images fast and cheap</description>
    </item>
    
    <item>
      <title>Sending Emails</title>
      <link>https://keithpblog.org/post/sending-emails/</link>
      <pubDate>Sun, 07 Jan 2018 11:15:22 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/sending-emails/</guid>
      <description>When action mailer fails to deliver to Hotmail/Outlook email accounts&amp;hellip;
A short note on sending mail from a Rails application ( action_mailer ) to a Microsoft Hotmail account, but the email never arrives in Hotmail/Outlook.
After investigation, it looks like Hotmail probably only likes one email address per origin / server IP address. If you send an email from the same server but change the email address, then hotmail will silently block it.</description>
    </item>
    
    <item>
      <title>Let’s Encrypt automatic SSL certificate renewal on a single AWS instance</title>
      <link>https://keithpblog.org/post/lets-encrypt-automatic-ssl-certificate-renewal-on-a-single-aws-instance/</link>
      <pubDate>Mon, 14 Aug 2017 10:36:22 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/lets-encrypt-automatic-ssl-certificate-renewal-on-a-single-aws-instance/</guid>
      <description>How we configured Elastic Beanstalk to play nicely with automatic certificate renewal by Let’s Encrypt.
Everyone it seems is going with Let’s Encrypt to generate their free SSL/TLS ceritficate. Running it once is easy, but getting it configured to work with Elastic Beanstalk and EC2&amp;rsquo;s lifecycle can send you round in circles. This post is an update of the original January 2017 post with our improved configuration.
The configuration needs to cater for ALL of these scenarios:</description>
    </item>
    
    <item>
      <title>Hugo website SEO</title>
      <link>https://keithpblog.org/post/hugo-website-seo/</link>
      <pubDate>Wed, 09 Aug 2017 11:15:22 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/hugo-website-seo/</guid>
      <description>You want to be found on the web. Search Engines want to help&amp;hellip;
Hugo or your Hugo theme might provide some SEO components out of the box, but consider adding what it doesn&amp;rsquo;t, then tell google; bing and other search engines about your site.
Part 1: Add SEO elements to your website See also about SEO elements -&amp;gt; https://developers.google.com/search/docs/guides 1. Configuration: By default Hugo or your Hugo theme will give you:</description>
    </item>
    
    <item>
      <title>Hugo website on GitLab Pages</title>
      <link>https://keithpblog.org/post/hugo-website-on-gitlabpages/</link>
      <pubDate>Sun, 06 Aug 2017 18:20:42 +0100</pubDate>
      
      <guid>https://keithpblog.org/post/hugo-website-on-gitlabpages/</guid>
      <description>How we created a static website with Hugo and hosted it on GitLab Pages with our custom domain secured with a SSL/TLS certificate, for free.
With Hugo + GitLab Pages + Let&amp;rsquo;s Encryptyou get:
 Static website generator. Auto-deploy on checkin. Free hosting. Custom domain AND secured with SSL/TLS encryption. Free Let&amp;rsquo;s Encrypt certificate.  Previously we had [setup our website on GitHub] (/post/hugo-website-on-githubpages/) but with one major drawback: Github Pages doesn&amp;rsquo;t currently support SSL/TLS certificates with a custom domain.</description>
    </item>
    
    <item>
      <title>Wordpress to Hugo</title>
      <link>https://keithpblog.org/post/wordpress-to-hugo/</link>
      <pubDate>Wed, 02 Aug 2017 10:29:37 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/wordpress-to-hugo/</guid>
      <description>How we migrated a Wordpress blog to a Hugo generated website (and hosted it on GitHub Pages for free), without too much fuss.
Part 1: Export from Wordpress to Hugo format: Being on the free tier of Wordpress, it was not possible to run any of the excellent looking tools that [hugo recommends] (https://gohugo.io/tools/migrations/). So instead we opted to use the wp2hugo.go tool to process the downloaded export file from Wordpress into markdown files, as explained [here] (https://eklausmeier.</description>
    </item>
    
    <item>
      <title>Hugo website hosted on GitHub Pages</title>
      <link>https://keithpblog.org/post/hugo-website-on-githubpages/</link>
      <pubDate>Wed, 02 Aug 2017 10:00:37 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/hugo-website-on-githubpages/</guid>
      <description>How we created a static website using Hugo and hosted it on GitHub Pages, for free.
With Hugo + GitHub Pagesyou get:
 Static website generator. Auto-deploy on checkin. Free hosting. Custom domain (not secured with SSL/TLS encryption).  With GitHub Pages your URL optionsare:
 Encrypted sub domain of GitHub Pages, for example: https://mygitname.github.io/mywebsite. Unencrypted custom domain, for example: http://mycustomdomain.  If you want to use a custom domain and SSL/TSL encryption, consider using GitLab instead: see blog post [Hugo website hosted on GitLab Pages] (/post/hugo-website-on-gitlabpages/).</description>
    </item>
    
    <item>
      <title>VMware Workstation</title>
      <link>https://keithpblog.org/post/vmware-workstation/</link>
      <pubDate>Sat, 27 May 2017 10:29:37 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/vmware-workstation/</guid>
      <description>A short note on VMware Workstation.
VMware Workstation is a great tool. But accepting an upgrade can run into problems.
If after installing an upgrade, when you try to start a VM you may see this popup message:
If you are running VMware from Windows:
 Confirm that &amp;ldquo;VMware Authorization Service&amp;rdquo; service is running ( i.e &amp;lsquo;Started&amp;rsquo; ) Check if VMware Player shows up in the list of installed programs  The 2nd problem means the update process didn&amp;rsquo;t properly register the program.</description>
    </item>
    
    <item>
      <title>Rails 5 Progressive Web App - part 2</title>
      <link>https://keithpblog.org/post/rails-5-progressive-web-app-part-2/</link>
      <pubDate>Sat, 17 Dec 2016 14:34:55 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/rails-5-progressive-web-app-part-2/</guid>
      <description>Inspired by some evangelical Progressive Web App (PWA) posts, we wanted to see what PWA goodness we could bring to our Rails 5, Turbolinks 5, Websocket-using web project. So this post is about what steps we have taken thus far.
In Part 1, we added service workers and achieved the “Installable”, “Discoverable” and “App-like” and “Connectivity-independent” improvements.
Now in Part 2 we look at achieving “Re-engageable”: User re-engagement with displayed push notifications via service workers, even when a tab is not open.</description>
    </item>
    
    <item>
      <title>Rails 5 Progressive Web App</title>
      <link>https://keithpblog.org/post/rails-5-progressive-web-app/</link>
      <pubDate>Tue, 13 Dec 2016 10:35:32 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/rails-5-progressive-web-app/</guid>
      <description>Inspired by some evangelical Progressive Web App (PWA) posts, we wanted to see what PWA goodness we could bring to our Rails 5, Turbolinks 5, Websocket-using web project. So this post is about what steps we have taken thus far.
We are coming at this from a web-first approach, we are following the Basecamp route into mobile with turbolinks-android. Our mobile development effort has mostly gone thus far into product re-design: stripping back and simplifying views to optomise for the more intimate phone format.</description>
    </item>
    
    <item>
      <title>Upgrading d3 from v3 to v4</title>
      <link>https://keithpblog.org/post/upgrading-d3-from-v3-to-v4/</link>
      <pubDate>Sun, 31 Jul 2016 11:05:21 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/upgrading-d3-from-v3-to-v4/</guid>
      <description>We recently upgraded to d3js v4.1.0. Here is what we did to fix the breaking changes:
After the upgrade our data visualizations stopped being generated, and on a closer look we were getting this js error in Chrome:
It turns out d3js v4.1.0 is a major rewrite with several breaking changes, so be prepared to spend half a day looking at it. Fortunately the d3.js documentation is very comprehensive, including the documented changes which is a must read.</description>
    </item>
    
    <item>
      <title>Ubuntu running low on disk space</title>
      <link>https://keithpblog.org/post/ubuntu-running-low-on-disk-space/</link>
      <pubDate>Sat, 11 Jun 2016 06:25:34 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/ubuntu-running-low-on-disk-space/</guid>
      <description>Warnings have been popping up with increasing frequency that the disk space is running low on Ubuntu running on VMware Workstation 12 Player.
Even creating a backup failed due to lack of space in the Tempfolder. It&amp;rsquo;s time to do some clean up. Run Disk Usage Analyser toidentify where the problems are:
 usr/srcfolder - 2.4 GB, contained folders like linux-headers-3.13.0-32 that go back years. home/.rvmfolder grew to 6GB, in which the worst offender was the current gemset, at 2.</description>
    </item>
    
    <item>
      <title>Action Cable: components checklist</title>
      <link>https://keithpblog.org/post/action-cable-components-checklist/</link>
      <pubDate>Wed, 27 Jan 2016 13:59:01 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/action-cable-components-checklist/</guid>
      <description>Here are the minimum code changes required to provide websocket capability in a Rails 5.0.0 app. This is based on a minimal alert app.
Disclaimer: Of course this is all rapidly changing in Rails. This was correct for rails master branch at the time of writing this post.
Prerequisites: gemfile: add em-hiredis, redis, and make sure you have puma 2.15.3 or greater  ... gem &#39;rails&#39;, &#39;&amp;gt;= 5.0.0.beta1.1&#39; gem &#39;em-hiredis&#39; gem &#39;redis&#39; gem &#39;puma&#39;, &#39;&amp;gt;= 2.</description>
    </item>
    
    <item>
      <title>Rails 5 tutorial chat app - can we deploy it to AWS?</title>
      <link>https://keithpblog.org/post/rails-5-tutorial-chat-app-can-we-deploy-it/</link>
      <pubDate>Wed, 30 Dec 2015 20:21:34 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/rails-5-tutorial-chat-app-can-we-deploy-it/</guid>
      <description>The simple chat example that DHH built in his recent screencast using ActionCable in Rails 5, is available on GitHub here: https://github.com/HectorPerez/chat-in-rails5. But can we get this working on an Elastic Beanstalk single instance - with no load balancer ? =&amp;gt; Initially yes, then no, then yes!
On a development pc:Action Cable works with redis so to run the chat app you will need to install redis on your local machine:</description>
    </item>
    
    <item>
      <title>Upgrading to Rails 5.0.0.beta1</title>
      <link>https://keithpblog.org/post/upgrading-to-rails-5-0-0-beta1/</link>
      <pubDate>Mon, 21 Dec 2015 12:12:51 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/upgrading-to-rails-5-0-0-beta1/</guid>
      <description>What we did to upgrade a small Rails app from Rails 4.2.5 to Rails 5.0.0.beta1.
Now the upgrade is deployed in AWS, here is where we are at:  When deploying, remember to change the secret key base to invalidate all sessions. ( or your users will get a nasty 500 error ) Temporarily removed NewRelic from the gemfile – it doesn&amp;rsquo;t currently support Rails 5.0.0.beta1. (UPDATE: as of 11 Feb NewRelic supports Rails 5.</description>
    </item>
    
    <item>
      <title>Scaling down to single instance Elastic Beanstalk.</title>
      <link>https://keithpblog.org/post/scaling-down-to-single-instance-elastic-beanstalk/</link>
      <pubDate>Mon, 13 Apr 2015 17:27:17 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/scaling-down-to-single-instance-elastic-beanstalk/</guid>
      <description>When you are looking to reduce your AWS costs, you might consider removing the Load balancer. At $20 per month it accounts for a large proportion of the hosting costs for a small application. Is it really needed right now? Down the line when your application grows, you can easily bring it back - right?
Elastic beanstalk is handy for provisioning and deployment, and thankfully the load balancer is not compulsory.</description>
    </item>
    
    <item>
      <title>Rails 4.2.1 upgrade ( SMTP email sending fail)</title>
      <link>https://keithpblog.org/post/rails-4-2-1-upgrade-smtp-email-sending-fail/</link>
      <pubDate>Fri, 27 Mar 2015 14:34:52 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/rails-4-2-1-upgrade-smtp-email-sending-fail/</guid>
      <description>Soon after we updated to Rails 4.2.1 from 4.2.0 deployed - the site stopped respondingand we saw this error in the passenger log:
phusion_passenger/preloader_shared_helpers.rb:69:in `fork&#39;: Cannot allocate memory - fork That was also the last time emails were successfully sent from Elastic Beanstalk. Now SMPT emails are silently failingwith no clues in the logs.
We were unsure if the memory issue was with this AWS instance or this update. Later decided it was the instance.</description>
    </item>
    
    <item>
      <title>Moving Rails development from Windows to Linux</title>
      <link>https://keithpblog.org/post/moving-rails-development-from-windows-to-linux/</link>
      <pubDate>Mon, 23 Feb 2015 14:05:19 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/moving-rails-development-from-windows-to-linux/</guid>
      <description>Recently we embarked on a new feature requiring a gem that is not compatible with Windows.
see also: [Moving Rails Development to Windows WSL 2 Linux] (/post/moving-rails-development-to-windows-wsl2-linux/).
To re-quote a quote from https://meta.discourse.org/t/bundle-install-fails-on-windows/6494 : &amp;ldquo;The reality is that Ruby, as used by most Rails apps is full of unixism, performance of Ruby MRI (the default Ruby) on Windows is abysmal, Rails load times are hellish, sooner or later (more likely sooner) you are going to hit gems that simply do not work properly on Windows.</description>
    </item>
    
    <item>
      <title>Configuring HTTPS for the AWS Elastic Beanstalk Load balancer</title>
      <link>https://keithpblog.org/post/configuring-https-for-the-aws-elastic-beanstalk-load-balancer/</link>
      <pubDate>Mon, 19 Jan 2015 00:42:44 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/configuring-https-for-the-aws-elastic-beanstalk-load-balancer/</guid>
      <description>Switching your Rails site to always use HTTPS takes a bit configuring.
Here is how we followed AWS&amp;rsquo;s 3 high level steps: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html
 Create a custom domain with your DNS provider. Create and upload an SSL certificate to AWS Identity and Access Management (AWS IAM). Update your Elastic Beanstalk environment to use HTTPS.  Step 1) was DONE - We already had our own www.ourdomain.com, not registered on AWS route 53 nor using the AWS route 53 name servers, but with godaddy.</description>
    </item>
    
    <item>
      <title>Upgrading to Ruby 2.1.4,  from 1.9.3</title>
      <link>https://keithpblog.org/post/upgrading-to-ruby-2-1-4-from-1-9-3/</link>
      <pubDate>Fri, 02 Jan 2015 11:43:56 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/upgrading-to-ruby-2-1-4-from-1-9-3/</guid>
      <description>Now that Rails 4.2.0 is out and several things have aligned, we took the plunge to upgrade to Ruby 2.1.4 from 1.9.3.
We had already upgraded to Rails 4.2.0.
Upgrading ruby was fairly straightforward, and we improved the AWS deployment in the process: faster updates &amp;amp; DB no longer tied to EB.
Here are the steps we took:
The plan was to create a whole new AWS EB environment using the latest 2014.</description>
    </item>
    
    <item>
      <title>Background processing on the cheap.</title>
      <link>https://keithpblog.org/post/background-processing-on-the-cheap/</link>
      <pubDate>Mon, 27 Oct 2014 23:07:41 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/background-processing-on-the-cheap/</guid>
      <description>We recently upgraded to Rails 4.2.0.beta2 to take advantage of the new Active Job framework and other improvements. We chose Sucker Punch to avoid the cost of using a separate worker on Elastic Beanstalk, along with Fist Of Fury for scheduling ( which we ended up not using ).
So we introduced active jobs to spawn threads for anything that takes time, like emails, external API calls, and heavy DB processing.</description>
    </item>
    
    <item>
      <title>Upgrading to Rails 4.2.0.beta2 ( aka upgrading to rspec-rails 3.1.x )</title>
      <link>https://keithpblog.org/post/upgrading-to-rails-4-2-0-beta2-aka-upgrading-to-rspec-rails-3-1-x/</link>
      <pubDate>Tue, 21 Oct 2014 13:08:58 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/upgrading-to-rails-4-2-0-beta2-aka-upgrading-to-rspec-rails-3-1-x/</guid>
      <description>Here is the process we went through to get our tests passing after upgrading our Rails app from Rails 4.1 to Rails 4.2.0.beta2.
  We updated the rails gem version and ran bundle update, and found these
gems needed to be upgraded to resolve dependencies: gem &#39;rspec-rails&#39;, &#39;~&amp;amp;gt; 2.14.1&#39; upgraded to &#39;~&amp;amp;gt; 3.1.0&#39; gem &#39;rspec&#39;, &#39;~&amp;amp;gt; 2.14.1&#39; upgraded to &#39;~&amp;amp;gt; 3.1.0&#39; gem &#39;sass-rails&#39;, &#39;&amp;amp;gt;= 3.2&#39; upgraded to &#39;&amp;amp;gt;= 5.0.0.beta1&#39; gem &#39;bootstrap-sass&#39;, &#39;~&amp;amp;gt; 3.</description>
    </item>
    
    <item>
      <title>Deploying versions with zero downtime ( 2 months later )</title>
      <link>https://keithpblog.org/post/deploying-versions-with-zero-downtime-2-months-later/</link>
      <pubDate>Tue, 07 Oct 2014 20:42:18 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/deploying-versions-with-zero-downtime-2-months-later/</guid>
      <description>Again, two months, almost to the day since we last hit problems with deployment, we are here again. Up till the day before, deployments worked fine if a little slow, but now they fail with a timeout. The site is running okay but remains at that version:
The process is now faultless:
&amp;ldquo;Deploying Versions with Zero Downtime&amp;rdquo;. Here is what we did:
STEP 1) Take a DB snapshot.
STEP 2) Duplicate the environment in AWS management console, using the DB snapshot just created.</description>
    </item>
    
    <item>
      <title>Speeding up Ruby on Rails</title>
      <link>https://keithpblog.org/post/speeding-up-ruby-on-rails/</link>
      <pubDate>Tue, 19 Aug 2014 17:21:10 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/speeding-up-ruby-on-rails/</guid>
      <description>&amp;hellip;with less sql queriesA Rails application will make a large number of sql queries per page unless steps are taken to mitigate this. This is bad because it degrades the performance of your app, affects your ability to scale, and will cost you money.
Install the New Relic gem to see the sql queries made when loading a page in your app.
Here is what we changed to reduce the number of sql queries per page:</description>
    </item>
    
    <item>
      <title>Eager loading and pg_search: good bye to polymorphic association.</title>
      <link>https://keithpblog.org/post/eager-loading-and-pg_search-good-bye-to-polymorphic-association/</link>
      <pubDate>Mon, 11 Aug 2014 21:15:06 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/eager-loading-and-pg_search-good-bye-to-polymorphic-association/</guid>
      <description>When we first designed the database schema for our Rails project, we employed the &amp;lsquo;Single Table Inheritance&amp;rsquo; and &amp;lsquo;Polymorphic Associations&amp;rsquo; strategies to two different and deserving cases. For the latter case, we needed to model different types of a class having common properties as well as unique. So for this, Polymorphic Association was chosen over Single Table Inheritance to achieve a cleaner data structure ( with less holes ).
Since then, the project has evolved and undergone several performance enhancement iterations, and today we decided it was time to lose the polymorphic association at the center of an n + 1 performance problem.</description>
    </item>
    
    <item>
      <title>Deploying versions with zero downtime</title>
      <link>https://keithpblog.org/post/deploying-versions-with-zero-downtime/</link>
      <pubDate>Thu, 24 Jul 2014 12:39:25 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/deploying-versions-with-zero-downtime/</guid>
      <description>Two months, almost to the day since we last hit problems with deployment, it looks like we are here again. Up till the day before, deployments worked fine if a little slow, but now they fail with a timeout. The site is running okay but remains at that version:
It is not possible to retrieve the logs - also due to an execution timeout. It is possible to SSH to the EC2 server but looking around the logs it appears everything is rolled back.</description>
    </item>
    
    <item>
      <title>Bootstrap-sass upgrade for Rails on AWS</title>
      <link>https://keithpblog.org/post/bootstrap-sass-upgrade-for-rails-on-aws/</link>
      <pubDate>Thu, 05 Jun 2014 19:56:11 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/bootstrap-sass-upgrade-for-rails-on-aws/</guid>
      <description>We recently spent a little time replacing blueprint with twitter bootstrap - precompiled with sass. It looks great. When it came to deploying to Elastic Beanstalk, we hit a few unexpected issues. Here is what we did to get it working.
We are running on the 64bit Amazon Linux 2014.03 AMI. The up to then prerequisite nokogiri v 1.6.1 gem was already installed and working fine. The problem came with bundle install requiring nokogiri v 1.</description>
    </item>
    
    <item>
      <title>Adventures in creating a new AWS EB environment</title>
      <link>https://keithpblog.org/post/adventures-in-creating-a-new-aws-eb-environment/</link>
      <pubDate>Wed, 21 May 2014 13:50:33 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/adventures-in-creating-a-new-aws-eb-environment/</guid>
      <description>We added queue classic to our Rails 4.1 + PostgreSQL application running on the AWS EB free tier. Then we hit problems. Later deployments failed (10 min time-out) yet the website continued to work okay.
The cause could have been the QC worker rake task, additional gems or maybe a combination of the two. So we tried restarting the app server =&amp;gt; failed (10 min time-out). Then we tried rebuilding the whole EB environment =&amp;gt; failed to remove a security group due to dependencies.</description>
    </item>
    
    <item>
      <title>Rails 4.1 upgrade from 4.0</title>
      <link>https://keithpblog.org/post/rails-4-1-upgrade-from-4-0/</link>
      <pubDate>Wed, 16 Apr 2014 11:02:59 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/rails-4-1-upgrade-from-4-0/</guid>
      <description>We have just upgraded a rails 4.0 application to Rails 4.1. It has a PostgreSQL DB; is developed on Windows; and is run in production on Linux in AWS. All rspec tests were passing and on rails 4.0 prior to the upgrade. On setting the rails version to 4.1, we had some test failures.
Here are the fixes made:
 Timezone error:  C:/Ruby193/lib/ruby/gems/1.9.1/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:199:i n `rescue in create_default_data_source&#39;: No timezone data source could be found.</description>
    </item>
    
    <item>
      <title>20 days in Colombia</title>
      <link>https://keithpblog.org/post/colombia/</link>
      <pubDate>Fri, 27 Dec 2013 22:50:31 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/colombia/</guid>
      <description>20 days in ColombiaOn November 23rd we flew into central Colombia and visited Bogota, the beautiful villages of Villa de Leyvaand Barichara, and the adrenalin center that is San Gil.
Heading north to the tropical Caribbean coast, we stayed in Santa Marta, hiked in Tayrona National Parkand visited the old town of Cartegena.
Finally we went south via Medellin to a coffee farm in Salentobefore returning to Bogota.</description>
    </item>
    
    <item>
      <title>Salento</title>
      <link>https://keithpblog.org/post/salento/</link>
      <pubDate>Fri, 27 Dec 2013 19:27:28 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/salento/</guid>
      <description>Salento is in the heart of the Zona Cafetera, between Medellin and Bogota. To get there we flew from Cartenga to stop over night in Medellin, then took a 5 hour coach and bus via Armenia.
The hostel in Salento is attached to a coffee farm and run by an eccentric ex-Australian and his teenage family. Fresh coffee was on tap, and we took the excellent coffee farm tour, in English.</description>
    </item>
    
    <item>
      <title>Cartegena</title>
      <link>https://keithpblog.org/post/cartegena/</link>
      <pubDate>Fri, 27 Dec 2013 19:22:04 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/cartegena/</guid>
      <description>Another 5.5 hour coach ride from Sante Marta, Cartegena is a the tourist capital of Northern Colombia. Even street traders speak English in Cartegena.The old town is extremely photogenic. Colourful spanisheque architecture is everywhere within its walled confines.
Filling the coachCartegena is not that far from Sante Marta, but it seems the coach drivers trawl the streets as they leave a town, touting for additional passengers. It can take up to an hour to get on the open road.</description>
    </item>
    
    <item>
      <title>Tayrona National Park</title>
      <link>https://keithpblog.org/post/tayrona-national-park/</link>
      <pubDate>Fri, 27 Dec 2013 19:14:05 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/tayrona-national-park/</guid>
      <description>Tayrona National Park was the reason for bringing the swimming gear, hiking boots, mosquito repellent and toilet paper.
Walking round the coast was easy if hot, with idyllic beaches. An open air hammock was rented for the night, and the following day we started the 4 hour trek over the top to some ruins and eventually out to the road. WildlifeAnts formed miniature multi lane highways between coconut palms and their nests, carrying pieces of leaf.</description>
    </item>
    
    <item>
      <title>Santa Marta</title>
      <link>https://keithpblog.org/post/santa-marta/</link>
      <pubDate>Fri, 27 Dec 2013 18:57:42 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/santa-marta/</guid>
      <description>The coach from San Gil was an 8 hour overnighter that took us winding down to the lower lying, warm and steamy Caribbean coast, to Santa Marta.
Santa Marta was a little disappointing. The hostel accommodation was not as nice as the one we left in San Gil. The town appeared fairly ordinary, and the fish restaurant had all but run out of fish.
The hostel was owned by two brothers from Dublin, who took turns alternating their seasons between Dublin and running the hostel.</description>
    </item>
    
    <item>
      <title>San Gil</title>
      <link>https://keithpblog.org/post/san-gil/</link>
      <pubDate>Fri, 27 Dec 2013 18:46:14 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/san-gil/</guid>
      <description>From Guane its a short coach ride by Colombian standards, back to Barichara and then to nearby San Gil.
San Gil is the adrenaline center of Colombia. So it was white water rafting and abseiling and high wire adventures in a package tour.
The raft master knew the words &amp;ldquo;forwards&amp;rdquo; and &amp;ldquo;backwards&amp;rdquo; and &amp;ldquo;in the boat&amp;rdquo; and was persuaded to use them instead of the Spanish equivalents. After some grade 4 rapids, he encouraged us to get out and swim.</description>
    </item>
    
    <item>
      <title>Barichara</title>
      <link>https://keithpblog.org/post/barichara/</link>
      <pubDate>Fri, 27 Dec 2013 18:36:49 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/barichara/</guid>
      <description>3 coaches and 5.5 hours later, Barichara is similar to Ville de Leyva. But even more beautiful.
CoachesThe coach out of Ville de Leyva was more a van, the road unsealed and dusty. At a small interchange, we waited to hail a blue and white coach like it was a taxi. The first we didn&amp;rsquo;t recognize, the second was full and didn&amp;rsquo;t stop, the third we got on. Once underway the air conditioned coaches take you rapidly through the lush country side, usually with Colombian music playing.</description>
    </item>
    
    <item>
      <title>Villa de Leyva</title>
      <link>https://keithpblog.org/post/villa-de-leyva/</link>
      <pubDate>Fri, 27 Dec 2013 18:22:16 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/villa-de-leyva/</guid>
      <description>After a 5.5 hr bus ride north from Bogota, Villa de Leyva is a picturesque, spanishesque town. The movie Zorro was filmed here, and you can see why, its well preserved and fairly timeless.
Back packs were essential, as wheeled cases would have to be carried over the very bumpy historic cobbled streets.
SecurityArmed police were very visible in Colombia. Reassuring rather than intimidating. Our identification was checked on entering the Bogota coach station.</description>
    </item>
    
    <item>
      <title>Bogota</title>
      <link>https://keithpblog.org/post/bogota/</link>
      <pubDate>Fri, 27 Dec 2013 18:04:36 +0000</pubDate>
      
      <guid>https://keithpblog.org/post/bogota/</guid>
      <description>Arriving in ColombiaAfter 18 hours on planes and in transit , and with the 5 hour time difference, I was grateful to have someone to meet on arriving in Bogota.
Bogota is a big city, comparable with London, having around 7 million people. The nearest thing to a metro system are the buses that run in dedicated lanes in the center of the street. They are packed - especially in rush hour - and the concrete roads don&amp;rsquo;t make for a smooth ride.</description>
    </item>
    
    <item>
      <title>About me</title>
      <link>https://keithpblog.org/page/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://keithpblog.org/page/about/</guid>
      <description>My name is The Dude. I have the following qualities:
 I rock a great beard I&amp;rsquo;m extremely loyal to my friends I like bowling  That rug really tied the room together.
my history To be honest, I&amp;rsquo;m having some trouble remembering right now, so why don&amp;rsquo;t you just watch my movie and it will answer all your questions.</description>
    </item>
    
  </channel>
</rss>
