{ "version": "https://jsonfeed.org/version/1", "title": "Jason Barrie Morley", "home_page_url": "https://jbmorley.co.uk", "feed_url": "https://jbmorley.co.uk/feed/", "items": [ {"title": "Ginger Granola", "id": "https://jbmorley.co.uk/posts/2019-08-19-ginger-granola/", "date_published": "2019-08-19T00:00:00+00:00", "content_html": "

Over the past few years, I\u2019ve continued to tweak and adjust my granola recipe. Sarah recently asked me for a ginger and pecan version and enjoyed the opportunity to make some adjustments.

\n

Ingredients

\n\n\n

I find this makes roughly two weeks of granola; adjust quantities to your own tastes and needs.

\n

Method

\n
    \n
  1. Pre-heat the oven to 250\u00baF.
  2. \n
  3. Crunch the coconut flakes and pecans into smaller, irregular pieces by hand.
  4. \n
  5. Combine the oats, nuts, and coconut flakes and spread them evenly over a baking tray.
  6. \n
  7. Mix the honey and olive oil in a bowl until you have a uniform syrup.
  8. \n
  9. Pour the honey and olive oil mix evenly over the oats, nuts, and coconut flakes.
  10. \n
  11. Using a spatula, ensure an even coating of honey and oil.
  12. \n
  13. Bake for 1 hour 20 minutes, turning every 20 minutes, breaking up larger chunks when they form.
  14. \n
  15. Allow the granola to cool and then mix in the candied ginger.
  16. \n
\n
", "url": "https://jbmorley.co.uk/posts/2019-08-19-ginger-granola/"}, {"title": "More Palettes", "id": "https://jbmorley.co.uk/posts/2019-05-05-more-palettes/", "date_published": "2019-05-05T00:00:00+00:00", "content_html": "\n\n

A few weeks ago, I was again motivated to record some of the glorious color palettes we encounter in every day life. The output of the k-means technique I\u2019m using still needs some tweaking, but it is a good starting point for use in other projects. In time, I hope to put together a light-weight service to automate the generation of these palettes.

\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n", "url": "https://jbmorley.co.uk/posts/2019-05-05-more-palettes/"}, {"title": "Publishing with iOS", "id": "https://jbmorley.co.uk/posts/2019-03-10-publishing-with-ios/", "date_published": "2019-03-10T00:00:00+00:00", "content_html": "

Over the past couple of years, I have been slowly working towards using iOS exclusively to update my website\u2013it\u2019s liberating being able to publish posts and photos with just an iPhone or iPad. Now that it\u2019s all working, I\u2019ve been asked to describe my workflow, and the tools I use.

\n\n
\n\n

The site itself is stored in GitHub as a collection of Markdown1 and media files\u2013one per page. Whenever a change is pushed, it\u2019s built and deployed automatically. While I use a homegrown solution for this process, it\u2019s a very common approach: GitHub Pages offers this behaviour out-of-the-box with Jekyll and it\u2019s a great place to start.

\n\n

With an automated build and deploy process like this in place, publishing becomes all about efficiently managing a git repository of Markdown files. For this, I make use of a few apps and workflows:

\n\n\n\n

Since starting this post, I\u2019ve also been experimenting with iA Writer for dedicated Markdown editing and offline previews.

\n

Working Copy

\n

\n

Viewing the repository in Working Copy

\n\n

Working Copy has been around for some time now and is the git client for iOS. It\u2019s fully featured enough to be the only tool you really need, providing a great built-in editor, while also playing nicely with other apps through Files integration, Shortcuts, and open-in-place.

\n\n

\n

Editing in Working Copy

\n\n

The integrated editor provides syntax highlighting for a comprehensive set of languages (including Markdown), allowing me to edit content, templates, and even the build scripts for my site. Publishing those changes is then simply a matter of pushing to master. This is where Working Copy\u2019s comprehensive set of keyboard shortcuts come in, allowing quick turn-around when editing drafts: you can commit and push right from the editor with \u2318 + Shift + C.

\n\n

\n

Working Copy offers a great collection of keyboard shortcuts

\n\n

Since I include a number large media files on the site, I make extensive use of git-lfs to stop them slowing down the repository, and Working Copy excels here too, offering out-of-the-box support.

\n

Safari and Split Screen

\n

While I can edit (and preview) in Working Copy, it\u2019s useful to be able to see the content as it will appear in my website. To achieve this, I publish draft posts to a separate section of my website, commit and push regularly during editing, and use Safari for previewing.

\n\n

Using Split screen\u2013one of the features that really allows iOS to shine on the iPad\u2013I can keep both Safari and Working Copy side-by-side without having to worry about excessive screen furniture or other distractions.

\n\n

\n

Editing and previewing all at once

\n

Photos and Shortcuts

\n

Since I like to control the publishing experience for my media, things like Google Photos, Instagram, or even Flickr aren\u2019t options. Instead, I follow the same model as the rest of my website, adding the files to my git repository, and using templates to display albums and individual photos and movies. This can be achieved with Jekyll, but only with many custom plugins and templates, and that complexity is the main reason I wrote my own site builder. Perhaps one day I will publish the code but, for now, I\u2019ll cover briefly how I manage my media and get it into git.

\n\n

For my media library, I use the built-in Photos2, which syncs across all my devices, meaning everything is available irrespective of the device I choose to use for publishing. Here, I organise everything into albums to make it easy to prepare for publishing.

\n\n

\n

Curation takes place in Photos

\n\n

When it comes to storing media in my site, the approach I take is very pragmatic: folders are created for the year, month, and album, and the corresponding photos and movies live there, sorted by date, and numbered sequentially. A sidecar Markdown index file contains the album metadata.

\n\n
/photos/2018/10/prge/\n    index.markdown\n    1.jpg\n    2.jpg\n    3.jpg\n    ...\n    7.m4v\n    ...\n
\n\n

Using Working Copy, it\u2019s easy to manually create this directory structure and Markdown file\u2013I only need to do this once for each album so it doesn\u2019t represent significant effort.

\n\n

Numbering the files correctly on export does take a little more work however and, for this, I use Shortcuts: with a simple workflow, it\u2019s possible to rename files sequentially, and then prompt the user for a location to save them. Adding my photos to Working Copy, is then a matter of selecting the Shortcut from the share sheet in photos, instead of exporting directly to Working Copy. And, of course, just like the rest of the site, pushing to GitHub triggers the build and redeploy.

\n\n

\n

Shortcuts provides a drag-and-drop editor for creating and editing tasks

\n

iA Writer

\n

While Working Copy does provide a way to edit and preview Markdown, it can can be a little cumbersome\u2013it\u2019s strength is breadth, not depth. For specific tasks, it\u2019s nice to be able to kick-out to a dedicated tool, and iA Writer is a great option, allowing direct editing of files in Working Copy. It offers a nice, minimal UI for editing with a quick keyboard shortcut (\u2318 + R) for previews, making for a rapid editing experience. Those previews are even customisable with templates allowing you to tweak how it appears to match your publishing platform.

\n\n

\n

Editing in iA Writer

\n\n

I have found that I need to tweak the options a little to disable things like smart quotes and smart dashes in the editor (this can really mess up adding code to posts, and HTML tags), but it\u2019s good to have that flexibility. It\u2019s been a great addition to the toolbox.

\n\n

\n\n

Like many other dedicated Markdown editors, iA Writer offers a collection of tools for formatting, including inserting links, and\u2013perhaps one of my most used features\u2013adding images directly from Photos.

\n\n
\n\n

Undoubtedly my workflow will change over time as iOS evolves and new apps are written, but already, these apps offer a wonderfully light-weight solution for editing on-the-go.

\n\n
\n
\n
    \n\n
  1. \n

    To be precise, I\u2019m using Frontmatter which includes some additional yaml-formatted metadata such as the page title, date, keywords, etc.\u00a0\u21a9

    \n
  2. \n\n
  3. \n

    I\u2019ve also heard good things about Lightroom CC for iOS, so I might explore it in the future.\u00a0\u21a9

    \n
  4. \n\n
\n
\n
", "url": "https://jbmorley.co.uk/posts/2019-03-10-publishing-with-ios/"}, {"title": "Visiting Japan: teamLab", "id": "https://jbmorley.co.uk/posts/2019-03-04-visiting-japan-team-lab/", "date_published": "2019-03-04T00:00:00+00:00", "content_html": "

Having lived in Japan for a few years, I often find friends come to me for travel advice. To help answer that question, I\u2019m putting together a collection of short posts about both the places I\u2019ve been and those I\u2019d like to visit.

\n\n

\n\n

Continuous Life in a Beautiful World

\n\n

teamLab is an art collective, based in Tokyo, with a focus on large-scale immersive and interactive digital art. Each and every piece looks striking, marrying physical and digital experiences. They have a permanent installation in Odaiba, Tokyo, the Planets \u2018museum\u2019 in Toyosu, Tokyo (through Fall 2020), and a number of events in other cities.

\n\n

While I\u2019ve not yet had a chance to check it out\u2013one of my biggest regrets from my last trip to Tokyo\u2013I\u2019ve heard great things, and strongly recommend a visit if you\u2019re in the neighbourhood.

\n
", "url": "https://jbmorley.co.uk/posts/2019-03-04-visiting-japan-team-lab/"}, {"title": "Building a Case", "id": "https://jbmorley.co.uk/posts/2019-03-02-building-a-case/", "date_published": "2019-03-02T00:00:00+00:00", "content_html": "

Last year, I spent a few weeks of the summer in Cambridge. Amongst other things, it was a great opportunity to hang out in Makespace with my good friend Michael and continue working on my Anytime x Nixie project\u2013the Nixie tube-based world clock I\u2019m building.

\n\n

Since Michael currently spends his time creating electric guitars, he\u2019s a great person to turn to to create a beautiful case for the clock, and we had a lot of fun doing just that: in under two weeks, we produced a number of PLA prototypes, CNC\u2019d the main body of the case, laser-cut a base, and printed some custom feet. You can find Michael\u2019s notes on the process here, and here.

\n\n

\"Coming

\n\n

In my previous posts covering the clock, I described the process of designing and building the electronics, and creating the firmware to control the Nixie tubes. In this post, I\u2019ll focus on designing and assembling the case:

\n\n
    \n
  1. Design and prototyping
  2. \n
  3. Testing the design on the CNC router
  4. \n
  5. Machining the wood box
  6. \n
  7. Laser-cutting a base
  8. \n
  9. Printing the feet
  10. \n
  11. Finishing up
  12. \n
\n

Design and prototyping

\n

Michael kicked things off by using Fusion 360 to produce some designs for the case\u2013you can export PCBs directly from EagleCAD into Fusion 360, so we were able to try everything in place without creating a single part. I\u2019d never used multiple components in Fusion before this, so it was a great learning opportunity. Once we had something we were happy with, we set about printing, testing, and revising the design.

\n\n

\"Fusion

\n\n

An early design idea

\n\n

We made use of Makespace\u2019s Ultimaker 3 extrusion printers for our prototypes, printing in PLA. These are quick and fairly reliable; ideal for rapid iterations. We did encounter a number of printer failures during the process\u2013a snag in the PLA spool killed our first print, and the unusually hot British summer caused a number of prints to deform a little\u2013but after a few days, we\u2019d seen enough to have confidence in the design.

\n\n

\"Clock

\n\n

Making the most of a failed print to test some dimensions

\n\n

We ultimately went through a number of variants of the case, tweaking clearances, adding a cut-out for the USB port that will power the clock, and adding air vents to ensure things don\u2019t overheat.

\n\n

\"Vents\"

\n\n

Rear of the clock, complete with USB port and vents

\n

Testing the design on the CNC router

\n

Having decided we were happy with the overall design, we next set about figuring out how to cut it out of wood using the CNC router. This is more complex than the extrusion printer, requiring multiple phases, with tool changes in between, and flipping the material in the process.

\n\n

To convince ourselves we had everything planned correctly\u2013and to avoid wasting our chosen wood\u2013we glued a few layers of MDF together and tested with this.

\n\n

\n\n

The completed part waiting to be cut away from the block of wood

\n\n

Happily we got most things right the first time around, and using the MDF allowed us understand just how careful we needed to be when drilling out the rear vents.

\n\n

\"Fully

\n

Machining the wood box

\n

For the final case, I picked up two blocks of wood\u2013Wenge and Wild Olivewood\u2013from Exotic Hardwoods UK Ltd, ultimately selecting the olivewood. We found ourselves with a block of wood significantly larger than necessary, so I should be able to get a number of clock cases (or other projects) out of it.

\n\n

We repeated the CNC steps we\u2019d practised on the MDF and, fortunately, everything went according to plan, leaving us with a beautiful box. It\u2019s really a true pleasure to work with natural materials like wood\u2013the texture and grain brings so much to a simple design.

\n\n

\"Olivewood

\n\n

Using a CNC router, there\u2019s more finishing required than a simple extrusion print: if you look closely in the above image, you can still see the tabs that the router leaves in place to connect it to the main block so it doesn\u2019t move around during cutting. These needed removing manually as part of the finishing process. We were also unable to drill the rear vent holes using the router as they\u2019re perpendicular to the body of the case, so we did that manually, placing a support block inside the case, and using a pillar drill along with a laser-cut guide:

\n\n

\"Case

\n\n

Ready to drill

\n\n

We then continued the finishing process by sanding the box. This involves working through gradually higher and higher grit sandpaper until the wood has almost a silken plastic-like quality. It\u2019s amazing how different it both looks and feels after this process.

\n\n

\"Sanding

\n\n

Since it\u2019s a time consuming process, we spaced the sanding out over the course of a few days but, during this time, were surprised to discover the case shirking. Wood requires seasoning (slowly drying, during which time it shrinks as the moisture content reduces) prior to working with it, and I had unwittingly purchased unseasoned wood.

\n\n

\"Checking

\n\n

Keeping an eye on the shrinkage

\n\n

Fortunately, our plan had always been to finish the case with Crimson Guitars\u2018 finishing oil, so we quickly started this process in the hope that it would cause the wood to expand a little, while also serving to reseal it. After a few coats, the base stopped shrinking and, thankfully, everything still fitted. In the future, we\u2019ll experiment with initially cutting away just some of the wood and leaving it to dry before cutting the details in the hope of avoiding this issue.

\n\n

\"Hanging

\n\n

Letting the base dry in between coats of oil

\n

Laser-cutting a base

\n

Many people have contributed to Anytime, and I wanted to acknowledge that so, following in the tradition of the first Mac, I thought it would be nice to include the signatures of the people I\u2019ve had the pleasure of working with on this project: Michael, Michi, Pavlos, and Anna. Having received my Makespace laser training, I opted to laser cut the base out of clear acrylic, complete with everyone\u2019s signatures:

\n\n

\"Signed

\n\n

Once installed, the clear acrylic shows off the circuit board inside\u2013complete with a few hardware bug-fixes:

\n\n

\"Clock

\n

Printing the feet

\n

Since we want to allow air to flow through the clock\u2013in through gaps to the sides of the base, and up through the holes at the rear\u2013it\u2019s necessary to raise the case up slightly with some feet. This has the nice aesthetic effect of making it look like it\u2019s floating.

\n\n

As with everything in this project, we designed our own, modelling them in Fusion 360, and then printing them, this time using the Form 1 resin printer.

\n\n

\"Foot

\n\n

Resin printers print at an angle to reduce the surface area of each horizontal slide to make it easier to separate from the printing plate

\n\n

The Form 1 can produce parts at an almost unbelievable resolution when you\u2019ve become used to the limitations of an extrusion printer like the Ultimaker, but it can be slow and finicky. We tried a few prints, on both the Form 1 and the Ultimaker, but ultimately a collection of imperfections caused me to turn to Shapeways for the final print:

\n\n

\"Feet

\n

Finishing up

\n

While we didn\u2019t quite manage to pull everything together before I had to return to California, we came mighty close. Since then, I\u2019ve assembled all the parts\u2013including the Shapeways feet\u2013and the clock sits in pride-of-place in my apartment.

\n\n

\"Fully

\n\n

Next, I\u2019ll be improving the software, and producing a few more clocks.

\n\n
\n\n

I would like to extend a big thank you to Makespace\u2013especially Jonathan and Michael\u2013for allowing me to join for such a short period of time and for making me feel so welcome. I can\u2019t wait for my next sabbatical.

\n\n

\"Michael

\n
", "url": "https://jbmorley.co.uk/posts/2019-03-02-building-a-case/"}, {"title": "Watching Tokyo", "id": "https://jbmorley.co.uk/posts/2018-12-06-watching-tokyo/", "date_published": "2018-12-06T00:00:00+00:00", "content_html": "

Over the summer, I played around with the idea of an always-on display showing a livestream of a different location on the globe. The inspiration came from Michael and Laura, who have been keeping me up to date with the Brooks Falls stream on YouTube, as they watch the bears in their pursuit of dinner.

\n\n

Using a Raspberry Pi 3 Model B+, coupled with an Adafruit PiTFT Plus 320x240 2.8\" TFT + Capacitive Touchscreen, I showed a YouTube livestream of Kabukicho, Tokyo. It was fascinating to simply glance over and see the goings-on half-way around the globe: it really brings a much greater sense of presence and connection with a place.

\n\n

\"Raspberry

\n\n

In the future, I hope to create something more permanent, making use of an LG LP097QX1 - iPad 3 / 4 Retina Display and a suitable HDMI controller. Unfortunately, the stream itself does not seem to be available any more, but I\u2019m sure other options will present themselves.

\n
", "url": "https://jbmorley.co.uk/posts/2018-12-06-watching-tokyo/"}, {"title": "Photo Feed", "id": "https://jbmorley.co.uk/posts/2018-12-03-photo-feed/", "date_published": "2018-12-03T00:00:00+00:00", "content_html": "

Since publishing all my photos here, I\u2019ve been considering different ways to make it easier for friends and family to see updates. With that in mind, I\u2019ve introduced a new feed (using JSON Feed) containing just my photos.

\n\n

If you use Feedly, you can subscribe directly by clicking this link.

\n\n
\n\n

(Apparently, I\u2019ve tried this before.)

\n
", "url": "https://jbmorley.co.uk/posts/2018-12-03-photo-feed/"}, {"title": "Mechanical Keyboards", "id": "https://jbmorley.co.uk/posts/2018-12-02-mechanical-keyboards/", "date_published": "2018-12-02T00:00:00+00:00", "content_html": "

A few weeks ago I accompanied James and Tanika to the Bay Area Mechanical Keyboard Meetup\u2013perhaps one of my most \u2018South Bay\u2019 experiences to-date. The event took over at Mosaic, a restaurant in San Jose, with both companies (such as Massdrop and WASD), and individuals showcasing their keyboards.

\n\n

\"Keyboards\"

\n\n

There were a huge range of designs on show

\n\n

It\u2019s fantastic to see how much creativity and personality people express through their keyboards. I\u2019m personally fond of the diminutive Planck by OLKB, and it was great to see so much variety in even this little keyboard.

\n\n\n\n

I love the matching striped case which I think might come from Modern Coup (though they don\u2019t seem to have that in-stock any more)

\n\n

In addition to the commonplace Cherry MX switches and everyday key-caps, there were a number of builds using different switches and older manufacturing processes. James and I were particularly impressed with the feel of this Preonic-like JJ50 keyboard by Evan, which employed DSA Honeywell key-caps and Box Royal switches.

\n\n

\"JJ50\"

\n\n

In true Bay Area style, TheGlyph had combined his love of climbing and mechanical keyboards to bring us the Crux Cap:

\n\n

\"Crux

\n\n

And, needless to say, there was also an IBM Model M in attendance:

\n\n

\"IBM

\n\n

There were many split keyboards, with a Rorschach, Helix, and various Iris keyboards, to name but a few. The looped cables give these real character, and there are some fantastic meta keys on the Rorschach.

\n\n\n\n

There were also many keyboards from older systems: one chap brought his collection of mechanical calculators, and I was overjoyed to finally have a chance to try out a Curta calculator.

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2018-12-02-mechanical-keyboards/"}, {"title": "Returning to Tokyo", "id": "https://jbmorley.co.uk/posts/2018-11-22-returning-to-tokyo/", "date_published": "2018-11-22T00:00:00+00:00", "content_html": "

After far too much time away, I\u2019m taking the opportunity of a Thanksgiving break to return to Tokyo for a few days. It\u2019s wonderful how familiar and homely the place still feels after all this time.

\n\n

On Monday, having an hour or so before catching up with my friend Nao, I stopped by Shibuya, and\u2013indulging my professional curiosity\u2013checked out the new Apple Store.

\n\n

\"Staircase\"

\n\n

The Apple staircase starts to feel somewhat of a retail institution

\n\n

One of the fantastic things about Tokyo is the myriad interesting architectural features that can be found thoroughout the city, new (like the Apple Store, and the ever-changing faces of Ginza) through old. I am particularly fond of the pervasive almost-Brutalist architecture and how it ages.

\n\n

\"Windows\"

\n\n
\n\n

As is always the case, the afternoon spent with Nao was one of good taste and design: we stopped by an au store to check out the 15 year anniversary reimagining of the INFOBAR\u2013a cellphone design that was already on its second iteration when I was living in Tokyo. It provides a real breath of fresh air in today\u2019s homogenous world of all-screen phones.

\n\n

\"INFOBAR

\n\n

Afterwards, we explored the area around Nao\u2019s home, near Shinagawa, and took in some of the creative pieces there: I\u2019ve come to really appreciate street art during my time living in San Francisco, and it was fun to see the local take.

\n\n

\"Street

\n\n

During our time together, we also had the opportunity to discuss one of the fascinating projects Nao is working on\u2013it is a true pleasure to be able to share life with so many inspiring and creative people.

\n\n
\n\n

On Michael\u2019s encouragement, I\u2019ve brought my DSLR along for the ride and am enjoying experimenting with just a 50 mm lens. I\u2019ll be publishing my photos along the way.

\n
", "url": "https://jbmorley.co.uk/posts/2018-11-22-returning-to-tokyo/"}, {"title": "Interests", "id": "https://jbmorley.co.uk/posts/2018-09-11-interests/", "date_published": "2018-09-11T00:00:00+00:00", "content_html": "

\n\n

Browser tabs can reveal many things

\n
", "url": "https://jbmorley.co.uk/posts/2018-09-11-interests/"}, {"title": "Mount Umunhum", "id": "https://jbmorley.co.uk/posts/2018-08-18-mount-umunhum/", "date_published": "2018-08-18T00:00:00+00:00", "content_html": "

\"Mountains\"

\n\n

Lukas and I took our bikes to Mount Umunhum and tried out some mountain biking: down one of the trails, and then back by way of the road. I\u2019ve recently been enjoying SoulCycle spin classes, but this ride definitely gave them a run for their money, making the downhill moments all the more rewarding.

\n\n

It\u2019s nice to enjoy a little of the Californian lifestyle, and the scenery is truly beautiful.

\n\n

\"Radar

\n\n

The old radar tower\u2013closed now due to peeling lead paint\u2013offsets the scenery with a striking, almost brutalist cube.

\n
", "url": "https://jbmorley.co.uk/posts/2018-08-18-mount-umunhum/"}, {"title": "Calendars", "id": "https://jbmorley.co.uk/posts/2018-06-27-calendars/", "date_published": "2018-06-27T00:00:00+00:00", "content_html": "

Each year, I produce calendars for family and loved ones, featuring photos taken throughout the year.

\n\n

Typically, I use the built-in support for creating wall calendars in Photos for macOS. In Vienna however, Junko and I wanted something a little smaller, so I turned to the desk calendar from Shutterfly. Following an email informing me that they were discontinuing the product, I realised it was time to capture and share the various calendars I\u2019ve produced over the years.

\n\n

Shutterfly\u2019s preview generator\u2013as used in their web-based editor\u2013is fully parametrised and can be encouraged to produce much larger renders which I\u2019ve turned into previews and PDFs:

\n\n\n\n

Print projects can also be exported from Photos as PDFs:

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2018-06-27-calendars/"}, {"title": "2D Designs", "id": "https://jbmorley.co.uk/posts/2018-06-26-2d-designs/", "date_published": "2018-06-26T00:00:00+00:00", "content_html": "

Since learning Fusion 360, it\u2019s become my go-to tool for any kind of CAD. The ability to so quickly dimension sketches and add constraints makes it great for 2D as well as 3D.

\n\n

Using Fusion, creating a simple 2D template to allow me to correctly centre a sticker on my MacBook Pro is simply a matter of a couple of shapes, dimensions, and constraints. It\u2019s even possible to dimension the angle to get it just right:

\n\n

\"Fusion

\n\n

Unfortunately, Fusion is still only really set up for printing in 3D, so printing the sketch itself is a little more nuanced. I\u2019ve had success exporting to DXF and then use Adobe Illustrator to do the printing.

\n\n

This can be done as follows:

\n\n
    \n
  1. right-click on the sketch in the Fusion object browser and export using \u2018Save as DXF\u2019
  2. \n
  3. open the file from Illustrator, using the \u2018File\u2019 > \u2018Open\u2026\u2019 menu
  4. \n
  5. accept the default options (most importantly ensuring an \u2018Artwork Scale\u2019 of \u2018Original Scale\u2019)
  6. \n
\n\n

I\u2019ve found, thanks to Michael, that it\u2019s crucial to perform step 2 and not attempt to open the file from Finder; there\u2019s a bug in Illustrator which causes the DXF import to fail if you attempt to open it by any other mechanism.

\n\n

Having done all this, I was able to enjoy putting things together:

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2018-06-26-2d-designs/"}, {"title": "Anytime x Nixie", "id": "https://jbmorley.co.uk/posts/2018-06-10-anytime-nixie/", "date_published": "2018-06-10T21:00:04+00:00", "content_html": "

Last year, I set out to build my own Nixie tube clock and integrate it with Anytime, my app that keeps track of local time for contacts. Anytime comprises an app and web service with an HTTP API, and I intend to make use of this to allow me to produce a physical clock which can display the time for a contact.

\n\n

In the process of building the clock, my Nixie tube supplier disappeared from the internet, so I turned instead to the Exixe control boards by dekuNukem.

\n\n

\"Prototype\"

\n\n

This post details the process of creating my custom clock, making use of off-the-shelf components where possible:

\n\n
    \n
  1. Introducing the Exixe
  2. \n
  3. Testing the Nixie tubes
  4. \n
  5. Prototyping with the Raspberry Pi
  6. \n
  7. Selecting a microcontroller
  8. \n
  9. Integrating with Anytime
  10. \n
  11. Designing the PCB
  12. \n
  13. Assembling the clock
  14. \n
  15. Next steps
  16. \n
\n

\u00a0Introducing the Exixe

\n

The Exixe are small, inexpensive, microcontrollers boards, each designed to host a single Nixie tube. They talk Serial Peripheral Interface Bus (SPI), and have standard 0.1\" headers. Along with a Nixie tube, they constitute a replaceable, socketed component:

\n\n

\"Complete

\n\n

Exixe, complete with IN-12 Nixie tube

\n\n

The Exixe boards and Nixie tubes can be powered using a dedicated 5V to 170V Nixie tube power supply making the overall circuitry much simpler (and safer) for someone inexperienced like myself.

\n

Testing the Nixie Tubes

\n

It\u2019s good practice to test the Nixie tubes before assembling the boards. This involves connecting up each pin in turn and ensuring the relevant digit lights up correctly:

\n\n

\n\n

Having splayed the pins on the tubes for testing, I couldn\u2019t resist having a bit of photographic fun:

\n\n

\"Invasion

\n\n

Invasion of the Nixie Tubes

\n

Prototyping with the Raspberry Pi

\n

While I didn\u2019t write many notes, I made pretty good progress with my previous Nixie tube controller, building a fully functional single digit solution. This used a Raspberry Pi as a controller, and cycled the four digits of a 24 hour clock on my one lonely Nixie tube:

\n\n

\"Previous

\n\n

Previous Nixie tube clock

\n\n

In the picture above, the Raspberry Pi is running a small Python Anytime client to drive the Display-O-Tron HAT and Nixie tube. The Anytime HTTP API serves the time zone for a given contact (e.g., \u2018Europe/Vienna\u2019) and the client implementation is expected to convert this to local time for that contact, accounting for things like daylight saving. The Raspberry Pi client takes advantage of the pytz library (which includes a comprehensive time zone database) to perform this conversion, vastly reducing the complexity of an Anytime implementation.

\n\n

With only a few small changes I was able to update the client to use the Adafruit Python GPIO library and control my newly assembled Exixe:

\n\n

\"Raspberry

\n\n

Here, I\u2019m powering both the Nixie tube power supply and the Exixe boards using a USB Micro-B Breakout Board from Adafruit.

\n

Selecting a Microcontroller

\n

Having proven the basic electronics and approach, it was time to switch from the Raspberry Pi to a microcontroller; there\u2019s much unneeded complexity in the Raspberry Pi and it tends not to be resilient to power failures (I\u2019ve destroyed the SD cards of a number of Raspberry Pis in the past and a microcontroller board shouldn\u2019t suffer from this).

\n\n

The ESP32-based boards come highly recommended for embedded WiFi projects, so I picked up a HUZZAH32 from Adafruit:

\n\n

\"HUZZAH32\"

\n\n

I had originally planned to run MicroPython on the HUZZAH32 to allow me to take advantage of the Python Anytime client, but it quickly became apparent this wasn\u2019t going to work: MicroPython is not so much a fully-featured Python (libraries included), as a basic language port. Only some Python libraries can be used and it\u2019s often necessary to rebuild the MicroPython distribution to add those libraries. Worse still, I was unable to get the crucial pytz library into an image.

\n\n

Instead\u2013on the advice of a colleague\u2013I returned to the Arduino port for the the HUZZAH32. This allowed me to take advantage of the Exixe Arduino library which, coupled with various NTP examples, allowed me to get my clock up and running very quickly.

\n

Integrating with Anytime

\n

Once it became clear that I wasn\u2019t going to be able to run the full, comprehensive Python stack I had been depending on, it was necessary to find some more pragmatic approaches to integrating with Anytime. Especially around watching for updates and daylight saving changes.

\n\n

Hosting the full Olsen database on the HUZZAH32 is troublesome, and updating it, even more so. Instead, I decided to have the clock to establish a persistent connection to the Anytime service and request time zone offset updates for a given contact. The service already manages offsets and contacts, so would simply need to broadcast relevant changes to any listening clocks.

\n\n

So far, I\u2019ve created a prototype which runs locally, on my Raspberry Pi. This is good enough for my clock, but I hope to integrate it more completely into the Anytime service in the future.

\n

Designing the PCB

\n

As with previous projects, after proving the circuit on the breadboard, I set about designing my own PCB. This circuit board is a little simpler than the Bluetooth keyboard I\u2019ve been building: this time, I just want something robust and simple to bring all the parts together.

\n\n

The clock constitutes a number of components:

\n\n\n\n

I also decided to add a power switch to allow me to power down the controller and\u2013more importantly\u2013the 170V of the Nixie power supply.

\n\n

For each of these, I created my own custom components in EagleCAD, allowing me to easily produce the circuit diagram and lay out the board:

\n\n

\"OSHPark

\n\n

The layout took a number of attempts, and I discovered the incredibly helpful ripup * EagleCAD command which removes all the routes, allowing you to run the auto-router again from scratch.

\n

Assembling the Clock

\n

Upon the arrival of my circuit boards from OSHPark, I fired up the soldering iron, but soon discovered that I shouldn\u2019t be allowed to design a PCB when tired: amongst other things, I forgot to connect up the both the 3V and 5V lines, incorrectly connected the HUZZAH32\u2019s SPI MOSI Exixe boards' MISO, and managed to wire up the switch so the board never turns on.

\n\n

This required some creative modifications and bug fixes:

\n\n

\"Bug

\n\n

Somewhere along the way, I discovered what it was like to receive a 170V shock, but eventually managed to produce a working clock:

\n\n

\"Assembled

\n

Next Steps

\n

I plan to live with the design for a little while, check that the circuit board (with modifications) works well, and gradually improve the firmware to make initial setup and configuration easier, perhaps with some richer integration with the Anytime web service.

\n\n

After that, it\u2019ll be time to order v1.1 of the PCB (something a little smaller, and lacking the troublesome power switch), and design and build a case. I\u2019m currently leaning towards a machined block of walnut.

\n\n

I\u2019ve had the pleasure of bouncing ideas off Michael (most recently of Electric Flapjack) throughout this project and there\u2019s one key idea I\u2019ve yet to incorporate: using NFC tokens representing contacts as a way to change the time. I\u2019m considering making it a separate piece of hardware, allowing me to place the controller and display separately.

\n
", "url": "https://jbmorley.co.uk/posts/2018-06-10-anytime-nixie/"}, {"title": "Bear Hugs", "id": "https://jbmorley.co.uk/posts/2018-06-10-bear-hugs/", "date_published": "2018-06-10T13:57:09+00:00", "content_html": "

Early in our relationship, when Junko and I were still living apart, Skype let us to keep in touch, and emoji\u2013while not nearly as visually rich as what we have today\u2013provided a fantastic way to express our emotions.

\n\n\n\n

These characters, \"Bear, \"Kiss\", \"Flower\", and \"Blush\", will always have a special place in my heart for all the love they have allowed us to share.

\n
", "url": "https://jbmorley.co.uk/posts/2018-06-10-bear-hugs/"}, {"title": "Vision of the Future", "id": "https://jbmorley.co.uk/posts/2018-06-09-vision-of-the-future/", "date_published": "2018-06-09T00:00:00+00:00", "content_html": "

Over twenty years ago Philips Design published a collection of concepts they called called \u2018Vision of the Future\u2019. It was intended to, \u2018explore ideas for products and services which could be part of our future in the year 2005\u2019.

\n\n

\"Vision

\n\n

I personally encountered this collection of designs at a BBC Tomorrow\u2019s World event in 1996. Since then, I\u2019ve been slowly checking off the different products as they become available: we might now be twelve years past the target year, but it remains truly amazing how prescient this work is and how many of the products now exist.

\n\n

Perhaps the one thing they didn\u2019t anticipate was the wide reaching impact of today\u2019s smartphones and tablets; these all-purpose devices serve many of the functions of those envisaged by Philips.

\n\n

Download Poster

\n\n

Philips also published an in-house book featuring presenting the designs here in more detail. Jonty very kindly acquired one for me which I hope to digitise at some point.

\n
", "url": "https://jbmorley.co.uk/posts/2018-06-09-vision-of-the-future/"}, {"title": "Keyboard Electronics", "id": "https://jbmorley.co.uk/posts/2018-04-07-keyboard-electronics/", "date_published": "2018-04-07T00:00:00+00:00", "content_html": "

Part of an on-going series describing the process of turning a Psion Series 5 keyboard into a practical, day-to-day, Bluetooth keyboard.

\n\n

Having got the basics of the keyboard working, the next challenge is to start the process of tidying up the circuit, designing a custom printed circuit board (PCB), and moving away from the prototype breadboard electronics.

\n

Adding a Power Switch

\n

Since the iPhone on-screen keyboard is only shown when no keyboard is connected, you quickly learn that it\u2019s imperative to be able to easily power off any Bluetooth keyboard. Until now, I\u2019d been relying on manually disconnecting the battery, but that won\u2019t cut it long term.

\n\n

The Adafruit Feather nRF52 includes support for this, with the documentation including the following note about the enable pin:

\n\n
\n

If you\u2019d like to turn off the 3.3V regulator, you can do that with the EN(able) pin. Simply tie this pin to Ground and it will disable the 3V regulator. The BAT and USB pins will still be powered.

\n
\n\n

I tested that I\u2019d understood this correctly by simply shorting this enable pin to ground on my breadboard, and was happy to see it powered down the board but still left the battery charging. Soon after, I added a slide switch to the breadboard:

\n\n

\"Slide

\n

Designing the Circuit

\n

Autodesk EagleCAD seems to be the go-to software for PCB design and, like Fusion 360, is free for non-commercial use. It\u2019s somewhat inscrutable, but there\u2019s a good introduction on The Ben Heck Show, which helped me get started.

\n\n

In EagleCAD, you typically design your circuit first, using the schematic file, and then switch over to a partially generated board file where you perform layout and routing. I started my schematic, and manually drawing connections between each and every one of the pins:

\n\n

\"EagleCAD\"

\n\n

This quickly leads to a very complex schematic and, as I soon learned, is unnecessary: EagleCAD will automatically connect up wires with matching names. This allows for something much, much simpler:

\n\n

\"EagleCAD\"

\n\n

Separate parts and named connections

\n\n

As you can see, I\u2019ve also added the slide switch, and made use of the wonderful Adafruit component library1 (adafruit.lbr) which is included in EagleCAD by default. This includes a FeatherWing component, making it extremely easy to design a board to extend the Feather nRF52.

\n\n

During the process, I learned the hard way (missing undo history, and out-of-sync board and schematic files) that it\u2019s good to store EagleCAD files in git. I\u2019d certainly recommend this to anyone getting started with EagleCAD.

\n

Laying Out the Board

\n

With the schematic nailed down, I went about the process of laying out the board. The board file presents a plan view of the PCB where you simply drag-and-drop components, adjust the shape of the board, place drill holes, and add silkscreen printing.

\n\n

The grid is a crucial part of this process. Unfortunately, it\u2019s not enabled by default, so the first thing I do is turn it on, and configure it with a \u2018Size\u2019 of 25 mil2, and an \u2018Alt\u2019 of 5 mil. I\u2019ve also found that the default board shape isn\u2019t aligned to the grid, so the easiest thing is to simply delete this and re-draw the outline.

\n\n

\n\n

Since this was my first PCB, I left routing to the auto-router and, while this gave me a few more vias than I suspect I need, I\u2019m pretty pleased with the outcome:

\n\n

\"EagleCAD

\n

Ordering the Board

\n

I turned to OSHPark for manufacture. Ordering is just a matter of uploading the EagleCAD board file, and they generate previews immediately, helping to give me confidence in the design.

\n\n

All told, the minimum order of three boards cost me $30 for a rush job. Had I been more patient, I could have saved myself $15. They turned up a week later, ready for soldering:

\n\n

\"Custom

\n\n

I already see a few things I\u2019d like to improve for the next version:

\n\n\n

Assembly

\n

Much to my surprise, placing the components on the board went surprisingly smoothly. Even my surface mount soldering worked first-time around\u2013I\u2019m starting to learn the benefits of a hot soldering iron, lashings of flux, and quick, deliberate action.

\n\n

\n

Finishing Up

\n

The breadboard is already earmarked for another project, and I very much enjoyed stripping it down now the keyboard has found a new home:

\n\n

\n\n
\n
\n
    \n\n
  1. \n

    I took a passing look at the \u2018con-lsta\u2019, \u2018con-lstb\u2019, and \u2018pinhead\u2019 libraries which provide default 100 mil header components, but ultimately these were less convenient than using Adafruit\u2019s own components.\u00a0\u21a9

    \n
  2. \n\n
  3. \n

    From Wikipedia: \u201cA thousandth of an inch is a derived unit of length in an inch-based system of units. Equal to \u200b1\u20441000 of an inch, it is normally referred to as a thou /\u02c8\u03b8a\u028a/, a thousandth, or (particularly in the United States) a mil.\u201d\u00a0\u21a9

    \n
  4. \n\n
\n
\n
", "url": "https://jbmorley.co.uk/posts/2018-04-07-keyboard-electronics/"}, {"title": "Psion Bluetooth Keyboard", "id": "https://jbmorley.co.uk/posts/2018-03-11-psion-bluetooth-keyboard/", "date_published": "2018-03-11T00:00:00+00:00", "content_html": "

\"Series

\n\n

The Psion Series 5 keyboard is arguably one of the best mobile device keyboards ever made. Heck, there\u2019s even an Indiegogo campaign\u2013the Gemini from Planet Computers\u2013to bring it back in the form of an Android PDA.

\n\n

Given the dearth of high quality small bluetooth keyboards, I\u2019ve been wondering for quite some time if it would be possible to instead use the keyboard from a broken Series 5. A few weeks ago, I purchased such a Series 5 from eBay and set about giving it a shot.

\n

Hardware

\n

Upon receipt of delivery, I set about disassembling the Series 5, extracting the keyboard, and figuring out how it connects to the mainboard:

\n\n

\"Cable\"

\n\n

As you can see, that\u2019s a 20 way FFC (Flexible Flat Cable). What you can\u2019t see from the photo, is that it\u2019s actually connected to a 22 way ZIF connector. Forutnately, the Psion Series 5 Service Manual helps clear up this discrepancy:

\n\n
\n

The Series 5 keyboard contains a total of 53 keys, organised in a conventional QWERTY arrangement. The implementation is a departure from the S3a family of products, and features a separate keyboard switch matrix assembly which slides out as the LCD screen is opened. The electrical connection between the keyboard and the main Series 5 PCB is achieved by means of a 22 way Flat Flexi Cable (only 20 ways are used for keys), fitted to a 22 way ZIF connector. The outside pins on the flexi are the grounded to allow a for a ground ring on the keyboard membrane to improve ESD protection.

\n
\n\n

This means that, while I should use a 22 way connector, it\u2019s sufficient to connect up only 20 of those pins. Searching Amazon, I managed to find a suitable connector, and breakout board. Fortunately\u2013given my lack of surface mount soldering experience\u2013these both came in large quantities:

\n\n

\"Ribbon

\n\n

For debugging purposes, I used a breadboard to connect this to the many GPIO pins of a Raspberry Pi:

\n\n

\"Raspberry

\n

Protocol

\n

To check that the keyboard was functional (and help figure out how it works), I reassembled the internals, and James and I spent an enjoyable few hours probing the keyboard connector with a multimeter:

\n\n

\"Ad

\n\n

We identified ground (as described in the service manual), discovered some pins were consistently high, and that the others were fluttering around low:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PinBehaviour
0Ground
1~ Low
2~ Low
3~ Low
4~ Low
5~ Low
6~ Low
7~ Low
8~ Low
9~ Low
10~ Low
11~ Low
12High
13High
14High
15~ Low
16High
17High
18High
19High
20High
21Ground
\n\n

Having been involved in the OpenPsion project to port Linux to various Psion devices, I had been hopeful that this, coupled with the observations above, would suggest how to read the hardware. Sadly, while Tony Lindgren\u2019s Series 5mx and Revo kernel patches are (wonderfully) still online, and the keyboard driver does indeed confirm the scanning matrix implied above, it\u2019s too far removed from the hardware layout to be clear on the details.

\n\n

Instead, the breakthrough came when James discovered Rasmus Backman\u2019s Psio\u03c0 project on Hackaday. In it, he details the process of building a USB adapter for the Series 5 keyboard as part of an ambitious project to build a Raspberry Pi powered Psion. It even includes the following diagram showing the layout of the keyboard matrix, and explanation of how to scan:

\n\n

\"Pin-out\"

\n\n

Reverse Engineering the Keyboard, Part I

\n\n

Scanning the keyboard:

\n\n
\n
    \n
  1. First of all, all pins are set to Inputs. This makes them high-impedance.
  2. \n
  3. The internal pull-up resistors are enabled on the column pins. This turns them logic HIGH.
  4. \n
  5. Then, one row at a time is turned to an output and driven low.
  6. \n
  7. Check the status on the column pins. A logic LOW signal means that column is connected to the active row because that key is pressed.
  8. \n
  9. When the matrix is scanned, it is compared to the last known state. Then we send \u2018pressed\u2019 scancodes for the newly pressed keys, and \u2018released\u2019 scancodes for the keys that has been released.
  10. \n
  11. Repeat from step 3.
  12. \n
\n
\n\n

Reverse Engineering the Keyboard, Part IV

\n\n

Coupled with our earlier pin mapping, this got us off to a great start. What proved a little confusing however was that\u2013for my Series 5 keyboard at least\u2013the key mapping was subtly incorrect: Fn, Menu, Esc and Ctrl did not appear to be working. After some experimentation, I realised that rows 9, 10, and 11 were, in fact, columns, leading to the following revised layout:

\n\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Col 01 (15)Col 02 (11)Col 03 (10)Col 04 (9)Col 05 (8)Col 06 (7)Col 07 (6)Col 08 (5)Col 09 (4)Col 10 (3)Col 11 (2)Col 12 (1)
Row 01 (20)SpaceUp. /LeftRightLeft Shift
Row 02 (19)ZXCVBNRight Shift
Row 03 (18)HJKM. ?DownFn
Row 04 (17)TabASDFGLeft Control
Row 05 (16)123456
Row 06 (14)UIOPLEnterMenu
Row 07 (13)QWERTYEsc
Row 08 (12)7890Del\u2018 -
\n\n

Looking back at the observations made when inspecting the powered-up Series 5 with a multimeter, this allocation of pins corresponds reassuringly with the behviour we were seeing from the Psion itself.

\n

Bluetooth

\n

Since it\u2019s clearly is overkill to use a Raspberry Pi, I chose the Adafruit Feather nRF52 Bluefruit LE - nRF52832 for the Bluetooth controller. It supports Bluetooth LE, has 19 GPIO pins, and an Arduino-friendly microcontroller. There\u2019s even an Adafruit HID library and an introductory guide.

\n\n

All told, the nRF52 is a great solution with only one minor limitation: the keyboard has 20 connections, but the board only 19 GPIOs pins. Fortunately the solution is a simple one: combine two of the columns into one. I chose to short pins 1 and 4, moving Ctrl onto column 9, alongside Fn.

\n\n

The firmware itself is fairly simple, using a tight loop to iterate over the columns and rows as described above. These are then converted to standard Bluetooth HID events, with Psion specific modifiers being handled locally to ensure the behaviour matches the keycaps. To give as much flexibility as possible, the Fn and Menu keys are treated as Alt and Command respectively when not used for these local key combinations.

\n\n
for (int c = 0; c < MAX_COLUMNS; c++) {\n    int column = COLUMNS[c];\n\n    // Pull the column low.\n    pinMode(column, OUTPUT);\n    digitalWrite(column, LOW);\n    delay(5);\n\n    // Iterate over the rows, reading their state.\n    for (int r = 0; r < MAX_ROWS; r++) {\n            \n            int keyDown = (digitalRead(ROWS[r]) == LOW) ? 1 : 0;\n            int currentKeyDown = keyboardState[c][r];\n            \n            if (keyDown != currentKeyDown) {\n                    char character = CHARACTER_MAP[c][r];\n                    if (character != HID_KEY_NONE) {\n                            sendKey(character, keyDown);\n                            keyboardState[c][r] = keyDown;\n                    }\n            }\n    }\n\n    // Restore the column.\n    pinMode(column, INPUT_PULLUP);\n}\n
\n\n

With this, I now have a fully functional\u2013albeit not terribly portable\u2013keyboard. I\u2019ve even managed to get the Psion specific key presses working, including adjusting the display brightness using the LCD contrast keys:

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2018-03-11-psion-bluetooth-keyboard/"}, {"title": "Raspberry Pi Setup", "id": "https://jbmorley.co.uk/posts/2018-02-20-raspberry-pi-setup/", "date_published": "2018-02-20T00:00:00+00:00", "content_html": "

Setting up a Raspbery Pi can be a little troublesome when you have limited connectivity options: without a monitor, keyboard, and mouse, network cable, or serial cable, it can be hard to see how to bootstrap the process.

\n\n

It\u2019s actually possible to configure many aspects of the Pi by modifying files on the FAT32 \u2018boot\u2019 partition of a standard Raspbian install. I tend to go through the following steps when setting up a new Raspberry Pi:

\n\n
    \n
  1. Install Raspbian
  2. \n
  3. Configure WiFi
  4. \n
  5. Enable SSH
  6. \n
  7. Discover the IP address
  8. \n
  9. Connect using SSH
  10. \n
  11. Enable VNC
  12. \n
\n\n
\n

Install Raspbian

\n

Download and install the latest Raspbian distribution from the Raspberry Pi downloads page, and follow the installation guide. The following instructions will work with both the \u2018Desktop\u2019 and \u2018Lite\u2019 distributions, so pick whichever is best suited to your needs.

\n

Configure WiFi

\n

Create a file named wpa_supplicant.conf on the newly created \u2018boot\u2019 partition of your microSD card, entering your own network name, pre-shared key, and changing the country and security type if necessary:

\n\n
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev\nupdate_config=1\ncountry=GB\n\nnetwork={\n    ssid=\"<Network Name>\"\n    psk=\"<Pre-Shared Key>\"\n    key_mgmt=WPA-PSK\n}\n
\n\n

This will be used to update /etc/wpa_supplicant/wpa_supplicant.conf on the next boot.

\n\n

There\u2019s a pretty good discussion on Stack Exchange, and you can find more details of the wpa_supplicant.conf file and general command-line WiFi configuration in the Raspberry Pi documentation.

\n

Enable SSH

\n

In order to be able to connect to the Pi, you\u2019ll need to enable SSH. This can be done by creating a empty file named ssh on the \u2018boot\u2019 partition of your microSD card; the presence of this file will enable SSH access on subsequent boots.

\n\n

For example, on a Mac:

\n\n
touch /Volumes/boot/ssh\n
\n

Discover the IP address

\n

In order to be able to connect to the Rapsberry Pi, you\u2019ll need to find its IP address.

\n\n

Return your microSD card to the Raspberry Pi and power it on. Once it has booted, you can discover the device on the network using the nmap command, substituting 10.0.0.1 with your own IP address:

\n\n
sudo nmap -sPn 10.0.0.1/24\n
\n\n

This will scan your current subnet for other devices. By default, your Raspberry Pi will have a hostname of raspberrypi, making it fairly easy to find. (You may wish to change this using raspi-config for ease of identification in the future.)

\n

Connect using SSH

\n

Since we enabled SSH access in an earlier step, connecting to the Raspberry Pi should simply be a matter of using SSH (remember to substitute the IP address below for the one you discovered using nmap):

\n\n
ssh pi@10.0.0.154\n
\n\n

The default password is raspberry. You\u2019ll be prompted to change this on first log in.

\n

Enable VNC

\n

If you\u2019re running a Desktop distribution, you might find it useful to use VNC. There are great step-by-step instructions in the Raspberry Pi documentation.

\n\n

In short, you will need to install the RealVNC VNC Server as follows:

\n\n
sudo apt-get update\nsudo apt-get install realvnc-vnc-server realvnc-vnc-viewer\n
\n\n

After this, you can enable the VNC Server by running the interactive raspi-config utility:

\n\n
sudo raspi-config\n
\n\n

From here, you will need to select 5 Interfacing Options, P3 VNC, then <Yes>. I also find it useful to increase the display resolution, in 7 Advanced Options1.

\n\n

If you want to use VNC Connect\u2013which allows you to connect back to you Pi, even if you\u2019re on a different network\u2013you will first need to connect over the local network, then sign in to your VNC Connect account using UI as there\u2019s no command-line mechanism to do so.

\n\n
\n
\n
    \n\n
  1. \n

    If you require a non-standard resolution, you can specify this by editing config.txt on the \u2018boot\u2019 volume and setting framebuffer_width and framebuffer_height. These will override the raspi-config settings.\u00a0\u21a9

    \n
  2. \n\n
\n
\n
", "url": "https://jbmorley.co.uk/posts/2018-02-20-raspberry-pi-setup/"}, {"title": "Upside", "id": "https://jbmorley.co.uk/posts/2018-02-18-upside/", "date_published": "2018-02-18T00:00:00+00:00", "content_html": "

\"Upside\"

\n\n

I have recently been looking for a simple design with which to start learning Autodesk Fusion 360, and to try out Shapeways\u2018 Porcelain Ceramic material.

\n\n

One project I\u2019ve been contemplating for some time is something to help balance shampoo bottles upside-down when they\u2019re near empty. The solution\u2013a simple doughnut-like hollow cylinder\u2013seemed like a good candidate:

\n\n

\"First

\n\n

First model in Fusion 360

\n\n

The idea is that you rest the bottle atop the ceramic base most of the time and, when you eventually need to stand it upside-down, you invert it and place the lid in the central hole: I\u2019m tentatively calling it 'Upside\u2019.

\n\n

The base modelling is fairly simple: drawing and extruding two concentric circles, then filleting the resulting edges. I parametrised the dimensions, so it\u2019s easier to adapt it to different bottles.

\n\n

What makes things a little interesting is that tolerances for porcelain are large: Shapeways states, \u2018\u00b1 3% shrinkage + 0.2-1.0 mm of glaze\u2019. Since this particular design works if things are a little too big, but fails entirely if it\u2019s too small (and the lid of the bottle doesn\u2019t fit inside the central hole), I simply scaled the whole model by a factor of 1.03.

\n\n

\"Drawing\"

\n\n

Original dimensions

\n\n

Overall things shrank a little more than I expected as I forgot to account for the glaze. Including this, it does indeed look like roughly 3% shrinkage:

\n\n\n\n

Given the 3D printed nature of the design, I had expected it to be fairly precise. Instead, the print has a somewhat handmade, almost wabi-sabi look about it. That was disappointing at first, but I\u2019m coming to like the result. The base is un-glazed, and has a fairly rough, abrasive texture, and might perhaps benefit from a piece of cork.

\n\n\n\n

You can download the original model here, and I\u2019ve also uploaded it to Thingiverse.

\n
", "url": "https://jbmorley.co.uk/posts/2018-02-18-upside/"}, {"title": "Scripting Photos", "id": "https://jbmorley.co.uk/posts/2018-02-14-scripting-photos/", "date_published": "2018-02-14T00:00:00+00:00", "content_html": "

Sometimes, when editing photos, it\u2019s useful to be able to copy the GPS location of one photo, and assign it to another. This was supported in iPhoto using the \u2018Paste Location\u2019 menu option, but not in Photos.

\n\n

Using JavaScript\u2013which is now a first-class citizen in macOS Automation\u2013it\u2019s easy to use JSON to transfer this data via the clipboard.

\n\n

First, copy the details of the selected photo to the clipboard (date and location in this example):

\n\n
photos = Application('Photos');\nphotos.includeStandardAdditions = true;\nphotos.activate();\nitem = photos.selection()[0];\ndetails = {\"location\": item.location(), \"date\": item.date()};\nphotos.setTheClipboardTo(JSON.stringify(details));\n
\n\n

Next, retrieve these same details from the clipboard, and update the newly-selected photo:

\n\n
photos = Application('Photos');\nphotos.includeStandardAdditions = true;\nphotos.activate();\nitem = photos.selection()[0];\ndetails = JSON.parse(photos.theClipboard());\nitem.location = details[\"location\"];\nitem.date = new Date(details[\"date\"]);\n
\n\n

While JavaScript makes it wonderfully easy to implement this functionality, it may not be immediately apparent how to create a git-friendly plain text script file which macOS automation knows to treat as JavaScript. I\u2019ve found the easiest solution is to create an executable script and specify the interpreter as \u00a0osascript, passing the language flag to explicitly specify the language as follows:

\n\n
#!/usr/bin/osascript -l JavaScript\n\nphotos = Application('Photos');\n...\n
\n
", "url": "https://jbmorley.co.uk/posts/2018-02-14-scripting-photos/"}, {"title": "Rethinking Nixie Tubes", "id": "https://jbmorley.co.uk/posts/2018-02-04-rethinking-nixie-tubes/", "date_published": "2018-02-04T00:00:00+00:00", "content_html": "

\"Exixe

\n\n

A few weeks ago, I wrote about my plans to build a Nixie tube Anytime clock. Unfortunately Switchmode Design\u2013from whom I purchased my first Nixie tube control board\u2013has disappeared from Shopify. Having only acquired a single control board, this means I need to rethink my approach to controlling my Nixie tubes.

\n\n

After some research, I\u2019ve settled on using the exixe driver module from dekuNukem. I had originally thought these over-engineered, and had been hopeful of assembling my own solution, but on further consideration, they seem the pragmatic approach.

\n\n

I will continue to use the original nixie tube as an opportunity to experiment with different approaches to wiring up the board and Raspberry Pi, and various case designs.

\n
", "url": "https://jbmorley.co.uk/posts/2018-02-04-rethinking-nixie-tubes/"}, {"title": "Color Palettes", "id": "https://jbmorley.co.uk/posts/2018-02-03-color-palettes/", "date_published": "2018-02-03T00:00:00+00:00", "content_html": "\n\n

Anyone who knows me knows I like my floral shirts. With a view to better understanding the kinds of patterns I like (and to perhaps help me create something in the future), I\u2019ve started cataloguing the patterns, textures and colors I encounter\u2013both man-made, and natural\u2013in everyday life.

\n\n

A large part of a successful print is its color palette, so I\u2019m keen to include this too. The Adobe Kuler app (now Adobe Capture) offers this functionality, but doesn\u2019t record the image alongside the palette. It also seems to have a tendency of dropping some of the more meaningful colors, perhaps in an effort to produce a more pleasing palette.

\n\n

I tried a couple of different approaches to determining an appropriate color palette myself, starting with a quantize operation before discovering K-means clustering.

\n

Quantize

\n

My first attempt was to quantize the image using ImageMagick:

\n\n
convert original.jpg -separate -threshold 50% -combine threshold.gif\n
\n\n

While this results in a fun image that evokes video games from the 80s, it simply reduces it to an 8-bit palette, loosing all the information we wish to capture:

\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

K-Means

\n

There\u2019s a pretty good discussion on Stack Overflow, which ultimately links to the OpenCV tutorial on K-Means Clustering. While nowhere near as exciting as the results from the quantize operation, this approach results in a palette much closer to that of the original image:

\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n

Unfortunately, this seems to result in a somewhat subdued version of the original. Increasing the clusters to 16 can help address this, but those beautiful pinky colours on the tips of the leaves are still missing:

\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n

There\u2019s clearly some more work to be done in selecting the more saturated/vivid colors from the clusters.

\n", "url": "https://jbmorley.co.uk/posts/2018-02-03-color-palettes/"}, {"title": "Beautiful Paper", "id": "https://jbmorley.co.uk/posts/2018-01-28-beautiful-paper/", "date_published": "2018-01-28T00:00:00+00:00", "content_html": "

\"Katazomi-shi

\n\n

I recently purchased three sheets of Katazome-shi from The Paper Place. Their library is absolutely fantasitc, sizeable, and well worth checking out. If you\u2019re interested, I bought 053, 136, and 144.

\n\n

While the timing didn\u2019t work out on the intended project, I\u2019m excited to make use of it in the future. In the short term, seeing the sheets about the apartment has motivated me to start collecting the patterns I encounter on a daily basis.

\n
", "url": "https://jbmorley.co.uk/posts/2018-01-28-beautiful-paper/"}, {"title": "Cropping PDF Documents", "id": "https://jbmorley.co.uk/posts/2018-01-08-cropping-pdf-documents/", "date_published": "2018-01-08T00:00:00+00:00", "content_html": "

Sometimes it\u2019s useful to be able to crop all pages in a PDF document. ImageMagick1 can do this, but the command you\u2019ll need is a little nuanced:

\n\n
convert \\\n    -density 300 \\\n    -crop 2550x3616+0+0 \\\n    +repage \\\n    input.pdf \\\n    -density 300 \\\n    -compress jpeg \\\n    -quality 75 \\\n    output.pdf\n
\n

Input File

\n\n

Output File

\n\n\n
\n
\n
    \n\n
  1. \n

    ImageMagick is available through Homebrew on macOS, and can be installed with the command brew install imagemagick.\u00a0\u21a9

    \n
  2. \n\n
\n
\n
", "url": "https://jbmorley.co.uk/posts/2018-01-08-cropping-pdf-documents/"}, {"title": "Adidas Posters", "id": "https://jbmorley.co.uk/posts/2018-01-07-adidas-posters/", "date_published": "2018-01-07T00:00:00+00:00", "content_html": "

Every time I visit Phil\u2013a hipster bookstore and coffee shop in Vienna\u2013I\u2019m struck by the wonderful hand drawn Adidas adverts they have along one of the walls.

\n\n\n\n

While perhaps not the most politically correct, these are a fantastic example of late 70s/early 80s fashion and design.

\n
", "url": "https://jbmorley.co.uk/posts/2018-01-07-adidas-posters/"}, {"title": "Bread", "id": "https://jbmorley.co.uk/posts/2018-01-02-bread/", "date_published": "2018-01-02T00:00:00+00:00", "content_html": "

When I have time, I like to bake my own bread. It\u2019s a very simple recipe Junko kindly gave me, and I thought it might be nice to share here.

\n\n

\"Freshly

\n

Ingredients

\n\n

Method

\n
    \n
  1. Combine the flour, yeast, and salt in a large bowl.
  2. \n
  3. Cut the butter into small pieces and add it to the bowl.
  4. \n
  5. Crumble the butter and flour by rubbing the mixture between your fingertips until no lumps of butter remain.
  6. \n
  7. Make a small well in the centre of the mixture, and add the warm water. Stir gently with a spoon, folding the flour and water together.
  8. \n
  9. Once it becomes difficult to stir, knead by hand for 5 to 10 minutes. The dough should leave the bowl clean, and shouldn\u2019t stick to your hand: if the mixture seems to be too dry to clean the bowl, add a drop more water; too sticky, add a pinch more flour.
  10. \n
  11. Place a damp cloth (I use a tea towel) over the top of the bowl, and leave the dough to rest in a warm place for between 30 minutes and an hour. It should roughly double in size during this time. If your kitchen is short on warm places, you can always rest the bowl inside a larger bowl or pan of warm water.
  12. \n
  13. Once it has risen, put a little flour on hands and knead the dough back down a little. Add some dried fruit or nuts (raisins, cranberries, walnuts, etc) at this point if you would like.
  14. \n
  15. Gently press the dough into an un-greased loaf tin, levelling the top.
  16. \n
  17. Bake in a fan oven at 230\u00baC (450\u00baF) for 15 minutes.
  18. \n
  19. Reduce the temperature to 200\u00baC (400\u00baF), and bake for a further 15 minutes.
  20. \n
  21. Remove the bread from the loaf tin, and leave to stand on a cooling rack.
  22. \n
\n\n

\"Sliced

\n
", "url": "https://jbmorley.co.uk/posts/2018-01-02-bread/"}, {"title": "Calendar 2018", "id": "https://jbmorley.co.uk/posts/2018-01-01-calendar-2018/", "date_published": "2018-01-01T00:00:00+00:00", "content_html": "

Featuring Paris, the Bay Area Maker Faire, Seattle, Portland, Seattle (again), A\u00f1o Nuevo State Park, Honolulu, San Francisco, and Vancouver.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2018-01-01-calendar-2018/"}, {"title": "Lollip 2018", "id": "https://jbmorley.co.uk/posts/2018-01-01-lollip-2018/", "date_published": "2018-01-01T00:00:00+00:00", "content_html": "

The annual desk calendar, featuring Lollip\u2019s many adventures in Vienna, Paris, Budapest, Sch\u00f6nbrunn, Santa Clara, and Honolulu.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2018-01-01-lollip-2018/"}, {"title": "Anytime Clock", "id": "https://jbmorley.co.uk/posts/2017-12-31-anytime-clock/", "date_published": "2017-12-31T00:00:00+00:00", "content_html": "

A little over a year ago, I created the Anytime platform as a way of keeping track of the time of day for various friends, family, and colleagues. It\u2019s especially useful now Junko and I are living on different sides of the Atlantic.

\n\n

The Anytime iOS app and widget are great when on-the-go, but they don\u2019t provide the same immediacy as a physical clock. So, after some encouragement by a colleague, I started work on a Nixie tube Anytime clock.

\n\n

\"First

\n\n

Pictures do not do Nixie tubes justice; they have a beautiful blue glow when seen in the flesh.

\n\n

Being one of my more complex electronics projects in a while, I decided to start simple, using the \u2018Smart Nixie tube\u2019 kit from Switchmode Design. I\u2019m glad I did\u2014even remembering how to read resistors presented a challenge:

\n\n

\"Learning

\n\n

Much to my surprise, everything worked first time\u2014more a comment on fantastic instructions than on my soldering skills.

\n\n

\"Completed

\n\n

The board can be controlled over serial, and supports chaining of up to six digits. I plan to purchase a further three kits to produce a four digit clock. Control will ultimately be performed by a Raspberry Pi (most likely a Zero), for which I\u2019ve already produced a small Python Anytime client:

\n\n

\"Raspberry

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-31-anytime-clock/"}, {"title": "Railway Journeys", "id": "https://jbmorley.co.uk/posts/2017-12-30-railway-journeys/", "date_published": "2017-12-30T00:00:00+00:00", "content_html": "

Ever since travelling on the Trans-Siberian Railway some 10 years ago, I\u2019ve wondered how one might capture such a journey: photos do not do the ever-changing view justice, and video remains difficult to consume. Even time-lapse videos do not allow the journey to be viewed as a whole, meaning macro changes are lost.

\n\n

On a recent trip from London Euston to Chester, I tried something new. Using the very simple technique of joining fixed-width strips from each frame of a video, I was able to produce the following:

\n\n

\"London

\n\n

This represents about 2 minutes of video with each frame contributing 2 pixels to the overall image. Increasing the width of each frame to 5 pixels, objects on the horizon have roughly the correct proportions:

\n\n

\"Euston

\n\n

The vertical banding is the result of objects in the foreground, such as a lamp posts or telegraph poles, which fill a full frame of video. It should be possible to remove these with some basic image analysis, comparing neighbouring frames and simply dropping any frame that differs too much from previous and subsequent frames.

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-30-railway-journeys/"}, {"title": "Configuring Jenkins Timeouts", "id": "https://jbmorley.co.uk/posts/2017-12-22-configuring-jenkins-timeouts/", "date_published": "2017-12-22T00:00:00+00:00", "content_html": "

I\u2019ve started using Jenkins to allow me to conveniently update and build this website on the go. In the process, I had to tweak a few settings, including timeouts, which proved more involved that expected.

\n\n

The default Git timeout is 10 minutes; often too short, especially for repositories using git-lfs. While there are ways to adjust this for some steps using the UI, the only way to affect all of them is to change the Jenkins-wide environment variable.

\n\n

On Ubuntu, you can set this by editing /etc/default/jenkins and updating the JAVA_ARGS value to include a define for org.jenkinsci.plugins.gitclient.Git.timeOut (specified in minutes) as follows:

\n\n
JAVA_ARGS=\"-Djava.awt.headless=true -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=600\"\n
\n\n

You can verify your new settings have taken by checking the build\u2019s console output. Commands are postfixed with a comment showing the timeout for each step. For example,

\n\n
 > git config remote.origin.url git@github.com:jbmorley/jbmorley.co.uk.git # timeout=600\n
\n\n

If you are running a setup with multiple slaves, you will need to perform this same configuration for each slave.

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-22-configuring-jenkins-timeouts/"}, {"title": "JSON Feed", "id": "https://jbmorley.co.uk/posts/2017-12-22-json-feed/", "date_published": "2017-12-22T00:00:00+00:00", "content_html": "

This site now supports the wonderful JSON Feed by Manton Reece and Brent Simmons.

\n\n

Subscribe: Feedly

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-22-json-feed/"}, {"title": "Early Video", "id": "https://jbmorley.co.uk/posts/2017-12-20-early-video/", "date_published": "2017-12-20T00:00:00+00:00", "content_html": "

When I first acquired a webcam back in the 90s, Mike was playing around and managed to capture this video (sound effects entirely unintentional, and we can\u2019t remember what created them). Perhaps it\u2019s easy to see why neither of us ended up making YouTube videos.

\n\n

\n\n

It\u2019s surprising that this remained on my hard drive, ready to be discovered some 20 years later.

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-20-early-video/"}, {"title": "Robert Fulton", "id": "https://jbmorley.co.uk/posts/2017-12-11-robert-fulton/", "date_published": "2017-12-11T00:00:00+00:00", "content_html": "

Some time ago, I came across the following quote by Robert Fulton, an American engineer from the mid 1700s credited with developing the steamboat. Ignoring for a moment the unfortunately gendered language, the quote translates well to modern software engineering:

\n\n
\n

As the component parts of all new machines may be said to be old[,] it is a nice discriminating judgement, which discovers that a particular arrangement will produce a new and desired effect. \u2026 Therefore, the mechanic should sit down among levers, screws, wedges, wheels, etc. like a poet among the letters of the alphabet, considering them as the exhibition of his thoughts; in which a new arrangement transmits a new idea to the world.

\n
\n\n

\n A Treatise on the Improvement of Canal Navigation, 1796\n

\n\n

While the first sentence might seem less relevant in the modern domain of software engineering, it\u2019s important to remember we\u2019re already building atop foundations decades old.

\n
", "url": "https://jbmorley.co.uk/posts/2017-12-11-robert-fulton/"}, {"title": "Google Doodles", "id": "https://jbmorley.co.uk/posts/2017-07-03-google-doodles/", "date_published": "2017-07-03T09:38:22.602694+00:00", "content_html": "

Over the years, I\u2019ve collected one or two of the Google Doodles that make me smile, and I thought I\u2019d post them here for posterity; these remain one of remain one of Google\u2019s most charming features.

\n

Audrey Hepburn\u2019s 85th Birthday

\n

\"Audrey

\n

255th Anniversary of the British Museum

\n

\"255th

\n\n

If you\u2019re wondering why you haven\u2019t seen this one before, it\u2019s from the UK homepage.

\n

\u00a0Leap Year, 2016

\n

\"Leap

\n

\u00a0Birthday

\n

\"Birthday\"

\n

Beijing Olympics

\n

\"Beijing

\n
", "url": "https://jbmorley.co.uk/posts/2017-07-03-google-doodles/"}, {"title": "IHOP", "id": "https://jbmorley.co.uk/posts/2017-01-21-ihop/", "date_published": "2017-01-21T00:00:00+00:00", "content_html": "

Today, Junko and I enjoyed a truly American breakfast at IHOP, the International House of Pancakes. It was a wonderful way to spend the morning together, and we later retired to Chromatic for their slightly higher quality beverages.

\n\n

\"Junko\"

\n
", "url": "https://jbmorley.co.uk/posts/2017-01-21-ihop/"}, {"title": "Calendar 2017", "id": "https://jbmorley.co.uk/posts/2017-01-01-calendar-2017/", "date_published": "2017-01-01T00:00:00+00:00", "content_html": "

Featuring Cuba, Oslo, Slovenia, Venice, South Africa, Lisbon, and Vienna.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2017-01-01-calendar-2017/"}, {"title": "Lollip 2017", "id": "https://jbmorley.co.uk/posts/2017-01-01-lollip-2017/", "date_published": "2017-01-01T00:00:00+00:00", "content_html": "

The now-annual calendar featuring Lollip (with a guest appearance by Rippy), on location in Slovenia, Kahlenberg, Cambridge University Botanic Garden, The Belvedere, A\u00f1o Nuevo State Park, and Vienna.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2017-01-01-lollip-2017/"}, {"title": "Classic Wallpapers", "id": "https://jbmorley.co.uk/posts/2016-11-23-classic-wallpapers/", "date_published": "2016-11-23T00:00:00+00:00", "content_html": "

Overcome by a wave of nostalgia, I recently booted up my SheepSaver Mac OS 9 installation and put together a collection of all the system wallpapers.

\n\n\n\n

Download

\n\n

If you\u2019re looking for something a little higher resolution, Louie Mantia has a fantastic re-render of the \u2018Mac OS Default\u2019 pattern on his wallpapers page.

\n
", "url": "https://jbmorley.co.uk/posts/2016-11-23-classic-wallpapers/"}, {"title": "Psion MC 400", "id": "https://jbmorley.co.uk/posts/2017-07-04-psion-mc-400/", "date_published": "2016-11-04T03:19:04.838847+00:00", "content_html": "

Some time ago, one of my colleagues very kindly brought in his Psion MC 400 to let me try it out and take some photos.

\n\n

\n\n

Considering it was released in 1989, the device is well featured, even sporting a trackpad (though the absolute positioning proves somewhat confusing when you\u2019re used to today\u2019s laptops).

\n\n

\n\n

The OS has a \u2018System\u2019 folder giving access to all the applications. It\u2019s not hard to see how this evolved into the silkscreen buttons of the Series 3 and Series 5 palmtops.

\n\n

\n\n

Another feature that made it across to the Series 3 devices was the Psion key though, disappointingly, it was replaced with the far more generic \u2018Fn\u2019 key on the Series 5.

\n\n

\n\n

Just like the Psion key, many charming design elements of the Series 3 have their origins in the MC series of devices. The badging, colour accents, typography, and ridges in the plastic housing (seen above), can all be found in the Series 3.

\n\n

\n\n

The MC 400 even sported Psion\u2019s own \u2018SSD\u2019 external media, which could be found in both a write-once flash version, and the a expensive read-write battery-backed form.

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2017-07-04-psion-mc-400/"}, {"title": "JavaScript Clocks", "id": "https://jbmorley.co.uk/posts/2016-10-23-javascript-clocks/", "date_published": "2016-10-23T00:00:00+00:00", "content_html": "

Earlier this year, I created a JavaScript analogue clock for a side-project. The clock never made it into shipping code, so I thought I\u2019d share it here for posterity.

\n\n\n\n

\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n

The HTML is more complex than I might like:

\n\n
<div class=\"clock-container\">\n    <div class=\"clock-body\">\n        <div class=\"clock-hours\"></div>\n        <div class=\"clock-center-shadow\"></div>\n        <div class=\"clock-minutes\"></div>\n        <div class=\"clock-center\"></div>\n        <div class=\"clock-seconds\"></div>\n        <div class=\"clock-center-seconds\"></div>\n    </div>\n</div>\n
\n\n

And, as always, the CSS is incredibly verbose:

\n\n
.clock-container {\n    background: #324B72;\n    padding: 32px 0;\n    margin: 0;\n    border-radius: 6px;\n    text-align: center;\n}\n\n.clock-body {\n    display: inline-block;\n    position: relative;\n    height: 200px;\n    width: 200px;\n    border: 8px solid #fff;\n    border-radius: 50%;\n    box-shadow:\n        0 0 5px rgba(0, 0, 0, 0.3),\n        inset 0 0 5px rgba(0, 0, 0, 0.3);\n    margin: 8px;\n}\n\n.clock-type-night {\n    background-color: rgba(0, 0, 0, 0.3);\n}\n\n.clock-type-day {\n    background-color: rgba(255, 255, 255, 0.3);\n}\n\n.clock-hours {\n    box-sizing: border-box;\n    background-color: #fff;\n    position: absolute;\n    width: 8px;\n    height: 50px;\n    border-radius: 4px;\n    bottom: 96px;\n    left: 96px;\n    transform-origin: 4px 46px;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n\n.clock-minutes {\n    box-sizing: border-box;\n    background-color: #fff;\n    position: absolute;\n    width: 6px;\n    height: 80px;\n    border-radius: 4px;\n    bottom: 97px;\n    left: 97px;\n    transform-origin: 3px 77px;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n\n.clock-center-shadow {\n    position: absolute;\n    width: 18px;\n    height: 18px;\n    background-color: #fff;\n    border-radius: 50%;\n    left: 91px;\n    top: 91px;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);    \n}\n\n.clock-center {\n    position: absolute;\n    width: 18px;\n    height: 18px;\n    background-color: #fff;\n    border-radius: 50%;\n    left: 91px;\n    top: 91px;\n}\n\n.clock-seconds {\n    box-sizing: border-box;\n    background-color: #aaa;\n    position: absolute;\n    width: 2px;\n    height: 100px;\n    border-radius: 4px;\n    bottom: 89px;\n    left: 99px;\n    transform-origin: 1px 89px;\n    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);\n}\n\n.clock-center-seconds {\n    position: absolute;\n    width: 8px;\n    height: 8px;\n    background-color: #aaa;\n    border-radius: 50%;\n    left: 96px;\n    top: 96px;\n}\n
\n\n

But at least the JavaScript is fairly simple:

\n\n
$(document).ready(function() {\n\n    var transform = function(degrees) {\n        return \"rotate(\" + degrees + \"deg)\";\n    }\n\n    var updateTime = function() {\n    \n        var now = new Date();\n        var hours = now.getHours();\n        var minutes = now.getMinutes();\n        var seconds = now.getSeconds();\n        \n        var hourDegrees = (hours * 30) + (minutes * 0.5);\n        var minuteDegrees = ((minutes * 60) + seconds) * 0.1;\n        var secondDegrees = (seconds * 6);\n        \n        $('.clock-hours').css(\"transform\", transform(hourDegrees));\n        $('.clock-minutes').css(\"transform\", transform(minuteDegrees));\n        $('.clock-seconds').css(\"transform\", transform(secondDegrees));\n\n    };\n\n    setInterval(updateTime, 1000);\n    updateTime();\n});\n
\n
", "url": "https://jbmorley.co.uk/posts/2016-10-23-javascript-clocks/"}, {"title": "Life in Vienna", "id": "https://jbmorley.co.uk/posts/2016-09-28-life-in-vienna/", "date_published": "2016-09-28T00:00:00+00:00", "content_html": "

With only a few days to go before moving out to California, I\u2019ve realised that I do not invest enough time in recording my life, here in Vienna, with Junko.

\n\n

Although it\u2019s the middle of the week\u2013and Junko doesn\u2019t have the freedom of the short break I have\u2013she kindly took the time to share a last (for the time being at least) tea in the lounge of Hotel Imperial. I enjoyed a plate of cheese, while she went for one of her club sandwiches and chips that always seem so amusingly uncharacteristic.

\n\n

\"Photo

\n\n

It feels like it\u2019s going to be quite some time before I get the opportunity to enjoy the excessive gold of Austria and Vienna.

\n
", "url": "https://jbmorley.co.uk/posts/2016-09-28-life-in-vienna/"}, {"title": "On-Demand 3D-Printed Parts", "id": "https://jbmorley.co.uk/posts/2016-04-08-on-demand-3d-printed-parts/", "date_published": "2016-04-08T00:00:00+00:00", "content_html": "

We often hear the promise that advances in 3D printing will provide a new supply chain model, giving us access to products for which there is otherwise insufficient demand; that, amongst other things, this is set to revolutionise the spare parts market, allowing companies to provide parts for any item on-demand.

\n\n

Unfortunately, although companies such as Shapeways offer comprehensive marketplaces for makers to sell their designs, these are flooded with novelty items (and gadget cases): items of which there is already a glut in traditional retail channels.

\n\n

You can imagine my excitement then when I recently had an opportunity to purchase a vaguely practical 3D-printed item which would not have otherwise been available:

\n\n

\"3DS

\n\n

Having switched to all digital downloads, my Nintendo 3DS now has an empty cartridge slot: ideal for collecting dust and a perfect point of structural weakness. Thanks to 3D printing, it\u2019s possible to purchase a blank 3DS cartridge from Shapeways. I opted for the \u2018Black Strong & Flexible\u2019 material \u2013 a matte textured plastic \u2013 and an very pleased with the result.

\n
", "url": "https://jbmorley.co.uk/posts/2016-04-08-on-demand-3d-printed-parts/"}, {"title": "Game Boy Cartridge", "id": "https://jbmorley.co.uk/posts/2016-03-23-game-boy-cartridge/", "date_published": "2016-03-23T00:00:00+00:00", "content_html": "

In the interests of restoring to Game Play Color some of the original Game Play design that didn\u2019t make the first-cut, I\u2019ve been gradually converting these elements over to pure HTML and CSS.

\n\n

One piece I found particularly daunting was the rendering of the original Game Boy cartridge used in the game library. The current version of Game Play Color sports a much simpler game library for this very reason.

\n\n

\n\n

On the left you can see the more skeuomorphic Game Play game library; on the right, the simpler Game Play Color game library.

\n\n

This has always felt like the lazy approach (and I\u2019m not a fan of exclusively flat design) so, a few days ago, I set about rectifying the situation:

\n\n\n\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Super Mario Land
\n
This Side Out
\n \n
\n
\n
\n
\n
\n
\n\n
\n\n

The HTML for this is fairly simple, though I\u2019m disappointed by the number of elements required, especially for the embossed bars across the top of the cartridge:

\n\n
<div class=\"cartridge\">\n    <div class=\"top\"></div>\n    <div class=\"logo\"></div>\n    <div class=\"lines\">\n        <div class=\"bar left one\"></div>\n        <div class=\"bar left two\"></div>\n        <div class=\"bar left three\"></div>\n        <div class=\"bar left four\"></div>\n        <div class=\"bar right one\"></div>\n        <div class=\"bar right two\"></div>\n        <div class=\"bar right three\"></div>\n        <div class=\"bar right four\"></div>\n    </div>\n    <div class=\"inset\">\n        <div class=\"label\">\n            <div class=\"title right\">Super Mario Land</div>\n            <div class=\"title left\">This Side Out</div>\n            <img src=\"mario.jpg\" />\n        </div>\n    </div>\n    <div class=\"edge left\"></div>\n    <div class=\"edge right\"></div>\n    <div class=\"arrow\"></div>\n</div>\n
\n\n

Unfortunately, the CSS proves a little more complex, with many special cases and absolute dimensions:

\n\n
.cartridge {\n    width: 140px;\n    height: 152px;\n    background-color: #848086;\n    position: relative;\n    box-shadow:\n        0 0 5px rgba(0, 0, 0, 0.6),\n        inset 0 1px 1px rgba(255, 255, 255, 0.6);\n    margin-top: 8px;\n    margin: auto;\n}\n\n.cartridge > .logo {\n    box-sizing: border-box;\n    position: absolute;\n    top: 4px;\n    left: 15px;\n    width: 110px;\n    height: 28px;\n    z-index: 10;\n    border-radius: 100px;\n    background: linear-gradient(top,\n                                rgba(0, 0, 0, 0.2),\n                                rgba(255, 255, 255, 0.2));\n    background: -moz-linear-gradient(top,\n                                     rgba(0, 0, 0, 0.2),\n                                     rgba(255, 255, 255, 0.2));\n    background: -webkit-linear-gradient(top,\n                                        rgba(0, 0, 0, 0.2),\n                                        rgba(255, 255, 255, 0.2));\n    box-shadow:\n        0 1px 1px rgba(255, 255, 255, 0.5),\n        inset 0 1px 1px rgba(0, 0, 0, 0.5);\n}\n\n.cartridge > .top {\n    box-sizing: border-box;\n    position: absolute;\n    content: \"\";\n    top: -8px;\n    left: 0;\n    background-color: #848086;\n    height: 10px;\n    box-shadow:\n        inset 0 1px 1px rgba(255, 255, 255, 0.6);\n    width: 90%;\n}\n\n.cartridge > .arrow {\n    box-sizing: border-box;\n    content: \"\";\n    position: absolute;\n    left: 60px;\n    bottom: 4px;\n    width: 19px;\n    height: 12px;\n    border-top: 1px solid rgba(0, 0, 0, 0.3);\n}\n\n.cartridge > .arrow:before, .cartridge > .arrow:after {\n    content: \"\";\n    width: 14px;\n    height: 0;\n    border-top: 1px solid rgba(255, 255, 255, 0.3);\n    position: absolute;\n    top: 4px;\n}\n\n.cartridge > .arrow:before {\n    transform: rotate(45deg);\n    -webkit-transform: rotate(45deg);\n    left: -2px;\n}\n\n.cartridge > .arrow:after {\n    transform: rotate(-45deg);\n    -webkit-transform: rotate(-45deg);\n    left: 7px;\n}\n\n.cartridge > .inset {\n    content: \"\";\n    position: absolute;\n    bottom: 20px;\n    left: 15px;\n    height: 92px;\n    width: 110px;\n    box-sizing: border-box;\n    border-radius: 3px;\n    box-shadow:\n        0 1px 1px rgba(255, 255, 255, 0.5),\n        inset 0 1px 1px rgba(0, 0, 0, 0.5);\n    padding: 2px;\n}\n\n.cartridge > .inset > .label {\n    width: 100%;\n    height: 100%;\n    background: linear-gradient(top,\n                                rgba(200, 200, 200, 1.0),\n                                rgba(170, 170, 170, 1.0));\n    background: -moz-linear-gradient(top,\n                                     rgba(200, 200, 200, 1.0),\n                                     rgba(170, 170, 170, 1.0));\n    background: -webkit-linear-gradient(top,\n                                        rgba(200, 200, 200, 1.0),\n                                        rgba(170, 170, 170, 1.0));\n    text-align: center;\n    border-radius: 1px;\n    box-shadow: inset 0 0 2px rgba(255, 255, 255, 0.4);\n    position: relative;\n}\n\n.cartridge > .inset > .label > .title {\n    position: absolute;\n    top: 40px;\n    font-size: 6px;\n    text-transform: uppercase;\n    font-family: Helvetica;\n    width: 106px;\n    text-align: center;\n}\n\n.cartridge > .inset > .label > .title.left {\n    transform: rotate(-90deg);\n    -webkit-transform: rotate(-90deg);\n    left: 45%;\n}\n\n.cartridge > .inset > .label > .title.right {\n    transform: rotate(90deg);\n    -webkit-transform: rotate(90deg);\n    left: -45%;\n}\n\n.cartridge > .inset > .label > img {\n    height: 100%;\n}\n\n.cartridge > .edge {\n    box-sizing: border-box;\n    position: absolute;\n    bottom: 0;\n    width: 4px;\n    height: 86px;\n    border-top: 1px solid rgba(255, 255, 255, 0.3);\n}\n\n.cartridge > .edge.left {\n    left: 0;\n    background: linear-gradient(left,\n                                rgba(0, 0, 0, 0.4),\n                                rgba(0, 0, 0, 0.2));\n    background: -moz-linear-gradient(left,\n                                     rgba(0, 0, 0, 0.4),\n                                     rgba(0, 0, 0, 0.2));\n    background: -webkit-linear-gradient(left,\n                                        rgba(0, 0, 0, 0.4),\n                                        rgba(0, 0, 0, 0.2));\n}\n\n.cartridge > .edge.right {\n    right: 0;\n    background: linear-gradient(right,\n                                rgba(0, 0, 0, 0.4),\n                                rgba(0, 0, 0, 0.2));\n    background: -moz-linear-gradient(right,\n                                     rgba(0, 0, 0, 0.4),\n                                     rgba(0, 0, 0, 0.2));\n    background: -webkit-linear-gradient(right,\n                                        rgba(0, 0, 0, 0.4),\n                                        rgba(0, 0, 0, 0.2));\n}\n\n.cartridge > .lines {\n    box-sizing: border-box;\n    position: absolute;\n    width: 100%;\n    height: 30px;\n    top: 6px;\n    left: 0;\n    overflow: hidden;\n}\n\n.cartridge > .lines > .bar {\n    box-sizing: border-box;\n    position: absolute;\n    width: 20px;\n    height: 4px;\n    box-shadow:\n        0 1px 1px rgba(255, 255, 255, 0.5),\n        inset 0 1px 1px rgba(0, 0, 0, 0.5);\n}\n\n.cartridge > .lines > .bar.left {\n    left: -4px;\n}\n\n.cartridge > .lines > .bar.right {\n    right: -4px;\n}\n\n.cartridge > .lines > .bar.one {\n    top: 0;\n}\n\n.cartridge > .lines > .bar.two {\n    top: 7px;\n    width: 16px;\n}\n\n.cartridge > .lines > .bar.three {\n    top: 14px;\n    width: 16px;\n}\n\n.cartridge > .lines > .bar.four {\n    top: 21px;\n}\n\n.cartridge > .lines > .bar.left.one,\n.cartridge > .lines > .bar.right.four {\n    transform: skew(-55deg);\n}\n\n.cartridge > .lines > .bar.left.two,\n.cartridge > .lines > .bar.right.three {\n     transform: skew(-12deg);   \n}\n\n.cartridge > .lines > .bar.left.three,\n.cartridge > .lines > .bar.right.two {\n    transform: skew(12deg);\n}\n\n.cartridge > .lines > .bar.left.four,\n.cartridge > .lines > .bar.right.one {\n    transform: skew(55deg);\n}\n
\n\n

Generally, I find the overall result fairly pleasing and, adding a few tweaks for Game Boy Color cartridges games helps keep things playful:

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2016-03-23-game-boy-cartridge/"}, {"title": "Charging The Dash", "id": "https://jbmorley.co.uk/posts/2016-03-22-charging-the-dash/", "date_published": "2016-03-22T00:00:00+00:00", "content_html": "

I recently acquired The Dash from Bragi. They\u2019re a great pair of headphones and a fantastic first product from Bragi, modulo all the usual Kickstarter caveats1.

\n\n

One of the many features of The Dash is the ability to load music directly onto the headphones themselves \u2013 they mount as a USB mass storage device when plugged into a computer and adding music is simply a matter of dragging-and-dropping unencrypted music files.

\n\n

As useful as this is, it\u2019s far more common that I simply wish to charge my headphones when plugging them into MacBook Pro. Since OS X helpfully auto-mounts USB mass storage volumes, I find myself with many of these when I\u2019m done charging:

\n\n

\n\n

Fortunately, it\u2019s possible to disable auto-mounting in OS X on a per-disk basis by tweaking your fstab; Wolf Paulus has a great post describing the basics of how to do this. The technique described relies on using the Volume UUID to identify the device but, since The Dash don\u2019t appear to have a Volume UUID, it\u2019s necessary to filter using the Volume Label instead2:

\n\n
#                                                                                      \n# Warning - this file should only be modified with vifs(8)                             \n#                                                                                      \n# Failure to do so is unsupported and may be destructive.                              \n#                                                                                      \nLABEL=THE\\040DASH none msdos rw,noauto 0 0\n
\n\n

Remember to use vifs to modify your fstab, instead of editing it directly:

\n\n
$ sudo vifs\n
\n\n
\n\n
    \n
  1. Over-promise and under-deliver. In the case of The Dash, some of the additional functionality such as fitness tracking (and even voice calling) doesn\u2019t yet work as advertised.
  2. \n
  3. Thanks to Johannes Wei\u00df for his suggestion and guidance.
  4. \n
\n
", "url": "https://jbmorley.co.uk/posts/2016-03-22-charging-the-dash/"}, {"title": "More Psion User Scans", "id": "https://jbmorley.co.uk/posts/2016-03-10-more-psion-user-scans/", "date_published": "2016-03-10T00:00:00+00:00", "content_html": "

Over Christmas, I managed to find the time to scan two more editions of Psion User. I\u2019ve now cleaned up the first of these \u2013 Winter 1998/99 \u2013 and added it to archive.org.

\n\n

\"Psion

\n\n

This edition served to introduce the \u2018pearlescent\u2019 aqua green special edition Series 5, a device I coveted at the time. I finally satisfied that childhood desire by purchasing one on eBay late last year, adding to a growing collection of Psion palmtops.

\n\n

Unfortunately, Psion\u2019s interest in Psion User was already waning at this point and, at only 8 pages, it\u2019s significantly shorter than previous editions.

\n\n

You can find a direct download here.

\n
", "url": "https://jbmorley.co.uk/posts/2016-03-10-more-psion-user-scans/"}, {"title": "Adding Timestamps to Terminal Commands", "id": "https://jbmorley.co.uk/posts/2016-03-07-terminal-timestamps/", "date_published": "2016-03-07T00:00:00+00:00", "content_html": "

During certain stages of our software development cycle, I find myself wondering exactly when I ran a given command \u2013 did I start that UI process or task before, or after, I ran that command line utility?

\n\n

More often than not, I give up guessing and re-run both jobs just in case. Scroll-back helps to some extent, but it\u2019s infuriating to see that you ran a command, yet still not know when you ran it.

\n\n

In an attempt to improve on this, I\u2019ve modified my prompt to include a right-aligned date, effectively adding a timestamp to the previous completed command:

\n\n

\n\n

If you\u2019re interested in using this yourself, you can add all or some of the following to your ~/.bash_profile:

\n\n
function right_aligned_date {\n    current_date=\\[$( date )\\]\n    width=$( tput cols )\n    echo \"$( printf %${width}s \"${current_date}\" )\"\n}\n\nPS1=\"\\[\\033[0;37m\\]\\$( right_aligned_date )\\[\\033[0m\\]\\n\\u@\\h \\W $ \"\n
\n\n
\n\n

Update: Some utilities \u2013 such as Python\u2019s virtualenv \u2013 will modify the $PS1 to add additional information about the current environment. This can break the date alignment used in the above example as it relies on spaces to position the date.

\n\n

The better solution is to explicitly set the column start position as follows:

\n\n
function right_aligned_date {\n    current_date=$( date \"+%H:%M:%S %Z\" )\n    column=$( expr $( tput cols ) - ${ #current_date } + 1 )\n    printf \"\\e[${column}G${current_date}\"\n}\n
\n
", "url": "https://jbmorley.co.uk/posts/2016-03-07-terminal-timestamps/"}, {"title": "Calendar 2016", "id": "https://jbmorley.co.uk/posts/2016-01-01-calendar-2016/", "date_published": "2016-01-01T00:00:00+00:00", "content_html": "

Featuring Arizona and California, Copenhagen, Japan, Vienna, Salzkammergut, and San Francisco.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2016-01-01-calendar-2016/"}, {"title": "Lollip 2016", "id": "https://jbmorley.co.uk/posts/2016-01-01-lollip-2016/", "date_published": "2016-01-01T00:00:00+00:00", "content_html": "

The annual desk calendar, featuring Lollip on location in Vienna, Hohe Tauern, Brussels, Cambridge, Milan, O'ahu, Salzkammergut, and Japan.

\n\n

Unfortunately Snapfish\u2013who I used to print this year\u2019s desk calendar\u2013didn\u2019t provide any download mechanism, so I\u2019m only able to show the photos themselves.

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2016-01-01-lollip-2016/"}, {"title": "Wedding Photos", "id": "https://jbmorley.co.uk/posts/2015-10-24-wedding-photos/", "date_published": "2015-10-24T00:00:00+00:00", "content_html": "

This Hyperlapse \u2013 from Ayelet and Aaron\u2019s wedding \u2013 captures some of the fun-and-games of the wedding photo shoot.

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2015-10-24-wedding-photos/"}, {"title": "Pager Codes", "id": "https://jbmorley.co.uk/posts/2015-10-13-pager-codes/", "date_published": "2015-10-13T00:00:00+00:00", "content_html": "

Looking through some old files, I recently came across this fantastic selection of pager codes that came with the Swatch The Beep pager watch. Presumably they were going after a more trendy audience, but their choice of phrases seems somewhat strange: I love the idea of paging someone to tell them to, \u2018Take a break, will you\u2019, or perhaps, that you\u2019re, \u2018Going away for 2 days\u2019.

\n

Family Codes

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CodeDescription
801Please go shopping
802Kids getting on my nerves
803Auntie\u2019s coming for tea
804Been to the shops
805Washed the car
806Cook up something yummy
807Visitors / bad atmosphere
808Visitors gone / coast clear
809Red wine\u2019s finished
810I\u2019d like some flowers
811Holidays booked
812Don\u2019t tell a soul
813Will you be on time?
814Take the dog for a walk
815Going away for 2 days
816Take a break, will you
817Not at home
818Beer\u2019s in the fridge
888It\u2019s a girl
889It\u2019s a boy
\n
", "url": "https://jbmorley.co.uk/posts/2015-10-13-pager-codes/"}, {"title": "pdavision", "id": "https://jbmorley.co.uk/posts/2015-09-20-pdavision/", "date_published": "2015-09-20T00:00:00+00:00", "content_html": "

I have had the pleasure of working with my good friend Mike Rhodes on a number of projects over the years. A couple of weeks ago, I discovered and resurrected pdavision \u2013 one of the very first such projects we collaborated on.

\n\n

\n\n

As we were somewhat younger at the time, pdavision lacks some of the spit and polish I\u2019d like to think we\u2019ve brought to recent ventures, but it foretells the direction each of us would take professionally: Mike to server-side infrastructure and client apps and libraries, and me to mobile operating systems and applications.

\n\n

I have done my best to reproduce the site as it was when we left it, conceding only a few structural changes to make templating and discovery easier. Unlike the original (which used ASP) the current version is built \u2013 much like this site \u2013 using Jekyll.

\n
", "url": "https://jbmorley.co.uk/posts/2015-09-20-pdavision/"}, {"title": "Psion User", "id": "https://jbmorley.co.uk/posts/2015-09-01-psion-user/", "date_published": "2015-09-01T00:00:00+00:00", "content_html": "

Psion handheld computers were my first true love when it came to computing devices: portable and relatively affordable, they allowed you to code whenever, and wherever, you wanted.

\n\n

Gaining information on these miraculous devices was difficult however. Without ready access to the internet, we relied on services such as Steve Litchfield\u2019s 3-Lib for access to software, and magazines such as Palmtop and Psion\u2019s own Psion User for our news.

\n\n

While the 3-Lib shareware library is still available online, it\u2019s hard to find copies of the print media. With a view to improving things slightly, I\u2019ve scanned my three copies of Psion user and uploaded them to archive.org:

\n\n\n\n

If anyone has other editions (or publications) they\u2019re willing to donate to the cause, I\u2019m happy to scan and upload more: just drop me an email or tweet.

\n\n

\"Psion

\n\n
\n\n

Update: You can find direct downloads here:

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2015-09-01-psion-user/"}, {"title": "iOS Switches in CSS", "id": "https://jbmorley.co.uk/posts/2015-08-10-switches/", "date_published": "2015-08-10T23:59:00+00:00", "content_html": "

Building Game Play Color gives me many opportunities and much encouragement to see explore what\u2019s possible with modern CSS. Most recently, I found myself wanting a near-native iOS enable/disable switch for a forthcoming feature.

\n\n

While it\u2019s not perfect, it turns out that, with a little tinkering, something pretty good can be achieved (go ahead, try turning it on):

\n\n\n\n\n\n
\n\n

As one might hope, the HTML required is incredibly simple and looks something like this:

\n\n
<div id=\"switch\" class=\"setting-switch\"></div>\n
\n\n

With all the complexity remaining firmly in the CSS:

\n\n
.setting-switch\n{\n  transition: 300ms ease-in-out;\n  position: relative;\n  width: 46px;\n  height: 28px;\n  border-radius: 28px;\n  background-color: white;\n  margin: 10px;\n  border: 2px solid #E6E6E6;\n}\n\n.setting-switch:before\n{\n  transition: 300ms ease-in-out;\n  content: '';\n  display: block;\n  width: 28px;\n  height: 28px;\n  border-radius: 28px;\n  background-color: #fff;\n  position: absolute;\n  top: 0;\n  left: 0;\n  box-shadow: 0 6px 4px rgba(0, 0, 0, 0.1), 0 -1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.setting-switch.on\n{\n  transition: 300ms ease-in-out;\n  background-color: #4CD964;\n  border: 2px solid #4CD964;\n}\n\n.setting-switch.on:before\n{\n  transition: 300ms ease-in-out;\n  left: 18px;\n}\n
\n\n

The JavaScript itself is also simple when using something like JQuery:

\n\n
var s = $(\"#switch\")\ns.click(function() {\n    s.toggleClass(\"on\");\n});\n
\n\n

If you\u2019re interested in playing further with the source, take a look at the JSFiddle.

\n
", "url": "https://jbmorley.co.uk/posts/2015-08-10-switches/"}, {"title": "Cambridge", "id": "https://jbmorley.co.uk/posts/2015-07-17-cambridge/", "date_published": "2015-07-17T07:14:44+01:00", "content_html": "

Staying in Cambridge this week in one of the newly built apartments near the station. Junko has been with me, having come over for a conference in Glasgow and taken the time to see Grandad.

\n\n

I returned home last night to a fantastic heart made from the towels in the apartment\u2013memories of our weekend in Prague.

\n\n

\"Heart\"

\n\n

This morning it\u2019s breakfast with Michael at Hot Numbers, work, and then off to Bristol for a weekend with Mike and Rose.

\n
", "url": "https://jbmorley.co.uk/posts/2015-07-17-cambridge/"}, {"title": "Akihabara", "id": "https://jbmorley.co.uk/posts/2015-05-02-akihabara/", "date_published": "2015-05-02T18:45:31+01:00", "content_html": "

What better way to capture the backstreets of Akihabara than with a Hyperlapse?

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2015-05-02-akihabara/"}, {"title": "10 Years of Dashboard", "id": "https://jbmorley.co.uk/posts/2015-02-24-10-years-of-dashboard/", "date_published": "2015-02-24T22:18:39+00:00", "content_html": "

\"Dashboard

\n\n

To celebrate that my InJapan Dashboard countdown widget still works on OS X Yosemite\u2013a whole 10 years after first writing it\u2013I\u2019ve released the source code on GitHub under the MIT license.

\n
", "url": "https://jbmorley.co.uk/posts/2015-02-24-10-years-of-dashboard/"}, {"title": "Granola", "id": "https://jbmorley.co.uk/posts/2015-01-14-granola/", "date_published": "2015-01-14T08:00:32+00:00", "content_html": "

\"Granola\"

\n\n

Junko has recently started making her own, incredibly tasty, granola for breakfast. At Michael\u2019s request we took the time to write-up and share the recipe.

\n

Ingredients

\n\n

Method

\n
    \n
  1. Pre-heat the oven to roughly 120\u00baC (250\u00baF).
  2. \n
  3. Mix all the ingredients (except for the raisins) with the olive oil and maple syrup.
  4. \n
  5. Spread the mixture evenly on a roasting tray.
  6. \n
  7. Bake for 1 hour 15 minutes, turning every 15 minutes.
  8. \n
  9. Allow the granola to cool and then mix in raisins.
  10. \n
\n
", "url": "https://jbmorley.co.uk/posts/2015-01-14-granola/"}, {"title": "Montage", "id": "https://jbmorley.co.uk/posts/2015-01-04-montage/", "date_published": "2015-01-04T07:39:32+00:00", "content_html": "

Sometimes it\u2019s useful to be able to quickly combine multiple images into one.1 ImageMagick\u2019s montage command does exactly this.

\n\n

The following command:

\n\n
montage -tile 1x -geometry 600x+1+1 image1.jpg image2.jpg image3.jpg output.jpg\n
\n\n

Will produce an image like:

\n\n

\n\n
\n\n
    \n
  1. This is especially useful when posting images to services like Freecycle which only support one product image and also have stringent file size requirements.
  2. \n
\n
", "url": "https://jbmorley.co.uk/posts/2015-01-04-montage/"}, {"title": "Calendar 2015", "id": "https://jbmorley.co.uk/posts/2015-01-01-calendar-2015/", "date_published": "2015-01-01T00:00:00+00:00", "content_html": "

Featuring Kensington Palace Gardens, Thurstaston, Graz, Hohe Tauern, and Tel Aviv.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2015-01-01-calendar-2015/"}, {"title": "Desk Calendar 2015", "id": "https://jbmorley.co.uk/posts/2015-01-01-desk-calendar-2015/", "date_published": "2015-01-01T00:00:00+00:00", "content_html": "

Wanting something a little smaller than the annual wall calendar for our new apartment in Vienna, we opted for a desk calendar from Shutterfly.

\n\n

Like this year\u2019s wall calendar, it includes photos from Kensington Palace Gardens, Thurstaston, Graz, Hohe Tauern, and Tel Aviv. Far more importantly however, it also introduces Lollip, our beloved reindeer.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2015-01-01-desk-calendar-2015/"}, {"title": "iTunes Artwork and AppleScript", "id": "https://jbmorley.co.uk/posts/2014-11-28-itunes-artwork-and-applescript/", "date_published": "2014-11-28T09:10:35+00:00", "content_html": "

There are a number of posts on the internet that describe how to set iTunes album artwork from a file using AppleScript. Most of these first convert images to PICT using Image Events and then use this to set the album artwork data. With recent versions of iTunes it is unnecessary to convert JPEGs prior to setting the album artwork. In fact, the PICT-based approach will no longer work.

\n\n

Fortunately, setting artwork is now relatively simple:

\n\n
tell application \"iTunes\"\n    set f to POSIX file \"/path/to/my/artwork.jpg\"\n    try\n        set data of artwork 1 of current track to (read f as picture)\n    end try\nend tell\n
\n
", "url": "https://jbmorley.co.uk/posts/2014-11-28-itunes-artwork-and-applescript/"}, {"title": "Bristol", "id": "https://jbmorley.co.uk/posts/2014-10-12-bristol/", "date_published": "2014-10-12T18:01:18+01:00", "content_html": "

\"Friendly

\n\n

Fantastic weekend visiting Mike and Rose in their new house in Bristol. Yesterday we enjoyed breakfast out at the city farm followed by a slow afternoon and dinner at Bells Diner and Bar Rooms.

\n
", "url": "https://jbmorley.co.uk/posts/2014-10-12-bristol/"}, {"title": "Hyperlapse", "id": "https://jbmorley.co.uk/posts/2014-10-03-hyperlapse/", "date_published": "2014-10-03T19:56:17+01:00", "content_html": "

Instagram recently released Hyperlapse, a video time-lapse app for iOS. How better to try it out than during a flight to the UK?

\n\n

\n\n

And here\u2019s a hyperlapse of my morning walk to Sektor5:

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2014-10-03-hyperlapse/"}, {"title": "Animated GIFs", "id": "https://jbmorley.co.uk/posts/2014-09-27-animated-gifs/", "date_published": "2014-09-27T06:13:29+01:00", "content_html": "

\n\n

Google+ has a nifty feature \u2013 known as \u2018auto awesome\u2019 \u2013 where it detects runs of photos which may be compiled together into short animations, automatically creating these animations for you.

\n\n

If uploading all your images to Google+ to create a few animations seems a little excessive, you can create your own using ImageMagick:

\n\n
convert -resize 1024x1024 -delay 20 *.JPG output.gif\n
\n\n
\n\n

Update: ffmpeg can do the pretty much the same thing for movies which are a far more efficient format but require a little more work to embed:

\n\n
ffmpeg -r 5 -pattern_type glob -i '*.JPG' -c:v libx264 -pix_fmt yuv420p output.mp4\n
\n
", "url": "https://jbmorley.co.uk/posts/2014-09-27-animated-gifs/"}, {"title": "Git Alias", "id": "https://jbmorley.co.uk/posts/2014-07-12-git-alias/", "date_published": "2014-07-12T13:54:05+01:00", "content_html": "

Git is an incredibly powerful tool. Sometimes all that power makes it difficult to remember the myriad command-line options required to fit your workflow. Configuring aliases can help make these much more accessible.

\n\n

Global git aliases live in the [alias] section of your user configuration file (~/.gitconfig).

\n

Simple Shortcuts

\n

Save yourself some typing when performing commonplace tasks:

\n\n
co = checkout\nci = commit\nbr = branch\ns = status\ndt = difftool\n
\n

Delete Branch (Locally and Remotely)

\n

When working with GitHub Pull Requests and personal repositories there\u2019s no automatic mechanism for deleting the pull request branch from your repository. This alias will delete both the local and remote branches in just one command:

\n\n
delete-branch = \"!git branch -D $1; git push origin :$1\"\n
\n

Single Diff

\n

Generate the diff for a single change set:

\n\n
diff-single = diff-tree --patch --no-commit-id --cc\n
\n

List Commits

\n

Sometimes it\u2019s useful to be list just the SHA1s associated with all the changes on your current branch:

\n\n
list-commits = log --pretty=format:\"%H\"\n
\n
", "url": "https://jbmorley.co.uk/posts/2014-07-12-git-alias/"}, {"title": "Scriptalicious", "id": "https://jbmorley.co.uk/posts/2014-06-08-scriptalicious/", "date_published": "2014-06-08T09:53:27+01:00", "content_html": "

In the interests of keeping on top of the various scripts I\u2019ve written over the last few years I\u2019ve published a few of them on GitHub:

\n\n\n\n

These were all written to satisfy some personal requirement or need. Hopefully the will prove useful for a wider audience.

\n
", "url": "https://jbmorley.co.uk/posts/2014-06-08-scriptalicious/"}, {"title": "Sektor5", "id": "https://jbmorley.co.uk/posts/2014-06-07-sektor5/", "date_published": "2014-06-07T09:00:27+01:00", "content_html": "

Since moving to Austria in December last year, I\u2019ve been lucky enough to find a great co-working space in Sektor5. Everyone is super-friendly, easing my transition into the somewhat more solitary life that is remote working.

\n\n

\n\n

Enjoying a quick drink to celebrate a Sektor5 birthday.

\n
", "url": "https://jbmorley.co.uk/posts/2014-06-07-sektor5/"}, {"title": "Hard Drive Case", "id": "https://jbmorley.co.uk/posts/2014-05-14-creating-things/", "date_published": "2014-05-14T09:26:17+01:00", "content_html": "

\"Hard

\n\n

I recently found myself getting quite excited about Raspberry Pi and the fantastic Pibow by Pimoroni case for Raspberry Pi. Inspired by its elegant design, I created myself a matching hard drive case.

\n\n

You can find it on Thingiverse.

\n
", "url": "https://jbmorley.co.uk/posts/2014-05-14-creating-things/"}, {"title": "Calendar 2014", "id": "https://jbmorley.co.uk/posts/2014-01-01-calendar-2014/", "date_published": "2014-01-01T00:00:00+00:00", "content_html": "

Featuring San Francisco, London, Israel, O'ahu and Maui, Seattle, and Vienna.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2014-01-01-calendar-2014/"}, {"title": "ANTLR 3 OS X Quick Start", "id": "https://jbmorley.co.uk/posts/2013-04-19-antlr-3-os-x-quick-start/", "date_published": "2013-04-19T08:27:09+01:00", "content_html": "

The ANTLR v4 website provides a nice and simple quick start for OS X developers. If, however, you find yourself requiring the richer feature set of ANTLR v3, the installation process is not quite so transparent.

\n\n

Borrowing heavily from the v4 quick start:

\n\n
cd /usr/local/lib\nwget http://www.antlr3.org/download/antlr-3.5-complete.jar\nexport CLASSPATH=\".:/usr/local/lib/antlr-3.5-complete.jar:$CLASSPATH\"\nalias antlr3='java -jar /usr/local/lib/antlr-3.5-complete.jar'\n
\n
", "url": "https://jbmorley.co.uk/posts/2013-04-19-antlr-3-os-x-quick-start/"}, {"title": "Game Play", "id": "https://jbmorley.co.uk/posts/2013-01-05-game-play/", "date_published": "2013-01-05T00:00:00+00:00", "content_html": "

\n\n

For the last few months, I\u2019ve been working on a side-project to bring Game Boy emulation to the iPhone: Game Play is now in public beta and I encourage people to give it a go.

\n\n

App Store restrictions have encouraged iOS emulators into Cydia, leaving those of us who prefer not to jailbreak our devices and enjoy the odd bit of retro gaming out in the cold. No longer! Fortunately, Mobile Safari performance on the iPhone 5 is good enough to run a pure JavaScript Game Boy emulator as a web app.

\n\n

Game Play integrates the JSGB core1 by Pedro Ladaria with a rich JavaScript web application with Google Drive support for adding ROMs. Suitably named .jpg files are, as you might expect, automatically used as artwork.

\n\n

The whole project is released under the GNU General Public License, Version 2, and can be found on GitHub.

\n\n
\n\n
    \n
  1. I have also experimented with the GameBoy-Online core as this provides audio support, but it will require some significant optimisation to make it usable on an iPhone.
  2. \n
\n
", "url": "https://jbmorley.co.uk/posts/2013-01-05-game-play/"}, {"title": "Calendar 2013", "id": "https://jbmorley.co.uk/posts/2013-01-01-calendar-2013/", "date_published": "2013-01-01T00:00:00+00:00", "content_html": "

Featuring Barcelona, San Francisco, Hawaii, Wicken Fen, Mount Rainier National Park and Seattle, and Chamonix.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2013-01-01-calendar-2013/"}, {"title": "iGoogle Themes", "id": "https://jbmorley.co.uk/posts/2012-10-19-igoogle-themes/", "date_published": "2012-10-19T21:14:12+01:00", "content_html": "

Earlier this year Google announced that iGoogle is to be shut down. While no one is likely to shed any tears over this decision, there are a couple of wonderful themes that it would be sad to loose.

\n\n

Version two of the \u2018Tea House\u2019 theme is alive and well in Gmail, but version one and the \u2018JR\u2019 theme seem set to go. I\u2019ve therefore created an archive of the headers for both themes and, in the process, turned the \u2018Tea House\u2019 version two theme into a collection of wallpapers.

\n\n\n\n

JR Headers

\n\n\n\n

Tea House Headers

\n\n\n\n

Tea House Wallpapers

\n\n
\n\n

Update: The HTML files used to create the wallpapers are can now be found on GitHub along with support for retina displays.

\n
", "url": "https://jbmorley.co.uk/posts/2012-10-19-igoogle-themes/"}, {"title": "Fez Wallpaper", "id": "https://jbmorley.co.uk/posts/2012-10-04-fez-wallpaper/", "date_published": "2012-10-04T06:11:43+01:00", "content_html": "

Fez is a wonderfully charming game that has soaked up a fair bit of my time over the past few weeks. In recognition of this, I\u2019ve put together my first wallpaper in many years depicting a slightly surprised Gomez.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2012-10-04-fez-wallpaper/"}, {"title": "Continuous Integration Cats", "id": "https://jbmorley.co.uk/posts/2012-09-23-continuous-integration/", "date_published": "2012-09-23T09:47:15+01:00", "content_html": "

\n\n

Continuous Integration is all about rapidly establishing code quality by building and testing each source code submission, and getting the results back in the hands of the developer who made the commit. This reduces the risk of bugs being compounded by weeks of untested development and\u2013in theory\u2013serves to keep teams relatively nimble.

\n\n

Looking after a number of projects can potentially mean wading through many build results spread across multiple emails or web pages, meaning broken builds can go unnoticed longer than they should. The common solution to this is what\u2019s jingoistically known as an \u2018Information Radiator\u2019: a coarse-grained, highly-visible, status indicator which provides a summary of all builds.

\n\n

Inspired by Last.fm\u2019s bears, we set out to build our own \u2018Information Radiator\u2019. Bears, however, are old-news, so we enlisted the help of three Maneki Neko\u2013the slightly strange beckoning cats you find in Japanese and Chinese restaurants.

\n

Implementation

\n

The cats themselves required only a minor modification\u2013cutting the battery cables and extending them outside the body. USB switching was achieved with a \u2018DLP-IOR4 USB-Based Latching Relay Module\u2019 which exposes a serial-over-USB interface and a simple protocol for latching 4 relays. Integration with Hudson is via little Python script knocked up by one of our interns.

\n\n\n

Paintwork

\n

Over the course of a week, Mark put to use one of his hither-too-unknown talents and gave our cats a shiny new look.

\n\n\n
", "url": "https://jbmorley.co.uk/posts/2012-09-23-continuous-integration/"}, {"title": "Barcelona", "id": "https://jbmorley.co.uk/posts/2012-09-22-barcelona/", "date_published": "2012-09-22T13:11:24+01:00", "content_html": "

\n\n

Each year, February brings with it a trip to Barcelona and Mobile World Congress. This year was no different and, in between the long days on the conference floor, I managed to snap a few photos of the fantastic architecture and sites.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-22-barcelona/"}, {"title": "WWDC 2012", "id": "https://jbmorley.co.uk/posts/2012-09-22-wwdc-2012/", "date_published": "2012-09-22T05:04:08+01:00", "content_html": "

\n\n

In June, my colleague and I boarded a plane bound for San Francisco and the 2012 Apple World Wide Developer Conference. A small snafu early on led to a nail biting week-long wait to discover if we\u2019d actually managed to successfully purchase tickets but, fortunately, everything came together in the end.

\n\n

My second such event, WWDC 2012 proved just as exciting and rewarding as the first. As someone who now has limited opportunity to do hands-on software development, it\u2019s refreshing to learn about new language features, methodologies and tools, and to take the time to explore the architectural direction of OS X and iOS. Needless to say, Apple are doing very interesting things with both these platforms and Objective C.

\n\n

San Francisco itself never fails to provide a wonderful and welcoming atmosphere and, during our time out there, we were able to enjoy the Haight-Ashbury Street Fair, some fantastic food and, in my case, a trip past Alcatraz and onwards to Sausalito.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-22-wwdc-2012/"}, {"title": "Hawaii", "id": "https://jbmorley.co.uk/posts/2012-09-20-hawaii/", "date_published": "2012-09-20T19:05:21+01:00", "content_html": "

\n\n

Earlier this year, I spent a couple of weeks visiting Junko in Hawaii, during which time we enjoyed a weekend excursion in the wonderfully sleepy Kauai, lodging at the fantastic Strawberry Guava Bed and Breakfast. The trip also provided a great opportunity to tour some of the many sights of O'ahu and log a few more hours diving with Island Divers, Hawaii.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-20-hawaii/"}, {"title": "Electromagnetic Field", "id": "https://jbmorley.co.uk/posts/2012-09-18-electromagnetic-field/", "date_published": "2012-09-18T12:36:00+01:00", "content_html": "

\n\n

A couple of weeks ago, along with roughly 500 other geeks, I set up camp in a field in Milton Keynes as part of Electromagnetic Field. The first such event in the UK, it offered an unique opportunity for like-minded individuals to collaborate on projects, share interests and just enjoy creativity, technology and company. Even the BBC came along to see what was happening.

\n\n

\n\n

Expressing just what an amazing experience EMF offered is difficult though; the unbelievable variety of events and topics squeezed into just three days means that everyone hears a different story as I only have time to talk about a few of the many things which captured the imagination. Quadcopters, 3D imaging, bees, arduinos, hammocks, electronics, rockets, high-altitude balloons, tesla-coils, retro-games andgeodesic domes all had their place.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-18-electromagnetic-field/"}, {"title": "2011", "id": "https://jbmorley.co.uk/posts/2012-09-12-last-year/", "date_published": "2012-09-12T07:27:08+01:00", "content_html": "

\n\n

With the completion of my Japan album, I\u2019ve now \u2013 only nine months into 2012 \u2013 finished reviewing and uploading all photos from 2011.

\n\n

Hopefully next year will bring with it greater efficiency.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-12-last-year/"}, {"title": "Visiting Bruges", "id": "https://jbmorley.co.uk/posts/2012-09-05-visiting-bruges/", "date_published": "2012-09-05T07:26:42+01:00", "content_html": "

\n\n

In August, Junko and I joined my parents for a long, relaxing, weekend in Bruges. During our four days, we took in many of the local churches, survived a tandem bike ride to the neighbouring town of Damme, enjoyed the mandatory boat trip and dined out on the local cuisine.

\n
", "url": "https://jbmorley.co.uk/posts/2012-09-05-visiting-bruges/"}, {"title": "Paris", "id": "https://jbmorley.co.uk/posts/2012-08-27-paris/", "date_published": "2012-08-27T21:03:16+01:00", "content_html": "

\n\n

Nearly a year ago, in October 2011, I was fortunate enough to visit Paris with Andrew and Danna. While a combination of food poisoning and heat-stroke took us all out for a good while, I did manage to snap a few shots.

\n
", "url": "https://jbmorley.co.uk/posts/2012-08-27-paris/"}, {"title": "Squarespace", "id": "https://jbmorley.co.uk/posts/2012-08-27-squarespace/", "date_published": "2012-08-27T20:59:50+01:00", "content_html": "

It\u2019s come to my attention that this website has received very little love of late. In an effort to rectify this, I\u2019m exploring Squarespace in the hope that a more managed platform will reduce the barrier to adding new posts.

\n", "url": "https://jbmorley.co.uk/posts/2012-08-27-squarespace/"}, {"title": "Japan", "id": "https://jbmorley.co.uk/posts/2012-08-26-japan/", "date_published": "2012-08-26T21:39:58+01:00", "content_html": "

\n\n

Last year I was fortunate enough to return to Japan for Junko\u2019s sister\u2019s wedding. While I was there, I took the opportunity to capture a few photos.

\n
", "url": "https://jbmorley.co.uk/posts/2012-08-26-japan/"}, {"title": "Calendar 2012", "id": "https://jbmorley.co.uk/posts/2012-01-01-calendar-2012/", "date_published": "2012-01-01T00:00:00+00:00", "content_html": "

Featuring Bonn and Brussels, Paris, Japan, London, and Waterbeach and Anglesey Abbey.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2012-01-01-calendar-2012/"}, {"title": "Koninginnedag", "id": "https://jbmorley.co.uk/posts/2011-06-30-koninginnedag/", "date_published": "2011-06-30T08:40:00+01:00", "content_html": "

\n\n

Back in April, I visited Andrew and Danna out in The Netherlands. Fortuitously, my visit just so happened to coincide with Koninginnedag.

\n
", "url": "https://jbmorley.co.uk/posts/2011-06-30-koninginnedag/"}, {"title": "Busy, Busy", "id": "https://jbmorley.co.uk/posts/2011-06-21-busy-busy/", "date_published": "2011-06-21T08:12:54+01:00", "content_html": "

\n\n

Lots of things have been happening and I\u2019ve been doing a terrible job at keeping up with it all \u2013 let alone recording it here. Until I get around to something more complete, here\u2019s some photos of recent experiences.

\n\n

February took me to Barcelona for Mobile World Congress 2011 and April had me visiting Bristol for Mike and Rose\u2019s house-warming.

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2011-06-21-busy-busy/"}, {"title": "Android Market", "id": "https://jbmorley.co.uk/posts/2011-06-15-android-market/", "date_published": "2011-06-15T18:18:27+01:00", "content_html": "

How can Google think this is acceptable?

\n\n
\n

Hello,

\n\n

We\u2019re writing to inform you about a planned service outage impacting Android Market that requires your attention.

\n\n

On Wednesday, June 15th, Google Checkout will be unavailable from approximately 4 p.m. to 5 p.m. PDT due to planned system maintenance. During this time, you will be unable to sign in to your Merchant accounts (http://checkout.google.com) and transactions will not be processed. The Android Market Developer Console (http://market.android.com/publish/) will still be available.

\n\n

During the outage, users will still be able to view paid applications on Android Market; however, any attempts at purchases will fail. No new orders will be created. After the maintenance has been completed, all normal activity will resume. No action is required on your part.

\n\n

Thank you for your patience and understanding.

\n\n

Regards,

\n\n

The Android Market Team

\n
\n\n

There are many developers out there who depend upon Android Market revenue. Google has a responsibility to ensure the reliability of this service.

\n
", "url": "https://jbmorley.co.uk/posts/2011-06-15-android-market/"}, {"title": "Calendar 2011", "id": "https://jbmorley.co.uk/posts/2011-01-01-calendar-2011/", "date_published": "2011-01-01T00:00:00+00:00", "content_html": "

The annual calendar, featuring Paris, Beijing, Hong Kong, Chicago, The Philippines, Hawaii, Uganda, Japan, and Stockholm.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2011-01-01-calendar-2011/"}, {"title": "Symbolising iPhone Crashlogs", "id": "https://jbmorley.co.uk/posts/2010-05-15-symbolising-iphone-crashlogs/", "date_published": "2010-05-15T09:05:18+01:00", "content_html": "

As an iPhone developer it\u2019s crucial to be able to make sense of those pesky crash logs you get back from your testers. Unfortunately Apple\u2019s tools offerings in in this area aren\u2019t much to write home about \u2013 they appear to require a few specific pre-conditions to be met.

\n\n

Make sure you have the necessary intermediary build files to hand:

\n\n
    \n
  1. Create the symbol files \u2013 *.dSYM \u2013 as part of your build process.
  2. \n
  3. Keep a copy of your symbol files and your Application Bundle for any builds you wish to debug.
  4. \n
\n\n

When setting up your environment, experimentation shows that the following is required:

\n\n\n\n

Symbolising a crash should then simply be a matter of running something like the following command:

\n\n
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v crash.log  > decoded.log\n
\n
", "url": "https://jbmorley.co.uk/posts/2010-05-15-symbolising-iphone-crashlogs/"}, {"title": "Nabe", "id": "https://jbmorley.co.uk/posts/2010-01-12-nabe/", "date_published": "2010-01-12T00:00:00+00:00", "content_html": "

A fantastic Japanese hot pot of tofu, salmon, meat balls and vegetables.

\n\n

\n
", "url": "https://jbmorley.co.uk/posts/2010-01-12-nabe/"}, {"title": "Calendar 2010", "id": "https://jbmorley.co.uk/posts/2010-01-01-calendar-2010/", "date_published": "2010-01-01T00:00:00+00:00", "content_html": "

My first ever wall calendar, featuring Lake Baikal, Beijing and its Botanical Gardens, Cheshunt, Uganda, Brussels, and Blackheath.

\n\n\n\n

Download

\n
", "url": "https://jbmorley.co.uk/posts/2010-01-01-calendar-2010/"}, {"title": "The Swing Bar", "id": "https://jbmorley.co.uk/posts/2009-08-14-the-swing-bar/", "date_published": "2009-08-14T00:00:00+01:00", "content_html": "

\n\n

I recently had cause to look through the various photos I\u2019ve snapped over the past few years and came across this reminder of my time in Beijing.

\n\n

The \u2018Swing Bar\u2019 on Bar Street became a regular haunt and featured this fantastic collection of musicians who would do their best to perform almost any song requested.

\n
", "url": "https://jbmorley.co.uk/posts/2009-08-14-the-swing-bar/"}, {"title": "Uganda Bound", "id": "https://jbmorley.co.uk/posts/2009-06-04-uganda-bound/", "date_published": "2009-06-04T01:54:44+01:00", "content_html": "

\n\n

Being that I am quite useless in updating my blog, I can only imagine that my readership (small though it might be) are quite unaware of my recent travel arrangements. That is, with the exception of those 79-or-thereabouts who follow me on Twitter.

\n\n

Representing a relative departure from my usual travels, I am currently aboard flight KQ0117. This will take me into Nairobi from where I shall onwards to Uganda and Entebbe. Usually attracted by the bright lights and expensive restaurants of the West and, more recently, the East, I have never found much appeal in Africa, venturing only once to Egypt with my parents a number of years previous. Now, with a friend (as all newly trained doctors seem to) serving out his medical elective in the town of Kiwoko, I find I have cause and my recent departure from my job gives me oportunity.

\n\n

I shall endeavour to catalog the events of the next few weeks in coming posts which, I expect, will reflect the usual m\u00e9lange of emotions with no shortage of culture shock as oft experienced during travel.

\n
", "url": "https://jbmorley.co.uk/posts/2009-06-04-uganda-bound/"}, {"title": "Victorian Architecture", "id": "https://jbmorley.co.uk/posts/2009-05-13-victorian-architecture/", "date_published": "2009-05-13T11:07:23+01:00", "content_html": "

\n\n

Returning to the UK, one inevitably flys into Heathrow and then takes the Heathrow Express onwards into Paddington. Despite the all-too-common feeling of sadness brought about by the conclusion of a journey, I still find the fantastic Victorian architecture at Paddington a reminder that there is something special about Britain.

\n\n

On Friday last week, I tried to capture just a little of that grandeur.

\n
", "url": "https://jbmorley.co.uk/posts/2009-05-13-victorian-architecture/"}, {"title": "Flutter Beta", "id": "https://jbmorley.co.uk/posts/2009-05-13-flutter-beta/", "date_published": "2009-05-13T00:00:00+01:00", "content_html": "

\n\n

Flutter is a light-weight iGoogle Twitter client and is the first of a number of small personal development projects I intend to release in the coming weeks and months.

\n\n

It is offered as an alternative to the fairly heavy-weight user experiences offered by many of the existing iGoogle-based solutions. All tweets, including replies and direct messages are re-threaded into a single feed to avoid switching between multiple tabs:

\n\n

\n\n

As the post title suggests, Flutter is currently in beta and, while I encourage everyone to give it a try, do expect to find a few pesky little bugs. I look forward to hearing about all such occurrences and will endeavour to fix them as soon as humanly possible.

\n

On Authentication

\n

Currently authentication is performed by passing users' credentials directly through a POST request to Twitter via the server hosting jbmorley.co.uk. I am well aware this is exceptionally in-elegant; it merely serves as an interim solution until OAuth support has been implemented so please bear with me.

\n

The Future

\n

Suggestions and recommendations are always gratefully received. I am personally considering providing TweetDeck-like behaviour in the Canvas view, but this will require some internal rearchitecting so it\u2019s some ways off right now\u2026

\n\n
\n\n

Update: You can now find the original source on GitHub.

\n
", "url": "https://jbmorley.co.uk/posts/2009-05-13-flutter-beta/"}, {"title": "Wordle Vision", "id": "https://jbmorley.co.uk/posts/2009-05-12-wordle-vision/", "date_published": "2009-05-12T20:18:41+01:00", "content_html": "

\n\n

It never ceases to amaze me what is created on the internet. Wordle is a case in point, offering a rather interesting alternative way to view text and websites.

\n\n

This site looks quite different \u2013 already Twitter represents a large portion of my content.

\n
", "url": "https://jbmorley.co.uk/posts/2009-05-12-wordle-vision/"}, {"title": "Holidays Past", "id": "https://jbmorley.co.uk/posts/2009-05-06-holidays-past/", "date_published": "2009-05-06T20:31:39+01:00", "content_html": "

\n\n

With a little more time on my hands, I\u2019ve been enjoying sorting through old holiday photos. There remain many more albums to review \u2013 here is the first.

\n\n

Autumn is commonly celebrated in Japan and, in the Autumn of 2007, Miho, Sarah and I journeyed to Nasu to enjoy the autumnal colours. The trip proved a fantastic opportunity to enjoy the splendid Japanese nature and scenery.

\n
", "url": "https://jbmorley.co.uk/posts/2009-05-06-holidays-past/"} ] }