<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
  <title>mikegriffin.ie</title>
 <link href="https://mikegriffin.ie/feed/" rel="self"/>
 <link href="https://mikegriffin.ie/"/>
 <updated>2017-09-29T12:41:09+01:00</updated>
 <id>https://mikegriffin.ie/</id>
 <author>
   <name>Mike Griffin</name>
   <email>iam@mikegriffin.ie</email>
 </author>

 
 <entry>
   <title>Octokit and SSL</title>
   <link href="https://mikegriffin.ie/blog/20170929-octokit-and-ssl"/>
   <updated>2017-09-29T11:54:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/octokit-and-ssl</id>
   <content type="html">&lt;p&gt;I do a lot of work using self signed certificates and sometimes I want to use &lt;a href=&quot;http://octokit.github.io/octokit.rb/&quot;&gt;octokit.rb&lt;/a&gt;.
By default, octokit tries to verify the SSL cert and fails with an error like:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SSL_connect returned=1 errno=0 state=error: certificate verify failed
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;To get past this, you can &lt;a href=&quot;http://octokit.github.io/octokit.rb/#SSL_Connection_Errors&quot;&gt;disable this setting&lt;/a&gt; by adding:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;client.connection_options[:ssl] = { :verify =&amp;gt; false }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I’m adding this here because I keep having to look it up and it takes me a while to find it each time.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking at the Waterford Tech Meetup</title>
   <link href="https://mikegriffin.ie/blog/20170203-waterford-tech-meetup"/>
   <updated>2017-02-03T22:50:00+00:00</updated>
   <id>https://mikegriffin.ie/blog/waterford-tech-meetup</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/2017-02-03-waterford-tech-meetup/boxworks.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I was asked to speak at the January Waterford Tech Meetup on January 25th at Boxworks.
I spoke about a project that I’ve been working on for quite some time for my Dad.
He takes a lot of photographs and wanted to update the site he uses to show odd his photos, it was running an old version of ZenPhoto.
Now it’s a static site hosted on GitHub Pages and using AWS S3 to store the photos.&lt;/p&gt;

&lt;p&gt;I talked about how to use Dropbox and webhooks to automatically update the GitHub Pages site and upload the photos to S3.
At the moment it’s not very sophisticated, it lacks a lot of checks and tests to ensure that things aren’t overwritten, but as it’s backed by a Git repository, I figure that I’ll always be able to manually fix things.&lt;/p&gt;

