Bleeding Edge Version of BackgrounDRb for better memory usage

Update: Do not forget to get rid of autogenerated backgroundrb etcetera files that were generated during last run of rake backgroundrb:setup.

A plain fork() is evil under Ruby and hence there are some issues with memory usage of BackgrounDRb. I have made some changes to packet library so as it uses fork and exec rather than just fork for better memory usage. However, there were quite bit of changes and BackgrounDRb is affected by them. You can try bleeding edge version as following.Also you need rspec for building packet gem.

clone the packet git repo:

git clone git://
cd packet;rake gem
cd pkg; sudo gem install --local packet-0.1.6.gem

Go to your vendor/plugins directory of your rails directory and remove or
backup older version of backgroundrb plugin and backup related config
file as well.

from vendor/plugins directory:

git clone git://
rake backgroundrb:setup
./script/backgroundrb start

Let me know,how it goes.

In honour of Ubuntu LTS – 8.04

Newest version of operating system for human beings is out. Kicking ass and users. Yes users, you heard it right.
I am not very happy with this release. In fact, I regret that I upgraded to this version. Why?

  • Today every upcoming Linux distro is bundling Firefox3 beta 5 as default browser so ubuntu is not alone there. But in my opinion this is a bad decision. Firefox3 beta5 is not stable. Most of the extensions aren’t supported yet. You are being hard on users by bundling a software thats still 2 months from final release. My main gripes with Firefox3 beta 5 is,
    • Its a CPU hog. Even with only one tab open, it consumes considerable CPU cycles. Bad for laptop users. Now before you jump the gun, in my tests, I have a simple page open (no fancy gmail with lots of background processing) and I am not interacting with firefox window
    • It hangs and freezes now and then. I have experienced this kinda behavior often, while downloading a page firefox will freeze momentarily and then suddenly it will come back.
    • Extensions, extensions. Many of my favorite extensions are not available for firefox3.
    • Also, I am using fully updated version of Hardy and have disabled Security->Tell Me, thingies. and have deleted urlclassifier3.sqlite without much success.
  • I guess all Linux users have seen occasional freezes and they have no other go than to hard reboot the machine. With Hardy and Compiz fusion, I just saw too many of freezes on my notebook. Also, did anyone notice metacity compositioning is buggy? I tried using metacity compositioning in place of compiz and had to press alt-ctrl-backspace couple of times. One sure way is, try enabling compositioning and then disabling it. I experienced X freeze when doing that.
  • Many Emacs users i think swap ctrl and caps keys. I am one of them. After upgrading to hardy swapping them through Gnome keyboard settings works, but whenever I press caps ( now its ctrl ), it still turns on caps LED display on my notebook. A bit annoying. This issue was not there in Guts.
  • Shipped Xorg is a CPU hog, even if you are not interacting with your machine, Xorg cpu usage stays around 10-30%. I have Nvidia graphics card and I have tried using <code>”UseEvents” “on”</code>. It doesn’t seem to have any effect.
  • Oh boy, I don’t even know, why they shipped this half hearted PulseAudio integration? For getting sound back on my laptop, I had to manually choose ALSA as Sound Playback device.

Being a LTS edition, I was expecting something solid, but I can confirm with some certainity that Hardy release is certainly inferior than Gutsy. Thank you Ubuntu for scrweing it up.

An idea about reviving Chennai.rb

Chennai.rb has been languishing for a while (strictly my opinion). First problem is, like almost all open source groups in India, its too business oriented. I have been on the mailing list for a while and attended one of their meetings and didn’t like the atmosphere. Back then, it was too rails centric.

I dunno if its a good idea, but I wanted to start a alternate Ruby group which is more code centric (like seatle.rb perhaps). We organize coding sprints, hacking sessions and stuff like that.

Whatever projects core members of the group decide to start and provided group accepts general idea of the project, it becomes groups responsibility, rather than one man job. Also, it will be responsibility of the creator of the project to explain underlying concepts of the project and it will be maintained by entire group.

We can have a page like seatle.rb on Rubyforge and collabaratively maintain projects.

Also perhaps, there won’t be any beginner sessions, business discussions and it should be truly chennai.alt.rb.

If you read this blog and is from Chennai let me know what you think?

Dont Buy Acer Laptops Ever

I am serious, I know perhaps you have read my last blog entry about Dell support, but let me tell you, that got resolved eventually and onsite tech support guy came and fixed it.

