Homemade Yogurt

Over the week-end I made some yogurt and boy am I glad I did. It was easily the best yogurt I have ever had. It was particularly good with peaches. That was tonight’s dessert, doesn’t it look yummy?

Peaches with homemade yogurt

In case you are wondering, I used a combination of these recipes. I did not follow either exactly. I get the feeling that is rather difficult to actually mess up yogurt.

Will code for …

I am no longer with Gnip. Which means that am available for other opportunities.

I know a fair bit about REST, HTTP, web services, extensible system design and scalable architecture. I like agile (small a) processes, Behavior (or test) driven development and dynamic languages. I am also pretty good at designing data interchange formats in JSON and XML. I dislike poorly factored, inelegant code. I do have a tendency to over-engineer things, but I am working on that.

If the above sounds interesting we should talk. My resume is here.

I’m one of the cool kids

It was pretty surreal to watch this unfold in my inbox. I happened to be one of the lucky 400 people to get spammed by Pradipta. The internet is a strange and wondrous place.

The Few, The Proud, The Pradipta 416

Reverberate seems to be having load issues so the story is: Yesterday a recruiter sent an email regarding some Ruby on Rails work to 400 people. But rather than using BCC he just sent the message to everyone. Shortly thereafter someone replied to all which, of course, went to all of us. The weird part is that it rapidly evolved into an interesting discussion amongst that group of random people brought together only by the ineptitude of a spammer. So much so that we have create google group and a logo. :)

Envy Code R

I love the new Envy Code R font. It’s very clear and easy to read. I had looked at this font in the past and quite liked it. However, I need a somewhat larger font than its native size and previous releases of it did not scale very well. Fortunately, the new version (pr7) seems to scales very nicely.

Here is screen shot of “pretty” Emacs (on Ubuntu) using this beautiful font

Pretty Emacs using Envy Code R font

Gnip Launches

Yesterday Gnip launched! We have a killer service offering. And apparently lots of other people agree. I am totally stoked to be part of the Gnip team.

The Gnip blog does a good job describing why we exist and what we do.

If you are looking for the quick elevator pitch it goes something like this: If are a consumer of public data APIs and would like to stop polling hundreds or thousands of URLs, we provide a way to notify you when any event meeting your interest criteria has happened. If you are a producer of data and would like to allow the world access to your data but the load of thousands of consumers polling your API is hard to manage, we help you by providing data consumers event notification. (Meaning they will only need to hit your API when something they actually care about has happened.)

If either one of those sounds interesting you should definitely check us out.

Announcing Resourceful

Resourceful has its initial (0.2) release today.

Resourceful is a sophisticated HTTP client library for Ruby. It will (when it is complete, at least) provide an simple API for fully utilizing the amazing goodness that is HTTP.

It is already tasty, though. The 0.2 release provides

  • fully compliant HTTP caching
  • a framework for implementing cache managers (memory based cache manager provided)
  • fully compliant transparent redirection handling (with hooks for overriding the default behavior)
  • plugable HTTP authentication handling (Basic provided)

Introduction

The API is strongly influenced by our successful experiences with REST. Each URI is represented by a Resource object. The Resource objects act as a proxy for the conceptual resource. Resources expose the basic set of HTTP verbs: get, put, post, delete. For example to get a representation of some resource you do this

require 'resourceful'
http = Resourceful::HttpAccessor.new
resp = http.resource('http://rubyforge.org').get
puts resp.body

If you want to post a form you do this

require 'resourceful'
http = Resourceful::HttpAccessor.new
resp = http.resource('http://rubyforge.org').post("name=Peter&hobbies=programming,diy", :content_type => "application/x-www-form-urlencoded")
puts resp.code

All non-2xx responses are either handled transparently (e.g. by following redirects) or the method will raise a UnsuccessfulHttpRequestError.

Conclusion

If you need a decent HTTP library in Ruby come on over and check it out. If you see something you want, or want fixed, feel free to branch the git repo and do it. Paul and I would love some more contributors and will welcome you with open arms.

Sprinklers

