Ahead of his time, Tagore left a legacy for world

Rabindranath Tagore (1861-1941), the first Asian author to have won the Nobel Prize in literature, still remains an inspiration around the world. A poet, playwright, performer, musician, essayist, philosopher, and one of the finest storytellers from India (eight novels, four novellas and numerous short stories), he also had over 2,000 paintings and doodles to his credit.
As he said in his first talk at Shanghai in 1924: 'I say that a poet's mission is to attract the voice which is yet inaudible in the air; to inspire faith in the dream which is unfulfilled; to bring the earliest tidings of the unborn flower to a sceptic world.'
That Tagore was able to give voice to the voiceless from among the colonised and subjugated nations is history now. But his legacy still lives on because, as Mahatma Gandhi had once said about him: 'In common with thousands of his countrymen I owe much to one who by his poetic genius and singular purity of life has raised India in the estimation of the world.'
It was not that he advocated a narrow definition of 'nationalism' to equate it with 'nationism', but he wanted to keep the idea of Asia and a spirit of universalism that emerged from this continent alive and foregrounded this idea.
For Tagore, the immense beauty that a localised vernacular language had to offer in the form of the best of poetry and writings that he churned out throughout his life, and the local knowledge bases that were created over centuries and millennia had very special positions.
The youngest of many children, Tagore was born into a Kolkata aristocrat family to Debendranath and Sarada Devi. He had de-schooled himself as a young child. Yet before him, nobody seemed to have thought about Complete Education as he did in the early 20th century.
In his model of teaching, the school would provide a learning opportunity where there is a communion between man and nature, between liberal and the performing arts. That education did not mean 'rote' learning, memorisation and reproduction is clear from his opening paragraphs of the book titled 'Visva -Bharati': 'The education that encourages repetition is not the education of the mind, because that can be taken care of even mechanically!'.
When Tagore started his school in Santinketan in 1901, he had wanted to include girls as well, but it did not prove practical until 1909, when a further blow to the traditional image of his Brahmacharyashram occurred with the admission of six girl students who were not put in separate classes but rather along with the boys in classes, sports and elsewhere -- a radical idea then.
He faced the death of his closest relatives one after the other but these could not deter him from creating the finest writings, music, theatre, and paintings for his legacy.
Tagore's literary contributions created a large following among Bengali and foreign readers by the beginning of the 20th century, and he published by then such works as 'Naivedya' (1901) and 'Kheya' (1906) - culminating with 'Gitanjali: Song Offerings' in 1912 that helped him win the Nobel Prize a year later. Talking about the charm of 'Gitanjali', W.B. Yeats wrote: 'These prose translations have stirred my blood as nothing has for years.'
Tagore was a widely travelled man and had himself said about his fascination for travel. 'I am a wayfarer of the endless road' - starting with his first trip to the Himalayas in 1873 with his father, and then on to numerous countries all around the world. The journey to Kolkata from Santiniketan in 1941 came immediately after his stirring address titled 'Crisis in Civilization' where Tagore observed the darkening clouds of war and destruction gather over the world.
Bengali theatre of the 19th century, which emerged as a product of Bengal Renaissance, was a colonial phenomenon and largely urban in nature, but it was completely revolutionised by Tagore through his numerous plays as well as dance-dramas. English theatre in those days mainly catered to the local British residents.
Tagore had created a new universe of theatre by bringing in a rare combination of traditional musical theatre ('Jatra'), didactic story-telling tradition ('kathakata'), singing of bards ('Kabigan') and folk-epic narratives ('panchali').
In that sense, with him, modern theatre was born in India, without aping the Western stage.
In addition, he created a truly large and varied body of music (over 2,230 songs) in 64 years between 1877 and 1941, where he brought in a rare fusion between the folk and the Indian classical, the traditional devotional songs with the western choir and church music, thus bringing in a rare convergence between the north Indian Hindustani tradition and the southern Karnataki tradition.
Tagore's legacy is not a simple case of a poet being remembered for some memorable lines. He was a model of a person who had all the wisdoms of the past, and yet was a modernist to the core - making a beginning in several endeavours that he had undertaken in each field he traversed. Even when he experimented with religious thinking and practices, his mission was 'divinisation of man and the humanising of god'.
This was the reason he adopted a lot of wisdom from ancient Hindu thoughts as well as from Buddhism and Christianity. His reading and commentaries on all religious texts and thoughts have given rise to many important philosophical and ethical questions.
Said Martin Kampchen, a German specialist of Tagore: 'Creative writers like Tagore do not merely produce works of art, but they also create a new art of living which translates, as closely as possible, the essence of their creative impulses into a social context.'
(08.05.2010 - Udaya Narayana singh is a linguist by profession, and is currently the Director & Tagore Research Chair, Rabindra Bhavana, Visva Bharati, Santiniketan, and is himself an accomplished poet, playwright and essayist. He can be contacted at unsciil@yahoo.com)

