<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4864916951241367995</id><updated>2012-01-30T17:24:29.659+05:30</updated><category term='mobile'/><category term='keyboard shortcuts'/><category term='funny'/><category term='freed'/><category term='Loop devices'/><category term='web applications'/><category term='unlikely'/><category term='reiserfs'/><category term='remount'/><category term='accels'/><category term='open source'/><category term='freedom'/><category term='sync'/><category term='recovering partition'/><category term='GNOME'/><category term='sysrq'/><category term='google mobile'/><category term='kernel space'/><category term='Google Dance'/><category term='frameworks'/><category term='The Machine is Using us'/><category term='winners'/><category term='gimp'/><category term='mdadm'/><category term='user space'/><category term='code'/><category term='ps2pdf'/><category term='Tux Coders'/><category term='linux'/><category term='code beauty'/><category term='php'/><category term='programming'/><category term='reboot computer'/><category term='cucumber'/><category term='likely'/><category term='simulating crash'/><category term='Nerdz'/><category term='git bash'/><category term='Web 2.0'/><category term='pdf'/><category term='Envision'/><category term='mvc'/><category term='gphone'/><category term='free software'/><category term='rspec'/><category term='android'/><category term='ruby on rails'/><category term='Prof Wesch'/><category term='spendwrite'/><category term='Jamia Hamdard'/><category term='kernel'/><category term='dropbox'/><category term='rails merb merge'/><category term='file sharing'/><category term='open handset alliance'/><category term='RAID without drives'/><category term='Crack the shell'/><title type='text'>Tux Playground</title><subtitle type='html'>Technogeekology and Tux.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-8217123745803436049</id><published>2009-01-21T12:41:00.003+05:30</published><updated>2009-01-21T12:51:36.841+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='ps2pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><title type='text'>How to make a PDF from a series of images</title><content type='html'>I was compiling a supplication extracted from a book of supplications. The problem at hand was to make a PDF out of various A4 images I had i.e. page01.xcf, page02.xcf, .., and so on. (&lt;a href="http://en.wikipedia.org/wiki/XCF_(file_format)"&gt;XCF&lt;/a&gt; is a &lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt; image)&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://tuxdna.blogspot.com/"&gt;friend&lt;/a&gt; &lt;a href="http://lists.xcf.berkeley.edu/lists/gimp-developer/2007-October/018754.html"&gt;suggested&lt;/a&gt; &lt;a href="http://pages.cs.wisc.edu/~ghost/doc/gnu/5.50/Ps2pdf.htm"&gt;ps2pdf&lt;/a&gt;, a command-line tool to convert from PostScript files to PDF.&lt;br /&gt;Since GIMP can save to PS format, I saved all my images into PS format first.&lt;br /&gt;However, the tool would accept only one ps file as input. So, I could get PDF file for each image, separately. Clearly this is not desired.&lt;br /&gt;&lt;br /&gt;However, ps2pdf can read input from stdin by using -.&lt;br /&gt;The solution was straightforward now:&lt;br /&gt;&lt;code&gt;$ cat page*.ps | ps2pdf - supplication.pdf&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Works out of the box! (though takes some time).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-8217123745803436049?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/8217123745803436049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=8217123745803436049' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8217123745803436049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8217123745803436049'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2009/01/how-to-make-pdf-from-series-of-images.html' title='How to make a PDF from a series of images'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-2232903351065404454</id><published>2008-12-25T01:49:00.003+05:30</published><updated>2008-12-25T02:29:43.449+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails merb merge'/><title type='text'>The day Merb joined Rails</title><content type='html'>&lt;img style="margin: 0px auto 0px; display: block; width: 150px; height: 150px; float: left;" src="http://merbist.com/wp-content/uploads/2008/11/dhh-150x150.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;img style="margin: 0; display: block;  width: 150px; height: 150px; float: right; " src="http://merbist.com/wp-content/uploads/2008/11/yehuda-katz-150x150.jpg" alt="" border="0" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's a historic day in history of &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; (and &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt;). Eyepoppingly shocking, Merb 2 has a new name -- Rails 3. Yes! Merb is being &lt;a href="http://developers.slashdot.org/article.pl?sid=08/12/23/2135246"&gt;merged&lt;/a&gt; into Rails 3!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.loudthinking.com/"&gt;DHH&lt;/a&gt; and &lt;a href="http://yehudakatz.com/"&gt;Yehuda Katz&lt;/a&gt; &lt;a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3"&gt;announced&lt;/a&gt; it almost &lt;a href="http://yehudakatz.com/2008/12/23/rails-and-merb-merge/"&gt;simultaneously&lt;/a&gt;. 96% people are positive about the &lt;a href="http://rubyonrails.org/merb"&gt;merger&lt;/a&gt;. If you belong to 4%, David has an &lt;a href="http://www.loudthinking.com/posts/36-work-on-what-you-use-and-share-the-rest"&gt;answer&lt;/a&gt; for you.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://brainspl.at/"&gt;Ezra&lt;/a&gt; &lt;a href="http://brainspl.at/articles/2008/12/23/merb-is-rails"&gt;explains&lt;/a&gt; how Merb is undergoing a rebirth. This &lt;a href="http://merbist.com/2008/12/23/rails-and-merb-merge/"&gt;merger&lt;/a&gt; would hopefully break the &lt;a href="http://www.loudthinking.com/posts/33-myth-4-rails-is-a-monolith"&gt;myth&lt;/a&gt; that &lt;a href="http://www.reddit.com/r/ruby/comments/7d5u6/so_why_should_i_choose_merb_over_ruby_on_rails/c06ckgv"&gt;Rails is a monolith&lt;/a&gt;. Interesting to see community putting an end to &lt;a href="http://merbist.com/2008/11/15/rails-vs-merb-drama/"&gt;drama&lt;/a&gt; and &lt;a href="http://splendificent.com/2008/12/the-merb-rails-merger-announcement-an-inside-opinion/"&gt;coming together&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-2232903351065404454?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/2232903351065404454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=2232903351065404454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/2232903351065404454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/2232903351065404454'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/12/day-merb-joined-rails.html' title='The day Merb joined Rails'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-1792029406980580397</id><published>2008-12-19T09:30:00.004+05:30</published><updated>2008-12-19T10:33:12.756+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='code beauty'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='cucumber'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming has evolved</title><content type='html'>When I look at the recent advancements in Behaviour Driven Development in Rails, I tend to think that programming has really evolved. Not in terms of advanced data structures and superior algorithms, but as a focus shift of intention.&lt;br /&gt;&lt;br /&gt;Earlier the focus was the machine. Days are gone when we thought so much about saving an extra byte, trading code simplicity for speed. A compromise here, a saving there, ad infinitum.&lt;br /&gt;&lt;br /&gt;The focus has definitely shifted to human understandability. Beauty of code now lies in its simplicity (some folks would argue that it always did, and they're right, but its more so apparent now).&lt;br /&gt;&lt;br /&gt;First it was Ruby, then Rails, and now BDD frameworks like rSpec and Cucumber prove the point. Just have a look at these executable code examples.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;animals = [ &lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"Tiger"&lt;/span&gt;, &lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"Cow"&lt;/span&gt;, &lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"Python"&lt;/span&gt;, &lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"Horse"&lt;/span&gt; ]&lt;br /&gt;animals.each &lt;span style="font-weight: bold; color: #008800;"&gt;do&lt;/span&gt; |animal|&lt;br /&gt;  puts animal + &lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"is cool!"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: #008800;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color; #888888;"&gt;#=&gt; Tiger is cool! Cow is cool! ...&lt;/span&gt;&lt;/pre&gt;Does a C for loop or C++ iterator look more elegant?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rails&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: #008800;"&gt;class&lt;/span&gt; &lt;span style="font-weight: bold; color: #BB0066;"&gt;Project&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: #CC0000;"&gt;belongs_to&lt;/span&gt;              &lt;span style="color: #AA6600;"&gt;:portfolio&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: #CC0000;"&gt;has_one&lt;/span&gt;                 &lt;span style="color: #AA6600;"&gt;:project_manager&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: #CC0000;"&gt;has_many&lt;/span&gt;                &lt;span style="color: #AA6600;"&gt;:milestones&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-weight: bold; color: #CC0000;"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span style="color: #AA6600;"&gt;:categories&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: #008800;"&gt;end&lt;/span&gt;&lt;/pre&gt;Code that you can just read, isn't it?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;rSpec&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: #008800;"&gt;lambda&lt;/span&gt; {&lt;br /&gt;  employee.develop_great_new_social_networking_app&lt;br /&gt;}.&lt;span style="font-weight: bold; color: #CC0000;"&gt;should&lt;/span&gt; change(employee, &lt;span style="color: #AA6600;"&gt;:title&lt;/span&gt;).from(&lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"Mail Clerk"&lt;/span&gt;).to(&lt;span style="background-color: #FFF0F0; color: #DD2200;"&gt;"CEO"&lt;/span&gt;)&lt;/pre&gt;Yes, that's a real executable example.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;And now, Cucumber&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: #008800;"&gt;Scenario:&lt;/span&gt; Search by topic&lt;br /&gt;   Given there are 240 courses where neither has the topic "biology"&lt;br /&gt;   And there are 3 courses A,B,C that each have "biology" as one of the topics&lt;br /&gt;   When I search for "biology"&lt;br /&gt;   Then I should see a the following courses:&lt;br /&gt;     | title |&lt;br /&gt;     | A     |&lt;br /&gt;     | B     |&lt;br /&gt;     | C     |&lt;/pre&gt;&lt;br /&gt;More beautiful, more succinct, more concise. That's what programming has evolved to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-1792029406980580397?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/1792029406980580397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=1792029406980580397' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/1792029406980580397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/1792029406980580397'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/12/programming-has-evolved.html' title='Programming has evolved'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-4629278023204019022</id><published>2008-12-18T10:45:00.004+05:30</published><updated>2008-12-18T10:59:16.827+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='git bash'/><title type='text'>Git your branch name into your shell</title><content type='html'>I use git on my Ubuntu for my Rails projects, and very frequently I need to know what branch I'm working on right now.&lt;br /&gt;If I can just get my shell to display the current local branch all the time in the prompt, it'd be a lot easier. I just found I could do so.&lt;br /&gt;&lt;br /&gt;You need to modify the environment variable PS1 to show your current local git branch.&lt;br /&gt;&lt;br /&gt;For me, it looks like this now.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$(git branch 2&gt;/dev/null| grep "\*" | cut -f 2 -d " ")]\$ '&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And it renders out like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  kazim@invincible:~/projects/aprioriate [refactoring]$&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In short, you need to append the following to the PS1 string.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  [$(git branch 2&gt;/dev/null| grep "\*" | cut -f 2 -d " ")]\$&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The redirection of stderr to /dev/null is required since it suppresses git error messages in case you're not inside a git directory.&lt;br /&gt;&lt;br /&gt;Ugly though it may be, it works. And to make the PS1 persist, add the line into your ~/.bashrc file.&lt;br /&gt;&lt;br /&gt;PS: I use bash. For zsh and others, its even easier to do this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-4629278023204019022?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/4629278023204019022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=4629278023204019022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/4629278023204019022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/4629278023204019022'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/12/git-your-branch-name-into-your-shell.html' title='Git your branch name into your shell'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-8116575067899133102</id><published>2008-10-13T02:28:00.003+05:30</published><updated>2008-10-13T02:39:13.802+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='file sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='web applications'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>Finally, a solution to file sharing woes</title><content type='html'>File sharing was never easy, especially for big files. I don't trust GMail, even when it says it allows attachment size of 20M. I often had my GMail frozen attaching just a 7M file, after some 20 minutes (which is way too much for just a 7M file!).&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://getdropbox.com"&gt;DropBox&lt;/a&gt;. 20GB of free online storage. And a desktop interface which sticks to your Windows Explorer/Mac Finder/GNOME Nautilus seamlessly. I won't say this is a new solution, since we had GMail drive once, and many others kept popping up.&lt;br /&gt;&lt;br /&gt;What makes DropBox special is ease of use with friendliness. And you can keep working while it synchronizes your files quietly in the background. You can also set maximum download/upload limits, so that your browsing experience remains okay.&lt;br /&gt;&lt;br /&gt;Go ahead. &lt;a href="https://www.getdropbox.com/tour"&gt;Tour&lt;/a&gt; Dropbox. See the &lt;a href="https://www.getdropbox.com/screencast#screencast"&gt;screencast&lt;/a&gt;. &lt;a href="https://www.getdropbox.com/install"&gt;Download&lt;/a&gt; it. Link your computer and start sharing. And be thankful to me forever!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-8116575067899133102?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/8116575067899133102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=8116575067899133102' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8116575067899133102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8116575067899133102'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/10/finally-solution-to-file-sharing-woes.html' title='Finally, a solution to file sharing woes'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-6256592521890926695</id><published>2008-03-20T23:22:00.000+05:30</published><updated>2008-03-20T23:23:11.556+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard shortcuts'/><category scheme='http://www.blogger.com/atom/ns#' term='accels'/><title type='text'>Shortcuts in GNOME</title><content type='html'>There are more than one ways to set Keyboard Shortcuts in GNOME. In my Ubuntu 7.04, you can either go to System -&gt; Keyboard Shortucts and change/add keybndings there. This way, you can change keybindings for most common operations like "Launch Web Browser" etc.&lt;br /&gt;&lt;br /&gt;There's another way, a very versatile one, provided by GTK. In almost any GTK application, you can give shortcuts to menu items. Just open the menu, and point with your mouse on the menu item you want to give a shortcut to, and press the shortcut key. GNOME will automatically assign that shortcut to that menu item, and remember it.&lt;br /&gt;&lt;br /&gt;If the procedure outlined above doesn't work for you for some reason, launch &lt;em&gt;gconf-editor&lt;/em&gt; from a terminal. Make sure that desktop/gnome/interface/can_change_accels is true. Happy shortcuts!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-6256592521890926695?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/6256592521890926695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=6256592521890926695' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/6256592521890926695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/6256592521890926695'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/03/shortcuts-in-gnome.html' title='Shortcuts in GNOME'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-3435422403051330237</id><published>2008-02-23T00:00:00.005+05:30</published><updated>2008-02-23T01:22:38.164+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='reiserfs'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='recovering partition'/><title type='text'>Recovering a (Lost) ReiserFS Partition</title><content type='html'>The partition table on my sister's laptop always seemed fishy to me. It just didn't have the right feel about it. The cylinder numbers and sizes and all, but I never cared. As the laptop went through a series of installations, Ubuntu or Windows, the abnormality showed up.&lt;br /&gt;&lt;br /&gt;After installing Windows, I found hard to install GRUB on MBR. The grub-install would refuse, and so would the grub. I was troubled when the output of cfdisk said that 30G is unusable space, out of my 60G disk.&lt;br /&gt;&lt;br /&gt;But, I thought its just another routine partition table corruption, and I had a tool in my swiss-army knife - testdisk (&lt;a href="http://www.cgsecurity.org/wiki/TestDisk"&gt;http://www.cgsecurity.org/wiki/TestDisk&lt;/a&gt;). Testdisk analyses your disk for lost partitions and tries to guess the correct partition table. Then it shows the guess to the user, who can then choose to write the table or not.&lt;br /&gt;&lt;br /&gt;In my case, though testdisk correctly guessed the partitions (it found more than actual ones), it could not guess a proper partition table. Instead, it asked me to specify which partition is primary, logical or bootable primary. Now that was difficult for me. And I didn't want to take risks.&lt;br /&gt;&lt;br /&gt;One good thing about testdisk is that it lets you peek inside partitions and read filenames. I was particularly interested in recovering a ReiserFS partition, which was 20G in size. Fortunately, testdisk was able to see this partition, and the filenames too. It was found lying from cylinders 3856 to 6287.&lt;br /&gt;&lt;br /&gt;Anybody who knows a bit about recovery knows that if you know the cylinder numbers, you've solved the problem. Recovering a partition becomes an easy job. I started by dd'ing out from cylinder 3856 about 1MB. But the result was not as expected. It wasn't a superblock. It was just 'data'. Just data? How could it be that testdisk was lying?&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ file mydump&lt;br /&gt;mydump: data&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I checked the calculations again, yet to no avail. It was data there. One thing was for sure -- the superblock must begin somewhere near cylinder 3856. I got a weird idea. I quickly made a dummy file of 200M using dd. I made a loop device out of it, and did a reiserfs format over it.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ dd if=/dev/zero of=check-rfs bs=1M count=200&lt;br /&gt;$ sudo losetup -f check-rfs&lt;br /&gt;$ sudo mkfs.reiserfs /dev/loop0&lt;br /&gt;$ hd check-rfs | less&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I intended to find out the pattern with which a reiserfs superblock starts. The output of hexdump showed something like this:&lt;br /&gt;&lt;code&gt;&lt;span style="font-size: 0.9em;"&gt;&lt;br /&gt;00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|&lt;br /&gt;*&lt;br /&gt;00010000  00 32 00 00 ec 11 00 00  13 20 00 00 12 00 00 00  |.2....... ......|&lt;br /&gt;00010010  00 00 00 00 00 20 00 00  00 04 00 00 93 98 2f 43  |..... ......../C|&lt;br /&gt;00010020  84 03 00 00 1e 00 00 00  00 00 00 00 00 10 cc 03  |................|&lt;br /&gt;00010030  02 00 01 00 52 65 49 73  45 72 32 46 73 00 00 00  |....ReIsEr2Fs...|&lt;br /&gt;00010040  03 00 00 00 02 00 01 00  02 00 00 00 00 00 00 00  |................|&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Look how smartly the filesystem developers have written ReIsEr2Fs there! The third line, which has 2 and a space, actually contains disk label.&lt;br /&gt;&lt;br /&gt;With this amount of information, I tried to find the superblock in the 10MB dump.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ hd mydump | grep -i reiser2fs&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And fortunately, it was there! At an offset of about 1d200h from cylinder 3856.&lt;br /&gt;&lt;code&gt;&lt;span style="font-size: 0.9em;"&gt;&lt;br /&gt;0001d200  02 00 01 00 52 65 49 73  45 72 32 46 73 00 00 00  |....ReIsEr2Fs...|&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Looking a few 100 bytes before this pattern, I found exactly the same fingerprint of ReiserFS superblock! After calculating and adding, I did a dd dump from the correct byes, and here it was -- the superblock!&lt;br /&gt;&lt;code&gt;&lt;span style="font-size: 0.9em;"&gt;&lt;br /&gt;$ file dump-again&lt;br /&gt;dump-again: ReiserFS V3.6 block size 4096 num blocks 4883760 r5 hash&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I took a bigger dump (2G), and tried to mount it. But mount refused, simply because there was not enough space on the loop device than the partition required (20G).&lt;br /&gt;I looked for some IRC help, and enouf on ##linux suggested the offset option of the mount command. It can do just what I wanted -- to mount a range of bytes of a disk as a device.&lt;br /&gt;&lt;code&gt;&lt;span style="font-size: 0.9em;"&gt;&lt;br /&gt;$ sudo mount /dev/sda recovered/ -o ro,loop,offset=31716679680&lt;br /&gt;$ ls recovered/&lt;br /&gt;bin   cdrom  etc   initrd      initrd.img.old  lost+found  mnt  proc  sbin  sys  tools  var      vmlinuz.old&lt;br /&gt;boot  dev    home  initrd.img  lib             media       opt  root  srv   tmp  usr    vmlinuz&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;And there it was! Recovered intact. The next thing I did was to backup the 15G data it had. And I got a treat from my sister, too. :-P&lt;br /&gt;&lt;br /&gt;Simplicity is often wonderful. And so is Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-3435422403051330237?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/3435422403051330237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=3435422403051330237' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/3435422403051330237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/3435422403051330237'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/02/recovering-lost-reiserfs-partition.html' title='Recovering a (Lost) ReiserFS Partition'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-3006961046806489418</id><published>2008-01-06T01:18:00.000+05:30</published><updated>2008-01-06T01:54:21.793+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='spendwrite'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'>Reinventing Rails</title><content type='html'>These holidays, I was busy developing &lt;a href="http://www.spendwrite.com/"&gt;spendwrite.com.&lt;/a&gt; The idea behind spendwrite is a community driven website where users share their experiences about the various places they visit in their town, like restaurants, coffee shops, dentists or shopping malls etc. Everyone reviews the outlets and rates them, so one can easily find the best of places around them.&lt;br /&gt;&lt;br /&gt;In the process of development, I learned that it requires a lot of courage and patience to develop a web application. It also requires foresight.&lt;br /&gt;&lt;br /&gt;To start with, I chose PHP as the language. Though I love the Ruby on Rails framework, I didn't choose it because its painfully slow. What I intended was, a functionality similar to the one offered by RoR framework, without a real framework in place.&lt;br /&gt;&lt;br /&gt;MVC is the leading architecture used by modern frameworks. Rails is no exception, and so many other frameworks use it. So I decided to have an MVC architecture for my website.&lt;br /&gt;&lt;br /&gt;I'd learned a lot about MVC and wrote little applications using Rails as well. But the advantage of using MVC was not entirely clear to me before I developed spendwrite.com.&lt;br /&gt;&lt;br /&gt;To begin with, I had vague ideas only. I created four directories, like Rails does, called 'models', 'views', 'controllers' and 'helpers'. To be true to MVC, a templating engine was required to play the role of 'views'. Enter Smarty, the templating engine we all know and love. With its caching abilities, it was clearly better than any other templating engines available for php.&lt;br /&gt;&lt;br /&gt;Initially, I was creating a model for each table in my database. But as I wrote more code, I found out that much of the code to the models are common. Thats where ActiveRecord component of RoR clicked to my mind. ActiveRecord has a basic CRUD code same for all models. On top of that, individual models define their own methods.&lt;br /&gt;&lt;br /&gt;So, I did the same. I carefully wrote CRUD functions, and made this code common to all models. This modular approach was fruitful. Models were tidy now, and the code was easier to manage and debug. Once the CRUD is solid, the models work flawlessly.&lt;br /&gt;&lt;br /&gt;Controllers. I must confess, that the habit of writing all-code-in-one-file doesn't go overnight. I wrote a lot of code in controllers, which I shouldn't have. For example, the code for validating user input. Though I had defined helpers like &lt;span style="font-style: italic;"&gt;validate_numericality_of &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;validate_minlength_of &lt;/span&gt;etc. in a helpers file, yet writing validation logic in controllers didn't make sense. It took some time for me to realize that validation actually belongs to models, and not to controllers.&lt;br /&gt;&lt;br /&gt;Code rearrangement followed. By having all the validation done in models, you relieve controllers of the repetitious job.&lt;br /&gt;&lt;br /&gt;For authorization, I'd love to implement something like before_filter in Rails. Since I really couldn't find equivalent, I wrote a model for authorization, and every controller must call a method must_authorize(); if it wants so.&lt;br /&gt;&lt;br /&gt;As I write more and more code, I come to realise the beauty of MVC. If you follow the MVC principles strictly, you write less code and error free code. And I also realize how beautifully Rails has implemented MVC architecture.&lt;br /&gt;&lt;br /&gt;Rails is no doubt the most productive framework available today for web development. The more you don't use Rails, the more you realize it. :-P&lt;br /&gt;&lt;br /&gt;Learning by experimenting is the best way to learn. And while I do, I find myself reinventing Rails. Any coincidence?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-3006961046806489418?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/3006961046806489418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=3006961046806489418' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/3006961046806489418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/3006961046806489418'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2008/01/these-holidays-i-was-busy-developing.html' title='Reinventing Rails'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-7240331462621277680</id><published>2007-11-11T23:25:00.000+05:30</published><updated>2007-11-13T11:56:07.069+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='remount'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard shortcuts'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='sysrq'/><category scheme='http://www.blogger.com/atom/ns#' term='reboot computer'/><title type='text'>Linux is fun for me</title><content type='html'>Do you've a SysRQ button on your keyboard? No. You must've the PrintScreen button, next to Scroll Lock? Yes. Then you can try out kernel keyboard shortcuts.&lt;br /&gt;&lt;br /&gt;The fastest (and most unsafe) way to reboot your computer is&lt;br /&gt;to press these these combinations, one after one.&lt;br /&gt;Alt+SysRQ+s - Sync data to disks for all mounted disks immediately.&lt;br /&gt;Alt+SysRQ+u - Remount all filesystems as readonly.&lt;br /&gt;Alt+SysRQ+b - Reboot immediately.&lt;br /&gt;&lt;br /&gt;There're a lot of kernel functions availible, depending upon your kernel version.&lt;br /&gt;You can find them in kernelsource/Documentation/sysrq.txt file.&lt;br /&gt;&lt;br /&gt;You can enable all of kernel functions by,&lt;br /&gt;&lt;blockquote&gt;echo 1 &gt;/proc/sys/kernel/sysrq&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pressing Alt+SysRQ+h should tell you about various sysRQ functions availible (in dmesg output). For example, on my system (Feisty Fawn), they are&lt;br /&gt;&lt;blockquote&gt;SysRq : HELP : loglevel0-8 reBoot Crashdump tErm Full kIll saK showMem Nice powerOff showPc unRaw Sync showTasks Unmount shoW-blocked-tasks&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The saK (secure access key) can be used to allow secure login. The output of kernel functions, if any, goes to /var/log/messages (or dmesg).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-7240331462621277680?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/7240331462621277680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=7240331462621277680' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/7240331462621277680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/7240331462621277680'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/11/linux-is-fun-for-me.html' title='Linux is fun for me'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-2886808861719178239</id><published>2007-11-07T20:18:00.000+05:30</published><updated>2007-11-13T00:26:10.856+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='open handset alliance'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='gphone'/><category scheme='http://www.blogger.com/atom/ns#' term='google mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Google will free the mobiles</title><content type='html'>&lt;div style="float: right;"&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;Google has unpacked the gPhone using Android. Its the next biggest thing in mobile industry. Having your phone run open source code and hacking it the way we hack Linux. Well, it looks promising now.&lt;br /&gt;&lt;br /&gt;The Open Handset Alliance founded by Google includes big names from the mobile world - Nvidia, Intel, Motorola, Samsung, LG, Qualcomm etc. Together these companies shall come forward to manufacture and design gPhones, that will run the open system called Android.&lt;br /&gt;&lt;br /&gt;Now, gPhone ain't a phone like iPhone. Its not even a phone for that matter. Its just a prototype. Their idea is to have thousands of gPhones, just like we've thousands of Linux distros! The handsets shall be coming to market next year.&lt;br /&gt;&lt;br /&gt;Well, some big players are still missing. Nokia, Sony Ericcson, Blackberry, Apple, Verizon and AT&amp;T. And yes, Microsoft.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://www.youtube.com/watch?v=6rYozIZOgDk"&gt;video&lt;/a&gt; by the developers introducing Android&lt;br /&gt;Another &lt;a href="http://www.youtube.com/watch?v=jWtFeIw8MVM&amp;NR=1"&gt;video&lt;/a&gt; by kids, who want their phone to make coookies for them.&lt;br /&gt;&lt;a href="http://www.openhandsetalliance.com/index.html"&gt;Open Handset Alliance&lt;/a&gt;&lt;br /&gt;&lt;a href="http://googleblog.blogspot.com/2007/11/wheres-my-gphone.html"&gt;Official Google Blog: Where's my Gphone?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google had acquired Android Inc. two years ago, in a very quiet manner. Android is being developed as a mobile platform to be released under &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache v2 license&lt;/a&gt;. The &lt;a href="http://www.openhandsetalliance.com/developers.html"&gt;complete documentation and Android SDK&lt;/a&gt; shall be released on &lt;span style="font-weight:bold;"&gt;November 12, 2007.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We know there've been other initiatives as well. OpenMoko, Qutopia, and now Android. The mobile shall be finally freed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-2886808861719178239?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/2886808861719178239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=2886808861719178239' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/2886808861719178239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/2886808861719178239'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/11/google-will-free-mobiles.html' title='Google will free the mobiles'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-601455764291349124</id><published>2007-11-04T22:48:00.000+05:30</published><updated>2007-11-06T19:44:23.814+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Crack the shell'/><category scheme='http://www.blogger.com/atom/ns#' term='Nerdz'/><category scheme='http://www.blogger.com/atom/ns#' term='Tux Coders'/><category scheme='http://www.blogger.com/atom/ns#' term='Jamia Hamdard'/><category scheme='http://www.blogger.com/atom/ns#' term='Envision'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Dance'/><category scheme='http://www.blogger.com/atom/ns#' term='winners'/><title type='text'>TuxCoders made it at Nerdz!</title><content type='html'>We're excited. We're happy! And we're the winners. At Nerdz 2007, Jamia Hamdard!&lt;br /&gt;&lt;br /&gt;For those who don't know, Nerdz is the annual technical fest organized by Department of Computer Sciences at Jamia Hamdard. They host a variety of contests, including on the spot programming, overnight coding, debugging etc.&lt;br /&gt;&lt;br /&gt;So we were the team known as TuxCoders. We were four - me, shamail, aaveg &amp; bharat. And we bagged three prizes! So we really rocked!&lt;br /&gt;&lt;br /&gt;Envision, the predesigned software contest. Shamail &amp; Aaveg presenting JamP2P. There was no second thought about being the first.&lt;br /&gt;&lt;br /&gt;Crack the Shell, the unix shell programming contest. Me &amp; Shamail. And we won by a big margin! Who needs to say more?&lt;br /&gt;&lt;br /&gt;Google Dance, the googling competition. Google and find answers to weird questions. Me &amp; Bharat. And we got the second prize, again!&lt;br /&gt;&lt;br /&gt;It felt somewhat deceiving, when we had to pay 500 bucks as the participation charges. It seemed a big risk! However, our confidence rose as the day passed. And the end, we bagged three trophies! And free food for the two days for all participants! So we made a good deal in the end.&lt;br /&gt;&lt;br /&gt;Nerdz '07 was a success, and we enjoyed a lot! I wished we had more guys from our college. But there's always a "next time"! But now, its time to celebrate! TuxEnjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-601455764291349124?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/601455764291349124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=601455764291349124' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/601455764291349124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/601455764291349124'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/11/tuxcoders-made-it-at-nerdz.html' title='TuxCoders made it at Nerdz!'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-5198892566618669523</id><published>2007-09-23T02:43:00.001+05:30</published><updated>2008-05-22T17:23:25.660+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mdadm'/><category scheme='http://www.blogger.com/atom/ns#' term='RAID without drives'/><category scheme='http://www.blogger.com/atom/ns#' term='simulating crash'/><category scheme='http://www.blogger.com/atom/ns#' term='Loop devices'/><title type='text'>Get rid of RAID!</title><content type='html'>&lt;div style="float: right;"&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;RID. That is RAID without the A.  I'll show you how you can experiment with RAID without having multiple drives, which are, not-so-inexpensive actually.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you don't know what is RAID, a half-an-hour glance through &lt;a href="http://tldp.org/HOWTO/Software-RAID-HOWTO.html"&gt;this TLDP guide&lt;/a&gt; will get you going. RAID is actually the feature of Linux that helps you append multiple drives (or partitions on different drives) as one device, with different kinds of features. RAID can also mirror your drive data, and protect your data from crashes.&lt;br /&gt;&lt;br /&gt;So, to get started using RAID, you need multiple drives. Wait! Is that really true? Do you know about loop devices? That is, devices within devices. Can I fool the RAID by asking it to make an array from loop devices?&lt;br /&gt;&lt;br /&gt;The answer is yes! Its possible! Here's a short experiment you can do to believe me!&lt;br /&gt;&lt;br /&gt;First, let us create two files, that will act as two devices to RAID.&lt;br /&gt;&lt;code&gt;$ dd if=/dev/zero of=disk0 bs=1M count=256&lt;br /&gt;$ cp disk0 disk1&lt;/code&gt;&lt;br /&gt;The first command takes some time. Now you've two zero'd files, ready to be used as loop devices.&lt;br /&gt;&lt;br /&gt;Using losetup, we'll setup the loop devices. If you're not already using any loops, you'll get loop0 and loop1 for the two files.&lt;br /&gt;&lt;code&gt;$ sudo losetup -f disk0&lt;br /&gt;$ sudo losetup -f disk1&lt;/code&gt;&lt;br /&gt;If they are successful, loop devices have been created. Just to check, you can run&lt;br /&gt;&lt;code&gt;$ sudo losetup /dev/loop0&lt;br /&gt;$ sudo losetup /dev/loop1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Two loop devices ready! Its time to ask RAID to make an array out of them. This is simple, with a self-explanatory command, as&lt;br /&gt;&lt;code&gt;$ sudo mdadm --create --verbose /dev/md0 --level=raid0 --raid-devices=2 /dev/loop0 /dev/loop1&lt;/code&gt;&lt;br /&gt;Take a deep breath, and read that command again. It's actually simple.  If you're going along with me, you should see something like this,&lt;br /&gt;&lt;code&gt;mdadm: chunk size defaults to 64K&lt;br /&gt;mdadm: array /dev/md0 started.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Great! We've made the RAID array device. Now its time we make it meaningful. Lets format it using ext3 filesystem!&lt;br /&gt;&lt;code&gt;$ sudo mkfs.ext3 /dev/md0&lt;/code&gt;&lt;br /&gt;This writes inode tables, superblocks and creates journal. ( If you're just curious, let me explain that the "actual" writing was done on our files disk0 and disk1 )&lt;br /&gt;&lt;br /&gt;Now we can just mount this device. Simply type,&lt;br /&gt;&lt;code&gt;$ mkdir myraid&lt;br /&gt;$ sudo mount /dev/md0 myraid&lt;/code&gt;&lt;br /&gt;If its successful, try moving inside.&lt;br /&gt;&lt;code&gt;$ cd myraid; ls&lt;/code&gt;&lt;br /&gt;You'll see the lost+found folder there. Copy here a few big files to see it works actually. Unmount and mount again. It works!&lt;br /&gt;&lt;br /&gt;To see that whether RAID has really done the job, you can&lt;br /&gt;&lt;code&gt;$ df -h | grep md0&lt;br /&gt;/dev/md0              496M   11M  460M   3% /home/kazim/myraid&lt;/code&gt;&lt;br /&gt;There we are, a drive with 496M!&lt;br /&gt;&lt;br /&gt;Now you can do everything you wanted to do with RAID. For example, try to make the disk1 crash! Since we used raid0 level, a crash means no recovery! If we used raid4 with spare disks, we could even see recovery process going on!&lt;br /&gt;&lt;br /&gt;How do you make disk1 'crash' ? Well, you should find a good answer yourself. For data corruption, you can destroy its superblock, or shred it, or do anything bad you can think of! RAID won't recover from a data corruption. But you can simulate hardware crash by using the --set-faulty option of mdadm. (Try crashing a mirror device on a RAID1 with a spare device and see how RAID recovers data.)&lt;br /&gt;&lt;br /&gt;Specifically, however, if you try to delete the drives (while md0 running),&lt;br /&gt;&lt;code&gt;$ sudo rm disk0&lt;br /&gt;$ sudo rm disk1&lt;/code&gt;&lt;br /&gt;There'll be no data loss. You would ask, "why?". Well, go and revise your OS concepts. And you'll know why 'removing' is not 'crashing'.&lt;br /&gt;&lt;br /&gt;Happy RAIDing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-5198892566618669523?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/5198892566618669523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=5198892566618669523' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/5198892566618669523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/5198892566618669523'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/09/get-rid-of-raid.html' title='Get rid of RAID!'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-1232364409919247235</id><published>2007-09-22T02:28:00.000+05:30</published><updated>2007-09-22T02:35:10.367+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Prof Wesch'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='The Machine is Using us'/><title type='text'>Web 2.0 - the hype?</title><content type='html'>If you still don't understand why humans have made so much hype about the Web 2.0, and you think that its a crap, you should watch&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=6gmP4nk0EOE"&gt;Web 2.0 - The Machine is Us/ing Us (YouTube Video)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Web is like growth of a civilization. The civilization of the netizens. And when we say 2.0, we appreciate our growth. We are more organised. We are teaching the machine.&lt;br /&gt;&lt;br /&gt;Read &lt;a href="http://mediatedcultures.net/ksudigg/?p=84"&gt;Prof Wesch's blog&lt;/a&gt;, on what he has to say about the video he made.&lt;br /&gt;&lt;br /&gt;We've seen revolutionary changes in the way we work on internet. We think the change deserves a name, Web 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-1232364409919247235?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/1232364409919247235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=1232364409919247235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/1232364409919247235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/1232364409919247235'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/09/web-20-hype.html' title='Web 2.0 - the hype?'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-9123858979849750375</id><published>2007-08-29T17:05:00.000+05:30</published><updated>2007-08-29T17:49:18.445+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='user space'/><category scheme='http://www.blogger.com/atom/ns#' term='unlikely'/><category scheme='http://www.blogger.com/atom/ns#' term='likely'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel space'/><title type='text'>unlikely() &amp; likely()</title><content type='html'>This week wasn't really productive. No preparations for sessionals yet. Stayed up last night so missed the college today. And some idiot classmates must be thinking now that I was preparing hard for sessionals. Poor kids, ;-)&lt;br /&gt;&lt;br /&gt;Actually, I tried my hands with Linux Kernel Development. And its such an amazing thing!!&lt;br /&gt;&lt;br /&gt;For starting out, I downloaded the source of latest kernel as &lt;a href="http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.5.tar.bz2"&gt;linux-2.6.22.5.tar.bz2&lt;/a&gt;.&lt;br /&gt;I unpacked it, and started reading code. And as some of you must have guessed it, it was beyond my limits of understanding.&lt;br /&gt;&lt;br /&gt;Its quite difficult to start actually. Including the comments, the whole kernel code (latest) is about 7.3 million lines. Too much, na? The first version, 0.0.1 had about 10000 lines. I read somewhere that lately they've not been adding much to this code, but refining it and fixing bugs.&lt;br /&gt;&lt;br /&gt;The Linux kernel is one of the best (or the best as they say) kernels around. It has got a great mix of good algorithms, and it has refrained from bad policies and poor design. Its monolithic and still quite modular.&lt;br /&gt;&lt;br /&gt;Its well commented, and the code gives me a feeling that it can be understood, given time &amp;amp; patience. Well I've got some books too, notably Linux Kernel Development 2nd Edition, which will help me as I go.&lt;br /&gt;&lt;br /&gt;There are some interesting things when writing kernel code. First, you can do everything and anything. Nobody will trap you or accuse you or kill you. No memory protection (as userspace has got), no faults and error trapping. You need to behave responsibly.&lt;br /&gt;&lt;br /&gt;Second, you don't have the standard C library. No printf (though a printk is there). No great time saving functions. But fortunately, most useful ones are there in kernel headers (like string comparison etc.)&lt;br /&gt;&lt;br /&gt;Third, you have a small, fixed-size stack. Unlike userspace applications, you just cannot allocate tons of variables! So every byte counts here.&lt;br /&gt;&lt;br /&gt;Fourth, no floats in kernel code. No floating point arithmetic here. Because kernel has a  do-it-yourself overhead. So, just integers and chars.&lt;br /&gt;&lt;br /&gt;Finally, the one I found most interesting is about predictability. Conditional branches can be optimized as either very likely or very unlikely by GCC. The macros likely() and unlikely() do this work.&lt;br /&gt;&lt;br /&gt;/* file is almost never NULL */&lt;br /&gt;if (unlikely(file == NULL)) { .. }&lt;br /&gt;&lt;br /&gt;/* the two sizes are almost always equal */&lt;br /&gt;if (likely(new_size == old_size)) { .. }&lt;br /&gt;&lt;br /&gt;Compiler will optimize these branches as the programmer has predicted. If prediction was good, it will improve performance. Otherwise it can degrade performance, too. You'll find unlikely() a lot in kernel code.&lt;br /&gt;&lt;br /&gt;Its an intelligent piece of code. And so it requires a lot of time to study. Well, I am prepared for anything! Let's tame the beast!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-9123858979849750375?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/9123858979849750375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=9123858979849750375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/9123858979849750375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/9123858979849750375'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/08/unlikely-likely.html' title='unlikely() &amp; likely()'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-5973855587270042172</id><published>2007-08-25T22:07:00.000+05:30</published><updated>2007-08-25T22:56:42.090+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='freed'/><category scheme='http://www.blogger.com/atom/ns#' term='free software'/><category scheme='http://www.blogger.com/atom/ns#' term='freedom'/><title type='text'>Get organised!</title><content type='html'>This one goes out to all my friends and foes who are a part of FLOSS community. Now is the right moment for all of us to get more organised. We don't have much time. Its now or its never. The FLOSS community is calling upon us. Get involved!&lt;br /&gt;&lt;br /&gt;You are a &lt;span style="font-weight: bold;"&gt;free&lt;/span&gt; programmer or designer or developer. You are free to do whatever you want. You are free to develop software for yourself. You are free to make it big and better. But not for very long. Because as soon as you get a job, your freedom is lost. The fun for programming is over. Your spirit dies when you do it for money and position.&lt;br /&gt;&lt;br /&gt;Imagine, you are a software engineer. Working for 9 hours a day. You just got a 100 page specification from your boss. You got a deadline. And now, painful days of working like a machine. 'Machine' because you are to do what you are told. You cannot innovate. You are not allowed to think. You ain't free. Your freedom sold in dollars.&lt;br /&gt;&lt;br /&gt;Again, imagine you are an open source developer. The scenario is different now. You are working on a project you chose for yourself. You are enthusiastic about your work. You've new and great ideas and you are gonna implement them. The fun of programming is alive and everyday is a holiday. You innovate new things, and you find appreciation. You find greatness.&lt;br /&gt;&lt;br /&gt;As Niyam (at ILUGD) puts it, "You are born unknown. You'll die unknown. You won't be great if you don't do great things. Join the free software community and get known. Then only you'll be called great. Find that greatness!"&lt;br /&gt;&lt;br /&gt;As a student, you've taken the freedom you enjoy for granted. But once you've a boss, you are no longer free. You are a slave of your boss, and your boss is a slave of his boss.&lt;br /&gt;&lt;br /&gt;You don't need to be a Linux geek to join us. All you need is a belief in software freedom. There's no second to waste. Rise against ignorance. Make everyone aware of free software. Participate in development! Get known. Get your friends involved.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Freed.in &lt;/span&gt;is near. Fasten your seat belts! We've to make it bigger than ever. Free your friends from proprietary software. Involve as many people as you can! Tell everyone what is free software. Tell them to use it. Invite them to Freed.&lt;br /&gt;&lt;br /&gt;Gear up! The world is yours!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;And don't hesitate to ask me if you don't know what to do.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://freed.in"&gt;&lt;img border="0" alt="Big Button - 120x60" title="freed.in" src="http://freed.in/wp-content/uploads/2007/08/freed.in.120x60.png"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-5973855587270042172?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/5973855587270042172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=5973855587270042172' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/5973855587270042172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/5973855587270042172'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/08/get-organised.html' title='Get organised!'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4864916951241367995.post-8070732315855113277</id><published>2007-08-24T08:39:00.000+05:30</published><updated>2007-08-24T08:35:08.471+05:30</updated><title type='text'>To blog or not to blog</title><content type='html'>But that&amp;#39;s not the question, since I&amp;#39;ve decided finally, after so many requests from so many people (read exaggeration), to blog. This is intended to be my technical blog, about all the funny and stupid and tragic things that I do with technology. &lt;p&gt;Why Tux Playground? Tux is the name of the penguin that first chased Linus Torvalds, and since then, the whole world has been chasing him, including me. Playground because its all about hacks and tweaks! I think thats all about it. See you again :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4864916951241367995-8070732315855113277?l=tuxplayground.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuxplayground.blogspot.com/feeds/8070732315855113277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4864916951241367995&amp;postID=8070732315855113277' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8070732315855113277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4864916951241367995/posts/default/8070732315855113277'/><link rel='alternate' type='text/html' href='http://tuxplayground.blogspot.com/2007/08/to-blog-or-not-to-blog.html' title='To blog or not to blog'/><author><name>Kazim Zaidi</name><uri>http://www.blogger.com/profile/16846652169654231184</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_0gOyGeZ3zDg/SPHjtnf_H0I/AAAAAAAAALM/vqtOs_WOn9A/S220/me.JPG'/></author><thr:total>1</thr:total></entry></feed>