Now, Acer was/is the first Laptop I bought about one and half year ago. I had various issues with notebook. One of them was overheating, other was rebooting without any reasons ( perhaps because of issue#1). Acer never fixed them. I live in Chennai and their service center is in one obscure place ( only one in Chennai ), where you are supposed to take your notebook and ask them to fix. They will take 4 to 5 days if you are lucky enough and after that you are supposed to go there and collect your notebook. Each day, getting your notebook repaired will take almost half of your day. But anyways, they never actually fixed.

Last time I took my notebook to them, my warranty period was over and their repair charges were almost same as cost of their brand new laptop with almost same configuration. Whats sad is, that was my first laptop and I bought it with Prize money obtained from here .

Needless to say, I left hope. But just for anyone else out there, please don’t buy Acer laptops.

Tips for budding Ruby hacker

I am no expert in Ruby, but overtime I have accumulated some thoughts that may help you in writing better Ruby code.

  • Always create a directory hierarchy for your library/application. Such as:
       |__ bin
       |__ lib
       |__ tests
       |__ yaml_specs
  • If you are not writing a library and rather an executable application. Then, have a separate file that loads/requires required libraries and does some basic stuff. For example, I have a boot.rb in my Comet server that looks like:

    require "rubygems"
    require "eventmachine"
    require "buftok"
    require "sequel/mysql"
    PUSH_SERVER_PATH = File.expand_path(File.join(File.dirname(__FILE__),'..'))
    ["lib","channels"].each {|x| $:.unshift(File.join(PUSH_SERVER_PATH,x)) }
    require "push_server"

    Why? Because such a file can come handy when you are writing test_helper for your applications. There, you can simply require above boot.rb, so as you don’t have to copy stuff back and forth if your required libs change.

  • If your project hierarchy is like above and you are writing an library not an application, don’t make the mistake of putting all your files in lib directory straightaway. Rather have a setup like:
      |__ bin
      |__ lib
      |__ lib/packet.rb
      |__ lib/packet/other files go here

    And use relative requires in “packet.rb” file, like:

    $:.unshift(File.dirname(__FILE__)) unless
      $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
    require "packet/packet_parser"
    require "packet/packet_meta_pimp"
    require "packet/packet_core"
    require "packet/packet_master"
    require "packet/packet_connection"
    require "packet/packet_worker"
    PACKET_APP = File.expand_path'../' unless defined?(PACKET_APP)
    module Packet

    It would be helpful in avoiding package name collisions that otherwise your users will report.

  • Once chris2 mentioned on #ruby-lang, you shouldn’t be overly clever with test cases. Don’t try to be too DRY in your test cases.
  • Write code that can be easilly tested. What the fuck that means? When I started with Ruby and was doing Network programming. I used to write methods like ughh, that always manipulated state through instance variables. I either used threads or EventMachine. One of the issues with EventMachine is, code written usually relies on state machine and hence it can be notoriously difficult to unit test, because most of the time your methods are working according to the state of instance of variables. That was bad. Try to write code in more functional way, where methods take some parameters and return some values based on arguments. You should minimize methods with side effects as much as possible. This will make your code more readable and easily testable
  • Read code of some good libraries, such as Ramaze , Rake, standard library.
  • Use FastRi rather than Ri. If possible, generate your set of documentation using rdoc on Ruby source code. I spend time just looking through methods, classes just for fun. However, I don’t like the default default RDoc template, use Jamis RDoc template, if you like Rails documentation. Often for gems installed on your machine, you can use gem server or gem_server to view their documentation.
  • #ruby-lang on freenode is generally a good place to shoot general Ruby questions. Be polite, don’t repeat and you will get your answers
  • Avoid monkey patching core classes if your code is a library and will go with third party code.

Gnome Applications hanging up after lost wireless connection

I am experiencing weird issue on my Notebook running Ubuntu Gutsy. Often, I will loose wireless connection and network manager will attempt to reconnect, but in stead of properly reconnecting to wireless router it just hangs. Whats more weird is, after this, I am unable to start any X application with few exceptions.

I have reported the bug here . Many have reported similar problems and I am waiting for a fix. However temporary workaround seems to be, to run

$ network-admin --sm-diable

and reset the network connections. Also, you can try deleting the /tmp/.ICE-Unix directory and files.

BackgrounDRb best practises

  • Best place for BackgrounDRb documentation is the README file that comes with the plugin. Read it thoroughly before going anywhere else for documentation.
  • When passing arguments from Rails to BackgrounDRb workers, don’t pass huge ActiveRecord objects. Its asking for trouble. You can easily circumvent the situation by passing id of AR objects.
  • Its always a good idea to run trunk version rather than older tag releases.
  • To debug backgroundrb problems. Its always a good idea to start bdrb in foreground mode by skipping ‘start’ argument while starting the bdrb server. After that, you should fire rails console and try invoking bdrb tasks from rails console and find out whats happening. John Yerhot has posted an excellent write up about this, here
  • Whenever you update the plugin code from svn, don’t forget to remove old backgroundrb script and run :
     rake backgroundrb:setup
  • When deploying the plugin in production, please change backgroundrb.yml, so as production environment is loaded in backgroundrb server. You should avoid keeping backgroundrb.yml file in svn. Rather, you should have a cap task that generates backgroundrb.yml on production servers.
  • When you are processing too many tasks from rails, you should use inbuilt thread pool, rather than firing new workers
  • BackgrounDRb needs Ruby >= 1.8.5
  • When you are starting a worker using

    from rails and using a job_key to start the worker ( You must use unique job keys anyways, if you want more than one instance of same worker running at the same time ), you must always access that instance of worker with same job key. Thats all MiddleMan methods that will invoke a method on that instance of worker must carry job_key as a parameter. For example:

       session[:job_key] = MiddleMan.new_worker(:worker => :fibonacci_worker, :job_key => 'the_key', :data => params[:input])
       MiddleMan.send_request(:worker => :fibonacci_worker, :worker_method => :do_work, :data => params[:input],:job_key => session[:job_key])

    Omitting the job_key in subsequent calls will be an error, if your worker is started with a job_key.

Price Parity between notebook prices – India and US

Its a no brainer in India that you should buy your favorite notebook from US if possible. The usual way is, Ask your friend, family , distance relative , beg them and if they are kind enough, you will get a good laptop in cheap bargain. But for most of us, its not possible.

So, I did a comparison between cost of same model notebooks in India and US and here are the results.

  • Dell : I dunno about you, but I like XPS M1330. Its really an awesome notebook. Starting price in US for this model is $ 1000 and in India its about 52,000 ruppes. Assuming $1 = 40 Rs, you have a price parity of about 12,000 rupees and notebook is costlier by 300 dollars in India. Not bad I would say.
  • Apple Macbook : I will leave Macbook air for you to figure. But simple white macbook costs around 59,000 Rs in India, while in US the same model costs 1100 dollars. Again assuming same currency conversion rates, macbook is costlier by 15,000 rupees or 350 dollars in India. Again, pretty good deal. The price difference used to be really high for Apple products, but Apple seem to have bridged the gap.
  • Thinkpad T61: Well, Thinkpads are Thinkpads and generally T61 and X61 are one of the best notebooks out there.But wait a minute, entry level T61 costs a mind boggling 90,000 rupees (2250 dollars ) in India, while in US it costs 984 dollars. So If you are buying this notebook from India, you are paying 1266 dollars or about 51,000 rupees more. Apple is selling Macbook air for a price of 96,000 rupees in India and T61 is 90,000 rupees. Somebody should slap these bastards at Lenovo. It pisses me off badly. I can’t imagine, one single reason, why Thinkpad models are so overpriced in India.
  • EEE PC: Again price parity is of about 6,000 rupees. EEE PC costs around 349 dollars in US and in India, it was launched at a price of 18,000 rupees.

Well, thats about it. I hope, Lenovo will learn and make thinkpads cheaper.

Dell Support Sucks

Boy, I am in pain.
I am a heavy keyboard user and left alt key on notebook has stopped working suddenly. First I tried to call them and after trying for nearly half an hour, I tried mailing them. Here is the text:

Dear Dell,

My laptop’s left alt key has stopped working since last couple of
weeks. I tried to get through the support line today with no success,
someone picked my call and assured that within 5 minutes my call will
be attended by someone from technical support. I waited for half an
hour and no one picked the call. I have bought two Dell laptops in
last 6 months and I am generally happy with price and quality match,
but is this how Dell treats its customers?

Is this called responsibility at Dell, where a customer is made to
wait for half an hour after a promise of call *will be attended within
5 minutes*. I know, I haven’t bought your *gold support* package and
you would have listened better if probably I would have, but who

Anyways, I will stop my rant and would like to know, how can I get my
left alt key working?

My Mobile number is: xxxxxxxxxxx . If possible please call on this
number, rather than replying to this mail, which gets irksome soon. I
have tried email support in past and it doesn’t work.

Now, what, my mail was rejected by their server. Here is gmail response:

Delivery to the following recipient failed permanently:

Technical details of permanent failure:
PERM_FAILURE: SMTP Error (state 13): 550 #5.1.0 Address rejected

Okay, now what? So I visited their support site and they asked me to take a survey, I did, because I felt okay may be that will be helpful.
So I tried to post my problem through the web interface, and You can’t believe this, because of a stupid Javascript error, I am not able to submit my request. Here is what firebug says:

Also, since I am aware of the fact that firebug sometimes creates problem for third party websites, I had firebug disabled initially. Now, Dell, how do I contact your technical support?

Lyrical Whisprings #5

Slow silly movement. No, its not for you.
No, You can’t talk too loudly , you will
be grabbed and gagged. There will be questions!

Its not, “Freedom is Slavery”.

Its You. Its the tangled webs that you have woven, and lo! Who is hanging and smiling from
webs of Shelob. No its not him, its you most likely.

A memory of never happening bliss and if it happens you wouldn’t know most likely.

That there
Thats not me
I go
Where I please
I walk through walls
I float down the liffey
Im not here
This isnt happening
Im not here
Im not here

I wish no questions!