15 secrets you never knew about your girl

Couple
15 secrets you never knew about your girl (Getty Images)
The woman in your life may give you her heart, soul and, of course, her body, but still there’s a part of her being that she’ll never share with you ... stuff that makes her a mystery .

Yes, your woman is a den of mysteries hinted to you in her sly smile, enigmatic laughter or that sudden silence. She just pretends to be one, but is never an open book to you. Her deepest secrets are what add to her charm ... but render you an outsider in her own ‘Secret Garden’. Secrets of her unshared yearnings, cherished fantasies or for that matter, a secret lover from the past ...

Here’s a peep into those hidden secrets ... dig into them at your own risk!

- I might just hate it when you sleep in that office shirt, but when you are away, I love to snuggle up in your shirt because it smells of you.

- Though I insist on paying the bill or sharing it in our initial dates, I’ll find you cheap and so non-chivalrous in case you don’t insist on making the payment.

- Long before we explored each other’s bodies, I had been fantasizing about being with you. That inhibition was only to get assured that you are all mine.

- I do think about my ex-es and compare them to you. Mostly you win, but you are not all perfect.

- ‘I don’t care you call or not’ is pure pretence. In fact, I start waiting for your next call the moment one ends. Not just this, I eagerly want you to plan our next date even before the current one ends. I might not show it. So, don’t fret about looking desperate just call! The gap looks like a lifetime to me.

- During the initial days of our relationship, I used to save all our chat histories and your SMSes and read them again and again. Sometimes, made my friends read them, too.

- The day you shared your password with me, digging into your chat records and mails was the first thing I did.

- I would love to know what turns you on. Though, I know it’s going to be hilarious as I’ve seen your frequently-visited porn sites.

- You don’t have to be a ‘good boy’ with me all the time. I don’t mind talking a little dirty.

- You are my soul mate, but my ‘best friend’ is my confidante. From the size of your pay cheque, bank account to the size of your other assets...she knows it all. So, till you are telling her how much you love me all’s fine. Remember she’s my best friend and never yours.

- You rightly blame me for bombarding you with so many questions. But, that’s my way of testing you. I judge and analyse you on every word, expression, action, e-mail or SMS you write to me or someone else. So, when I ask “Do you fantasize about other women?,” the answer has to be “Why would I when I am with you?” So, better watch out!

- I love to make you a little jealous as it makes me feel wanted. So the next time you spot me flirting with your friend, know that I’m actually flirting with you through her.

- Every time I fight with you is because I feel ignored. Don’t get into your cocoon when I’m bad. Just give me what I’m fighting for – a little attention and I’ll be all yours.

- I love to get constant reminders of the much known fact that – you need me. So, what’s the harm in dropping liners saying ‘You complete me’ or ‘Don’t ever leave me alone’ ... ?

- Last but not the least, irrespective of how independent and self-driven I am, how ever much I may say that I don’t need a man to be happy, but still I want you to take charge when we are in bed.

Cricinfo International Scores

Cricinfo International Scores: "Get the latest scores of all the international cricket matches from Cricinfo. Add the Cricinfo International Scores widget now!"

The Java serialization algorithm revealed


Serialization is the process of saving an object's state to a sequence of bytes; deserialization is the process of rebuilding those bytes into a live object. The Java Serialization API provides a standard mechanism for developers to handle object serialization. In this tip, you will see how to serialize an object, and why serialization is sometimes necessary. You'll learn about the serialization algorithm used in Java, and see an example that illustrates the serialized format of an object. By the time you're done, you should have a solid knowledge of how the serialization algorithm works and what entities are serialized as part of the object at a low level.

Why is serialization required?

