<?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-14569512</id><updated>2011-11-23T09:58:46.205-08:00</updated><title type='text'>The Tinkerer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14569512.post-7746610050534236023</id><published>2011-08-26T02:42:00.000-07:00</published><updated>2011-08-26T03:10:26.422-07:00</updated><title type='text'>How to have page up and page down in safari iPad</title><content type='html'>Add these as bookmarklets in your bookmark bar:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  javascript:window.scrollBy(0,-window.innerHeight+20)&lt;br /&gt;&lt;br /&gt;  javascript:window.scrollBy(0,window.innerHeight-20)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;They are for page up and page down, respectively.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-7746610050534236023?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/7746610050534236023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=7746610050534236023' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/7746610050534236023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/7746610050534236023'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2011/08/how-to-have-page-up-and-page-down-in.html' title='How to have page up and page down in safari iPad'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-8634204140263567067</id><published>2011-08-11T19:20:00.000-07:00</published><updated>2011-08-11T19:57:21.275-07:00</updated><title type='text'>How To Optimize</title><content type='html'>Donald Knuth:&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;We should forget about small efficiencies, say about 97% of the&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;time: premature optimization is the root of all evil.  Yet we&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;should not pass up our opportunities in that critical 3%.&lt;/i&gt;&lt;/div&gt;&lt;/quote&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;(&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.103.6084&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;Source is here.&lt;/a&gt; See the 2nd paragraph on the right column on page 8.)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Here's the general advice on optimizing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    1. Don't do it&lt;/div&gt;&lt;div&gt;    2. Don't do it yet&lt;/div&gt;&lt;div&gt;    3. Don't do it until someone complains that it is slow.&lt;/div&gt;&lt;div&gt;4. And when someone complains, find the bottleneck - &lt;b&gt;measure&lt;/b&gt; it! Get a feel of how slow it is. Remember:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Don't optimize what you cannot measure because therein lies the road to insanity.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. Optimize one step at a time and always, always measure the gain. If there's no gain then undo your "optimization".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-8634204140263567067?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/8634204140263567067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=8634204140263567067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/8634204140263567067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/8634204140263567067'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2011/08/how-to-optimize.html' title='How To Optimize'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-1388844983597049407</id><published>2011-02-23T21:50:00.001-08:00</published><updated>2011-02-23T21:51:24.412-08:00</updated><title type='text'>Put it out on the 'net</title><content type='html'>This is so that I'll never forget the lyric to that song that my daughter sang when she came back from daycare:&lt;br /&gt;&lt;br /&gt;Tamiyana tam tam tam ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-1388844983597049407?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/1388844983597049407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=1388844983597049407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1388844983597049407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1388844983597049407'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2011/02/put-it-out-on-net.html' title='Put it out on the &apos;net'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-568565037454686107</id><published>2010-12-20T23:56:00.000-08:00</published><updated>2010-12-21T00:16:15.191-08:00</updated><title type='text'>Tolerable dark blue on black</title><content type='html'>&lt;a href="http://code.google.com/p/simple-build-tool/"&gt;sbt&lt;/a&gt; shows what it is doing using the color blue.  Unfortunately on a black background (my preference) it is super-unreadable.&lt;br /&gt;&lt;br /&gt;Mark Harrah said that &lt;a href="http://groups.google.com/group/simple-build-tool/browse_thread/thread/3690fa72b7f52d80/9ec704d8f795a13a?lnk=gst&amp;amp;q=color#9ec704d8f795a13a"&gt;sbt uses the ANSI escape sequence so the actual color that is used should be configurable by the terminal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's how to configure the color palette for xfce-terminal:&lt;br /&gt;&lt;br /&gt;1. Edit ~/.config/Terminal/terminalrc&lt;br /&gt;2. Change:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; ColorPalette5=#00000000aaaa&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; ColorPalette5=#6666ccccffff&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You don't have to restart anyting, xfce will update the color instantaneously as soon as you save the file.&lt;br /&gt;&lt;br /&gt;It will change the color from this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SSdWx5XaV9s/TRBhwuT0gII/AAAAAAAAANw/X5p-daxG2D4/s1600/blue-on-black.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 199px; height: 78px;" src="http://1.bp.blogspot.com/_SSdWx5XaV9s/TRBhwuT0gII/AAAAAAAAANw/X5p-daxG2D4/s400/blue-on-black.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553045830240600194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;to this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SSdWx5XaV9s/TRBh9X6nTAI/AAAAAAAAAN4/YVSeRszI6Ao/s1600/lightblue-on-black.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 202px; height: 84px;" src="http://3.bp.blogspot.com/_SSdWx5XaV9s/TRBh9X6nTAI/AAAAAAAAAN4/YVSeRszI6Ao/s400/lightblue-on-black.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553046047567596546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Neat!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-568565037454686107?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/568565037454686107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=568565037454686107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/568565037454686107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/568565037454686107'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2010/12/tolerable-dark-blue-on-black.html' title='Tolerable dark blue on black'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SSdWx5XaV9s/TRBhwuT0gII/AAAAAAAAANw/X5p-daxG2D4/s72-c/blue-on-black.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-5679405985375632940</id><published>2010-04-19T19:26:00.000-07:00</published><updated>2011-07-28T04:06:04.699-07:00</updated><title type='text'>No more select-and-middle-click for git (or how unix saves the day, again)</title><content type='html'>[Update 2011-07-28: You can get the code at github: &lt;a href="https://github.com/holygeek/git-number"&gt;https://github.com/holygeek/git-number&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;I use git and rely on its 'git status' output to select the filenames that I want to operate on whatever git command that I wanted to do *now*.&lt;br /&gt;&lt;br /&gt;I used to do this (a lot):&lt;br /&gt;&lt;br /&gt;$ git status&lt;br /&gt;[git shows the status here]&lt;br /&gt;$ git [add|add -p|rm|checkout] *I reach for the mouse with my right hand, double click on the filename(s) shown in the status (so that it is selected and copied into the X cut selection) and middle click on the terminal (so that the filename is pasted here), and either hit the space bar to prepare for the next 'select-and-middle-click' another filename or press enter at this point to execute this action*&lt;br /&gt;&lt;br /&gt;At first this felt like a quick and speedy way of selecting files to operate on but over time it gets old. I don't like reaching for the mouse and prefer that my hand stays on the keyboard. Somehow this breaks my concentration somewhat and that is not a good thing, you know, focus and all... and somehow I never get comfortable with the command line completion offered by the shell (when it comes to git) and wondered if there's a quicker way of telling git which file I want it to operate on ...&lt;br /&gt;&lt;br /&gt;So I devised a way that I think I'll be happy using:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ gt&lt;br /&gt;# On branch master&lt;br /&gt;# Changed but not updated:&lt;br /&gt;#   (use "git add &amp;lt;file&amp;gt;..." to update what will be committed)&lt;br /&gt;#   (use "git checkout -- &amp;lt;file&amp;gt;..." to discard changes in working directory)&lt;br /&gt;#&lt;br /&gt;#1      modified:   fa&lt;br /&gt;#2      modified:   mF&lt;br /&gt;#3      modified:   poor.pl&lt;br /&gt;#&lt;br /&gt;# Untracked files:&lt;br /&gt;#   (use "git add &amp;lt;file&amp;gt;..." to include in what will be committed)&lt;br /&gt;#&lt;br /&gt;#4      6a&lt;br /&gt;#5      6c&lt;br /&gt;#6      6cov&lt;br /&gt;#7      6g&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;'gt' is a perl script that parses the output of git status and adds cute numbers before the tab that precedes the filenames in git status' original output. The numbers are cute because they let me know that I no longer have to reach for the mouse to tell git (or some other shell script) which file I wanted to operate on. You can think of it as the primary key that uniquely identify the file listed by git status. gt also saves its output in a hidden file, overwriting the previous content on every run.&lt;br /&gt;&lt;br /&gt;So with this in place I can have another script, ga (which stands for git add) that accepts either the full filename or the cuter numbers as its argument so I can pretty much not go through 'select-and-middle-click' for git anymore:&lt;br /&gt;&lt;br /&gt;$ ga -p 1 3&lt;br /&gt;&lt;br /&gt;Which have the same effect as if I had typed "git add -p fa poor.pl" - this is *big* win for me. Yay!&lt;br /&gt;&lt;br /&gt;What ga does is go through its argument and convert those numbers to its equivalent filename by looking at that hidden file I mentioned earlier.  This is done by the following small perl library:&lt;br /&gt;&lt;br /&gt;MyGitList.pm:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;package MyGitList;&lt;br /&gt;&lt;br /&gt;my $number_pattern;&lt;br /&gt;my $cmd_opt = '';&lt;br /&gt;&lt;br /&gt;sub resolve_args {&lt;br /&gt;    my (@argv) = @_;&lt;br /&gt;    my @resolved;&lt;br /&gt;&lt;br /&gt;    foreach my $arg (@argv) {&lt;br /&gt;        if ($arg =~ /^[0-9]+$/) {&lt;br /&gt;            if (defined $number_pattern) {&lt;br /&gt;                $number_pattern .= '|'.$arg&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                $number_pattern = $arg;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        elsif ($arg =~ /^-/) {&lt;br /&gt;            $cmd_opt .= $arg;&lt;br /&gt;            $cmd_opt .= ' ';&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            push @resolved, $arg;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    my $resolved = join(' ', @resolved);&lt;br /&gt;&lt;br /&gt;    my $gitlist = '';&lt;br /&gt;    if (defined $number_pattern) {&lt;br /&gt;        $gitlist = `gl '$number_pattern'`;&lt;br /&gt;        $gitlist =~ s/\n/ /g;&lt;br /&gt;        $gitlist =~ s/\s*$//g;&lt;br /&gt;        $gitlist =~ s/^\s//g;&lt;br /&gt;    }&lt;br /&gt;    my $arg_list = "$gitlist $resolved";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    return ($cmd_opt, $arg_list);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;1;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And ga uses MyGitList.pm like so:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;use lib($ENV{HOME} . '/bin');&lt;br /&gt;use MyGitList;&lt;br /&gt;&lt;br /&gt;if (scalar @ARGV == 0) {&lt;br /&gt;    print "Usage: ga &amp;lt;number_pattern|filename&amp;gt;\n";&lt;br /&gt;    exit 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my ($cmd_opt, $arg_list) = MyGitList::resolve_args(@ARGV);&lt;br /&gt;my $cmd = "git add $cmd_opt $arg_list";&lt;br /&gt;print "$cmd\n";&lt;br /&gt;system($cmd);&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I love Unix.&lt;br /&gt;&lt;br /&gt;Not too long ago I modified git status, git add, git rm, git diff, and a few more of its siblings to handle this cute numbering scheme but gave up on that because when I think about it more it seems like git is not the proper place to do it - it feels like modifying your car so that it can tell you where you stashed the coins that you had with you yesterday (there goes another not-so-useful car-computer analogy).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-5679405985375632940?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/5679405985375632940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=5679405985375632940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/5679405985375632940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/5679405985375632940'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2010/04/no-more-select-and-middle-click-for-git.html' title='No more select-and-middle-click for git (or how unix saves the day, again)'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-1978389791207043391</id><published>2009-10-29T20:57:00.000-07:00</published><updated>2009-12-16T18:55:31.827-08:00</updated><title type='text'>When Did I Install This?</title><content type='html'>I use chrome via &lt;a href="http://code.google.com/p/chromium/"&gt;chromium&lt;/a&gt;, and I compile it every now and then, whenever I feel like it's been a while since I last compile it.&lt;br /&gt;&lt;br /&gt;How do I know it's been a while? How long is a while?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        ls -lL `which chrome`&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;shows me the last modification time.&lt;br /&gt;&lt;br /&gt;But this needs some mental exercise on comparing the last modification time with the current time.&lt;br /&gt;&lt;br /&gt;Here's my solution ...  &lt;br /&gt;&lt;br /&gt;Say hello to age:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SYNOPSIS&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;  age [-fh] file ...&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;&lt;b&gt;DESCRIPTION&lt;/b&gt;&lt;br /&gt;&lt;tt&gt;age shows the age of the given programs. For each argument age&lt;br /&gt; locates the program executable using which(1), and then&lt;br /&gt; calculates the age in days, hours, minutes and seconds. Fields&lt;br /&gt; where the values are zero are not shown.&lt;br /&gt;  &lt;br /&gt; For executables age dereferences symbolic links by default.&lt;br /&gt; This makes it simple to find out how old a program has been&lt;br /&gt; installed on the system.&lt;br /&gt;  &lt;br /&gt; To show the age of symbolic links use the -f option instead&lt;br /&gt; and specify the fullpath to the symbolic link.&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Example usage:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ age chrome&lt;br /&gt; /home/nazri/bin/chrome: 1 day 21 hours 1 minute 20 seconds&lt;br /&gt;&lt;br /&gt; $ age git&lt;br /&gt; /usr/local/bin/git: 1 day 23 hours 43 seconds&lt;br /&gt;&lt;br /&gt; $ age ls&lt;br /&gt; /bin/ls: 1 year 125 days 3 hours 23 minutes 15 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Neat!&lt;br /&gt;&lt;br /&gt;Here's the full shell script:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;# age - Show age of files&lt;br /&gt;&lt;br /&gt;me=`basename $0`&lt;br /&gt;SECONDS_PER_MINUTE=60&lt;br /&gt;SECONDS_PER_HOUR=3600&lt;br /&gt;SECONDS_PER_DAY=86400&lt;br /&gt;SECONDS_PER_YEAR=31536000&lt;br /&gt; &lt;br /&gt;usage() {&lt;br /&gt;cat &lt;&lt; EOF&lt;br /&gt;SYNOPSIS&lt;br /&gt; age [-fh] file ...&lt;br /&gt;&lt;br /&gt;DESCRIPTION&lt;br /&gt; age shows the age of the given programs. For each argument age locates the&lt;br /&gt; program executable using which(1), and then calculates the age in days,&lt;br /&gt; hours, minutes and seconds. Fields where the values are zero are not shown.&lt;br /&gt;&lt;br /&gt; For executables age dereferences symbolic links by default. This makes it&lt;br /&gt; simple to find out how old a program has been installed on the system.&lt;br /&gt;&lt;br /&gt; To show the age of symbolic links use the -f option instead and specify the&lt;br /&gt; fullpath to the symbolic link.&lt;br /&gt;&lt;br /&gt;OPTIONS&lt;br /&gt; -h Show this help message&lt;br /&gt;&lt;br /&gt; -f Do not locate the executable. Assume that the files are relative path&lt;br /&gt;  to the current directory&lt;br /&gt;&lt;br /&gt;AUTHOR&lt;br /&gt; Written by Nazri Ramliy&lt;br /&gt;&lt;br /&gt;LICENSE&lt;br /&gt; Public domain.&lt;br /&gt;EOF&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;get_age() {&lt;br /&gt; since=$1&lt;br /&gt; now=`date +%s`&lt;br /&gt; delta=$(( $now - $since ))&lt;br /&gt; &lt;br /&gt; years=$(( $delta / $SECONDS_PER_YEAR ))&lt;br /&gt; delta=$(( $delta % $SECONDS_PER_YEAR ))&lt;br /&gt;&lt;br /&gt; days=$(( $delta / $SECONDS_PER_DAY   ))&lt;br /&gt; delta=$(( $delta % $SECONDS_PER_DAY ))&lt;br /&gt;&lt;br /&gt; hours=$(($delta / $SECONDS_PER_HOUR  ))&lt;br /&gt; delta=$(( $delta % $SECONDS_PER_HOUR   ))&lt;br /&gt;&lt;br /&gt; minutes=$(($delta / $SECONDS_PER_MINUTE))&lt;br /&gt; delta=$(( $delta % $SECONDS_PER_MINUTE ))&lt;br /&gt;&lt;br /&gt; seconds=$delta&lt;br /&gt; &lt;br /&gt; [ $years   -gt 0 ] &amp;&amp; out="$years year"          &amp;&amp; &lt;br /&gt; [ $years   -gt 1 ] &amp;&amp; out="${out}s"&lt;br /&gt;&lt;br /&gt; [ $days    -gt 0 ] &amp;&amp; out="$out $days day"       &amp;&amp;&lt;br /&gt; [ $days    -gt 1 ] &amp;&amp; out="${out}s"&lt;br /&gt;&lt;br /&gt; [ $hours   -gt 0 ] &amp;&amp; out="$out $hours hour"     &amp;&amp;&lt;br /&gt; [ $hours   -gt 1 ] &amp;&amp; out="${out}s"&lt;br /&gt;&lt;br /&gt; [ $minutes -gt 0 ] &amp;&amp; out="$out $minutes minute" &amp;&amp;&lt;br /&gt; [ $minutes -gt 1 ] &amp;&amp; out="${out}s"&lt;br /&gt;&lt;br /&gt; [ $seconds -gt 0 ] &amp;&amp; out="$out $seconds second" &amp;&amp;&lt;br /&gt; [ $seconds -gt 1 ] &amp;&amp; out="${out}s"&lt;br /&gt;&lt;br /&gt; out=`echo $out|sed -e 's/^ *//'`&lt;br /&gt; echo $out&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;find_bin=1&lt;br /&gt;while getopts hf opt&lt;br /&gt;do&lt;br /&gt; case "$opt" in&lt;br /&gt; f)&lt;br /&gt;  find_bin=0&lt;br /&gt;  ;;&lt;br /&gt;    h)&lt;br /&gt;  usage&lt;br /&gt;   exit;;&lt;br /&gt; \?) exit;;&lt;br /&gt; esac&lt;br /&gt;done&lt;br /&gt;shift $(($OPTIND -1))&lt;br /&gt;&lt;br /&gt;[ -z "$1" ] &amp;&amp; usage &amp;&amp; exit&lt;br /&gt;&lt;br /&gt;for file in $*; do&lt;br /&gt; if [ $find_bin -eq 1 ]; then&lt;br /&gt;  exe=`which 2&gt;/dev/null $file`&lt;br /&gt;  [ $? -ne 0 ] &amp;&amp; echo "$me: $file: No such executable" &amp;&amp; exit 1&lt;br /&gt;  file=$exe&lt;br /&gt;  since=`stat -L --format '%Y' $file`&lt;br /&gt; else&lt;br /&gt;  [ ! -e $file ] &amp;&amp; echo "$me: $file: No such file" &amp;&amp; exit 1&lt;br /&gt;  since=`stat --format '%Y' $file`&lt;br /&gt; fi&lt;br /&gt;&lt;br /&gt; printf "$file: "&lt;br /&gt; get_age $since&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-1978389791207043391?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/1978389791207043391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=1978389791207043391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1978389791207043391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1978389791207043391'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2009/10/when-did-i-install-this.html' title='When Did I Install This?'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-6178032007822456783</id><published>2009-07-08T23:37:00.000-07:00</published><updated>2009-07-08T23:40:06.560-07:00</updated><title type='text'>How to be Good at the Command Line (or How to Improve Your CLI-FU)</title><content type='html'>It's simple: Join your $SHELL mailing list, read the emails and apply what you learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-6178032007822456783?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/6178032007822456783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=6178032007822456783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/6178032007822456783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/6178032007822456783'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2009/07/how-to-be-good-at-command-line-or-how.html' title='How to be Good at the Command Line (or How to Improve Your CLI-FU)'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-4054640566590363908</id><published>2009-06-22T01:18:00.000-07:00</published><updated>2009-06-22T01:38:26.907-07:00</updated><title type='text'>Running any program as a windows service on Windows XP (or its many siblings).</title><content type='html'>I needed to run a perl script as windows service.&lt;br /&gt;&lt;br /&gt;The perl module &lt;tt&gt;&lt;a href="http://www.roth.net/perl/packages/"&gt;Win32::Daemon&lt;/a&gt;&lt;/tt&gt; written by Dave Roth was not available on CPAN, and the one provided on his website seem to require a specially compiled version of perl. I'm running perl using the strawberry perl distribution on Windows XP, so Roth's module, even though it seemed like the best solution (it provides all those nice callbacks), had to be scrapped for my purpose at the moment.&lt;br /&gt;&lt;br /&gt;After googling around I made the decision to run the service using the bare-bones &lt;tt&gt;instsrv.exe&lt;/tt&gt; and &lt;tt&gt;srvany.exe&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;Here are the steps necessary: &lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; If you don't have them yet, get &lt;tt&gt;instsrv.exe&lt;/tt&gt; and &lt;tt&gt;srvany.exe&lt;/tt&gt; by downloading the windows resource kit (google for &lt;tt&gt;srvany.exe&lt;/tt&gt; and it should tell you from which Microsoft webste can you get it). Install the kit and it should give you instsrv.exe and &lt;tt&gt;srvany.exe&lt;/tt&gt;.  I copied &lt;tt&gt;instsrv.exe&lt;/tt&gt; and &lt;tt&gt;srvany.exe&lt;/tt&gt; from the resource kit's program files directory to my &lt;tt&gt;C:\Windows\System32&lt;/tt&gt; directory.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Register your windows service by doing the following:&lt;br /&gt;&lt;br /&gt; &lt;tt&gt;instsrv yourservicename c:\Windows\System32\srvany.exe&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt; This will create a registry entry for the "&lt;tt&gt;yourservicename&lt;/tt&gt;" service.&lt;br /&gt;&lt;br /&gt; Next you'll need to tell srvany which script to run when it starts your service.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Now run regedit and (do heed the obligatory warning and cautions about directly editing registry entries on windows, in other words, close one eye and proceed :) specify the location of your script by adding the following keys:&lt;br /&gt;&lt;br /&gt; Entry (create if it doesn't exist):&lt;br /&gt;&lt;br /&gt; &lt;tt&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\yourservicename\Parameters&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Keys (all are string)       Value&lt;br /&gt;    &lt;br /&gt;    Application                 c:\strawberry\perl\bin\perl.exe&lt;br /&gt;    AppParameters               c:\Path\To\Your\Script&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; This is optional:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    AppDirectory                c:\Path\To\Your\App\Start\Directory&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;  Now go to Control Panel/Administrative Tools/Services. You service should be listed there. By default the service with the privileges of the Local System Account, so be aware of the privilege limitations.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Profit!!!&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-4054640566590363908?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/4054640566590363908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=4054640566590363908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/4054640566590363908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/4054640566590363908'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2009/06/running-any-program-as-windows-service.html' title='Running any program as a windows service on Windows XP (or its many siblings).'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-5010945625468782731</id><published>2009-02-26T20:36:00.000-08:00</published><updated>2009-02-26T20:42:29.408-08:00</updated><title type='text'>matchit.vim's b:match_words for template toolkit</title><content type='html'>I put the following in my ~/.vim/after/ftplugin/html_snippets.vim:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;let b:match_words = b:match_words . ','&lt;br /&gt;\. '[% \&amp;lt;\(IF\|FOR\|FOREACH\)\&amp;gt;:[% \&amp;lt;E\%(LSIF\|LSE\|ND\)\&amp;gt;:[% \&amp;lt;END\&amp;gt;'&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;I love vim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-5010945625468782731?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/5010945625468782731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=5010945625468782731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/5010945625468782731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/5010945625468782731'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2009/02/matchitvims-bmatchwords-for-template.html' title='matchit.vim&apos;s b:match_words for template toolkit'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-1353390314178518271</id><published>2009-02-19T20:02:00.000-08:00</published><updated>2009-02-19T20:12:52.993-08:00</updated><title type='text'>I like git</title><content type='html'>There's a feature called 'bisect' in git.&lt;br /&gt;&lt;br /&gt;Basically it works like this:&lt;br /&gt;&lt;br /&gt;Your're at HEAD, testing out the application, and suddenly&lt;br /&gt;noticed that a bug has been introduced sometime ago (could&lt;br /&gt;be hours, days or weeks or months or years).&lt;br /&gt;&lt;br /&gt;How to find the guilty commit?&lt;br /&gt;&lt;br /&gt;Git bisect takes the pain away from finding that one commit&lt;br /&gt;that introduced that bug. It performs a binary search along&lt;br /&gt;your history on that bug.&lt;br /&gt;&lt;br /&gt;The best thing is that if you can come up with a script that&lt;br /&gt;returns true or false to indicate the presence or absence of&lt;br /&gt;the bug, then you can automate the process of finding that&lt;br /&gt;bug.&lt;br /&gt;&lt;br /&gt;And when it comes to scripting, the possibilities are&lt;br /&gt;endless.&lt;br /&gt;&lt;br /&gt;Example: Let's say suddenly there's a band of blue pixels&lt;br /&gt;suddenly appearing in the webpage, that you know is not&lt;br /&gt;there a few weeks ago. To find the guilty commit, write a&lt;br /&gt;script that queries that location in your browser&lt;br /&gt;(automatically refreshing the page) for the existence of the&lt;br /&gt;area and returns true or false accordingly, then use git&lt;br /&gt;bisect to find the first commit that introduced that blue&lt;br /&gt;pixels. The script doesn't have to be all automatic, it&lt;br /&gt;could even ask you whether you can see the band or not, then&lt;br /&gt;returns true or false according to your y/n response.&lt;br /&gt;&lt;br /&gt;There's a nice &lt;a href="http://lwn.net/Articles/317154/"&gt;article about git bisect&lt;/a&gt; at LWN.&lt;br /&gt;&lt;br /&gt;Technically this 'bisect' could work as well for svn&lt;br /&gt;(there's &lt;a href="http://search.cpan.org/~infinoid/App-SVN-Bisect-0.6/bin/svn-bisect"&gt;svn-bisect&lt;/a&gt; on &lt;a href="http://cpan.org/"&gt;CPAN&lt;/a&gt;), but if your svn&lt;br /&gt;repository is not local, then it will take much longer&lt;br /&gt;compared to git since svn needs to checkout each revision as&lt;br /&gt;it is bisecting whereas in git all the history are stored&lt;br /&gt;locally.&lt;br /&gt;&lt;br /&gt;But once you found the guilty commit you still have to&lt;br /&gt;manually bisect/debug it to isolate the buggy code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-1353390314178518271?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/1353390314178518271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=1353390314178518271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1353390314178518271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1353390314178518271'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2009/02/i-like-git.html' title='I like git'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-931856976338390262</id><published>2008-12-23T20:20:00.000-08:00</published><updated>2008-12-23T20:22:11.718-08:00</updated><title type='text'></title><content type='html'>In 1752, September had only 19 days.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SSdWx5XaV9s/SVG40TILh8I/AAAAAAAAAKk/uppD2mivQsY/s1600-h/1752.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 361px; height: 400px;" src="http://4.bp.blogspot.com/_SSdWx5XaV9s/SVG40TILh8I/AAAAAAAAAKk/uppD2mivQsY/s400/1752.png" alt="" id="BLOGGER_PHOTO_ID_5283207046509594562" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-931856976338390262?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/931856976338390262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=931856976338390262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/931856976338390262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/931856976338390262'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2008/12/in-1752-september-had-only-19-days.html' title=''/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_SSdWx5XaV9s/SVG40TILh8I/AAAAAAAAAKk/uppD2mivQsY/s72-c/1752.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-1360178688981784914</id><published>2008-12-22T23:26:00.000-08:00</published><updated>2008-12-23T01:48:37.664-08:00</updated><title type='text'>Trend in browser usage, as seen by w3schools (or predicting IE6's death)</title><content type='html'>I've had my share of venting out my frustrations on IE6 for the last few weeks. Feeling frustrated, I googled for "predicting IE6 death". A few minutes later brought me to w3schools' web browser trend page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.w3schools.com/"&gt;w3schools&lt;/a&gt; publishes the web browser used by people visiting their website &lt;a href="http://www.w3schools.com/browsers/browsers_stats.asp"&gt;here&lt;/a&gt; from 2002 up to now (2008).&lt;br /&gt;&lt;br /&gt;I was bored, and wondered how the data would look like. So after a few minutes of eating &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt;, massaging a &lt;a href="http://www.vim.org/"&gt;vim&lt;/a&gt; script, grokking &lt;a href="http://www.gnuplot.info/"&gt;gnuplot&lt;/a&gt;, spitting some &lt;a href="http://perl.org/"&gt;perl&lt;/a&gt; phlegm, and waving the &lt;a href="http://www.imagemagick.org/script/index.php"&gt;imagemagick&lt;/a&gt; wand, here's the result:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SSdWx5XaV9s/SVCzHIEitAI/AAAAAAAAAKc/Su5GLf2JrrM/s1600-h/all.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 38px;" src="http://1.bp.blogspot.com/_SSdWx5XaV9s/SVCzHIEitAI/AAAAAAAAAKc/Su5GLf2JrrM/s400/all.png" alt="" id="BLOGGER_PHOTO_ID_5282919297912583170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From left: 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2008 (chrome).&lt;br /&gt;&lt;br /&gt;The red line at the beginning is IE6. The green line at the beginning is IE5.&lt;br /&gt;We can see IE6 dominating from 2003 up to 2005, in which year it drops due to a new kid on the block: Firefox, which is a reincarnation of Mozilla (the blue line, and later purple from 2006 onwards). The green line at the end (from 2006 onwards) is IE6. The colors are the default ones given by gnuplot.&lt;br /&gt;&lt;br /&gt;2009 would be an interesting one to watch out for.&lt;br /&gt;&lt;br /&gt;Until the next post, happy new year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-1360178688981784914?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/1360178688981784914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=1360178688981784914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1360178688981784914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/1360178688981784914'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2008/12/trend-in-browser-usage-as-seen-by.html' title='Trend in browser usage, as seen by w3schools (or predicting IE6&apos;s death)'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SSdWx5XaV9s/SVCzHIEitAI/AAAAAAAAAKc/Su5GLf2JrrM/s72-c/all.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14569512.post-112162285679347867</id><published>2005-07-17T10:49:00.000-07:00</published><updated>2005-07-17T10:54:16.796-07:00</updated><title type='text'>The Tinkerer</title><content type='html'>&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/b&gt; From merriam-webster:&lt;br /&gt;&lt;b&gt;tinker&lt;/b&gt;&lt;br /&gt; Function: &lt;i&gt;verb&lt;/i&gt;&lt;br /&gt; Inflected Form(s): &lt;b&gt;tin·kered&lt;/b&gt;; &lt;b&gt;tin·ker·ing&lt;/b&gt;&lt;br /&gt;&lt;i&gt;intransitive senses&lt;/i&gt; &lt;b&gt;:&lt;/b&gt;&lt;br /&gt;  to work in the manner of a tinker; &lt;i&gt;especially&lt;/i&gt; &lt;b&gt;:&lt;/b&gt; to repair, adjust, or work with  something in an unskilled or experimental manner&lt;br /&gt;&lt;br /&gt;&lt;i&gt;transitive senses&lt;/i&gt; &lt;b&gt;:&lt;/b&gt;&lt;br /&gt;  to repair, adjust, or experiment with&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14569512-112162285679347867?l=thetinkerer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thetinkerer.blogspot.com/feeds/112162285679347867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14569512&amp;postID=112162285679347867' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/112162285679347867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14569512/posts/default/112162285679347867'/><link rel='alternate' type='text/html' href='http://thetinkerer.blogspot.com/2005/07/tinkerer.html' title='The Tinkerer'/><author><name>The Tinkerer</name><uri>http://www.blogger.com/profile/09368871558033916845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
