Older blog entries for rkrishnan (starting at number 249)

Clojure's function composition goodness

Sean Devlin, in the Episode 16 of the Full Disclojure posted some really awesome ways to play with tables. One of the nice things he did is worth writing. Due credits go to Sean for posting the code.

Suppose you have a map of people with their name and ages:

(def from-xml [{:name "Sean" :age 27} {:name "Ross" :age 27} {:name "Brian" :age 22}])

Now, you want to have the name and age of people in this list of those with the age 27. Clojure’s comp function comes to the rescue. comp takes some functions and applies them to the data from right to left. i.e., It takes the right most function, applies it to the input parameters, the result of which goes as input to the next right most function and so on. Let us take one single map and pass it to the comp:

user> ((comp #{33} :age) {:name "Ram" :age 33}) 33

What this does is, it takes the input map, applies the :age function on the map (Clojure’s hashmap keys are functions themselves). The result of this is used to see if it falls in the given set (which just has 33).  Now, sets are functions of their members. Here is an example:

user> (#{33 34} 34) 34 user> (#{33 34} 33) 33 user> (#{33 34} 32) nil user> (#{33} 33) 33

We use this composition as a predicate to the filter function which results in the elegant solution that Sean posted.

user> (filter (comp #{27} :age) from-xml) ({:name "Sean", :age 27} {:name "Ross", :age 27})

Note that we get back maps in the same format, which is really nice in certain situations. Sean’s Episode 16 also has quite a lot of other goodness as well.

Syndicated 2010-04-14 07:00:00 from Ramakrishnan Muthukrishnan

Pragmatic Thinking and Learning

I finished reading ”Pragmatic thinking and learning” by Andy Hunt (who wrote Pragmatic Programmer and other books). If one is really interested in self-improvement, this is the book to grab. For me, most things described in the book were known things, but it got very reinforced because Andy has some magical power to convey ideas in a very convincing way.I highly recommend this book for anyone interested to know more about learning and apply those things into their own daily lives. The book explains the process of learning using the Dreyfus model and how one advances from a beginner to an expert. Ever wondered why you get new ideas while in the bathroom? Have you noticed why you suddenly perform better when you are in the middle of good performers? I have many times noticed that I speak better english when I am talking to a good english speaker and vice versa. This book explains why, using a simplified model of the human brain.

One noteworthy suggestion in the book for every reader is to keep a personal wiki, which I had experimented with, sometime last year, with great success. I especially liked the meditation technique described in the book and can say with some confidence that it works very well. The chapter on “focus” is also very well researched. The book says that each context switch costs about 20 minutes. Interestingly, the book does not talk about the concept of flow.

I greatly enjoyed reading “Pragmatic Programmer: From Journeyman to Master” earlier (despite the extremely bad packing from Flipkart, which made the paper curly, sort of permanantly).

Syndicated 2010-04-01 07:00:00 from Ramakrishnan Muthukrishnan

Power of find and xargs

Doesn’t, the unix commands find, xargs and grep look like map, apply and filter of the functional world? I was looking at the OCW website and downloaded some content from there as a zip file, which had a complicated directory structure. I wanted to flatten the directory structure, so that all the pdfs are in one directory. With find and xargs it turned out to be extremely easy.

$ find ./ -name *.pdf -print | xargs -I xxx cp xxx /tmp

The key is the -I argument to xargs which replaces every occurance of the pattern in the command with the input from stdin.

Also don’t the pipes look like calling a function composition like in f(g(x) as mentioned by this post?

Syndicated 2010-03-17 07:00:00 from Ramakrishnan Muthukrishnan

SICP Challenge

The SICP study group met today. We agreed to do the following:

  • read a section of the book.
  • solve the exercises in the section.
  • see the videos.
  • come with doubts/insights etc for the next meetup.
We agreed to meetup once in 2 weeks.

So, here I am, (re)starting the SICP from today. Hopefully this time I will complete the book. I am very tempted to do the exercises in clojure, so that I won’t copy the code as it is from the text. I am not sure whether future chapters can become difficult for me  because of this, but I think I will give it a try with clojure. Also I believe I will need only a subset of clojure so that use only the fundamentals and no advanced facilities.

Here are some of the available resources that I plan to use:

My solutions will be available in this github repository.

Of course, I/we are not the first to do this. Here are some of the other people who have attempted this and have documented it (much better than I could ever do) on the web.

For those who are using Scheme, this page will be of great help.

Syndicated 2010-03-14 08:00:00 from Ramakrishnan Muthukrishnan

SICP Study group

Some of us in the bangalore-fp group have decided to form a study group on SICP. The main reason behind study groups is that it is a great way to learn any new subject or a literary work. People share what they read, ask questions, have discussions around these questions they ask etc etc. Also regular meetups provide a time tick to the group and is very motivational. If anyone is interested, please contact me or subscribe to bangalore-fp. We will most likely have a meetup this sunday. The venue and time is not yet decided. I will update this post once it is agreed upon. I am not sure whether this will be a “success”. I don’t even know how to measure success (in general, not just in this context). If one person manage to get inspired to complete the entire book, then I guess it can be considered as a success. Update: The meeting is at this place called Jaaga on sunday, 14th March 2010 from 3pm.

Syndicated 2010-03-10 08:00:00 from Ramakrishnan Muthukrishnan

Laptop Power Supply

Common folklore (confirmed by some Norwegian friends) is that heat is not a friend of laptop batteries. The life of a laptop battery tend to reduce in Indian weather. One of the Dell Laptops I bought in early 2008 can now work barely 30 minutes with a fully charged battery.

Linux kernel provides a wealth of information (through ACPI) about the Battery like the make, type, serial number etc. Look under /sys/class/power_supply/BAT0/. This is what I have: ~$ cat /sys/class/power_supply/BAT0/status Unknown ~$ cat /sys/class/power_supply/BAT0/technology Li-ion ~$ cat /sys/class/power_supply/BAT0/type Battery ~$ cat /sys/class/power_supply/BAT0/serial_number 32511 ~$ cat /sys/class/power_supply/BAT0/manufacturer SANYO ~$ cat /sys/class/power_supply/BAT0/model_name 42T4511 ~$ cat /sys/class/power_supply/BAT0/energy_full_design 84240000 ~$ cat /sys/class/power_supply/BAT0/energy_full 64530000 ~$ cat /sys/class/power_supply/BAT0/energy_now 63160000 It looks like, my battery (this is a work laptop, Lenovo Thinkpad T61 running Debian x86-64 unstable) is functioning at a lesser capacity than it is designed. It will be nice to corelate these readings with the actual performance of the battery. I tend to run this machine mostly with AC, but I will try profiling it for battery performance and see how much time these numbers translate to.

Syndicated 2010-03-06 08:00:00 from Ramakrishnan Muthukrishnan

git - renaming branches

I was working on a project recently, which involved cloning another git repository and adding my own changes into it. After I cloned it, I forgot to create and switch to the new branch and do my changes there. So all my changes were in the ‘master’ branch. I rather wanted to have my changes in my own branch. git makes these things trivial. All you have to do is rename your current master:

$ git branch -m <old-branch-name> <new-branch-name>
$ git branch (should show the new name)
Now, do a git log and find out which is the commit before you started making the change and do:
$ git checkout -b <old-branch-name> <commit-sha1>
That’s it and you have the whole thing as you wanted it to be.

Thanks to my friend Anand for the tip on the -m option to git branch. Most git gems seem to be deep embedded in those switches of the sub commands of git.

Syndicated 2010-01-24 08:00:00 from Ramakrishnan Muthukrishnan

insertion sort in clojure

Here is my first cut, non-lazy implementation of insertion sort.

gist id=282146

Syndicated 2010-01-21 08:00:00 from Ramakrishnan Muthukrishnan

social networking

The so called “social networking” websites seem to be the new craze (or is it already too old?). I used to have an account in facebook and orkut for more than 2 years and it was mainly used to connect back to classmates and the likes. But it turned out to be a distraction, atleast for a while. One just connects to a friend and almost never talks to him or her again thru these websites. Instead we post what we ate for breakfast, what new year resolutions we took etc etc - those phrases which carry zero information. And some people use it to show off their new materialistic possessions like their new Honda Cities and their newly built houses and their latest trip across atlantic etc.One can easily sink an hour a day browsing from a link to another without leaving facebook.com.

In the end, I decided that my time is more precious and enough is enough. So I am facebook/orkut free from today. Facebook incidentally only de-activates the account.

I didn’t tell my friends in facebook or orkut that I am leaving. But I guess in the true spirit of social networking, they don’t care, so it doesn’t matter.

Syndicated 2010-01-21 08:00:00 from Ramakrishnan Muthukrishnan

Tale of autocomplete

As  a web user, I have always known that those automatic suggestions you get when you search for something at Google or when you fill in the forms while booking a Flight or Train Ticket are the handiwork of Javascript scripts working behind the scenes. Off late, I was very curious to know how exactly this works. This took me through a long road in the unknown territory.

To give a short summary for those like me, what really happens is that the JS script running on your browser (which gets downloaded from the webpage/site you are viewing) issues various HTTP requests to the server “asynchronously” while you are plugging in some values into a form. There is a standard way of issueing this request  - XMLHttpRequest. Once we get the data, we can modify the structure of the HTML Page. I was sort of lying. HTML page is not modified. The HTML page is read by the browser, parsed and arranged as a Tree structure and is made accessible to the JS Script. This structure is called DOM - Document Object Model. Think of DOM as a parsed HTML page re-arranged as a Tree, because HTML Document is indeed a heirarchical data structure and can be represented as a tree. The attributes of any HTML tag is now an attribute of a node in the tree and is accessible to the JS. JS script can now add/delete/change any node or its properties in the tree. When a change in DOM is made, it reflects immediately in the rendered page and one need not do a “refresh”.

But all this comes because the server can respond to those “asynchronous” requests coming from the browser and respond back with data. If it can’t, then all these are useless. One has to write code at the server side to handle these requests and return the required data (usually as XML or as JSON, an alternative to XML or key/value pairs which express the data as Javascript objects).

This is the essense of what happens in the so called “Web 2.0” style websites. Unfortunately, web has too many jargons which creates an impression that it is highly complex. It is complex but with a bit of effort, it is not difficult to understand.

I found the IBM DeveloperWorks series on AJAX very useful in understanding the above concepts.

Syndicated 2009-12-25 08:00:00 from Ramakrishnan Muthukrishnan

240 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!