In today's world, a typical enterprise application will have multiple components and will be distributed across various systems and networks. In Java, everything is represented as objects; if two Java components want to communicate with each other, there needs be a mechanism to exchange data. One way to achieve this is to define your own protocol and transfer an object. This means that the receiving end must know the protocol used by the sender to re-create the object, which would make it very difficult to talk to third-party components. Hence, there needs to be a generic and efficient protocol to transfer the object between components. Serialization is defined for this purpose, and Java components use this protocol to transfer objects.
Figure 1 shows a high-level view of client/server communication, where an object is transferred from the client to the server through serialization.
A high-level view of serialization in action

Figure 1. A high-level view of serialization in action (click to enlarge)

How to serialize an object

In order to serialize an object, you need to ensure that the class of the object implements the java.io.Serializable interface, as shown in Listing 1.

Listing 1. Implementing Serializable

import java.io.Serializable; class TestSerial implements Serializable { public byte version = 100; public byte count = 0; }
In Listing 1, the only thing you had to do differently from creating a normal class is implement the java.io.Serializable interface. The Serializable interface is a marker interface; it declares no methods at all. It tells the serialization mechanism that the class can be serialized.
Now that you have made the class eligible for serialization, the next step is to actually serialize the object. That is done by calling the writeObject() method of the java.io.ObjectOutputStream class, as shown in Listing 2.

Listing 2. Calling writeObject()

public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); TestSerial ts = new TestSerial(); oos.writeObject(ts); oos.flush(); oos.close(); }
Listing 2 stores the state of the TestSerial object in a file called temp.out. oos.writeObject(ts); actually kicks off the serialization algorithm, which in turn writes the object to temp.out.
To re-create the object from the persistent file, you would employ the code in Listing 3.

Listing 3. Recreating a serialized object

public static void main(String args[]) throws IOException { FileInputStream fis = new FileInputStream("temp.out"); ObjectInputStream oin = new ObjectInputStream(fis); TestSerial ts = (TestSerial) oin.readObject(); System.out.println("version="+ts.version); }
In Listing 3, the object's restoration occurs with the oin.readObject() method call. This method call reads in the raw bytes that we previously persisted and creates a live object that is an exact replica of the original object graph. Because readObject() can read any serializable object, a cast to the correct type is required.
Executing this code will print version=100 on the standard output.

The serialized format of an object

What does the serialized version of the object look like? Remember, the sample code in the previous section saved the serialized version of the TestSerial object into the file temp.out. Listing 4 shows the contents of temp.out, displayed in hexadecimal. (You need a hexadecimal editor to see the output in hexadecimal format.)

Listing 4. Hexadecimal form of TestSerial

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65 73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05 63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78 70 00 64
If you look again at the actual TestSerial object, you'll see that it has only two byte members, as shown in Listing 5.

Listing 5. TestSerial's byte members

public byte version = 100; public byte count = 0;
The size of a byte variable is one byte, and hence the total size of the object (without the header) is two bytes. But if you look at the size of the serialized object in Listing 4, you'll see 51 bytes. Surprise! Where did the extra bytes come from, and what is their significance? They are introduced by the serialization algorithm, and are required in order to to re-create the object. In the next section, you'll explore this algorithm in detail.

Java's serialization algorithm

By now, you should have a pretty good knowledge of how to serialize an object. But how does the process work under the hood? In general the serialization algorithm does the following:
  • It writes out the metadata of the class associated with an instance.
  • It recursively writes out the description of the superclass until it finds java.lang.object.
  • Once it finishes writing the metadata information, it then starts with the actual data associated with the instance. But this time, it starts from the topmost superclass.
  • It recursively writes the data associated with the instance, starting from the least superclass to the most-derived class.
I've written a different example object for this section that will cover all possible cases. The new sample object to be serialized is shown in Listing 6.

Listing 6. Sample serialized object

class parent implements Serializable { int parentVersion = 10; } class contain implements Serializable{ int containVersion = 11; } public class SerialTest extends parent implements Serializable { int version = 66; contain con = new contain(); public int getVersion() { return version; } public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); SerialTest st = new SerialTest(); oos.writeObject(st); oos.flush(); oos.close(); } }
This example is a straightforward one. It serializes an object of type SerialTest, which is derived from parent and has a container object, contain. The serialized format of this object is shown in Listing 7.

Listing 7. Serialized form of sample object

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65 73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07 76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09 4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72 65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00 0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70 00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74 61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00 0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78 70 00 00 00 0B
Figure 2 offers a high-level look at the serialization algorithm for this scenario.
An outline of the serialization algorithm

