On the untimely demise of google wave

Alas, Google wave is no more. I knew it well.

Or.. rather. I knew the api’s well. All the cool technology behind it – I knew that.  The google wave team tackled some tough issues to get it up and running. Google wave included an implementaion of  Operational transforms for largescale realtime collaboration. The google wave api was also pretty nifty.

Now – when thinking about it , I remember email conversations about google wave – facebook conversations about google wave. Real life conversations about wave. Hackathons about wave. I never actually did anything useful in wave itself.  All the fun memories I have about google wave is basically learning about new technologies and meeting new people. There is nothing bad in hacking on interesting tech – during this process I learned about google app engine, cloud computing, python,  protocol design and some longhaired math – all these things are usefull to me in the long run.

It looks like that some of  the technologies of google wave will live on in other google products.  One of the main features – realtime collaboration in documents is now available in google docs.

Using the ExtJS Designer

I have downloaded the ExtJS Designer and tried it out . It has some minor kinks , but it looks like it is in a usable state. I left some notes here , and an example project here .

Surviving in the post-sun software era

Now that an era has passed then I thought I’d write up a list things that you can do if you want to use open source variants of projects now maintained by Oracle.

MySQL is now also maintained as maria-db. Today I switched my home mysql server to maria-db using the instructions here .

The JDK is now opensource and can be retrieved by issuing “sudo apt-get install openjdk-6-jdk” on debian.

openoffice now has an accelerated development cycle at go-oo

opensso is now maintained by forgerock in the OpenAM project.

Oh yes. For those of you that have been using netbeans , I would recommend you take a look at eclipse . (Oh .. eclipse? .. now I get it)

pdf thingy

Update 2010-05-08:

Google has decided to discontinue Google wave, so  I  will stop updating pdf-thingy.

I’ve spent a couple of hours tinkering with pdf export from wave. I put the result here :
pdf-thingy@appspot.com . You can invite the bot to your wave, when you do it will present a link to a pdf version of the root blip. No fancy colors yet ;)

Somebody pointed me to PDF Wave Exporter, but I could not find the source code for it to tinker with. (I admit that I did not look that hard).

I implemented pdf thingy to learn more about python,wave and google appengine.

I based pdf-thingy on exporty by Pamela Fox , available from google code . This tutorial helped me learn about reportlab on google app engine.

You can find the code here: http://github.com/jacobandresen/pdf-thingy

There are some obvious points of improvement:
- handle text overflow
- supporting annotations
- fancy color templating

icanhas javascript OOP?

In javascript we can express objects using the prototype notation:

  var Cat = function () {
     this.furry = true;
  }
 Cat.prototype.greet = function () {
   return "meeow";
 }

using class mimicking from prototype-js it would be :

 var Cat = new Class({
  initialize: function (){
    this.furry = true;
    },
  ask: function (item) {
   return "icanhas "+item+" ?";
 });

This example should be pretty clear. But when we get into real-life application scenarios we need to interact with users and databases.

Let’s say we had a panel and a button for interacting with lolcats:

var CatInformationPanel = Class.create({
   initialize: function (container) {
     $(container.id+'_furry').checked = true;
     $('petButton').observe('click',  this.ask.bindAsEventListener(this));
  },
  ask:  function (item) {
    $(container.id+'_text').value ="icanhas "+item+" ?";
  }
});

Note that we need to bind “this” to the the function scope for “ask”. this is one of the intricacies of object oriented javascript. Here are some badass ninja examples to explain why.

Now, after interacting with user , you probably want to save the result to a database. let’s assume that you have a resource /lol/cat/questions you can issue a HTTP post to (you can create this using rubyonrails or something similar).

var CatInformationPanel = Class.create({
   initialize: function (container,name) {
     this.name = name;
     $(container.id+'_furry').checked = true;
     $('petButton').observe('click',  this.ask.bindAsEventListener(this));
  },
  ask:  function (item) {
    var question = "icanhas "+item+" ?"
    $(container.id+'_text').value =question;
   var request = new Ajax.Request ({
      "/lol/cat/question", {
        method:'post',
        params:{ name:name, question:question },
        onSuccess: function (json) {
           alert("saved question");
           }
     }
    });
  }
});