Reanimating a Little Printer project

I’ve made a little app which generates an image for you to display or print how many people there are in space right now. The code is here.

This is based on work that the excellent design and technology agency BERG did a decade ago with their Little Printer.

Little Printer was a wonderful little service which used a network-connected thermal printer with a personality to send little messages of wonder and joy into your house.

Little Printer on a bookshelf

It was released in 2012 and as all these products inevitably do, the servers went offline a few years later and the service went away. BERG released their code and a little community sprang up to help liberate the devices and keep them running, which you can see at https://tinyprinter.club/ and additional work from design invention studio Nord Projects.

In the 12 years since Little Printer, desktop sized bluetooth-connected thermal printers have become a thing, and you can get one delivered to your house for less than £20 from Amazon or Aliexpress. I have this nice cat-themed one:

Thermal printer with a stylised cat face next to a Lego superman minifig for size comparison

When tidying up my repos in GitHub I found I’d forked one of the Little Printer repos many years ago, so now that I’ve got a thermal printer wouldn’t it be nice to get that running? This one prints out a little picture telling you how many people are in space right now. I can’t find a photo of this working on a Little Printer, so let’s give a spoiler instead:

Printer publishing "How many people are in space right now?" on paper

Let’s have a quick look to see if the decade-old Ruby code runs out of the box (although with low expectations it will). No surprises, it doesn’t:

  • Ruby version is too old
  • Dependency compatibility is broken
  • The tumblr RSS feed it relies on doesn’t get updated any more
  • We don’t have a server to send the rendered content to the printer

So let’s see if we can rewrite this app! 

  • Find a new service with the number of people in space
  • Make a simple Sinatra web app
  • Point the existing app which sends content to the printer to the web app
  • Press print
  • Done!

Here’s the code.

The Fun Print app that supports my printer allows me to print directly from a URL, so I just give it the address of my web app, and it prints out nicely, as you can see above, and because my printer came with several rolls of sticker paper, I can simply peel it off and stick into my Techo!

Obviously the real benefit of Little Printer is that it’s push-based. If I want to be able to push this data to the printer in the future I guess I’ll need to convert the web page into an image, so I’ve added some (currently unused) rendering with Capybara to the application. I might give some of the resources linked from https://tinyprinter.club a go in the future to try and get push working, but I’m quite happy with pull at the moment.

A Ruby interface to the GatherContent API

GatherContent is an awesome tool for planning, structuring and collaborating on web content (they have a short video demo).

They have a read-only API, but only a couple of implementations, so here is mine, in Ruby.

The API is read-only and HTTP POST-based, and so I use HTTParty to manage that side of things, and method_missing to emulate the relevant API calls, and then Hashie to convert the returned Hash into an object. It’s very simple, so give it a try.

I have forked Charbot Green

About a year ago Libby Miller wrote Charbot Green, a BBC Radio 4 announcement bot for Twitter. It’s written in JRuby, uses the H2 database and the source code is in SVN here.

A screenshot of CharbotGreen on Twitter

It’s a really great app and I thought I’d have a play, but half-way through the install I realised that setting up an H2 DB server was a step too far, so instead I rewrote it to be a pure Ruby app using the SQLite3 database. Using SQLite3 keeps it a self-contained app in a single directory without the need to run a database server.

You can get the code from GitHub here.

My small changelist looks like this:

  • H2 replaced by SQLite3
  • links to iPlayer use the short form of the URL
  • if available, the subtitle, such as episode number is displayed
  • now a pure ruby app!

I haven’t tested it very hard, just run it up a couple of times, so please do let me know of bugs or feel free to go fork it yourself!

Ruby and memcached in Bristol

I have rather hastily promised to do a talk about memcached at the Bristol Ruby User Group meetup on Thursday evening (we’ll start after 6pm at the Jiva offices, see the map, no need to know about ruby or memcached in advance!).

As ever, this event is on Upcoming.

There’s a pub next door which I plan on visiting both before and afterwards, and I also want someone to guide me through the capabilities of Passenger (specifically, with nginx) as well as showing me why all my code is horribly wrong. Come along!

Bristol Ruby User Group

Tonight was the third Bristol Ruby User Group meeting, but the first with room for laptops and a projector (thanks to petef for organising and The Watershed for giving us somewhere to meet for free!).

Bristol Ruby User Group

About ten people showed up and we took some time to settle in because lots of us hadn’t met before, we ranged from total novices to professional Ruby programmers (I sit very close to the bottom rung in that ladder!) and didn’t have any concrete plans on what we were going to be doing.

In the end we decided to set up a GitHub repo for any work we might do in other sessions (which you can see here) so spent some time getting that up and running for everyone and then naturally gravitated into two main groups: one getting Jekyll integrated so that we could have a website, and another doing some introductory Ruby work.

(I’m afraid to say that I’d gone beyond tired and into slightly manic which was alarming for me, let alone everyone else, so I worry slightly about the impression on others but hope I can ascribe it to the beer.)

It was good to hear Steve from Beef praising Sinatra, since I’ve written a couple of apps based on it the last few weeks and it seems like the perfect way of writing lightweight web applications in Ruby.

