NBnotify: NetBeans Growl notifications, now with its own website

http://nbnotify.com/ is live with the latest version of the NetBeans plugin which displays Growl notifications for builds (as well as everything else the IDE might need to notify you about).

It took about a week to get this up and running, but mostly because we had a weekend in between.

Andrei was paid to take care of the WordPress magic, I just provided the budget (yeap, open-source still costs money besides time), text, screenshots and the video.

Speaking of the video, it's surprisingly hard to find a tool that records plain .avi on OSX. Hard because Google is oblivious to the changes in Snow Leopard where I could just use QuickTime to do File | New Screen Recording. Of course, I've only seen this now, and fiddled with Camtasia, Snapz Pro X (which worked) and Jing.

Have fun with the plugin and let me know about it!

Linguistic musings

There are two notions that to me seem have been injected out of the blue into the mainstream.

First: systems programming (language)

This came for me out of nowhere. The first Wikipedia articles are from 2004 (and late 2003) but I've never heard it until Google Go was described as something good for systems programming.

If you look at the Google Trend for "system programming language, systems programmer, google go language" you should see something like this:

So basically all variations start showing up the same time as Google Go is introduced and even those that show up are basically job adds that just happen to have 'systems' and 'programmer' in them.

It's safe to say that Google Go brought the word systems programming into the mainstream.

If you are looking at Wikipedia, even the description of the C programming language is filled now with "system software" and "system programming" but go as far as the 2004 version and "system programming" is gone.  In the late 2002 Wikipedia version it doesn't even mention 'system software'.

Second: curated computing, curated platform

I think Apple thought long on hard about how to put a positive spin on the whole closed ecosystem they are selling with iPhone and AppStore and figured out the curated word. It's actually quite brilliant -- the experience is locked down, but it's curated, so we have someone there (the curator) that cares deeply about your experience.

Enough with my linguistics musing for tonight. Let me know about other words and phrases I might have missed!

Building an iOS project with Hudson

I'm mostly writing this here for archival purposes. This is how I used to build iOS projects via Hudson (I don't have any iOS projects ongoing).

First, since Hudson runs on a Linux machine, I need to add a new node then start the agent on an OSX machine from an account where I have all the digital keys set up properly.

Next, supposing I have an iOS app called Example, I just tell Hudson to poll the SCM then execute the script:

TIME=`date "+%Y-%m-%d_%H-%M-%S"`;

rm -r build || true;

xcodebuild -target Example -configuration Distribution -sdk iphoneos3.1.2 clean build


  (mkdir build/Distribution-iphoneos/Payload; mv build/Distribution-iphoneos/Example.app build/Distribution-iphoneos/Payload)
  (cd build/Distribution-iphoneos && zip -9 "example-$TIME.ipa" -r Payload)