&lt;p&gt;My Dad’s site is &lt;a href=&quot;[https://www.photosofblacklion.net&quot;&gt;https://www.photosofblacklion.net&lt;/a&gt;.
Go check it out and take a look at the relevant repositories at &lt;a href=&quot;https://github.com/PhotosOfBlacklion&quot;&gt;https://github.com/PhotosOfBlacklion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pull Requests and questions welcome!&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;b632d0af38ac4fc6ac45832bf9b6971e&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;heres-a-long-form-version-of-the-talk-i-gave-too&quot;&gt;Here’s a long form version of the talk I gave too.&lt;/h3&gt;

&lt;p&gt;This project started out because my Dad likes to takes photos and wanted to share photographs of our local village in Cavan, including any activities that were happening around the place. So I set up a PHP based gallery called ZenPhoto. This was running on PHP4 on a Dreamhost box. I upgraded it a few times over the years, but each time something would change and there would be some weirdness about not being able to log in for a while. Or else my Dad would lose the password from the browser auto fill. Anything out of the ordinary would throw him off, so I gave up upgrading it and it’s been running OK for a few years. It wasn’t fast due to being hosted in the US, and most visitors being in Ireland. and it wasn’t particularly pretty (extra clicks to see the full size photo, clunky paginated interface to view 700 photos in an album), but he kept putting photos up and people kept looking at them. Then as more people emigrated, there were more international hits, Australia, Canada, the UK.&lt;/p&gt;

&lt;p&gt;He started asking was there anything better available and of course there was. I got thinking about it and my criteria were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cheap&lt;/li&gt;
  &lt;li&gt;Fast&lt;/li&gt;
  &lt;li&gt;Easy to change the layout&lt;/li&gt;
  &lt;li&gt;As simple as possible to upload photos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After lots of messing around in the name of research, and some failed experiments, I decided on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AWS S3 to hold the photos (should be pretty cheap, can make use of a CDN easily)&lt;/li&gt;
  &lt;li&gt;GitHub Pages to host the HTML (free, I know it pretty well)&lt;/li&gt;
  &lt;li&gt;Dropbox to upload photos so they could be processed (don’t have to write a multi file resumable file upload app)&lt;/li&gt;
  &lt;li&gt;DigitalOcean to host the Sinatra server and process images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So that’s the list of things. How do we go from that to an online gallery that is available for anyone to look at with a minimum of visible fuss.&lt;/p&gt;

&lt;p&gt;First, a little diversion. Webhooks. I see that there three ways to know if something has changed somewhere:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Stand looking at it until it changes.
 This doesn’t work all that well, think of watching a kettle boil but you’re also waiting for it to be switched on. You’ll either need a lot of patience or some way of seeing into the future.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Check periodically to see if anything has changed.
 This is the equivalent of someone coming up behind you every five minutes, tapping you on the shoulder and asking, “Are you finished yet?”. It might be tolerable if one person does it, but it gets annoying quickly if multiple people do it even if it’s a different times. This is called polling and is the simplest way to set up most CI systems. Use a cron job, or schedule it in the CI system itself.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Get the application to tell you.
 Like Archimedes jumping up and shouting Eureka when he stepped into the bath, webhooks notify any subscribers when something has happened. The subscriber can be as simple as an HTTP server waiting to be be hit or a full blown CI system.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To get started, I used a Sinatra app on a DigitalOcean Droplet.This listens for a POST request with the correct parameters, does some parsing to check that the request comes from Dropbox, and stores any new photo paths into a MySQL database.&lt;/p&gt;

&lt;p&gt;Just like it’s important to respond to a regular webpage request as quick as possible, you have to respond to the fired webhook in as short space of time to acknowledge it. For Dropbox, this is 10 seconds. You can do a lot in ten seconds but it’s recommended that any heavy lifting be done in an asynchronous process.&lt;/p&gt;

&lt;p&gt;My first thought to get past this was a cron job to poll the database…but there’s polling again, which I want to avoid.&lt;/p&gt;

&lt;p&gt;Secondly, I could have used a job queue instead of the database and a worker like resque to process the queue. But this is essentially polling again, just at a much faster rate.&lt;/p&gt;

&lt;p&gt;I decided to go with forking out to another script, which first checks if there’s another instance running and if so, exits.&lt;/p&gt;

&lt;p&gt;Because this webhook is also fired when files are removed, it checks if there are any new photos to process before looping over each one to do the work.&lt;/p&gt;

&lt;p&gt;Then it runs through these steps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;download the file from dropbox&lt;/li&gt;
  &lt;li&gt;delete it from dropbox&lt;/li&gt;
  &lt;li&gt;create a thumbnail&lt;/li&gt;
  &lt;li&gt;copy the photo and thumbnail to S3&lt;/li&gt;
  &lt;li&gt;delete the local files&lt;/li&gt;
  &lt;li&gt;add the S3 paths to an array&lt;/li&gt;
  &lt;li&gt;and repeat for each photo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of the process, it creates a markdown file in a predefined repository directory. The photograph information is stored in the YAML front matter of a GitHub Pages post file. This is parsed by Jekyll and ends up with a gallery page showing all of the photos.&lt;/p&gt;

&lt;p&gt;To get the site to build, the new file has to be committed and pushed to GitHub. These steps are done using the &lt;code class=&quot;highlighter-rouge&quot;&gt;libgit2/rugged&lt;/code&gt; gem, before the script exits. And that’s it.&lt;/p&gt;

&lt;p&gt;This code is messy, has minimal error checking and to be honest a bit of a hack job, but it works and that’s the important bit at the end of the day. There is logging in place to trace back anything that happened and at worst, it’s a Git repository which can be rolled back to a known good state.&lt;/p&gt;

&lt;p&gt;Other things that can be added to it are a webhook on the GitHub side that fires on a page build success to send an email or other notification saying that the new gallery is available.&lt;/p&gt;

&lt;p&gt;There was also a large data migration project involved to move over 8 years of photographs, 2129 directories and 125702 files to give 63GB of photos. This involved bash scripting, some ruby, some judicious MySQL and a lot of late nights.&lt;/p&gt;

&lt;p&gt;To compare the costs, Zenphoto on Dreamhost was costing me $120 a year in hosting with free storage.
The new system is costing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$5 a month for a digitalocean droplet (that I use for my own website anyway)&lt;/li&gt;
  &lt;li&gt;$0 for GitHub Pages&lt;/li&gt;
  &lt;li&gt;$0 for Dropbox because the files get removed after they are copied down&lt;/li&gt;
  &lt;li&gt;$1.48 + tax for S3, so round it up to $2&lt;/li&gt;
  &lt;li&gt;for a grand total of $7 a month, or $84 dollars a year, a saving of $36!&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Autocomplete SSH Hosts</title>
   <link href="https://mikegriffin.ie/blog/20161012-autocomplete-ssh-hosts"/>
   <updated>2016-10-12T22:22:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/autocomplete-ssh-hosts</id>
   <content type="html">&lt;p&gt;Once upon a long time ago, I had autocomplete set up in ZSH to complete hosts that I connected to through SSH. Only in the last few days have I set it up again in bash.&lt;/p&gt;

&lt;p&gt;I was reading through &lt;a href=&quot;http://www.lucianofiandesio.com/&quot;&gt;Luciano Fiandesio’s blog&lt;/a&gt; on how to configure Mutt and I saw that he has &lt;a href=&quot;https://github.com/luciano-fiandesio/dotfiles&quot;&gt;shared his dotfiles&lt;/a&gt;.
I took a look at his bash configuration and saw this line:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[ -e &quot;$HOME/.ssh/config&quot; ] &amp;amp;&amp;amp; complete -o &quot;default&quot; -o &quot;nospace&quot; -W &quot;$(grep &quot;^Host&quot; ~/.ssh/config | grep -v &quot;[?*]&quot; | cut -d &quot; &quot; -f2 | tr ' ' '\n')&quot; scp sftp ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;complete&lt;/code&gt; is a bash builtin function, which you can read more about in &lt;a href=&quot;http://www.thegeekstuff.com/2013/12/bash-completion-complete/&quot;&gt;this TheGeekStuff article&lt;/a&gt;.
This line will add the hosts in your &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.ssh/config&lt;/code&gt; file to the autocomplete list for &lt;code class=&quot;highlighter-rouge&quot;&gt;scp&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;sftp&lt;/code&gt;, and &lt;code class=&quot;highlighter-rouge&quot;&gt;ssh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pretty handy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drupalcon Dublin</title>
   <link href="https://mikegriffin.ie/blog/20161004-drupalcon-dublin"/>
   <updated>2016-10-04T21:16:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/drupalcon-dublin</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/2016-10-04-drupalcon-dublin/commute.jpg&quot; alt=&quot;my commute along the Liffey&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Drupalcon Dublin took place last week and I went to the sessions on Tuesday,
Wednesday and Thursday (27-29 September). Here are some of my thoughts on the
conference and the talks that I went to.&lt;/p&gt;

&lt;h4 id=&quot;tuesday&quot;&gt;Tuesday&lt;/h4&gt;

&lt;h5 id=&quot;ride-the-whale-docker-for-drupalists&quot;&gt;Ride the Whale! Docker for Drupalists&lt;/h5&gt;

&lt;p&gt;Really enjoyed this as an overview of how to use Docker. Even though it
targetted Drupal, there are lots of bits that can be used elsewhere. The
&lt;a href=&quot;https://socketwench.github.io/rideTheWhale/#/&quot;&gt;slides are available too&lt;/a&gt;&lt;/p&gt;

&lt;h5 id=&quot;weathercom-the-weather-company-as-an-inspiration-to-extend-tmgmt&quot;&gt;Weather.com (The Weather Company) as an Inspiration to Extend TMGMT&lt;/h5&gt;

&lt;p&gt;Disappointed with this talk as it wasn’t what I expected. It turned into a
sales pitch for their product.&lt;/p&gt;

&lt;h5 id=&quot;configuration-management-theory-and-practice&quot;&gt;Configuration Management: theory and practice&lt;/h5&gt;

&lt;p&gt;Drupal specific, but a very good overview of the challenges of creating
development and production environments that mirror each other but still allow
small differences. For example, having verbose logging enabled on a development
site.&lt;/p&gt;

&lt;h5 id=&quot;leading-healthy-teams&quot;&gt;Leading Healthy Teams&lt;/h5&gt;

&lt;p&gt;A good reminder on not burning out. He wasn’t a huge fan of remote teams
though, advised meeting up on site at least once a week.&lt;/p&gt;

&lt;h4 id=&quot;wednesday&quot;&gt;Wednesday&lt;/h4&gt;

&lt;h5 id=&quot;a-cautionary-tale-for-defensive-programmers&quot;&gt;A Cautionary Tale for Defensive Programmers&lt;/h5&gt;

&lt;p&gt;Lots of tips on returning early and using exceptions. How to handle and bubble
up exceptions in your application.&lt;/p&gt;

&lt;h5 id=&quot;building-a-co-lingual-website---lessons-learned-from-irelandie&quot;&gt;Building a co-lingual website - lessons learned from ireland.ie&lt;/h5&gt;

&lt;p&gt;An enjoyable look at how difficult it is to get content in different languages
to match up and how hard it is to get it translated. Reminded me a lot of the
work that went in to http://www.museum.ie too.&lt;/p&gt;

&lt;h5 id=&quot;http-for-web-developers&quot;&gt;HTTP for Web Developers&lt;/h5&gt;

&lt;p&gt;I’ve been looking forward to seeing Lorna talk in person for a long time. This
was a very approachable introduction to HTTP and APIs. Also included a run
through some HTTP clients and how Lorna tests things. I also picked up a signed
copy of “PHP Web Services” before the talk.&lt;/p&gt;

&lt;h5 id=&quot;imposter-syndrome-and-individual-competence&quot;&gt;Imposter Syndrome and Individual Competence&lt;/h5&gt;

&lt;p&gt;Beautiful slides and a good talk. Everyone in the room had experienced imposter
syndrome in some form or another.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2016-10-04-drupalcon-dublin/foyer.jpg&quot; alt=&quot;entrance foyer of the convention centre&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;thursday&quot;&gt;Thursday&lt;/h4&gt;

&lt;h5 id=&quot;guzzle-extraordinary-http-client&quot;&gt;Guzzle: Extraordinary HTTP Client&lt;/h5&gt;

&lt;p&gt;Rob is one of the developers of Guzzle and the Slim framework and showed some
really useful ways that Guzzle wraps around curl and makes even multiple curl
calls easy.&lt;/p&gt;

&lt;h5 id=&quot;search-and-beyond-with-elasticsearch&quot;&gt;Search and beyond with Elasticsearch&lt;/h5&gt;

&lt;p&gt;How to use Elasticsearch to make searching a Drupal site better, faster and
more useful. Drupal specific again but with information on Elasticsearch that
can be used everywhere. Also showed some sites that use it and one that
doesn’t. The room was packed for this one, lots of interest.&lt;/p&gt;

&lt;h4 id=&quot;summary&quot;&gt;Summary&lt;/h4&gt;

&lt;p&gt;It was hard to go to a conference not knowing anyone beforehand, I’m not one
for going up to someone and saying hi. Despite this, I found some people to
talk to and had good chats outside of the talks themselves.&lt;/p&gt;

&lt;p&gt;I was surprised that there were so many Drupal specific developers and
companies. I expected there to be mostly PHP developers that used Drupal, but
it was the other way round. I had used Drupal a few years ago and it’s great to
see that it’s come on a long way since then. The automations possible now would
have made life a lot easier before.&lt;/p&gt;

&lt;p&gt;Saying that, the tracks that I enjoyed the most were the PHP and human specific
ones. I guess they were easier for me to drop in to despite not having done any
PHP in the last two years.&lt;/p&gt;

&lt;p&gt;I’m not sure I’d go to another Drupal specific conference, but there’s enough
going on in PHP to drag me back and keep me interested. It’s not at all the
same as it was back in PHP3 and 4!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2016-10-04-drupalcon-dublin/stickers.jpg&quot; alt=&quot;some stickers to hand out&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I got rid of a lot of my stash of stickers too, if you missed out on them or
want any, &lt;a href=&quot;mailto:mike@mikegriffin.ie?subject=I'd like some stickers, please&quot;&gt;send me an email&lt;/a&gt; and I’ll see what I can do.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Using Pipe With Ruby Scripts</title>
   <link href="https://mikegriffin.ie/blog/20160525-using-pipe-with-ruby-scripts"/>
   <updated>2016-05-25T11:50:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/using-pipe-with-ruby-scripts</id>
   <content type="html">&lt;p&gt;I’ve been writing some Ruby scripts recently to parse some text files and I was
looking for a way to pass in only part of a file instead of the full 1500
lines. If I was bash scripting, I could use &lt;code class=&quot;highlighter-rouge&quot;&gt;head&lt;/code&gt; to extract part of the text
file and then pipe it in to my script. But that wasn’t going to work in this
case because I was passing the filename as a command line argument like this:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;input = File.open(ARGV[0])
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A quick search and I found &lt;a href=&quot;http://www.jstorimer.com/blogs/workingwithcode/7766125-writing-ruby-scripts-that-respect-pipelines&quot;&gt;this blog
post&lt;/a&gt;
describing exactly what I wanted to achieve.&lt;/p&gt;

&lt;p&gt;Instead of using &lt;code class=&quot;highlighter-rouge&quot;&gt;File.open(ARGV[0])&lt;/code&gt;, I could use &lt;code class=&quot;highlighter-rouge&quot;&gt;ARGF.read&lt;/code&gt; and it would work in both
scenarios. Now I can run the Ruby script in two ways:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./script.rb filename
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;head filename | ./script.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Very handy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Don't Be That Guy</title>
   <link href="https://mikegriffin.ie/blog/20151102-dont-be-that-guy"/>
   <updated>2015-11-02T16:00:00+00:00</updated>
   <id>https://mikegriffin.ie/blog/dont-be-that-guy</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/2015-11-02-dont-be-that-guy/mike.jpg&quot; alt=&quot;Me, playing canoe polo&quot; title=&quot;me, playing canoe polo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve played &lt;a href=&quot;https://youtu.be/VMt5V4mq6f4?t=202&quot;&gt;canoe polo&lt;/a&gt; for a long time, longer than I care to admit to myself.
Not long after I started playing in the highest national division, I came up against a guy that had once played at the highest level.
The only problem was that he hadn’t played recently and his brain was moving faster than his body.
To compensate, or maybe because he was that little bit slower to react, he played dirty, cynical things like &lt;a href=&quot;https://youtu.be/cBSpEffaIuk?t=39&quot;&gt;obstructing and chopping&lt;/a&gt;.
I used to hate playing against him because you finished up the game with cut fingers and sore arms.&lt;/p&gt;

&lt;p&gt;He used to give out to referees that he thought were picking on him too.
He just couldn’t accept that he was doing something wrong and thought everyone was out to get him because he used to be good.&lt;/p&gt;

&lt;p&gt;Over the weekend, I realised that I’m in danger of turning into that guy.
- I once played at the highest level.
- I haven’t trained ot played consistently in a few years
- I give out to referees when things don’t go my way&lt;/p&gt;

&lt;p&gt;This is a note to myself so that I realise that I can still turn this around.
Enjoy the games you get to play, they won’t always be there.
Don’t get upset or angry if you’re beaten in what you think is an unfair way, it’s probably that you’ve slowed down more than you realise.
But most of all…&lt;/p&gt;

&lt;p&gt;“Don’t be that guy…”&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving From LastPass to 1Password</title>
   <link href="https://mikegriffin.ie/blog/20151019-moving-from-lastpass-to-1password"/>
   <updated>2015-10-19T21:23:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/moving-from-lastpass-to-1password</id>
   <content type="html">&lt;p&gt;Last weekend I moved my passwords from LastPass to 1Password.
This was partly due to the notice that &lt;a href=&quot;https://blog.lastpass.com/2015/10/lastpass-joins-logmein.html/&quot;&gt;LogMeIn bought LastPass&lt;/a&gt; and partly to test out if it was possible.&lt;/p&gt;

&lt;p&gt;There were some manual steps involved and some caveats, which I’ll document here.&lt;/p&gt;

&lt;h3 id=&quot;export-your-passwords&quot;&gt;Export your passwords&lt;/h3&gt;
&lt;p&gt;The first thing to do is to export everything from LastPass to a CSV file.
If you use the browser plugin, you can do this by going to:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Tools -&amp;gt; Advanced Tools -&amp;gt; Export To -&amp;gt; LastPass CSV File
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You’ll be prompted for your password and then a location to save the file.
I chose to save it to the Desktop.&lt;/p&gt;

&lt;h3 id=&quot;modify-the-csv-file&quot;&gt;Modify the CSV file&lt;/h3&gt;
&lt;p&gt;I removed some old passwords that I don’t need any more before fixing up and reordering the columns.
The original headers are:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;url,username,password,extra,name,grouping,fav
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;but the 1Password headers are:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;title,location,username,password,notes
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I moved them around so that &lt;code class=&quot;highlighter-rouge&quot;&gt;url&lt;/code&gt; became &lt;code class=&quot;highlighter-rouge&quot;&gt;location&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;name&lt;/code&gt; became &lt;code class=&quot;highlighter-rouge&quot;&gt;title&lt;/code&gt;.
I also deleted the &lt;code class=&quot;highlighter-rouge&quot;&gt;extra&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;grouping&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;fav&lt;/code&gt; columns.&lt;/p&gt;

&lt;p&gt;I removed any Secure Notes and saved them into another file for later.&lt;/p&gt;

&lt;h3 id=&quot;import-into-1password&quot;&gt;Import into 1Password&lt;/h3&gt;
&lt;p&gt;Importing was easy.
Open 1Password, got to &lt;code class=&quot;highlighter-rouge&quot;&gt;File -&amp;gt; Import&lt;/code&gt;, select the file and hey presto, all done.
A quick check to make sure everything was there and I was done.&lt;/p&gt;

&lt;h3 id=&quot;caveats&quot;&gt;Caveats&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Make sure to remove the header line from the CSV file before you import or else you will be left with a new entry with the headers in it.&lt;/li&gt;
  &lt;li&gt;Don’t try to import Secure Notes, it just made some more Logins for me.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving Email to Fastmail</title>
   <link href="https://mikegriffin.ie/blog/20150411-moving-email-to-fastmail"/>
   <updated>2015-04-11T11:15:00+01:00</updated>
   <id>https://mikegriffin.ie/blog/moving-email-to-fastmail</id>
   <content type="html">&lt;p&gt;I’ve hosted my own email for the past few years, going through setting it up, moving the config to puppet, having it crash
and burn, recreating it and reimporting all the old mails. I don’t have the time to do this any more so a short while ago
I moved it all, lock stock and barrel to &lt;a href=&quot;http://www.fastmail.com/?STKI=14043913&quot;&gt;Fastmail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I could have moved it back to Gmail, but I wanted to try out something different and I’d heard a lot of good things about
&lt;a href=&quot;http://www.fastmail.com/?STKI=14043913&quot;&gt;Fastmail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They have a nice easy method to import mails from an IMAP account as well as from some of the large common email hosters.
After a few hours, everything was imported and I had to change over the DNS entries. This was the worst bit. What would
happen if I did something wrong here? Would I even know that mail was falling through the cracks?&lt;/p&gt;

&lt;p&gt;After a few days and seeing mails still being delivered, I called it a success. I set up the new account details on my phone
and laptop and I was all moved.&lt;/p&gt;

&lt;p&gt;Overall, it was a simple process with very little that could go wrong once the excellent instructions were followed. I plumped
up for the personal enhanced package for $40 per year so that I could use a personal domain and get 15GB storage.&lt;/p&gt;

&lt;p&gt;If you feel like giving it a go, try it out using &lt;a href=&quot;http://www.fastmail.com/?STKI=14043913&quot;&gt;this referral link&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>LVAC XC Club Championships</title>
   <link href="https://mikegriffin.ie/blog/20150215-lvac-xc-club-championships"/>
   <updated>2015-02-15T00:00:00+00:00</updated>
   <id>https://mikegriffin.ie/blog/lvac-xc-club-championships</id>
   <content type="html">&lt;p&gt;This is just a short report on how the race went.
The weather was as good as we could expect, with a bit of a headwind down the final straight.&lt;/p&gt;

&lt;p&gt;There was a new course for the LVAC XC Club Championships this year.
We were spared some of the roots and a large hill, but we had to cross the Munichs instead.&lt;/p&gt;

&lt;p&gt;Peter won the race, Damien was second and Chris was third. I finished in fifth, behind Bren and just ahead of Gavin, who almost caught me on the line.&lt;/p&gt;

&lt;p&gt;The race went out as expected and I tried to hold on to the lead bunch for as long as I could.
I dropped off about half way through the first lap and shortly after Chris went past me.
I tried to stay with him, but he dropped me after a few hundred metres.
Shortly after that, I caught Gavin and went past him as strong as I could.
I didn’t quite drop him as much as I wanted to though.&lt;/p&gt;

&lt;p&gt;Bren came through on the third lap and passed me.
I stayed with him until the end of the Munichs but then totally died.
I felt like I was walking at this stage and had to dig really deep to keep going.&lt;/p&gt;

&lt;p&gt;I wasn’t strong enough on the day, but I hadn’t slept well in the week leading up to it, Éabha was teething and keeping us all awake.
This is no excuse, but more of a reason, if that makes sense to anyone else!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rock and Roll New Orleans 10k</title>
   <link href="https://mikegriffin.ie/blog/20150125-rock-and-roll-new-orleans-10k"/>
   <updated>2015-01-25T00:00:00+00:00</updated>
   <id>https://mikegriffin.ie/blog/rock-and-roll-new-orleans-10k</id>
   <content type="html">&lt;p&gt;I went to New Orleans for a week to meet up with work mates and found out a week before that there was a 10k taking place on the day after I arrived.
Without thinking too much about it, I entered, thinking it would be a nice way to see the city without having to worry about getting lost.
I didn’t have a lot of time to spare to collect my number after arriving in New Orleans, but I missed the connecting flight in Newark and arrived too late to register.
I didn’t think there would be any chanve to register on the day as the race was starting at 7am, so I went out for a few drinks with the guys from work.
Sometime after midnight, I got a message saying I could register before the race, not what you want to hear with about 6 hours to go before you have to get up.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015-02-25-nola-10k/there-i-am.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just before 6am, I got up and went to register, I had paid for it and I was awake, it seemed like the right thing to do.
Registration was quick and easy and by 6:30, I was off warming up after handing over my spare clothes for the end of the race.
After some long strides and a few chats to other runners, I went to the start area.
As usual, I spent some time looking around, checking out the other runners, sussing out the competition.
I was a little surprised, it looked like there were only a small number of “proper” runners.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2015-02-25-nola-10k/national-anthem.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just before the race, the national anthem was sung and then we were off.
After about 200m, I was in the leading bunch of three, but 100m later, I was talking to the only other person still in the group.
It turned out she was a runner from Manchester who had moved to Colorado to work as a physiotherapist.
She was looking to run around 38 minutes, I said I was hopeing for somewhere between 35 and 36.&lt;/p&gt;

&lt;p&gt;I dropped her after another couple of minutes and from then on I was on my own.
The roads were closed, there were two police motorbikes, two lead cars and a cyclist keeping me company but it was a surreal experience being the only runner on large city streets.
I don’t think the bands were expecting someone to come along so soon, most of the time they only started to play after I had gone past them.&lt;/p&gt;

&lt;p&gt;The finish was another surreal experience, I didn’t know how to celebrate going over the line and breaking the tape.
I was presented with my finisher medal, some water, gatorade, chocolate milk, banana and recovery bar before realising I should go back and cheer in the other runners.
The girl in second place finished 3 minutes after me, with the second man another 3 minutes back.&lt;/p&gt;

&lt;p&gt;My finish time was 36 minutes 22 seconds, after going through half way in just over 18 minutes.
I was pretty happy overall, coming to a large city and winning a road race was something I never thought I would do.
It would have been nice to come in under 36 minutes, I know I had it in me, but seeing as I wasn’t being pushed and the cyclist kept talking to me, I’ll live with my time.&lt;/p&gt;

&lt;p&gt;I ran back very slowly to the hotel watching the marathon runners as they wound their way to the half way mark.
They were still going past the hotel two hours after I got back and showered.
More than 13,000 took part in the three races overall, great to see so many people getting out early in the day.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>
