Thursday, March 30, 2006
Detached
Mind, and the Madness of it,
Truth, and the Tenderness of it,
Pain, and the Purpose of it,
Darkness, and the Depth of it,
Tears, and the Truth of it,
Past, and the Pain of it,
Eyes, and the Emptiness in it,
Time, and the Trap of it,
Idle, and the Intimacy with it,
Fire, and just a Flicker of it,
Gale, and only the Gust of it,
Veil, and the Visions from it,
Death, and the Design of it,
Paradise, and just a Picture of it,
Child, and the Cruelty of it,
Eden, and the Entrapment of it,
God, are you the Garden I am in,
Or I the Dream in You?
Wednesday, March 08, 2006
Summer of '06
The only obvious advantages of this hot and humid climate is that I can now stop applying Vaseline on my dry skin, travel to coastal areas and frolic on the beaches and have all the ice-cream I crave for. My midnight snack’s now officially chocolate/vanilla ice-cream topped with banana and grapes.
Yum.
Friday, February 17, 2006
Demystifying virtual functions
{
public:
virtual void PRINT_FUNCTION(void);
};
class DERIVED_CLASS : public BASE_CLASS
{
public:
void PRINT_FUNCTION(void);
};
void BASE_CLASS::PRINT_FUNCTION(void)
{
printf("Base Function\n");
}
void DERIVED_CLASS::PRINT_FUNCTION(void)
{
printf("Derived Function\n");
}
int main()
{
DERIVED_CLASS *dobject=new DERIVED_CLASS;
dobject->PRINT_FUNCTION();
return 0;
}
This has to be self-explanatory. Obviously, the print from the above code, if run, would be "Derived Function". The basic concepts of how virtual functions are implemented using vtables & vptr are explained beautifully here. To surmise, each object has a vptr that points to the correct vtable of the class, where the vtable is a list of pointers to virtual functions defined in that class.
Now, let's put this code under the magnifying glass.
g++ -fdump-tree-gimple -fdump-class-hierarchy -S virtual.cpp
Compiling it with -fdump-tree-gimple gives us the GIMPLE output, which I recently found out from here.
-fdump-class-hierarchy "dumps a representation of each class' hierarchy and virtual function table layout to a file." (quoting the man page of gcc).
-S gives us the assembler output.
Before analyzing the dumps, let me just explain whatever little name-mangling I had to learn for this experiment. The G++ ABI mangles all names with a preceding _Z. After this, certain patterns occur, followed by the mangled name :
TV - Vtables. Pointed to by polymorphic objects and those with virtual bases.
TI - Type information. Returned by the typeid operator, pointed to by the vtable.
TS - Type string. Returned by type_info::name, and used for type comparisons.
In most of the cases, the mangled name consists of two things - a number specifying the length of the string following and the string itself (usually the name of a class or a function).
Okay, let's look at the class hierarchy dump first:
The first thing we see is that the vtable (if it exists) always consists of two entries, by default. The first one is a NULL pointer and the second one is a pointer to the type-info of the class ( Maybe this is used for RTTI? ). Right, from then on, we have one pointer each for each virtual function in the class. The vptr for the base class is defined to be the value &(Base Class's virtual table) + 8. The 8 bytes skip the first two entries (on a 32-bit machine). Similarly, the vptr for the derived class is &(Derived Class's virtual table) + 8. Now, where is the vptr for each object stored? In the case of gcc, it is always the first word in the object's memory. Well, that's pretty much the vtable structure. So, calling a virtual function is now simply finding the vptr for the object ( in the first word ) & getting the address of the corresponding vtable. Index into the table using the appropriate index (calculated during compile-time), and you get the actual function to be called.
Vtable for BASE_CLASS
BASE_CLASS::_ZTV10BASE_CLASS: 3u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI10BASE_CLASS)
8 BASE_CLASS::PRINT_FUNCTION
Class BASE_CLASS
size=4 align=4
base size=4 base align=4
BASE_CLASS (0xb7d1bbc0) 0 nearly-empty
vptr=((& BASE_CLASS::_ZTV10BASE_CLASS) + 8u)
Vtable for DERIVED_CLASS
DERIVED_CLASS::_ZTV13DERIVED_CLASS: 3u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI13DERIVED_CLASS)
8 DERIVED_CLASS::PRINT_FUNCTION
Class DERIVED_CLASS
size=4 align=4
base size=4 base align=4
DERIVED_CLASS (0xb7d1bc80) 0 nearly-empty
vptr=((& DERIVED_CLASS::_ZTV13DERIVED_CLASS) + 8u)
BASE_CLASS (0xb7d1bcc0) 0 nearly-empty
primary-for DERIVED_CLASS (0xb7d1bc80)
Let's move on to the GIMPLE output (unnecessary output skipped):
We first see that the constructor for the base class and the derived class are implicitly called with the "this" pointer. This pointer points to the object in memory. Let's look at the base constructor. All we're doing here is getting the vtable for this class and making the vptr point to it. The vptr is depicted here as "this->_vptr.BASE_CLASS". Next comes the derived class's constructor. Since the derived class also has access to the base class's members/functions, it does contain a "pointer" to the base class within itself. In our case, this is the pointer &this->D.2202, which we pass on to the base' constructor. I haven't been able to figure out how the pointer is being obtained. Anyway, after the call to the base constructor, the vptr is now made to point correctly to the derived class's vtable as:
;; Function BASE_CLASS::BASE_CLASS() (_ZN10BASE_CLASSC2Ev)BASE_CLASS::BASE_CLASS() (this)
{
int (*__vtbl_ptr_type) (void) * D.2250;
try
{
{
D.2250 = &_ZTV10BASE_CLASS + 8;
this->_vptr.BASE_CLASS = D.2250;
}
}
catch
{
<<>>
{
__cxa_call_unexpected (<<>>);
}
}
}
;; Function DERIVED_CLASS::DERIVED_CLASS() (_ZN13DERIVED_CLASSC1Ev)
DERIVED_CLASS::DERIVED_CLASS() (this)
{
struct BASE_CLASS * D.2259;
int (*__vtbl_ptr_type) (void) * D.2260;
try
{
{
D.2259 = &this->D.2202;
__base_ctor (D.2259);
D.2260 = &_ZTV13DERIVED_CLASS + 8;
this->D.2202._vptr.BASE_CLASS = D.2260;
}
}
catch
{
<<>>
{
__cxa_call_unexpected (<<>>);
}
}
}
;; Function int main() (main)
int main() ()
{
struct DERIVED_CLASS * D.2215;
void * D.2261;
int (*__vtbl_ptr_type) (void) * D.2262;
int (*__vtbl_ptr_type) (void) D.2263;
int D.2264;
{
{
struct DERIVED_CLASS * dobject;
D.2261 = operator new (4);
D.2215 = (struct DERIVED_CLASS *) D.2261;
try
{
__comp_ctor (D.2215);
}
catch
{
operator delete (D.2215);
}
dobject = D.2215;
D.2262 = dobject->D.2202._vptr.BASE_CLASS;
D.2263 = *D.2262;
OBJ_TYPE_REF(D.2263;dobject->0) (dobject);
....
this->D.2202._vptr.BASE_CLASS = D.2260;
Remember, the base and derived classes both share the same vptr, hence it gets overwritten after the call to the base constructor has finished.
Now, let's look at how the virtual function is called from main() :
We first get the vptr of the object as :
vptr->D.2202._vptr.BASE_CLASS and then dereference it directly to get the function. Since the function is at the 0th index, we don't need any indexing here. We then call this deferenced function, which is pointing to the derived PRINT_FUNCTION and voila! There's your rabbit out of the hat!
On a more personal note, I just had an amazing last 3 weeks. Went to Goa (my second visit), the Jethro Tull concert, Bryan Adams concert, started on a couple of B&N free courses and still trying to keep my head above all this. It's now 3:35 AM and I've to leave for Mangalore in half an hour ( I've decided getting even a wink of sleep won't work for me now ). Maybe, I can nap along the way....
Monday, January 23, 2006
A couple of movies I recently saw....
Rounders is a movie about Poker. It starts off with Mike(Matt Damon) losing miserably in a game against a Frenchman "KGB"(John Malkovich) and thereafter vowing never to play again. But the guy's a genius. He comments he can even defeat a group of judges at Poker blindfolded, after having figured out the exact hands each one was playing. His friend Lester(Edward Norton) , having just gotten out of jail, is shocked to find his old friend has quit. But soon, the two friends start playing together, after Lester insinuatingly persuades Mike to start up again. But, Mike soon finds out Lester is ripping him off and ends up owing $15,000 to KGB. Meanwhile, his girlfriend's left him when she finds out he's started gambling again. This is not an underdog story. You don't feel ecstatic at the end of the movie ; you feel comforted and satisfied, after having seen Mike suffer for something that's not even his fault and finally overcoming it, by playing an unbelievable last game against KGB. You cannot get away from what you are, no matter how hard you try - that seems to be the moral of this movie. And it's stylish ; Matt Damon excels in his scattered monologue and can really deliver that I-don't-give-a-damn-I'm-a-genius character, that he played in Good Will Hunting. The movie had some appealing visuals too and overall, was entertaining. Definitely worth watching.
eXistenZ is a movie about virtual reality(VR) - Reality being simulated in a game. Allegra (Jennifer Jason Leigh) is a game designer, who's spent the last 5 years developing a 38 million-dollar game. The interface to all such VR games is a bio-port - A hole at the back of the spine into which a cord is attached. The other end of the cord goes to a game-controller ; which is actually an organism, with its own neural system, built from parts of various animals and engineered to simulate reality. Everything goes haywire from the very beginning. An assassination attempt on Allegra leads her and Ted(Jude Law), a PR guy for the company promoting the game, to go into hiding. They soon plug into the game Allegra developed - "eXistenZ", and start playing. Some interesting observations are then realised. The game has a start-point, where a character tells you what you should do next. From there, you're on your own. Your character has it's own motions and instincts, which are displayed as the game progresses. An ingame character goes into a loop, if not confronted with the right dialogue. A loop is similar to a program loop, where the character blindly moves his eyes up and down and stares, dumbfounded at the floor or the ceiling. Soon, Ted cannot distinguish from the game-world and the real-world. They all seem the same ; the same texture and ambience rots through everything he sees. Even after pausing the game and returning to the real world, he still feels it's a game. How do you know where you are, if you can't tell the difference between what's real and what's not? Simple, you cannot. Having looked closely, I realized that eXistenZ can itself simulate another game environment and set up VR games from within itself. Forget VR controllers simulating reality ; this is VR simulating VR. And you can go as deep as you can, you can have a VR game running from within a VR, which is under another VR environment. The movie depicts exactly this, and saying anything more would give away the ending. I would definitely recommend this movie to anyone, even though the visuals are forgettable at best and the acting just so-so.
Monday, January 16, 2006
Ooga Mooga Ga
As a sidenote, this is something I came up with as I was writing this post:
struct on_you; /* You know....the movie???? "Stuck On You"?? Ring a bell????...Oh, come on.... */
void aleehooo; /* would have made a yodeller proud */
float er_ahoy;
[courtesy digg]
Thursday, January 12, 2006
Identity
A question that is hypothetical at best and better left that way; at least till we find a way to hitchhike in the fourth dimension. But, what would happen if, one day, we somehow came face-to-face with our own self? Now, I don’t mean the physical self, but I’m rather more interested in the mind, or the spirit, or the karma….you get the drift. So, how will you feel if you met someone who thinks and behaves exactly like you do? I mean, this person, except for his or her appearance, likes everything you like, hates all the things you hate, dresses up exactly like you and basically has all the niceties and oddities that you might possess. What’ll be your first impression of this person? Will you be elated at having discovered something; something that feels so personal, like finding a toy you’ve hidden in your childhood?
Well, for me at least, I know it’ll be quite an astronomical shock. As far as I can remember, I’ve never met anyone who share all their passions with mine, who get irritated at all the miniscule and irrelevant things I get irritated at, who laugh at all the things I find funny and also hate the things I positively despise. Suppose I met myself, say at a coffee shop and we start talking. Now, I obviously don’t know the other guy is actually me and neither does he. So, we chat for a while and suddenly discover that we have almost everything in common, overlooking all the facts of life, like parents, schooling and stuff. We both love the same kind of music (mostly new-age, rock and alternative), the same authors (Crichton, Rand, Christie, Austen, Woolf, Tolkein….), the same sit-coms and also the same genre of movies (Surreal, Horror….). We also love technology and have lately taken up an interest in classical music and fine art ( we also quickly realize that neither of us understands what exactly art and music is, but want to find out exactly how it’s worth millions of dollars). Having extinguished this initial high-intensity flame to a cinder, I finally settle down and briefly sip my tea. Now, I always feel like an outcast when I’m in a coffee shop, ‘cause I don’t like coffee at all. I’m a tea guy and always will be. So, having ordered whatever basic tea that this joint had to offer, I immediately realized that the guy in front of me had also ordered tea. “Tea in a coffee shop. I feel like an idiot, but I can’t help it. I hate coffee” – he tells me. “Amazing. I was thinking the same thing” – I say. Wow, this person likes everything I like. Fun!!!! So, for the next few days, I meet up with this guy a lot and discuss everything I’m working on right now, talking about all the crazy stuff that I'm trying to implement. I also discover this guy loves Linux and has a keen interest in the same areas that I just enjoy working on. So, I come up with some good solutions and insights to most of these problems. But, very soon, I discovered that I never felt completely satisfied with the way I’ve solved it. There’s no sense of anticipation or discovery anymore. No sense of excitement or the realization of having done something wrong, or overlooked a minor detail. Everything felt so dull and dreary. It took me a while to realize why. I figured out, I cannot learn anything new from this guy ; I know nothing that I’ve not known before I met him that day. Moreover, hearing the same thoughts, like an echo, both from within my head and from his mouth, was beginning to get boring. It sounded both monotonous and repetitive. The next time we met, he told me that he was feeling the exact same thing. Whatever he was thinking came out of my mouth and he felt it best that we both go our separate ways. I agreed. We shook hands. We left. Opposite Ways. As I was walking home, it started drizzling. I stopped and looked up at the sky. Water ran down my hair and face. Strangely, I felt warm and fuzzy inside. I immediately knew he was feeling the same thing. We wished each other and resolved to meet up in the future.
Thursday, December 08, 2005
Look Ma, I'm Lazy!!!!
I'm considering only the ELF format for analysis here. First off, all symbols (static or dynamic) have a symbol-table entry specifying its name ( actually an index into the string table) & an offset (or virtual address). Functions are also symbols, hence they too reside in this symbol table. Furthermore, all programs that are dynamically linked with a shared library also have stub-code within the executable for all functions that are called in the shared-library. This is used at runtime to find its actual address. The stub-code resides in a segment of the memory called PLT ( Procedure Linkage Table ). This is usually ro (read-only) memory. The executable in memory also has a GOT ( Global Offset Table ) that contains the actual address of the symbol at run-time. Whenever a symbol's address has to be resolved at runtime, the dynamic linker queries for the symbol in each of the dependent shared-libraries, finds out the base-address of the library where this symbol is present and populates the symbol's actual run-time address into the GOT. Now, the first instruction of the stub-code in the PLT is always of the form:
jmp *(got-address).
Here, got-address specifies the location in the GOT, where the address of the function resides. Initially, however, got-address points to the next instruction in the PLT itself, which pushes certain identifiers for the dynamic linker and jumps to the linker code itself. Now, the dynamic linker locates the load-address of the function and modifies the GOT entry to contain the actual address. So, the next time a function call is made, the overhead of skipping to the dynamic linker is omitted and the function is called directly.
The program that demonstrates all this is shown below (assuming there's a function called SO_FUNC in a shared-library and this file is linked with that library) :
extern void SO_FUNC(void);As we see, the address of SO_FUNC before & after the call are different. To further confirm this, we can look at /proc/
int main(void)
{
Elf32_Addr *gotAddr, *lazyAddr, *pltAddr;
pltAddr = (Elf32_Addr*)SO_FUNC;
//Skip the opcode and MOD-REG-R/M....
gotAddr = (Elf32_Addr*)( (char*)(pltAddr)+0x2 );
lazyAddr = (Elf32_Addr*)(*gotAddr);
printf("Address of SO_FUNC before the Call: %x\n", *lazyAddr);
SO_FUNC();
printf("Address of SO_FUNC after the Call: %x\n", *lazyAddr);
}
Output:
Address of SO_FUNC before the Call: 804834e
Address of SO_FUNC after the Call: 40024704
Of course, this the lazy way of doing this. The correct method would be to locate the address of
the function from the symbol table, its GOT entry from the relocation section ( the rel & rela sections are somehow not present in memory, however ), and then print its contents. But then, to do that, we need to read the ELF header, the Program Header & the Dynamic Segment or use
hashing. Then again, all programmers are born lazy.
Wednesday, November 16, 2005
The Bitter Sweet Symphony
After a brief pause,
"Won't you ask of what?"
Woodrow - "Of what?"
Tessa - "Of Life."
- The Constant Gardener
Sunday, November 06, 2005
Nostalgia
Scary how the human mind works ; I'd completely forgotten 'bout these things ; these words and these thoughts ; somehow they had taken a backplace in my mind, overshadowed by all the other trivial things that occured afterwards. Yet, they never completely disappeared. They were just waiting, lurking deep within myself, waiting for the right moment to make themselves visible again. Nice feeling, this one. This strange sense of........ self-discovery. I somehow have to do this more often..........
Sunday, October 30, 2005
Sunday, October 23, 2005
Caged
Saint Germain
Aloha
Omigosh!!!! If anyone can make an ounce of sense out of these sites, I'll be forever grateful to 'em. This....this is just weird....plain wierd. It's like I've just come out of the cinema hall after a really bad movie with the sounds still bellowing inside my ears and my head starts spinning like a furious top. I mean, what's the purpose of all this piece of crap?? Does it have some hidden secret or puzzle, which I'm unable to figure out? Is it a text adventure? What the bloody is it? I remember this feeling I'm having right now. It's like the one I had when I was watching a movie sometime back - a supposedly horror one - "House of 1000 Corpses". Horrible movie that one. In the words of a character from Friends, "I felt like putting my fingers through my eyes into my brain and twirling it around". (shudder). Oh, by the way, the movie also has a sequel - "The Devil's Rejects". Now, who in the right mind, would trot along and make a sequel to that? Then again, who in the right mind, would have even made the first one?
(links via:digg)
Friday, October 21, 2005
Flocked Ya
I received an invitation from flock today, requesting me to try out their "developer-edition" release. Nice browser - this one. It's based on the Mozilla browser and hence has a lot of customizable features and extensions (a la Firefox). It was also laden with tiny noticeable bugs during my first 15-20 minutes with it, but that's fine - still an infant, this one. The interesting part is that it's actually a social browser of sorts ; has extensive bookmarking/tagging options and complete integration with del.ic.ious, blogger, wordpress & flickr. Sweet!!!. It also has exciting feature-sets such as "On the Fly Aggregation", that creates an aggregated view of various feeds and displays it on a single page (a wee bit similar to Google IG, start or netvibes), "Blog-This" - The ability to blog any piece of text on any page (kinda similar to the one on digg) and "The Shelf", which can store snippets of interesting content for later blogging. My only regret - like Firefox, this one too hogs close to 90 Megs of memory on my system when left running for a coupla hours. But, other than that, maybe I've finally got a worthy replacement for "The Fox".
Wednesday, October 12, 2005
iPod, therefore I am
Well, it's 12:30 A.M. now and I've just finished reading the live text-feed from Apple's conference. What's new???A new blue-tooth remote, sleek 20'' Mac G5's (ooh la la!!) and the ubiquitous iPod, now in a brand new flavor that's thinner, sexier,comes in black and plays videos (mpeg4 and H.264). Holy God, if only I had 300 greenbacks!!!!
(rolls eyes mischeviously and prays that someone gifts him the new iPod).
It's a binary world after all.....
The current world population (14:24 GMT 10/12/05) - 6,472,184,054.
Converted to binary, this is - 110000001110001011011000011110110.
That's 33 bits. But, with 33 bits the maximum number that can be obtained is 8,589,934,591 (around 8.5 Billion). At the current growth rate(of 1.4% p.a.), this'll overflow around 2024. Hmmm, no good.
Let's try adding a bit. Since adding a bit doubles its max value, we can go upto 17,179,869,183 (17 Billion) with 34 bits. Now, the population doubling time with a 1.4% growth rate is around 51 years. Hence, having 34 bits will fail around 2075. So, assuming that we don't nuke ourselves to kingdom come in the next 400 odd years, we just need 37 bits to safely cover the entire human population ( for the next 400 years atleast ).If that does'nt make us seem insignificant, what will? ( The Total Perspective Vortex perhaps????)
Saturday, October 08, 2005
The Travail Of Passion
"When the flaming lute-thronged angelic door is wide;
When an immortal passion breathes in mortal clay;
Our hearts endure the scourge, the plaited thorns, the way
Crowded with bitter faces, the wounds in palm and side,
The vinegar-heavy sponge, the flowers by Kedron stream;
We will bend down and loosen our hair over you,
That it may drop faint perfume, and be heavy witha dew,
Lilies of death-pale hope, roses of passionate dream."
-W.B.Yeats
Thursday, October 06, 2005
Black Flowers
Saturday, October 01, 2005
A Lament
Coming home every night, I think to myself that I shall not succumb to you, I shall not give up my resolve, and I shall not let you take over my mind and my body; and every morning, in retrospect, I realize I am, but a hopeless case, when it comes to resisting you. YOU – evil conjurer of the dark, seductress of the night winds, charismatic devil of the underworld, you stalk me all through the day and devour me at night; you devour me like a vampire, seeping your fangs into my fragile neck and weakening my consciousness till it capsizes under your immense power. Devil of the dark, I call you. Hideous creature you. Night after night after night, you unleash your minions upon me; I can feel them moving all over my body, slowly at first, then faster and faster, their speed rising exponential with time. In a matter of minutes, I am all but vanquished. A zombie is what I become; waiting on your every whim till dawn breaks and so does your spell. My mind is your playground. You are but a megalomaniac; your desire to play with my mind is what makes you that. Haughty you. Night after night, I succumb to you, shamelessly, helplessly. All my attempts to overthrow your reign have been futile. An evil King is what you’ve become; tyranny is what you practice on me. Bah!!!! Your stench makes me nauseas, yet I can’t turn away from you. You have me in a stranglehold. I struggle in your grasp every night, writhing painfully, my eyes fixated on you, struggling to free myself from this merciless demon, this --- this vixen. But I fail, I fail every single time, every single night. Your most fearful minion, you unleash upon me. His….his “methods” are very different from yours. You are a silent killer, one who stops at nothing till your goal is reached, your aim fulfilled, your efforts aptly rewarded. And then you rejoice silently, letting your victims realize their defeat at your hands. Not he!!!! I am terrified of him. His modus-operandi is….is….”different”. His visits are sporadic all through the night, his stay much more random. And the visions he shows me are puzzling, dangerous, impossible and sometimes terrifying. Every night, you make sure he visits me. But, of his sojourns, I remember none at morn, except that he visited me. I hear whispers, whispers loud enough for me to hear, whispers loud enough to make sure I hear them, whispers that say you call him “Dreams” - A plural representation of a singular entity. I was puzzled initially, puzzled at this thought. It doesn’t matter anymore. None of this does. When I defeat you, none of this will remain. They’re all useless, meaningless without you. You are the ONE - The one mastermind behind this endless drama unfolding every night, the drama that ends with the first light of dawn. I have hopelessly tried every devious attempt to thwart your actions before – but not this time - this time, I have sided with your arch-nemesis - caffeine - he is now my closest compatriot. Together, we shall overthrow you from the throne you’ve taken over in this kingdom, this kingdom where you’re no longer needed. We shall banish you from this place, this holy land, where nothing was black, before you came. We shall watch you limp in agony to the wastelands, to the lands where there are none as helpless as me to devour, none who shall even endure your companionship. You will regret the day you took over me. Mark my words. You will come to regret it. Till then, I shall call you by the name most fear to utter even in your absence.
“SLEEP”. damned “SLEEP”!!!!!!!
(Inspired by a 3:00 AM dream I had last night).
Friday, September 16, 2005
Eternity
"-- Last and crowning torture of all the tortures of that awful place is the eternity of hell. Eternity! O, dread and dire word. Eternity! What mind of man can understand it? And remember, it is an eternity of pain. Even though the pains of hell were not so terrible as they are, yet they would become infinite, as they are destined to last for ever. But while they are everlasting they are at the same time, as you know, intolerably intense, unbearably extensive. To bear even the sting of an insect for all eternity would be a dreadful torment. What must it be, then, to bear the manifold tortures of hell for ever? For ever! For all eternity! Not for a year or for an age but for ever. Try to imagine the awful meaning of this. You have often seen the sand on the seashore. How fine are its tiny grains! And how many of those tiny little grains go to make up the small handful which a child grasps in its play. Now imagine a mountain of that sand, a million miles high, reaching from the earth to the farthest heavens, and a million miles broad, extending to remotest space, and a million miles in thickness; and imagine such an enormous mass of countless particles of sand multiplied as often as there are leaves in the forest, drops of water in the mighty ocean, feathers on birds, scales on fish, hairs on animals, atoms in the vast expanse of the air: and imagine that at the end of every million years a little bird came to that mountain and carried away in its beak a tiny grain of that sand. How many millions upon millions of centuries would pass before that bird had carried away even a square foot of that mountain, how many eons upon eons of ages before it had carried away all? Yet at the end of that immense stretch of time not even one instant of eternity could be said to have ended. At the end of all those billions and trillions of years eternity would have scarcely begun. And if that mountain rose again after it had been all carried away, and if the bird came again and carried it all away again grain by grain, and if it so rose and sank as many times as there are stars in the sky, atoms in the air, drops of water in the sea, leaves on the trees, feathers upon birds, scales upon fish, hairs upon animals, at the end of all those innumerable risings and sinkings of that immeasurably vast mountain not one single instant of eternity could be said to have ended; even then, at the end of such a period, after that eon of time the mere thought of which makes our very brain reel dizzily, eternity would scarcely have begun."
There's an online version of the entire book here.
Saturday, September 10, 2005
Memoirs
I stepped out the elevator into a dimly lit bar. It had been raining outside, raining hard and relentless. The night sky was littered with dark clouds - signs of impending doom. A dim silence swept the town, riding on the crest of fear; the fear of an unknown. The entropy of the future was weighing heavily on everyone’s minds. I waited for my pupils to get attuned to the darkness inside. My mind was a haze. Incidents of the past haunted me, more so in my dreams than when I’m awake. I stepped toward a vacant spot and ordered a martini, stirred not shaken. The waitress served me the drink, wearing a false smile. I returned the favor.
Miles Davis was playing on the radio – "Autumn Leaves" – my favorite song. The music was soothing, yet disturbing. I closed my eyes and took a swig of the martini. A sudden calmness descended upon me, a feeling of detachment, as though I’m not a part of this world; as though I was never meant to be. I felt like a woman in a gay bar. The rain still splattered on the roof. I shook my head violently before the nostalgia crept in, shaking it off. It was then that I realized my uneasiness in this place. An odd sensation – as though a pair of eyes was watching my every move, calculating the results and imposing a judgment on me – “The Last Judgment”. Michelangelo’s stunning accomplishment strained my weak imagination till it collapsed into a frenzy of eclectic seizures. I turned my head sideways, searching the faces around me, not knowing what I was looking for. A blind man in a dark alley told me once, “We see what we want to see, not the facts – but our perception of it. A dimly lit corridor is the same as a brightly lit hall”. I know not why this thought came to me now, just that it did. The faces in the bar were all faintly similar, yet each one different from the next; some distraught, others dull and bored, caught in a time they have no awareness of. The hands of the clock slowly crept toward
It was then that I noticed her. A dame – with captivating eyes – pale blue. Her hair ran down the length of her back. As she flipped her weary eyelids and gave a forlorn glance down the hall, I realized she was waiting for someone. I found myself cursing the fool who had stood her up. It was sad, such beauty in such a time. She had a misgiven fortune, but at least she had one. Most of us go through our lives like an automaton, attaching no strings of empathy to anything that happens around us, going through life as if it were just another obstacle in our path, another bridge to cross or another bus to take to the office. Feelings of detachment and loneliness take center-stage in this play – the play of life enacted in the theatre of this benevolent Earth. I pulled myself up before I thought I’d drift away and searched her face for clues, clues to a distant past or a near-impossible future- clues that could give away her presence here in this place. I found none. She had an ash-stricken face, almost as if she just got out of cryopreservation. For the first time in my life, I felt sorry for a dame. I felt like I had known her all my life. Out the window, beads of icicles were forming across the edges. Suddenly, she uncrossed her legs and stood up. Her legs were achingly long. A faint smile began to form itself across her lips as she took her first step towards me. She never took a second one.
At that instant, a shrill sound pierced the air. The windows shattered, the glass hitting the floor and me. I staggered, but somehow found my footing and stood up. She was staring at me, those blue eyes like a bottomless pit. Machines with wings flew overhead. The entire town was encompassed with a cacophony of titillating frequencies. The end of time as known to mankind was fast approaching. The wailing siren of a cop car could still be heard in the distance over all the commotion that erupted in the streets below. The ground bellowed from under us, like a monster that showed no mercy, buildings shook and cracked at their edges. No one could have had a premonition of what was happening now. It had seemed an impossibility just a couple of months back; but the reality of it now, a harsh stink – like the stink of dark blood emanating from a badly beaten bum. Craning my neck towards the sky, I could make out faint lights – the lights of warships, encapsulating tonnes of fissile material, enough to blow the Earth ten times over. They all moved in perfect harmony with one another, creating silent music from their movement. I closed my eyes for the last time, and prayed - prayed for a different future, a different time. I prayed for her. I prayed so that I need not look at the inhumanities happening right in front of my eyes, heedless of any words, following a path that only some understand. I finally let the truth sink in.
The War. It had begun.