Afterwards Hudson just needs to "Archive the artifacts" from build/Distribution-iphoneos/*.ipa

Obviously you need to tweak the sdk version a bit as this script is for an older 3.1 app but this is the gist of it.

Now you just have Hudson doing builds as soon as a commit comes up and you can send updates to customers by just grabbing the .ipa file from the Hudson site (or even give customers direct access to Hudson and have them download a build as soon as available).

NetBeans Slowness detector with Growl

Got surprised today when I saw the slowness notification on Growl:

I rarely get this message but it's nice to see it published via Growl, using my OSX Notifications module which is a Growl bridge for NetBeans Platform notifications.

Clicking on the notification

gets you this:

I'm not entirely satisfied with the way this message is presented because I would need a "Close" button, not an "OK" button. Also -- clicking on that hyperlink seems to open a new window behind this dialog.

Anyhow, there isn't much I can control since we have a lot of native components due to the broken OpenIDE AWT NotificationDisplayer API which encourages custom JComponents.

This particular notification for example should use no custom component. It should just say: "Slowness detected: Not responsive for 5 s" and then clicking on the (Growl) notification should open the "Report Problem" dialog.

NetBeans Growl notifications

Demo time

This plugin provides Growl integration with NetBeans. If you are using NetBeans on OSX and you have Growl, download my plugin.

As a proof of concept builds are shown but all other notifications that usually would have appeared using the default implementation are now posted via Growl.

Complex UIs trigger just a simple notification and then display a dialog when clicked with the actual custom components (obviously one can't publish custom Swing components in a Growl popup).

Speaking of complex UIs, some custom components are just JLabels that simulate hyperlinks so I would say those might be migrated to a normal text and ActionListener.


One thing that NetBeans needs is OS-aware notifications and my two focused OSes are Ubuntu and OSX.

On Linux we have the Desktop Notifications Specification, which is a very clean, D-BUS based specification for desktop-wide notifications.

Ubuntu extends and modified the specification a bit as well as define a quite nice design guideline document.

Growl defines the OSX notification standard which is generally similar to the Ubuntu version. Their documentation provides a nice overview of their API.

NetBeans on the other hand has its own notification API in the via the OpenIDE AWT NotificationDisplayer API.

The problem is that all these are disconnected, but rather similar given the nature of the problem they are trying to solve.

What I think NetBeans is missing on OSX is a proper Growl bridge. Also, the NetBeans API should be modified to discourage custom components as those aren't easy to bridge to something else.


It's rather hard to find Java bindings for Growl as the official implementation is deprecated.

Next, I was able to find Grrrowl by Sonatype, which uses native code (via HawtJNI) and seems to be originally part of IntelliJ. There's also a fallback implementation to AppleScript which is nicely provided as pure Java scripting engine on an Apple JVM.

The problem with Grrrowl is that while it does display notifications quite nicely, it doesn't support any click handlers, so we won't be able to respond to user interaction.

The best implementation seems to be a very low-profile implementation by Michael Stringer, posted as stringbean on CocoaForge.

Michael Stringer's version uses actual JNI and provides a click handler. This is what my implementation uses.

Obviously, it only works on OSX, specifically, Intel-based OSX (because that's what I used to build the native code).

Let me know what do you think about it.

MySQL as the first NoSQL database

I was watching yesterday a presentation at GeekMeet Timisoara about how to scale your websites and all the MySQL-related advices were as expected, but upon thinking about it, entirely agains normal database mantras:

  • You should de-normalize the database (copies are easier to access and cheap)
  • You should disable transactions (ie. use a MySQL storage engine that isn't transactional).
  • MySQL Master-Slave replication (which is asynchronous!)

This made me realize that MySQL is successful precisely because of all the things I discredited it for.

You see, in my book MySQL was never a real database because, initially, it wasn't transactional. For the project where I could choose the database, I picked PostgreSQL and I always used MySQL knowing in the back of my head that, in fact, it was a bit of a sham.

But this might just be MySQL's good fortune: by providing a simple storage engine with some SQL front-end, they proved that most people don't need ACID compliance.

Furthermore, as more and more people need to scale their applications horizontally (since it's cheaper and because... Google does it), they need even less of an actual database.

NoSQL was a movement that started after people got tired of the constraints of SQL databases and started thinking about what do they really need when storing data. It was liberating to see that one must not assume from the start that "external data==database" and actually put some though into the specific needs of their application.

And by being such a lightweight and unconstrained implementation, MySQL is right here, still serving the needs of people that want to scale out.

MySQL was basically the first NoSQL database. By relaxing what a database must provide, they proved in the long run that this is what people actually need. So besides the pure NoSQL tools like the various key-value stores they are building nowadays, MySQL could very well remain the most used place to store your data precisely because it allows you to pick which of the database-specific features you actually need.

NetBeans Ideas

Auto update must become OS-aware

This means that on Linux auto update is entirely apt-get based (or whatever mechanism the distro has).

On OSX we might use something like Sparkle.

The NetBeans specific auto update implementation should be just a fallback plan. Having it use BitTorrent too would be nice (see my experiment regarding this).

OS-aware notifications

The custom notification mechanism and popup should be replaced by the OS notification, if available. This means using Growl on OSX and whatever Ubuntu has nowadays.


Git support should be part of the official release: help these guys make it happen!

Mercurial Queues and 3 way diff would also be a nice thing.


Btrace should be bundled with NetBeans and integrated with the existing debugger and profiler. I want to either use the manual debugger/profiler, run normal BTrace scripts or control the debugger or profiler via BTrace scripts! This means a Debugger/Profiler dedicated BTrace API.

Out of process indexing

Indexing takes way too much CPU/memory and should be moved outside the main process (think Google Chrome Multi-process Architecture) since it triggers ugly memory spikes. The design is also kinda broken: preindexing needs almost a full IDE launch during build.

I'll try to expand some of these ideas into dedicated posts.

Of Romania

This post is about a facet of the Romanian society so if that doesn't interest you, feel free to ignore it or just skip to the conclusions.

Something in the air

There is a strange attitude I'm noticing in my day to day interactions with some institutions and the State. The relationship between authority and individual seems entirely broken.

Perhaps I should start with some examples and then I'll let this cristalize a bit.

Avoid the rules

First, imagine you live in a building of flats and you want to fix the roof. Well, since it's a historical building, you need some approval from the City Hall and some Culture departments.

And this is where the red tape gets to you: besides the whole paperwork you need a formal architectural plan of your change. Although you technically aren't changing anything and you're just investing $300, you need to go to a 3rd party architect to pay him draw you some plans.

So, what did a City Hall official say when I tried to explain this is crazy, because I'm wasting more time and money on the formalities than I am actually investing in fixing the roof itself? Her answer was: try to do this over a weekend and be done with it.

The rules are so convoluted and stupid that the officials are recommending you to skip them.

Be fearful

I went the other day to buy a parking subscription as it's cheaper to pay for a full month instead of paying each day. There was an employee there that started doing small talk and then he said: you know, they apparently mounted traffic cameras outside the city -- make sure to also pay the road tax.

From the outside this looks like an advice from a caring person. But actually the context and tonality was another: he was trying to justify why am I paying for parking inside the city (his company is basically a parasite, they don't actually build parking places) by making me fear the fines. And of course, there are other things I should pay, such as the road tax.

Because you see, people that are decent and pay their share are just the kind of people that need some fear mongering to pay for everything else too. The rest of the people will slip though the cracks somehow.

The parking company isn't selling you a service. It's selling you a protection racket so you don't get fined.

At the beginning of the year the "economical crisis" was just in full swing so there was the idea that people won't pay their property tax. What did the politicians do? They started spreading rumors that they'll double the tax and people rushed to pay the lower amount. Funny thing -- by the end of the year the increased the property tax anyhow for a subset of the population.

I know you avoided the rules

I called the guys providing our building natural gas because there was a smell of gas next to the building entrance and that's usually not a good sign. As expected, some pipe wasn't sealed properly and they fixed it.

But the discussion I had with one of the two employees that came was, again, interesting. We discussed about the cause and the fact that natural gaz doesn't actually have odor so they add something to it (which is common knowledge).

Then he started saying that there seems to be something wrong with some of our pipes, specifically the exhaust pipes for the heating devices people use.

Because, you see, you are always breaking some rules (imaginary or not) so you shouldn't bother anyone in a power position as they will find something to bother you with.

You know you avoided the rules

Historical buildings are property tax-exempt but I've had my neighbors say they don't actually want to do the paperwork for use this right: they fear the City Hall will starting paying close attention to them and find something else to tax or fine them.


What results is Romania: a system so broken you have to ignore the rules to get something done.

Since authority assumes that you broke some rules -- you better keep your head low. People assume they either broke some rules or there are rules that may be interpreted easily to frame them so they do keep their head low as not to anger someone higher-up.

Taxes are mostly extracted through fear, there is no concept of honest person or the civilized attitude that you might want to pay your share just like everyone else.

People in power don't care about anything as they make the rules.

Normal people are like an exotic creature that they don't know how to classify.

Silver lining

This blog was a bit too grim but I wanted to describe this for quite some time since it's something that looks fundamentally broken and unsustainable. It's also bothering me a lot!

The silver lining might be that people are free and a big chunk of them are visiting or working in European countries: it gives them a reference point, a system that works. I believe that at some point we'll converge to a more sane society as everybody will have an idea about how things are abroad.

Of course, there are also a lot of genuine nice Romanian people, but this blog wasn't about the young generation or the rest of the nice folks.

It's about the people that seem to have any form of power onto others and how they distort everything. It might just be that power corrupts in it's smallest quantities and these small doses of poison alter nations.

Why don't you have personal projects ?

I've been reading a lot of CVs and did some interviews with young folks that are either about to finish University or just did (and some are already preparing for their Masters' degree) as I'm trying to fill a position at Joseki Bold SRL.

What strikes me as unusual is how few personal projects do most of them have. And I'm not talking here about A students that barely have enough time to learn for school and do the teacher's projects. I'm talking about normal students that don't seem to have very high grades, nor work to earn a living and yet they also don't have any personal projects to talk about.

Computer programmers are lucky. Unlike other professions, we can easily afford to buy the top-level tools and have free access to a lot of information to learn about our trade. A physics student can't really buy his own particle accelerator but by all means any student already has everything the best computer programmer in the world has: a PC and access to internet. That's all there is!

And if you care about computers there's also the University resources. For example, if you want to play with a cluster -- the University has one. Or, Amazon's EC2 machines are cheap enough you can experiment a bit if you are really passionate about.

This might be the gist of it: you need to be passionate about it.

I remember an old Eddie Murphy from the 1980s called Coming to America where Eddie is a prince that has everything, including a gorgeous groups of half-naked women as his personal "bathers". His father has a nice line somewhere in the movie:

Son, I know we never talked about this. I always assumed you had sex with your bathers. I know I do.

Magical moments

Noticing after I've read Douglas Adams' The Hitchhiker's Guide to the Galaxy that on a furniture in the kitchen lies the answer to the ultimate question:

Sitting one day in the almost empty 700 Coffee & Lounge and hearing the eerie Twin Peaks Theme by Angelo Badalamenti:

Cleaning up yesterday the same old closet with 42 and finding a bottle of Suntory Gold whisky. Lost in Translation is my favorite movie and Suntory is the brand of whisky Bill Murray was endorsing in it:

Source code hosting sets pricing all wrong

Where's the love?

The way GitHub structured their pricing plan looks like a way to punish long-term customers.

They don't charge based on how much value they are providing: they just charge based on how much you must be willing to pay after your data starts gathering there. And they are not alone -- most other do the same wrong customer segmentation tricks.

Many small projects

It's good form to have separate repositories for separate projects, so with each new project hosted on GitHub you would create a new private repository.

Well -- pretty soon you will run out of private repositories so you'll need to upgrade to a new plan.

If you look at their pricing plans they are for 5, 10 and 20 private repositories, and then you get into the over $100/month business plans.

Am I silver business or micro ?

If I look at my own server, I have 34 mercurial repositories dating 2 years back alone. Of course, some are big, some are small, some represent my own ideas while other are repositories for client projects.

But do you know how many am I actually using nowadays? The answer is 4.

So according to this I would need to be on a silver business plan with $100/month. But what is the value they are providing? It's the equivalent of $7/month of the micro plan, plus the value of having your old projects archived and available. Now, I wouldn't say the value of archiving old projects is $93/month.

Metered please

My solution is metered code hosting.

Amazon's EC2 might have spoiled me but I like to know that I'm paying for what I am actually using.

So, how do I see a sane pricing plan ? Well, there are 3 axes to look at: it's the disk I'm using, the bandwidth I'm using and then the actual hosting extras I'm accessing like online source code visualizer, wiki, merge tool, code review or whatever. If you think about it, the "extras" I am talking about might be seen like the CPU-time of running their software.

Now, all the trick is setting a right storage/bandwidth/CPU price.

Storage can't be more than 130% of the S3 price, meaning about 20 cents/GB ($0.20)

Bandwidth can't be more than 130% of the EC2 data transfer, meaning again about 20 cents/GB ($0.20)

Setting a price on the CPU time is interesting as this basically tells you how they value their product. It's impossible to guess but they would have to set the number pretty high to make normal usage exceed their current pricing plan.

... or the simpler change

The other notion they could introduce is that of active repository.

If I am pushing changesets to a repository, editing the wiki it's pretty safe to say I should pay for that repository.

But if I haven't touched the repository in any way for the whole month it would sure be nice to charge me only for the storage (or nothing at all if we see storage as "unlimited").

Compiling is such a chore

I'm using Hudson as my build server and I would love to patch some things about it, especially the JUnit reports and charts.

Well, one of the reasons I dislike getting to this small change is that I would first:
  • need to checkout Hudson,
  • then figure out how to build it,
  • then do the patch,
  • then compile it and finally
  • start using the changed Hudson.
Thus, there are quite a few things that stop you from doing the smallest changes, and I would say the biggest culprit is that you have to compile the code. In a scripting language:
  • I would not need to checkout anything as the installed sources are everything I need.
  • There would be no "build" rules.
  • The patch would be done in-place.
  • There would be no "compilation" step and
  • There would be no "deploy" step so I can start using the new Hudson right away.
So while I dislike PHP, for example, as it seems too easy to break anything, having a strong typed, compiled language does hinder the desire to do small changes.

Imagine how easy would be to keep your changes in a separate branch (or Mercurial queues) and just rebase once in a while with the upstream codebase, tweak your patch a bit and have the latest running version as well as your changes.

Having everything pluggable is nice, but sometimes it would just be faster to edit the source.

Forget the removable battery, what about the easily removable hard drive? (Get well soon, trusty mac!)

Get well soon, trusty Mac

Last Wednesday my MacBook Pro's display stopped working. Actually, it might be the logic board since the fans do seem to start but nothing else happens: it needs to be sent to an Apple Service. (It could also be that wide-spread NVidia problem MacBook Pros had, who knows).

Anyhow, I had to migrate some data to a new machine I received this morning.

I have bought about a month ago an Intel SSD hard drive so I already knew how to dismantle the laptop. This time I just had to swap the hard drive of the replacement machine with my own SSD drive and I was back to work. Well, one hour later anyhow.

User serviceable

This whole experience made me think how convenient it really is to have user-serviceable components. As laptops basically replace desktops, it's important to be able to access hardware in your laptop.

Actually, not everything is important, there are 2 big things that matter: RAM and hard drive. RAM access is just a nice to have feature since adding more RAM is the best upgrade one could make. CPU and GPU would be nice to have, but not high on my list.

Hard drive access is crucial though, because your work isn't actually on the machine itself.  Your work is just the hard drive. Having swapped the drive into this new laptop I'm back to work just like it's the same machine (if you ignore the annoying German keyboard).

So, it's a bit weird to think about these new MacBooks that are unibody and seem to be harder to dismantle. Taking your machine to a service for a battery or hard drive replacement is odd: in Timisoara this means I have to send it via post 600km to Bucharest, and it's not cheap either.

Plus that all this doesn't take into account the importance of data: I wouldn't want to send my laptop with the work data on it. Even if I were to use FileVault, there is something unsettling about knowing your data is exposed like that.

The right to private data

The right to private data should be as important as the right to privacy. Just because people buy a laptop they shouldn't give away the right to private data. I don't really need a replaceable battery, I don't mind Apple keeping the old battery if they need to replace it. But I need a replaceable hard drive.

So, instead of a removable battery, laptop manufacturers should actually make a removable hard drive. In a few easy steps any user should be able to pop-out his hard drive and then send the empty laptop shell to service worry free.

Re: How Could the NetBeans Team Make Money from the NetBeans Platform?

This is a reply to Geertjan's blog which wonders how could Oracle monetize the Platform: How Could the NetBeans Team Make Money from the NetBeans Platform?  .

The first thing I would like to see is the NetBeans Foundation which would be a central authority that cares about the future of the NetBeans Platform (and IDE, actually -- it makes no sense to have the Foundation just for the Platform).

Because when NetBeans was under Sun, the Platform wasn't seen as something worth monetizing. Under Oracle, we worried weather they will pull the plug or not (given Oracle has their own IDE and supports Eclipse too).

So, the first thing would be to have an actual entity in charge of this -- something legal, not some website or imaginary construct. This entity would want to get our money and will support itself in various forms: donations, support, stakeholder fees or various subscriptions.

Of course, we need some actual backing so we would still need actual companies on board: stakeholders.

Some of these stakeholders might need to pay, but I imagine it will be indirect: they will pay for developer time. Just as lots of companies employ developers to work on the Linux kernel, tools companies will employ developers to work on parts of the NetBeans Platform or NetBeans IDE.

Having a simpler and more modest entity in charge will also allow an ecosystem to form around the Platform and the IDE. I'm not sure Oracle will list my small company as a source to get official support for the Platform, but I'm pretty sure the NetBeans Foundation would (just as there are many companies offering various services around Postgresql, for example).

Now, the big question isn't how should NetBeans make some money. There are surely many ways: I'm working full-time just doing NetBeans Platform-related projects. Many other people are doing a living doing trainings or programming. My questions are:

How much does NetBeans actually cost and would we get enough stakeholders ? Except Oracle, who would get on board to pay either cash or developer time to keep NetBeans going? Because if only Oracle pays, they will be reluctant to allow the Foundation happen (actually they still might, for tax purposes). If NetBeans is a loss leader, can Oracle really afford losing total control ?

Any other solution that doesn't include the Foundation doesn't really interest me as I don't think NetBeans is making Oracle poor. They can always try to get as much money via training, support and other ways and just cover the difference out of the pocket to have their own IDE which may be seen a loss leader for other Oracle products (for example JavaFX).

Plus that now that Oracle owns Java and leads the JCP so they will always need some IDE to provide the reference implementations on: might as well be the OSGi-fied NetBeans.

EC2 as a build server

I've been using for the past year or so a Slicehost virtual private server running Ubuntu Linux to run a build server.

Due to the inherent IO-bound nature of some of my builds and the RAM starved nature of the servers sold, I've been forced to upgrade from the 256MB to the 512MB and then to the 768MB slice. Not sure if it's a marketing ploy but you cannot use the server otherwise.

Starting last week, I'm running experiments on migrating the builds on top of EC2 (and S3 for storage). Using EC2 for a build server, especially for a small company is a perfect fit:

EC2 machines are way more powerful

The smallest EC2 machine has 1.7GB of RAM and the next one 7GB. These are serios machines.

Builds are finite

This might not apply for your projects or your company, but I generally do a few operations per day that would trigger a build.

This means that I actually only need the server for, let's say, 5 builds per day or less. Over 20 work days, I would actually use the build server for 100 builds per month.

So I am actually paying for a server to be live all the time when I only need it for 100 builds. Assuming a build takes about 1 hour (which is does for the longest project I have), I only need the server for 100 hours per month.

It's cheaper

Considering the previous paragraph where I noticed I only need the server for 100 hours, it's cheaper to pay for the EC2 hourly usage. Of course, running the EC2 server full-time would be a lot more expensive compared to Slicehost, but I don't need it full-time.

Thus, it's cheaper either to give up Slicehost altogether or to have some mixed scenario perhaps, with a much cheaper Slicehost server combined to an EC2 slave running on demand when needed. I'm slowly migrating to the mixed scenario first.

But there are also some clear advantages to using EC2:

You really do a clean build

While with a normal build server that's configured properly this problem doesn't show up, it is possible to be there: tainted builds. A tainted build is one that's using some form of unexpected binaries for various reasons.

When you build on a fresh machine there is nothing there to influence your build. Just the operating system, your tools and your code.

It forces you to take out to magic out of the build

When you start with a bare-bone machine you cannot make any assumptions you would unknowingly do on the build server.

On an always-live build server you can easily ssh and do some manual tweak which will remain there forever but never be actually documented.

This style of whole world building will force you to document and produce all the build dependencies.

Some first results for my most IO bound build

It finishes:

After 30 minutes with the 512MB slice, (but that started slipping for some reason, hence the upgrade)
After 20 minutes with the 768MB slice.
After 25 minutes of uptime with the EC2 m1.small
After 11 minutes of uptime with the EC2 m1.large
After 15 minutes of uptime with the EC2 m1.large, building everything over a RAM-disk.

The surprising thing here is that on EC2 m1.large, where I have over 7GB of RAM, a RAM-disk is slower. I assume the reason is that Linux uses the RAM for disk-cache anyhow and it's smarter about that (ie. by only caching the JARs not the whole source and build folder like I did).

The build over EC2 m1.small seems to be a bit slower but this total time is uptime. Meaning in the 25 minutes I install all the tools and download and unzip more than 1GB of dependencies and do the build.

Fremen gear

Ever since I've been working for my own company, I've discovered that working from a single place gets pretty boring after a while. Actually, there are a few phases you go through, but suffice to say at some point you'll want to also work in coffee shops at least for the change of scenery.

Let's talk now about the gear I happen to use:

Then, a whole lot of other items I was a bit surprised to find when I unloaded the backpack yesterday to wash it:

Let's see (right to left):

  • My Orange 3G modem. I rarely need it while in Timisoara. While visiting my parent though it's almost useless since it goes over EDGE, meaning it's slower than dialup.  Handy as a last resort but I won't renew the subscription with Orange when it expires.
  • My 8G iPod Touch, USB cable and iPhone headset (I use this headset since it also has the microphone, unlike the original iPod headset). I almost never listen to music though, it's just for testing if we have an iPhone project to develop.
  • Nokia E71 USB charger (you can barely see it since it's black -- right next to the iPod cables)
  • My 2010 diary
  • A fountain pen -- I like writing with a fountain pen, a ballpoint pen ruins your handwriting.
  • A ballpoint pen
  • Lots of wet tissues (including one from KFC apparently).
  • Matches
  • Some pills
  • A key I forgot about
  • A Wenger Swiss Army knife (thanks dad)
  • Company stamp. I don't carry this always, but you need it for almost everything company-related here.
  • Bureaucratic papers.
  • A small yellow note book for quick note-taking
  • Some leftover sugar from some coffee I bought probably. Forgot about these -- it's very easy to lose stuff in the backpack.
Besides these items, sometimes I have in the external pockets a small umbrella, tissues and perhaps a 500ml bottle of water.

There you are: the gear of a modern day fremen. Stillsuit not included.

iPhone OS notes

Apple news flooded the Internet during Easter. After having watched the iPhone OS 4 keynote I have a few remarks and questions. Feel free to comment if you have anything to clear up for me.


Jobs sells the penalty of clicking ads since that closes the app and launches Safari. But since he just introduced multitasking, this penalty is greatly reduced or non-existent. After all, if the user doesn't know how to return to the app after clicking an ad there is something really wrong with the multitasking user interface.

Push services

Things that make you go hmm: apparently Apple has a direct link to each iPhone via push services. I never used this API but I can't but wonder how does this thing really work (expecially via 3G-only).

Also, I assume that notifications aren't encrypted. That should be another data-mining opportunity for  Apple for iAd.

Wireless sync ?

iBooks bookmarks sync wirelessly. What does that mean ? Is there some Apple server that gets this data no matter what ?

That's about it. I won't comment on the new programming language restriction they apparently introduced since it's been said enough already.

Almost saw Freddy Mercury in concert

I regret not seeing Freddy Mercury from Queen in concert but I was too young when they were touring and not yet born during most of their prime years.

Last night I witnessed a ballet show on Queen music and it was as close to a Freddy Mercury show as I could ever get.  A truly exceptional experience !

Bread and circuses

Yesterday while zapping the TV shows I've observed what the true purpose of all the political talk shows and talk show hosts is: they are the modern day circus presided by a modern day jester.

For you see, the jester has a very important role: it diffuses the public negativity.

As a ruler or ruling party that also does questionable social or economical decisions you don't really want people on the streets. You don't want resentment to grow within people. So - the jester is actually something you need. Of course, they may sting a little but remember: sticks and stones...

The default NetBeans IDE java source template is polluting the web

People will never bother to do anything manual unless absolutely necessary. This is why I believe the current NetBeans "empty" java file template is fundamentally broken.

It tries to "teach" people how to change the template by inserting in the file header something like:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.

This might sound like a great idea in practice but it's broken since most people won't change it. So it just becomes line-noise that will get published, committed to VCS, etc.

A good UI would display that message differently, like a floating non-modal dialog, or some notification in the New File Wizard, but it shouldn't produce actual text that is part of the source code file.

Google seems to say about the same: there are 321.000 instances of files indexed by the search engine containing that header. And this is only on the public web, I bet there are many more closed-source code repositories filled with these lines...

Reading poetry is hard

I have this book with all the poems of a great Romanian poet, Nichita Stanescu and I've started reading about a poem every day.

I like his poems because they are very imaginative and visual in an unexpected way. I see them as surrealist descriptions, as if someone would put a Dali painting in words and add some more emotions to the mix. Of course, this is just how I see them, I never bothered to read the actual critics review of the poet.

The other day I was reading a nice poem called "Rain in the month of March"  ("Ploaie in luna lui Marte" in original). I can't find a proper translation but this is the first one a search returns.

Well, this poem also became the lyrics of a famous Romanian song by Paula Seling: listen it, it's quite nice.

Now, reading this poem made me realize two things.

First, I couldn't separate the song in my head from the poem. I couldn't read the poem, I was always hearing the tune of the song. The song taught me the only way I could ever read that poem.

Second, I'm probably not good at reading poems. Because the song made me see how beautiful the poem is -- I would have just read it, imagined an interesting visual imagine and be done with it. Reading it would have never shown me how good the poem is, it would have just been another specific Nichita Stanescu poem. But the song showed me it's an excellent poem.

I wonder how many other great poems I've already missed because I couldn't read them the way they are supposed to, with the right state of mind and the right visuals.

Reading poetry is hard.

Nobody reads the fine print (for mobile widgets anyhow)

I've gotten used to skim the legalese things that you agree to upon any account creation, etc. You know, those things that have a textbox next to them and the submit button is disables until you check them.

Anyhow -- here is a nice piece from jil.org, a developer portal for mobile widgets. I used to do Konfabulator (now Yahoo) widgets long ago and I though I should see what's with these new "mobile" widgets. (The terms PDF is here ).
   7.  JIL’s right to use User Content
         1. With the exception of personal information, you hereby grant JIL a perpetual, unlimited, royalty-free, worldwide, non-exclusive, irrevocable, transferable license to run, display, copy, reproduce, publish, bundle, distribute, market, create derivative works of, adapt, translate, transmit, arrange, modify, sub-license, export, merge, transfer, loan, rent, lease, assign, share, outsource, host, make available to any person or otherwise use, any widgets or other content you provide on or through the Developer Site or which you send to JIL by e-mail or other correspondence including, without limitation, any ideas, concepts, inventions, know-how, techniques or intellectual property contained therein, for any purpose whatsoever and in any manner (“User Content”). JIL shall not be subject to any obligations of confidentiality regarding any such information unless specifically agreed by JIL in writing or required by law. You represent and warrant that you have the right to (a) grant the license set out above and to (b) upload the User Content on the Developer Site. You acknowledge that the license set out above includes the right for JIL to make the User Content available to a Sponsor and other entities with which JIL has contractual arrangements for further distribution of the User Content.
Now, this paragraph starts like a standard paragraph on many sites where they basically say the want to be legally allowed to display your product. So they need to be able to host, distribute and market the widget. Sounds nice. Obviously their partners need to be able to do that too. Ok, pretty standard so far...

But here is the interesting part: they want to be able to modify your widget and create derivative works! So this is not the standard "hosting" agreement -- you are actually granting them a license on your source code to do as they please. If you combine this with the fact that every agreement of this kind (and obviously JILs too) has some indemnification clause, you get an interesting situation.

An interesting software would be one to track all these agreements. I think that by the end of your lifetime, it would be pretty scary to look at the dependency graph all these agreements have created between you and sites/companies, partner companies, merged companies, owners of bought companies.

In other words, if we define this "agreement distance" in the spirit of the Erdos number , I'd say that over a 30 years span the agreement distance becomes 1 for any reasonably active individual with any other major company or website.

OSGi has won

Although NetBeans' module system was on-par with OSGi, greater industrial support meant OSGi always looked like a better pick to outsiders.

Starting a while back I saw OSGi as the clear winner. Especially when Glassfish 3, an major Sun project picked OSGi instead of the NetBeans Module system, it was obvious OSGi was winning even inside Sun (although they were reluctant towards giving OSGi a too big stake in the upcoming Java 7 module system).

In the meantime NetBeans is getting native support to run OSGi bundles as well as getting ready to run inside an OSGi container.

Oracle wanted a common IDE extension API starting at least 2002 when they sumitted JSR 198.

Now, owning Java and NetBeans itself, they have it really easy to define the roadmap for both.

I estimate that NetBeans will be able to run inside an OSGi container by the end of 2010. We'll also see official NetBeans plugins distributed as OSGi bundles instead of NetBeans modules. In the end the NetBeans module system might become a deprecated subsystem.

Note: This is just my take at technology analysis. I have no inside information obtained via my NetBeans Dream Team membership or from Oracle.

Interesting banking factoid from Romania

Like anywhere in Europe, all bank deposits are guaranteed if the bank goes under, within a limit.

For a company account, that limit was until not too long ago 20.000 euro. Now, the limit has been raised to 50.000 eur.

See the chart bellow for an idea on how the limit has been raised. It kinda shows the evolution of the Romanian economy as well as the panic at the beginning of the finance crisis.

What seems surprising to me is that if you have a company with, let's say, 1 million eur in deposits, you would need to open accounts to 20 banks and spread your money.

If you have 2 million euro you are out of luck in this regard, because you would need 40 banks and Romania only has about 30 officially registered banks. (Of course, with 2 million euro in cash you would be one really happy camper.)

I wonder how a big company like Apple is handling this, given they had a few billion dollars in cash reserves last I checked.

Slicehost as a build server

I'm using a Slicehost server for over an year now to host my build server and my slice seems to be getting slower.

Here is the graph for one of the projects:

The build initially took about 30 minutes, then I had a period where I jumped to about 70 minutes. This lag was entirely my unit-test and after some refactorings I took is down again to about 30 minutes, which is decent.

Now take a look at another project:

The difference is that the project took all long about 40 minutes, and now I have spikes of 3-4 hours !

What's the catch: well, the first project is taking so long during unit tests since I have a lot of GUI tests, where the code has to sleep and give the interface time to repaint, etc. So, although the time is 30 minutes, it's mostly waiting for the GUI (inside an Xvnc instance) to paint.

The second project though does a massive build where I just produce JARs and don't run any unit tests. It's massively IO-bound.

So, the way I see it, in the past 2 months or so the machine I'm running my VPS on, has been getting slower doing IO request.

IO has always been a problem with my limited VPS experience. First, I got rid of this by moving from the 256mb slice to the 512mb slice since apparently I was just trashing the swap file.

But now, I'm not so certain it's a RAM issue anymore. The 2nd compilation just needs to touch the disk so it doesn't matter how much RAM do I add, after the minimal amount needed for ant and javac.

I'm starting to think I should move the build server onto an EC2 instance. This way I could use a smaller slice just to run Hudson, but do the actual building onto a bigger EC2 instance. I'm not certain it will be cheaper though.

Later edit: The discussion here is continued with my post about using EC2 instances as build servers.

Oracle and Java

Since using Google is faster compared to loading the saved Javadoc, I always read the JDK Javadoc online. There was something odd today - the favicon (what's a favicon?) looked a bit off: it's a red square with a white O in the middle.

Heading off to http://java.sun.com/ I see that the header is different. It says "ORACLE: Sun Developer Network (SDN)". So that's where the red favicon comes from !

Well, I guess it will take some getting used to. I don't really know anything about Oracle, but I really liked Sun's logo much more.

Linux: The last 10% will take another 10 years

Note: The blog post bellow was written on the 6th of December 2007, but I never published it. It seems to still be valid today and given that the laptop I'm talking about went dead and was sent for repairs last week (but most likely they won't be able to fix such an old model), I'm finally publishing it now as a remainder of what that little machine had to endure :-)

Everybody in the Linux world will tell you that Linux has GoodEnoughTM hardware support. Meaning of course that all the good stuff is missing but that your system is fairly functional.

Which is fine ! I mean, as a programmer why would I want to squeeze 100% of my machine ? We can always buy another one which will be even faster but, due to the "LackOfLinuxDriver compensating factor", will fell just like the old machine would have felt with proper drivers.

That is, bad hardware support makes you feel on today's hardware as if you are using a refurbished machine.

Ok, enough ranting. The reason I'm evil in this post is because Linux killed my laptop's battery.

I have an old Dell C840 which had a battery that only lasted about 30 minutes. So I spent about a quarter of the laptop's current value on a new battery (the Dell has two battery bays which is kinda cool).

So now, with the new battery I had about 4 hours off the grid, which was acceptable.

That is, until one night when I just let my laptop with the lid closed but, somehow, it didn't suspend/hibernate as it normally did. Instead it kept on going and going and going upto total and 100% battery drain.

Strangely, the old battery (Li-Ion), after being at 0% and about 16 hours of charge recovered and it's now back to the regular 30 minutes.

But the new battery, after days of charging is dead. Hello LI-Ion deep discharge ! Now, why in the world didn't Linux shutdown my machine when it was clear the power was running out ? Or course, some weird hardware support-related fluke. Do I care ? No: my new battery was killed.

This is sadly a losing position for Linux as they can't write those drivers in some situations (due to so called evil corporations) but it sure makes me mad to use less then what my hardware has to offer...

Another example: Linux (Ubuntu) on a MacBook Pro. It's like the ugly duckling ! The scenario is like this: I use OSX with the nice fonts, Expose, I reboot, I select Linux and then I see the horror. It's as if the machine was reduced to a cheap NoName laptop: the image doesn't "look" good, you see pixelated things, then you see ugly fonts, then you see windows that barely drag/refresh due to lack of a proper driver, then you install the binary-blob-driver from nVidia and notice that the "effects" don't hold a candle to OSX' experience (and some more pixelated stuff).

It's this last 10% threshold that I'm talking about here. Sure, hardware works 90% of the cases, but I sure would like to know I'm using the full power of my machine. Gnome does give you some GUI but I sure would like to see fonts I can stare at for 10 hours a day or some decent effects that aren't there just to show what OpenGL does.

In conclusion: I really like Linux and the reason I bought a Mac was because I needed an "unix" with proper hardware support. Because Linux still doesn't have a place as the main machine.

Linux on a headless server ? Sure ! Linux on my main machine I have to stare at the whole day: not if I have a choice.

I wonder how much does AllegroGraph cost

Although I'm not a big RDF user, I did notice that some SPARQL queries take some time on my machine so I cannot but ask myself how much faster would it run using AllegroGraph ?

Franz Inc does provide a free edition that's limited on how many triples you may store so at some point it should be easy to run some benchmarks.

But -- how much would the AllegroGraph enterprise license really cost to get rid of the triples limitation ?

Like any company that is (or thinks it is) selling an expensive item, the price is not listed, all you are given is a phone number.

I wonder how many customers are they losing this way because people assume the product is way more expensive then it actually is. Because I won't pay 0.5 million dollars to get the enterprise license. Then again, what do I know, it might be 5 mil plus  :-)

Personal growth a purpose in itself ?

2 or 3 years ago I used to read some of an internet-famous person's blog posts. They were mostly economical and entrepreneurship related and I liked the way they were written.

Ever since, I stopped reading his blog since his personal growth "road" has taken him into some strange areas I don't really care to follow.

For example, there were some traces of some kind of mysticism, and then he decided he should separate from his wife, then try polyamory and this year he's going into BDSM !

I know the last part since I re-open once in a while his link to see if something interesting might pop-up. Imagine my surprise when I read his latest blog post...

Of course, it could also be some cultural blocks that deny me to see the "value" in what he's is trying to achieve, but I think at some point personal growth might be able to turn malign.

Humans aren't really built for infinite growth given the simple limitation that people die. So, it might be that trying too much to "grow as a person" leads to desensitizing towards normal life. Which means that it's possible to start using more extreme "personal growth" experiences to make up for it.

Go see Avatar

Yesterday I watched Avatar in a proper cinema with 3D glasses. The experience was almost surreal and while I had already read the book long ago, the adaptation was decent.

But really -- the 3D part of the movie is where all the magic is. Well worth the ticket price !

No such thing as a bad technology

The human race will adapt to the tools and technologies it has developed. That's why the cell phone companies for example just have to play a long term game and wait: in time fewer people will be sensitive to their cell phone radiation.

It's just another level in the "adapting to the environment" game. Even if this time the environment is man-made.