In conclusion, there is an Upcoming Group, a mailing list and of course the GitHub repository we set up and the associated website/blog! We meet on the third Thursday of every month so if you’re local and interested in programming, come along!

Sinatra from scratch

I wrote a small Ruby app the other day which was chucking out JSON which was being parsed by some PHP.

So I thought I’d convert it to all-Ruby using Sinatra (my first real attempt at a Ruby web framework that’s not Hello World).

Installation was harder than expected on my clean Ubuntu box, but for reference:

gem install 1.8-dev
gem install mongrel
gem install rack --version 0.4
gem install sinatra

It was the third line which really caught me out – Sinatra is bound to version 0.4 of Rack, even though it’s at 0.9.1 right now!

Everything seems fine so far, I’ll post a URL if I ever get it running!

update: Sinatra 0.9 was released two days after I wrote this, and it is now dependent on Rack 0.9.1 so the “–version 0.4” is no longer needed

Java makes me passionate

Seriously.

I really like Java, it’s a fundamentally great language. Verbose at times, but great.

However, web application development in Java is painful. Additionally, the compilation and deployment of Java webapps completely suck. I mean, they’re terrible.

I dread to think how many frameworks exist in Java to ease web app development – each one claiming it’s the best and will solve all your woes, yet none come anywhere close to the ease of development in Rails, Django, or any of the PHP frameworks.

I remember being introduced to JSF at ApacheCon Europe 2006. I came back declaring that we would never use JSF for our internally-developed applications. When there was masses of hype, and everyone was claiming JSF was amazing, I got a few questions in the office.

Two years on and there’s finally some acceptance that JSF 1.0 was horrible for developing web applications, with some defensively claiming that JSF 2.0 will solve all the problems. Right, because that always works.

See the recent discussion:

Anyway this means I try and keep a close eye on things like JRuby and Grails but we’ve been pretty reluctant to use them at work because we tend to have large monolithic applications which require maintenance by different people over time which means code homogenisation is good.

To this end, our last couple of projects have been in Struts2+Spring+JPA+Hibernate. This is a nice combination, with a number of well-understood components working well together, especially since we’ve used the Zero Configuration plugin which allows us to drop tens of lines of XML in favour of a few lines of annotations. The Zero Configuration stuff is as buggy as hell and there’s no concrete date for Struts 2.1.2 where it should be fixed, but that’s by-the-by. For me, the fact that we haven’t had to be editing XML almost makes it worth it 😉 Also, Struts2 is highly testable which fits in nicely with our existing testing process.

But when you have a framework you’re (mostly) happy with for development, it highlights the other pain points you may have. For us, this was definitely the deploy/test cycle. We were already using TDD in the compile cycle so there’s a level of confidence about the backend code – tests always run after a successful compile, but when you’re amending the web interface either for small cosmetic changes or for larger changes of data representation there’s a long recompile, redploy, retest cycle that drives me insane. Obviously there are ways around it if you’re using something like Eclipse and have a web application in the structure it needs but we tend to have a number of files which are built at compile-time by Ant. Also, I don’t like being tied to an IDE for tooling purposes – I’m very happy with my current editor thank you very much. The only real missed opportunity was AppFuse – we remembered about it too late; any other Struts2 projects will probably start with it though.

All of this is why I was pleased to see Play! . It’s a just-in-time compilation framework where the controllers and model are pure Java and the view is Groovy; excellent!

This means that we can reduce the time taken to learn (we only need to learn one component – the view – plus config) whilst leaving all the business logic in a state maintainable by anyone in the team. It serves up locally through Apache Mina whilst also being deployable to a more conventional container like Tomcat or JBoss. Changes to both business logic and template are instant, and you can still test it to your heart’s content !

Unfortunately the latest stable version (1.0-stable3 at writing) doesn’t contain critical features like, um, if..else in the template language. Everything seems to be in the nightly, but having been burned with the Zero Configuration Struts plugin (which had the notice “This is experimental. Feedback is appreciated!”) I wouldn’t like to commit any real effort to writing an application in it. As soon as they have that core stuff nailed down though – I’m there.

Deskbot

Deskbot is a cross-platform desktop-based Jabber client for talking to a single user – normally a bot.

deskbot

This is a screenshot of me using it to talk to the bot we run at work and asking for the details of a particular user.It’s written in wxRuby and uses xmpp4r-simple. There is a slight complication writing applications which need to poll a queue in wxRuby (such as the list of incoming replies from the bot) since you can’t just use green Thread objects and must use a Timer to make sure the Thread gets serviced. Very annoying.You can get the code like this:

bzr get http://philwilson.org/code/deskbot

You need to configure both who deskbot logs in as, and who it’s talking to in the code. There are some interesting questions around presence, invisibility, and client redirection here, but I just created a test account to log in as, and the bot already existed to talk to.

Theoretically I should be using things like ad-hoc commands and data forms, but I’m way too lazy.

It’s only a demo bit of code really and not enough to talk about, but I promised myself I would talk about more of the code I write!