<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Alex Bain</title>
  <link href="https://alexba.in/atom.xml" rel="self"/>
  <link href="https://alexba.in/"/>
  <updated>2026-10-13T07:00:00.000Z</updated>
  <id>http://alexba.in/</id>
  <author>
    <name>Alex Bain</name>
  </author>
  <entry>
    <title type="html">Building the 2026 El Niño Kelvin wave tracker</title>
    <link href="https://alexba.in/blog/2026/10/13/building-the-kelvin-wave-tracker/"/>
    <updated>2026-10-13T07:00:00.000Z</updated>
    <id>http://alexba.in/blog/2026/10/13/building-the-kelvin-wave-tracker</id>
    <summary type="html">You can't see a Kelvin wave with your naked eye. Out on the equator, it lifts the sea by only a few centimeters, while about 150 meters down it pushes the bottom of the warm layer down by several meters. Yet each one crosses the Pacific: a pulse of warm water traveling east along the equator, more than 10,000 kilometers in about two months. At South America it splits and runs along the coast in…</summary>
  </entry>
  <entry>
    <title type="html">2026 El Niño Kelvin wave tracker</title>
    <link href="https://alexba.in/visuals/kelvin-wave/"/>
    <updated>2026-10-13T00:00:00.000Z</updated>
    <id>https://alexba.in/visuals/kelvin-wave/</id>
    <summary type="html">An interactive globe following the 2026 El Niño's Kelvin waves across the Pacific and up the coast of the Americas, built from ocean models, buoys and tide gauges.</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://alexba.in/visuals/kelvin-wave/&quot;&gt;&lt;img src=&quot;https://alexba.in/_astro/kelvin-wave.BA8zhrud_MibA7.jpg&quot; alt=&quot;A globe centred on the Pacific, coloured by sea level compared with normal, with a timeline of the 2026 Kelvin waves below it.&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An interactive globe following the 2026 El Niño's Kelvin waves across the Pacific and up the coast of the Americas, built from ocean models, buoys and tide gauges.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alexba.in/visuals/kelvin-wave/&quot;&gt;Explore it →&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title type="html">Times are changing</title>
    <link href="https://alexba.in/blog/2025/12/29/times-are-changing/"/>
    <updated>2025-12-29T13:20:00.000Z</updated>
    <id>http://alexba.in/blog/2025/12/29/times-are-changing</id>
    <summary type="html">It's been nearly a decade since I last wrote something for this blog, and the software engineering industry has undergone such profound change since then. As 2025 comes to a close, and I have some time to reflect, I thought it fitting to refresh the blog and write out some thoughts.</summary>
  </entry>
  <entry>
    <title type="html">lirc_web v0.3.0</title>
    <link href="https://alexba.in/blog/2016/03/13/lirc-web-v0-3-0/"/>
    <updated>2016-03-13T11:50:00.000Z</updated>
    <id>http://alexba.in/blog/2016/03/13/lirc-web-v0-3-0</id>
    <summary type="html">v0.3.0 of lircweb has just been published to npm.</summary>
  </entry>
  <entry>
    <title type="html">lirc_web v0.2.0</title>
    <link href="https://alexba.in/blog/2015/12/31/lirc-web-v0-2-0/"/>
    <updated>2015-12-31T04:56:00.000Z</updated>
    <id>http://alexba.in/blog/2015/12/31/lirc-web-v0-2-0</id>
    <summary type="html">The lircweb project (available at https://github.com/alexbain/lircweb) has been updated to v0.2.0, which contains some new features and bugfixes. Here's the summary of the new functionality now available in the project:</summary>
  </entry>
  <entry>
    <title type="html">Automatically reconnecting WiFi on a RaspberryPi</title>
    <link href="https://alexba.in/blog/2015/01/14/automatically-reconnecting-wifi-on-a-raspberrypi/"/>
    <updated>2015-01-14T03:55:00.000Z</updated>
    <id>http://alexba.in/blog/2015/01/14/automatically-reconnecting-wifi-on-a-raspberrypi</id>
    <summary type="html">In this post, I'm going to cover writing a short script that automatically reconnects a RaspberryPi to a WiFi network. The script will check to see if the Pi has network connectivity and, if it's offline, will restart the wireless interface to bring it back online. We'll use cron to schedule the execution of this script at a regular interval.</summary>
  </entry>
  <entry>
    <title type="html">lirc_web v0.0.8</title>
    <link href="https://alexba.in/blog/2014/08/10/lirc-web-v0-0-8/"/>
    <updated>2014-08-10T19:18:00.000Z</updated>
    <id>http://alexba.in/blog/2014/08/10/lirc-web-v0-0-8</id>
    <summary type="html">In this post I'm going to talk about two features I've added to the lircweb project. lircweb is a NodeJS app I wrote that provides a web interface and JSON based API for controlling LIRC, an open source project that lets you control IR devices from the command line. I built lircweb to run on a RaspberryPi along with an expansion board I designed so that anyone could build their own fully…</summary>
  </entry>
  <entry>
    <title type="html">Receiving SMS notifications from your washer &amp; dryer</title>
    <link href="https://alexba.in/blog/2014/01/06/receiving-sms-notifications-from-your-washer/"/>
    <updated>2014-01-06T03:05:00.000Z</updated>
    <id>http://alexba.in/blog/2014/01/06/receiving-sms-notifications-from-your-washer</id>
    <summary type="html">Previously, I discussed how I built an open source universal remote using a RaspberryPi, an expansion board, and a NodeJS web application. This device allows me to control any infrared device in my home from my phone, smart watch, laptop, or other web connected device. I use the remote daily, and it's sparked my curiosity to devise new ways of enhancing my environment with internet connected…</summary>
  </entry>
  <entry>
    <title type="html">Running lirc_web with nginx and upstart</title>
    <link href="https://alexba.in/blog/2013/11/02/lirc-web-nginx-and-upstart/"/>
    <updated>2013-11-02T09:50:00.000Z</updated>
    <id>http://alexba.in/blog/2013/11/02/lirc-web-nginx-and-upstart</id>
    <summary type="html">In this post I will cover how to start a NodeJS app (lircweb) when a RaspberryPi boots up. This ensures that if the RaspberryPi ever loses power, the lircweb app will restart when the system comes online. lircweb is an open source NodeJS app I wrote as part of the Open Source Universal Remote project. If you'd like to learn more about the project, please check out Open Source Universal Remote -…</summary>
  </entry>
  <entry>
    <title type="html">lirc_web v0.0.5</title>
    <link href="https://alexba.in/blog/2013/08/21/lirc-web-v0-0-5/"/>
    <updated>2013-08-21T10:25:00.000Z</updated>
    <id>http://alexba.in/blog/2013/08/21/lirc-web-v0-0-5</id>
    <summary type="html">August 10, 2014 Update: Latest version is now lircweb v0.0.8</summary>
  </entry>
  <entry>
    <title type="html">Open Source Universal Remote - Parts &amp; Pictures</title>
    <link href="https://alexba.in/blog/2013/06/08/open-source-universal-remote-parts-and-pictures/"/>
    <updated>2013-06-08T16:17:00.000Z</updated>
    <id>http://alexba.in/blog/2013/06/08/open-source-universal-remote-parts-and-pictures</id>
    <summary type="html">This past weekend I converted my Open Source Universal Remote breadboard layout into a more permanent soldered circuit. I used the Adafruit Protoboard as a base instead of having a custom circuit board printed, which worked out well. The protoboard is perfectly sized for the RaspberryPi and I highly recommend it for any RaspberryPi related hardware projects.</summary>
  </entry>
  <entry>
    <title type="html">Open terminal's working directory in Finder</title>
    <link href="https://alexba.in/blog/2013/06/06/open-terminals-working-directory-in-finder/"/>
    <updated>2013-06-06T09:51:00.000Z</updated>
    <id>http://alexba.in/blog/2013/06/06/open-terminals-working-directory-in-finder</id>
    <summary type="html">I frequently need to jump from the terminal to Finder in OSX. Turns out there is a very easy way to do that, which I thought I'd log here in case anyone else is searching for how to do this.</summary>
  </entry>
  <entry>
    <title type="html">Using a RaspberryPi and Pebble Watch to control your home theater</title>
    <link href="https://alexba.in/blog/2013/06/01/using-the-pebble-watch-to-control-your-home-theater/"/>
    <updated>2013-06-01T13:23:00.000Z</updated>
    <id>http://alexba.in/blog/2013/06/01/using-the-pebble-watch-to-control-your-home-theater</id>
    <summary type="html">This post will serve as a guide to using a RaspberryPi, a Pebble Watch, and an Android phone (Google Nexus 4) to control your home theater from your wrist. The result is something like this:</summary>
  </entry>
  <entry>
    <title type="html">lirc_web v0.0.3</title>
    <link href="https://alexba.in/blog/2013/04/14/lirc-web-v0-dot-0-3/"/>
    <updated>2013-04-14T13:00:00.000Z</updated>
    <id>http://alexba.in/blog/2013/04/14/lirc-web-v0-dot-0-3</id>
    <summary type="html">August 10, 2014 Update: Latest version is now lircweb v0.0.8</summary>
  </entry>
  <entry>
    <title type="html">RaspberryPi IR Schematic for LIRC</title>
    <link href="https://alexba.in/blog/2013/03/09/raspberrypi-ir-schematic-for-lirc/"/>
    <updated>2013-03-09T09:19:00.000Z</updated>
    <id>http://alexba.in/blog/2013/03/09/raspberrypi-ir-schematic-for-lirc</id>
    <summary type="html">Here is a schematic I designed that demonstrates you how you could create an IR transceiver for your RaspberryPi. You can use this schematic with the LIRC software package to create your own universal remote. It's hosted on Upverter and contains a parts list for where to purchase the parts I used.</summary>
  </entry>
  <entry>
    <title type="html">Open Source Universal Remote</title>
    <link href="https://alexba.in/blog/2013/03/06/open-source-universal-remote/"/>
    <updated>2013-03-06T11:55:00.000Z</updated>
    <id>http://alexba.in/blog/2013/03/06/open-source-universal-remote</id>
    <summary type="html">Almost a year ago I decided to teach myself electronics by creating my own WiFi enabled universal remote. Initially I tried to build the project with an Arduino, but later switched to a RaspberryPi. As I've made progress on my project I've open sourced the software I've written and blogged about every step of the process.</summary>
  </entry>
  <entry>
    <title type="html">Controlling LIRC from the web</title>
    <link href="https://alexba.in/blog/2013/02/23/controlling-lirc-from-the-web/"/>
    <updated>2013-02-23T13:06:00.000Z</updated>
    <id>http://alexba.in/blog/2013/02/23/controlling-lirc-from-the-web</id>
    <summary type="html">In this post I will cover how to create a web interface + API for LIRC, the Linux Infrared Remote Control project. I will be using NodeJS and a RaspberryPi in this post, but the ideas generalize to other languages and hardware. This post will serve as Part 3 of my open source universal remote project posts. If you haven't had an opportunity to read the first two posts, I suggest checking out…</summary>
  </entry>
  <entry>
    <title type="html">Installing NodeJS on your RaspberryPi</title>
    <link href="https://alexba.in/blog/2013/01/15/installing-nodejs-on-your-raspberrypi/"/>
    <updated>2013-01-15T12:04:00.000Z</updated>
    <id>http://alexba.in/blog/2013/01/15/installing-nodejs-on-your-raspberrypi</id>
    <summary type="html">Here's how I installed NodeJS on my RaspberryPi:</summary>
  </entry>
  <entry>
    <title type="html">Use your RaspberryPi to power a company dashboard</title>
    <link href="https://alexba.in/blog/2013/01/07/use-your-raspberrypi-to-power-a-company-dashboard/"/>
    <updated>2013-01-07T15:51:00.000Z</updated>
    <id>http://alexba.in/blog/2013/01/07/use-your-raspberrypi-to-power-a-company-dashboard</id>
    <summary type="html">Here are five steps to follow if you want to start using a RaspberryPi to power a company dashboard. I've just finished putting this together at my office. We're using Geckoboard for the web interface:</summary>
  </entry>
  <entry>
    <title type="html">Setting up LIRC on the RaspberryPi</title>
    <link href="https://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/"/>
    <updated>2013-01-06T08:38:00.000Z</updated>
    <id>http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi</id>
    <summary type="html">June 8th 2013 Update: I have completed a soldered circuit prototype, complete with a full parts list and high resolution build pictures. Please read Open Source Universal Remote - Parts &amp; Picturse to learn more.</summary>
  </entry>
  <entry>
    <title type="html">RaspberryPi Quickstart</title>
    <link href="https://alexba.in/blog/2013/01/04/raspberrypi-quickstart/"/>
    <updated>2013-01-04T20:08:00.000Z</updated>
    <id>http://alexba.in/blog/2013/01/04/raspberrypi-quickstart</id>
    <summary type="html">I recently had the opportunity to purchase and setup a second RaspberryPi system. Here's a very brief shopping list and collection of links to get your own RaspberryPi system setup.</summary>
  </entry>
  <entry>
    <title type="html">Spreadsheets to Websites</title>
    <link href="https://alexba.in/blog/2012/12/07/spreadsheets-to-websites/"/>
    <updated>2012-12-07T10:29:00.000Z</updated>
    <id>http://alexba.in/blog/2012/12/07/spreadsheets-to-websites</id>
    <summary type="html">This morning I came across a two interesting JavaScript libraries designed to help make Google Spreadsheets a data source for websites. Given how simple it is to get started creating a spreadsheet it seems like a great way to make that data available for public viewing.</summary>
  </entry>
  <entry>
    <title type="html">User agent stylesheets and border-box</title>
    <link href="https://alexba.in/blog/2012/10/16/user-agent-stylesheets-and-border-box/"/>
    <updated>2012-10-16T12:38:00.000Z</updated>
    <id>http://alexba.in/blog/2012/10/16/user-agent-stylesheets-and-border-box</id>
    <summary type="html">Recently I was trying to troubleshoot why all of the inputs on a project had box-sizing: border-box applied to them. It turns out that a user agent stylesheet rule that I don't normally see was being applied to all input elements. This user agent stylesheet rule was being applied in Chrome, Firefox, and Safari.</summary>
  </entry>
  <entry>
    <title type="html">Native gem extensions failing to install</title>
    <link href="https://alexba.in/blog/2012/10/16/native-gem-extensions-failing-to-install/"/>
    <updated>2012-10-16T12:23:00.000Z</updated>
    <id>http://alexba.in/blog/2012/10/16/native-gem-extensions-failing-to-install</id>
    <summary type="html">Recently I've had trouble installing native gem extensions on my OSX 10.8.2 laptop. It appears that some gems are specifically looking for /usr/bin/gcc-4.2 and fail to compile if that's missing. When I checked /usr/bin I could only find /usr/bin/gcc.</summary>
  </entry>
  <entry>
    <title type="html">ArduSat: Doing it.</title>
    <link href="https://alexba.in/blog/2012/07/14/ardusat-doing-it/"/>
    <updated>2012-07-14T11:26:00.000Z</updated>
    <id>http://alexba.in/blog/2012/07/14/ardusat-doing-it</id>
    <summary type="html">I've been enamored with space for as long as I can remember. The barrier of entry for space/satellites, however, has always been a bit outside of the individual's grasp.</summary>
  </entry>
  <entry>
    <title type="html">Universal remote experiments</title>
    <link href="https://alexba.in/blog/2012/07/08/universal-remote-experiments/"/>
    <updated>2012-07-08T09:51:00.000Z</updated>
    <id>http://alexba.in/blog/2012/07/08/universal-remote-experiments</id>
    <summary type="html">Over the past few months I've decided to teach myself a bit about embedded microcontrollers and electronics. I've never worked with hardware before and, after a bit of Googling, found an amazing Maker / Open Hardware movement going on that I could leverage to help bootstrap my ideas.</summary>
  </entry>
  <entry>
    <title type="html">Testing for missing images in JavaScript</title>
    <link href="https://alexba.in/blog/2012/07/07/testing-for-missing-images-in-javascript/"/>
    <updated>2012-07-07T23:08:00.000Z</updated>
    <id>http://alexba.in/blog/2012/07/07/testing-for-missing-images-in-javascript</id>
    <summary type="html">Recently I had to determine if an image URL was properly rendering or not. Since this image URL was provided by a user there was a chance that it had been deleted or moved since they first set it. In that case I wanted to show a different image - perhaps a &quot;missing user&quot; image - rather than just an empty box.</summary>
  </entry>
  <entry>
    <title type="html">Undefined macro: AC_PROG_LIBTOOL</title>
    <link href="https://alexba.in/blog/2012/07/07/undefined-macro-ac-prog-libtool/"/>
    <updated>2012-07-07T23:00:00.000Z</updated>
    <id>http://alexba.in/blog/2012/07/07/undefined-macro-ac-prog-libtool</id>
    <summary type="html">While trying to install LIRC on my RaspberryPi I ran into this error:</summary>
  </entry>
  <entry>
    <title type="html">Opening Chrome from the OSX terminal</title>
    <link href="https://alexba.in/blog/2012/03/23/open-chrome-from-terminal/"/>
    <updated>2012-03-23T11:15:00.000Z</updated>
    <id>http://alexba.in/blog/2012/03/23/open-chrome-from-terminal</id>
    <summary type="html">Have you ever wanted to open an HTML file in Chrome, directly from the OSX terminal? I have. Here's how to do it:</summary>
  </entry>
  <entry>
    <title type="html">TTI: Time to Information</title>
    <link href="https://alexba.in/blog/2012/03/16/time-to-information/"/>
    <updated>2012-03-16T00:15:00.000Z</updated>
    <id>http://alexba.in/blog/2012/03/16/time-to-information</id>
    <summary type="html">Information. Not long ago information was scarce. If you needed information you'd have to embark on a quest to seek it out. You'd go to a library or book store, search for a book, (hopefully) find one, and read it. Perhaps you were lucky and the first book you read had the information you needed. If you weren't lucky and you still had the drive to continue, you could try again with another book…</summary>
  </entry>
  <entry>
    <title type="html">Adventures with Microprocessors</title>
    <link href="https://alexba.in/blog/2012/02/03/adventures-with-microprocessors/"/>
    <updated>2012-02-03T08:17:00.000Z</updated>
    <id>http://alexba.in/blog/2012/02/03/adventures-with-microprocessors</id>
    <summary type="html">I've always been fascinated by embedded systems but haven't taken the time to dive into them or hack on 'em. Over the past few weeks, however, the [Arduino][1] platform caught my eye and I've started reading about it and understanding what it's capable of.</summary>
  </entry>
  <entry>
    <title type="html">JavaScript Equivalence Operators</title>
    <link href="https://alexba.in/blog/2012/01/05/javascript-equivalence-operators/"/>
    <updated>2012-01-05T22:06:00.000Z</updated>
    <id>http://alexba.in/blog/2012/01/05/javascript-equivalence-operators</id>
    <summary type="html">JavaScript has two sets of equivalence operators. One set is type converting while the other set is strict.</summary>
  </entry>
  <entry>
    <title type="html">First Post</title>
    <link href="https://alexba.in/blog/2011/12/23/first-post/"/>
    <updated>2011-12-23T12:29:00.000Z</updated>
    <id>http://alexba.in/blog/2011/12/23/first-post</id>
    <summary type="html">Hi!</summary>
  </entry>
</feed>
