Sunday, March 19, 2006

Encounters with LISP

Ever since I read The Cathedral and the Bazaar , I've wanted to try out some Lisp.
LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot. -- Eric S. Raymond
But the trouble with most LISP tutorials out there is that they just don't make it easy to get into the flow of this language. Not anymore for me; I found the best LISP book available online.Common Lisp: A Gentle Introduction to Symbolic Computation

So far I've just browsed through the book without writing much code. The favourite chapter so far has been Chapter 7: Applicative Programming. I can say I finally get it, what map and reduce are all about. The curiosity that's been bothering me ever since that Google paper (MapReduce:Simplified Data Processing on Large Clusters (PDF Alert!!))

Well, I've used map quite a bit in Perl. But never got to use reduce. Looks like List::Util module is the best way to try it out.

I don't think I'll ever write much in LISP. But just reading LISP code so far has been fun and educational.

Sunday, March 12, 2006

Mini Languages and Perl 5

I must've been really sleeping under a rock. It took too long but finally encountered Parse::RecDescent

Feels one step closer to trying out my own mini-language.

And things should get easier in Perl 6 because grammars are default in there.

Tuesday, September 27, 2005


The buttons and the progressbar come standard with the widget. The progressbar updates during record-fetching.

Note the excel-like drop down filter boxes in the second image.

If you want to know more about it, then go to

Tuesday, June 07, 2005


This nice looking picture is a treemap of the Gtk2-Perl source (1.061 version). This treemap was generated using my brand-new Gtk2::Ex::TreeMap module (Find the latest version here.)

If you want to know more about treemaps, try one of the following sites. the most popular treemap

Wednesday, April 13, 2005



Friday, February 25, 2005


Gtk2::Ex::RecordsFilter - A high level widget to browse reasonably large amounts of relational data and select a subset of records. This widget is inspired by the song browser of iTunes.

use Gtk2 -init;
use Gtk2::Ex::RecordsFilter;
# Create a recordset
my $recordset = [
# Create the recordsfilter object
my $recordsfilter = Gtk2::Ex::RecordsFilter->new;

# Specify the headers for the columns
my $headers = ['Category', 'Sub-Category', 'Brand', 'Model'];
# Inject data into the widget
# Get a ref to its widget
my $recordsfilter_widget = $recordsfilter->get_widget();
# Create the root window
my $window = Gtk2::Window->new;
$window->signal_connect(destroy => sub { Gtk2->main_quit; });
$window->set_default_size(500, 300);
# Add the widget to the root window


When working with large amounts of relational records (csv files, database records, music files index), a common task is to filter out a subset or records from a given set. For example, in a master-detail database design, the master recordset, which is typically smaller than the detail recordset, can be filtered out and the filtered subset of master records can then be used to perform additional tasks on the detail records that they point to.

A common example of this usage is the song browser in your own mp3 player application (for example, the iTunes application). This application will allow you to choose an mp3 file (the detail record) based on criteria such as Artist, Album, Song (the master record). Once the master record is choosen (i.e., the Artist, Album and Song) it then performs a task on the detail record (i.e., play the mp3 file).

This Gtk2::Ex::RecordsFilter widget is inspired by the iTunes song browser widget. But this widget carries certain functionality which is not present in the iTunes song browser. The iTunes song browser allows the user to choose one song (one master record) at a time and play it. However, a more general usage should allow the user to choose multiple master records at a time. One approach for such multiple selections is to enable the user to click on different records with the CTRL key pressed and then choose all the highlighted records in one shot. This widget takes a different approach, which I call the 'shopping cart' approach. This is explained in the next section.

The top half the widget shows all the master records. The records are shown in a hierarchical fashion similar to the iTunes song browser. Clicking on a parent node on the left-most box will cause all the boxes on its right to show only the child nodes.

The user can click on any entry in the top half and then click on the add to selection button and the record will show up in the bottom half. If the entry clicked is in one of the left boxes, then the widget automatically discovers all the child nodes and adds them to the selection. Upon adding to selection, the record is removed from the top half and shows up in the bottom half. The remove from selection button works in the reverse way.

The user can click on multiple records in the top half using the CTRL key.


my $recordsfilter = Gtk2::Ex::RecordsFilter->new;

The widget can be used to select a subset of these records (into a selection list). The methods get_selected_rows and get_unselected_rows can be used to view the selection ( or unselection) at any point.

'Selected' portion is referred to as the 'RIGHT' side (bottom). 'Unselected' portion is referred to as the 'LEFT' side (top)



The recordset is injected into the widget using this method. The widget will automatically create the HPaned children and the Selection buttons.


my $recordsfilter_widget = $recordsfilter->get_widget();

This method returns the widget of the filter object.


my $selected_rows = $recordsfilter->get_selected_rows();
print Dumper $selected_rows;

This method returns the selected_rows contained in the bottom half of filter widget. A common usage is to have an Apply button which, when clicked, will invoke this method and use the returned results. Check out the examples directory to see this in action.

$apply_button->signal_connect (clicked =>
sub {
my $selected_rows = $recordsfilter->get_selected_rows();
print Dumper $selected_rows;


my $selected_rows = $recordsfilter->get_unselected_rows();
print Dumper $selected_rows;

This method returns the unselected_rows contained in the top half of filter widget. This method too can be used with an Apply button like the one shown above.

Friday, February 11, 2005

Gtk2::Ex::TreeMaker - 0.07

This is the 0.07 release of this widget. See here for details on the widget including a screenshot


This page is powered by Blogger. Isn't yours?