Figure 2. An outline of the serialization algorithm

Let's go through the serialized format of the object in detail and see what each byte represents. Begin with the serialization protocol information:
  • AC ED: STREAM_MAGIC. Specifies that this is a serialization protocol.
  • 00 05: STREAM_VERSION. The serialization version.
  • 0x73: TC_OBJECT. Specifies that this is a new Object.
The first step of the serialization algorithm is to write the description of the class associated with an instance. The example serializes an object of type SerialTest, so the algorithm starts by writing the description of the SerialTest class.
  • 0x72: TC_CLASSDESC. Specifies that this is a new class.
  • 00 0A: Length of the class name.
  • 53 65 72 69 61 6c 54 65 73 74: SerialTest, the name of the class.
  • 05 52 81 5A AC 66 02 F6: SerialVersionUID, the serial version identifier of this class.
  • 0x02: Various flags. This particular flag says that the object supports serialization.
  • 00 02: Number of fields in this class.
Next, the algorithm writes the field int version = 66;.
  • 0x49: Field type code. 49 represents "I", which stands for Int.
  • 00 07: Length of the field name.
  • 76 65 72 73 69 6F 6E: version, the name of the field.
And then the algorithm writes the next field, contain con = new contain();. This is an object, so it will write the canonical JVM signature of this field.
  • 0x74: TC_STRING. Represents a new string.
  • 00 09: Length of the string.
  • 4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, the canonical JVM signature.
  • 0x78: TC_ENDBLOCKDATA, the end of the optional block data for an object.
The next step of the algorithm is to write the description of the parent class, which is the immediate superclass of SerialTest.
  • 0x72: TC_CLASSDESC. Specifies that this is a new class.
  • 00 06: Length of the class name.
  • 70 61 72 65 6E 74: SerialTest, the name of the class
  • 0E DB D2 BD 85 EE 63 7A: SerialVersionUID, the serial version identifier of this class.
  • 0x02: Various flags. This flag notes that the object supports serialization.
  • 00 01: Number of fields in this class.
Now the algorithm will write the field description for the parent class. parent has one field, int parentVersion = 100;.
  • 0x49: Field type code. 49 represents "I", which stands for Int.
  • 00 0D: Length of the field name.
  • 70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion, the name of the field.
  • 0x78: TC_ENDBLOCKDATA, the end of block data for this object.
  • 0x70: TC_NULL, which represents the fact that there are no more superclasses because we have reached the top of the class hierarchy.
So far, the serialization algorithm has written the description of the class associated with the instance and all its superclasses. Next, it will write the actual data associated with the instance. It writes the parent class members first:
  • 00 00 00 0A: 10, the value of parentVersion.
Then it moves on to SerialTest.
  • 00 00 00 42: 66, the value of version.
The next few bytes are interesting. The algorithm needs to write the information about the contain object, shown in Listing 8.

Listing 8. The contain object

contain con = new contain();
Remember, the serialization algorithm hasn't written the class description for the contain class yet. This is the opportunity to write this description.
  • 0x73: TC_OBJECT, designating a new object.
  • 0x72: TC_CLASSDESC.
  • 00 07: Length of the class name.
  • 63 6F 6E 74 61 69 6E: contain, the name of the class.
  • FC BB E6 0E FB CB 60 C7: SerialVersionUID, the serial version identifier of this class.
  • 0x02: Various flags. This flag indicates that this class supports serialization.
  • 00 01: Number of fields in this class.
Next, the algorithm must write the description for contain's only field, int containVersion = 11;.
  • 0x49: Field type code. 49 represents "I", which stands for Int.
  • 00 0E: Length of the field name.
  • 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion, the name of the field.
  • 0x78: TC_ENDBLOCKDATA.
Next, the serialization algorithm checks to see if contain has any parent classes. If it did, the algorithm would start writing that class; but in this case there is no superclass for contain, so the algorithm writes TC_NULL.
  • 0x70: TC_NULL.
Finally, the algorithm writes the actual data associated with contain.
  • 00 00 00 0B: 11, the value of containVersion.

Conclusion

In this tip, you have seen how to serialize an object, and learned how the serialization algorithm works in detail. I hope this article gives you more detail on what happens when you actually serialize an object.