I have been battling the sprinkler system in my front yard for a while now. I spend a good part of last weekend working on it only to have completion of the project ripped from my grasp by a burst pipe (and my lack of competence in sprinkler systems). Today, however, I am triumphant.

My sprinklers running

Here is picture of my new found enemies unconditional surrender.

My sprinklers running

(That is the replacement for the section of burst pipe that was such a problem. Notice how it is not leaking. It’s the small things.)

The back story

In 2006 we had a walk added to our front yard. It added some nice visual interest and has been great. But it ended up covering one of the sprinkler heads. No big deal, we just turned off the front sprinklers. We had – and still do have, for that matter – big plans for xerascaping our front yard. We live in a semi-arid climate and have no need for a lush carpet of grass in the front yard.

A year and a half later we have still not finished the front yard. The grass is looking really bad this spring, so we decided to fix the sprinklers. I like DYI projects – they are a hobby of mine – so last weekend I jumped in with gusto.

Everything was going great… I found the main line I need to cap to disable the heads under the walk. I installed a new head for some new small sprinklers in a flower bed. I removed another head whose placement was just dumb. Then I turn the sprinkler on and it worked. Well, except for the water spraying out of the ground in the middle of the yard.

It seems that in the intervening two winters the sprinkler line burst. So I dug the appropriate hole, cut out the busted pipe, and attempted to install a new section. Several times. And then I had to give up for the day because it was getting dark. Today, I started again, and as they say, the rest is history.

My Brother Has a Blog (Finally)

Cat and I have been gently suggesting that my brother should get a blog for years. Now he has finally done it. I am not sure what the personality1 of his blog will turn out to be, but I am looking forward to finding out. He is smart – and a better photographer than I knew – so it should be good.


  1. I was about to say theme. That is not quite right, though. Some blogs have a theme other have more than one theme intertwined. I am not sure I am comfortable personifying blog quite that explicitly but personality does work rather well to describe what I mean.

Want a Job?

As you have probably noticed, I recently started a new job. Which means that I also recently left a job.

The job I left was as at Absolute Performance, and it was a pretty good gig. The good news is that my leaving means that there is a spot for you. If you are interested in working on some cool Ruby, Java and C++ code with a really great team you should send them a resume. Oh, and don’t forget to tell them I sent you, maybe they will buy me a lunch or something.

Java and Scalability

Every time I hear someone say that Java is “scalable” my initial reaction is to kick the person who said it in the shin.

I have been talking to a lot of people lately about the tools we are using at Gnip. Every time I tell someone that major parts of our system are written in Java the response seems to be, “Oh, for it’s scaling capability?” While I was safely ensconced in the Ruby world I had hope that this malformed meme was dead. It seems that in the wider world it’s not quite dead.

I never actually kick the person, by the way. Instead I just sigh and explain that, no that is not the reason. Scalability cannot be the reason we use Java, because Java does not scale any better, or worse, than any other general purpose language.

There are a variety of different sorts of scalability. The most interesting type of scaling in the context of web applications, like Gnip, is how easily can you increase the number of requests/sec the system can handle. This sort of scalability, or lack thereof, derives pretty much entirely from the architecture of the system. No language will magically make your system be able, or unable, to handle an order of magnitude increase in the number of requests.

The culture1 of Java actually encourages the development of mediumly, rather than highly, scalable systems. It does this by favoring the use of multi-threading, shared state, vertical scaling and large monolithic components. These techniques do not scale infinitely. Fortunately, Java is fast enough that they can scale to quite significant levels. Even though the culture of Java encourages these less than perfectly scalable techniques you can build highly scalable systems with Java quite readily. You just have to be willing to buck the culture when it is appropriate.

Performance, on the other hand, does derived, to a significant degree, from your language,2 and that is why we use Java.


  1. Every language has a set of idioms and practices that it, and it’s community, implicitly encourage. This set of idioms and practices are what I mean by culture.

  2. I really wish this were not the case. I don’t think it has to be this way but today Java is a lot faster that most of the languages I really like.