Year / 2008
Struts 1 config file reference documentation
This documentation is just a copy paste of portions of official Struts DTD. As I couldn’t find any easy to find reference on it hence I have put together this just to be easily locatable.
The values in [] are default values for that attribute.
Top Level Elements:-
<struts-config> (the root of the configuration file hierarchy, and contains nested elements for all of the other configuration settings.)
- id:
<form-beans> (describes the set of form bean descriptors.)
- type: Fully qualified Java class to use when instantiating ActionFormBean objects. If specified, the object must be a subclass of the default class type.
WARNING: For Struts 1.0, this value is ignored. You can set the default implementation class name with the “formBean” initialization parameter to the Struts controller servlet.
- id:
<form-bean> (describes an ActionForm subclass [org.apache.struts.action.ActionForm] that can be referenced by an “action” element. It is a JavaBean that implements the org.apache.struts.action.ActionForm class.)
- className: The configuration bean for this form bean object. If specified, the object must be a subclass of the default configuration bean. [“org.apache.struts.config.FormBeanConfig”]
- extends: The name of the form bean that this bean will inherit configuration information from.
- name (Required): The unique identifier for this form bean. Referenced by the <action> element to specify which form bean to use with its request.
- type: Fully qualified Java class name of the ActionForm subclass to use with this form bean.
- enhanced: Reserved for future use.
- id:
<form-property> (describes a JavaBean property that can be used to configure an instance of a DynaActionForm or a subclass thereof. This element is only utilized when the “type” attribute of the enclosing “form-bean” element is [org.apache.struts.action.DynaActionForm] or a subclass of DynaActionForm. If a custom DynaActionForm subclass is used, then the “dynamic” attribute of the enclosing <form-bean> element must be set to “true”. Since Struts 1.1.)
- className: The configuration bean for this form property object. If specified, the object must be a subclass of the default configuration bean. [“org.apache.struts.config.FormPropertyConfig”]
- initial: String representation of the initial value for this property. If not specified, primitives will be initialized to zero and objects initialized to the zero-argument instantiation of that object class. For example, Strings will be initialized to “”
- name (Required): The name of the JavaBean property described by this element.
- reset: The flag that indicates when this property should be reset to its “initial” value when the form’s “reset()” method is called. If this is set to “true”, the property is always reset when “reset()” is called. This can also be set to one or more HTTP methods, such as GET or POST. In such a case, the property will be reset only when the HTTP method used for the request being processed is included in this attribute’s value(s). Multiple HTTP methods can be specified by separating them with whitespace or commas.
- size: The number of array elements to create if the value of the “type” attribute specifies an array, but there is no value specified for the “initial” attribute.
- type (Required): Fully qualified Java class name of the field underlying this property, optionally followed by “[]” to indicate that the field is indexed.
<global-exceptions> (describes a set of exceptions that might be thrown by an Action object. The handling of individual exception types is configured through nested exception elements. An <action> element may override a global exception handler by registering a local exception handler for the same exception type. Since Struts 1.1.)
- id:
<exception> (registers an ExceptionHandler for an exception type.)
- bundle: Servlet context attribute for the message resources bundle associated with this handler. The default attribute is the value specified by the string constant declared at Globals.MESSAGES_KEY. [org.apache.struts.Globals.MESSAGES_KEY]
- className: The configuration bean for this ExceptionHandler object. If specified, className must be a subclass of the default configuration bean. [“org.apache.struts.config.ExceptionConfig”]
- extends: The name of the exception handler that this will inherit configuration information from.
- handler: Fully qualified Java class name for this exception handler. [“org.apache.struts.action.ExceptionHandler”]
- key: The key to use with this handler’s message resource bundle that will retrieve the error message template for this exception.
- path: The module-relative URI to the resource that will complete the request/response if this exception occurs.
- scope: The context (“request” or “session”) that is used to access the ActionMessage object [org.apache.struts.action.ActionMessage] for this exception.
- type (Required): Fully qualified Java class name of the exception type to register with this handler.
- id:
<global-forwards> (describes a set of ActionForward objects [org.apache.struts.action.ActionForward] that are available to all Action objects as a return value. The individual ActionForwards are configured through nested <forward> elements. An <action> element may override a global forward by defining a local <forward> of the same name.)
- type: Fully qualified Java class to use when instantiating ActionForward objects. If specified, the object must be a subclass of the default class type.
WARNING: For Struts 1.0, this value is ignored. You can set the default implementation class name with the “forward” initialization parameter to the Struts controller servlet.
- id:
<forward> (describes an ActionForward that is to be made available to an Action as a return value. An ActionForward is referenced by a logical name and encapsulates a URI. A “forward” element may be used to describe both global and local ActionForwards. Global forwards are available to all the Action objects in the module. Local forwards can be nested within an <action> element and only available to an Action object when it is invoked through that ActionMapping.)
- catalog: The name of a commons-chain catalog in which to look up a command to be executed as part of servicing this request. Only meaningful if “command” is also specified.
- className: Fully qualified Java class name of ActionForward subclass to use for this object. [“org.apache.struts.action.ActionForward”]
- command: The name of a commons-chain command which should be looked up and executed as part of servicing this request.
- extends: The name of the forward configuration that this will inherit configuration information from.
- module: The module prefix to use with this path. This value should begin with a slash (“/”).
- name (Required): The unique identifier for this forward. Referenced by the Action object at runtime to select – by its logical name – the resource that should complete the request/response.
- path: The module-relative path to the resources that is encapsulated by the logical name of this ActionForward. This value should begin with a slash (“/”) character.
- redirect: Set to “true” if a redirect instruction should be issued to the user-agent so that a new request is issued for this forward’s resource. If true, RequestDispatcher.Redirect is called. If “false”, RequestDispatcher.forward is called instead. [false]
<action-mappings> (describes a set of ActionMapping objects [org.apache.struts.action.ActionMapping] that are available to process requests matching the url-pattern our ActionServlet registered with the container. The individual ActionMappings are configured through nested <action> elements.)
- id:
- type: Fully qualified Java class to use when instantiating ActionMapping objects. If specified, the object must be a subclass of the default class type.
WARNING: For Struts 1.0, this value is ignored. You can set the default implementation class name with the “mapping” initialization parameter to the Struts controller servlet.
<action> (describes an ActionMapping object that is to be used to process a request for a specific module-relative URI.)
- id:
- attribute: Name of the request-scope or session-scope attribute that is used to access our ActionForm bean, if it is other than the bean’s specified “name”. Optional if “name” is specified, else not valid.
- cancellable: Set to “true” if the Action can be cancelled. By default, when an Action is cancelled, validation is bypassed and the Action should not execute the business operation. If a request tries to cancel an Action when cancellable is not set, a “InvalidCancelException” is thrown. [false]
- catalog: The name of a commons-chain catalog in which to look up a command to be executed as part of servicing this request. Only meaningful if “command” is also specified.
- className: The fully qualified Java class name of the ActionMapping subclass to use for this action mapping object. Defaults to the type specified by the enclosing <action-mappings> element or to “org.apache.struts.action.ActionMapping” if not specified. [“org.apache.struts.action.ActionMapping”]
- command: The name of a commons-chain command which should be looked up and executed as part of servicing this request.
- extends: The path of the action mapping configuration that this will inherit configuration information from.
- forward: Module-relative path of the servlet or other resource that will process this request, instead of the Action class specified by “type”. The path WILL NOT be processed through the “forwardPattern” attribute that is configured on the “controller” element for this module. Exactly one of “forward”, “include”, or “type” must be specified.
- include: Module-relative path of the servlet or other resource that will process this request, instead of the Action class specified by “type”. The path WILL NOT be processed through the “forwardPattern” attribute that is configured on the “controller” element for this module. Exactly one of “forward”, “include”, or “type” must be specified.
- input: Module-relative path of the action or other resource to which control should be returned if a validation error is encountered. Valid only when “name” is specified. Required if “name” is specified and the input bean returns validation errors. Optional if “name” is specified and the input bean does not return validation errors.
- name: Name of the form bean, if any, that is associated with this action mapping.
- parameter: General-purpose configuration parameter that can be used to pass extra information to the Action object selected by this action mapping.
- path (Required): The module-relative path of the submitted request, starting with a “/” character, and without the filename extension if extension mapping is used.
NOTE: Do *not* include a period in your path name, because it will look like a filename extension and cause your Action to not be located.
- prefix: Prefix used to match request parameter names to ActionForm property names, if any. Optional if “name” is specified, else not allowed.
- roles: Comma-delimited list of security role names that are allowed access to this ActionMapping object. Since Struts 1.1.
- scope: The context (“request” or “session”) that is used to access our ActionForm bean, if any. Optional if “name” is specified, else not valid. [session]
- suffix: Suffix used to match request parameter names to ActionForm bean property names, if any. Optional if “name” is specified, else not valid.
- type: Fully qualified Java class name of the Action subclass [org.apache.struts.action.Action] that will process requests for this action mapping. Not valid if either the “forward” or “include” attribute is specified. Exactly one of “forward”, “include”, or “type” must be specified.
- unknown: Set to “true” if this object should be configured as the default action mapping for this module. If a request does not match another object, it will be passed to the ActionMapping object with unknown set to “true”. Only one ActionMapping can be marked as “unknown” within a module. [false]
- validate: Set to “true” if the validate method of the ActionForm bean should be called prior to calling the Action object for this action mapping, or set to “false” if you do not want the validate method called. [true]
<controller> (describes the ControllerConfig bean [org.apache.struts.config.ControllerConfig] that encapsulates a module’s runtime configuration.)
- bufferSize: The size of the input buffer used when processing file uploads. [4096]
- catalog: Name of the catalog to use when processing requests for this module. [struts]
- className: Fully qualified Java class name of the ControllerConfig subclass for this controller object. If specified, the object must be a subclass of the default class.[“org.apache.struts.config.ControllerConfig”]
- command: Name of the command to execute to process a request. [servlet-standard]
- contentType: Default content type (and optional character encoding) to be set on each response. May be overridden by the Action, JSP, or other resource to which the request is forwarded. [“text/html”]
- forwardPattern: Replacement pattern defining how the “path” attribute of a <forward> element is mapped to a context-relative URL whenit starts with a slash (and when the contextRelative property is false). This value may consist of any combination of the following:
- – “$M” – Replaced by the module prefix of this module
- – “$P” – Replaced by the “path” attribute of the selected “forward” element
- – “$$” – Causes a literal dollar sign to be rendered
- – “$x” – (Where “x” is any character not defined above). Silently swallowed, reserved for future use.
If not specified, the default forwardPattern is “$M$P”, which is consistent with the previous behavior of forwards. Since Struts 1.1. [“$M$P”]
- inputForward: Set to “true” if you want the “input” attribute of <action> elements to be the name of a local or global ActionForward, which will then be used to calculate the ultimate URL. Set to “false” (the default) to treat the “input” parameter of <action> elements as a module-relative path to the resource to be used as the input form. Since Struts 1.1. [false]
- locale: Set to “true” if you want a Locale object stored in the user’s session if not already present. [true]
- maxFileSize: The maximum size (in bytes) of a file to be accepted as a file upload. Can be expressed as a number followed by a “K”, “M”, or “G”, which are interpreted to mean kilobytes, megabytes, or gigabytes, respectively. [“250M”]
- memFileSize: The maximum size (in bytes) of a file whose contents will be retained in memory after uploading. Files larger than this threshold will be written to some alternative storage medium, typically a hard disk. Can be expressed as a number followed by a “K”, “M”, or “G”, which are interpreted tomean kilobytes, megabytes, or gigabytes, respectively. [“256K”]
- multipartClass: The fully qualified Java class name of the multipart request handler class to be used with this module. [“org.apache.struts.upload.CommonsMultipartRequestHandler”]
- nocache: Set to “true” if you want the controller to add HTTP headers for defeating caching to every response from this module. [false]
- pagePattern: Replacement pattern defining how the “page” attribute of custom tags using it is mapped to a context-relative URL of the corresponding resource. This value may consist of any combination of the following:
- – “$M” – Replaced by the module prefix of this module
- – “$P” – Replaced by the value of the “page” attribut
- – “$$” – Causes a literal dollar sign to be rendered
- – “$x” – (Where “x” is any character not defined above). Silently swallowed, reserved for future use.
If not specified, the default forwardPattern is “$M$P”, which is consistent with previous hard coded behavior of URL evaluation for “page” attributes. [“$M$P”]
- processorClass: The fully qualified Java class name of the RequestProcessor subclass to be used with this module. [“org.apache.struts.chain.ComposableRequestProcessor”]
- tempDir: Temporary working directory to use when processing file uploads. [{Directory provided by servlet container}]
- id:
<message-resources> (describes a MessageResources object with message templates for this module.)
- className: The configuration bean for this message resources object. If specified, the object must be a subclass of the default configuration bean. [“org.apache.struts.config.MessageResourcesConfig”]
- factory: Fully qualified Java class name of the MessageResourcesFactory subclass to use for this message resources object.[“org.apache.struts.util.PropertyMessageResourcesFactory”]
- key: Servlet context attribute under which this message resources bundle will be stored. The default attribute is the value specified by the string constant at [Globals.MESSAGES_KEY]. The module prefix (if any) is appended to the key (${key}${prefix}). [org.apache.struts.Globals.MESSAGES_KEY]
NOTE: The module prefix includes the leading slash, so the default message resource bundle for a module named “foo” is stored under “org.apache.struts.action.MESSAGE/foo”.
- null: Set to “true” if you want our message resources to return a null string for unknown message keys, or “false” to return a message with the bad key value.
- parameter (Required): Configuration parameter to be passed to the createResources method of our factory object.
<plug-in> (specifies the fully qualified class name of a general-purpose application plug-in module that receives notification of application startup and shutdown events. An instance of the specified class is created for each element, and can be configured with nested <set-property> elements.)
- id:
- className (Required): Fully qualified Java class name of the plug-in class; must implement [org.apache.struts.action.PlugIn].
Subordinate Elements:-
<description> (contains descriptive (paragraph length) text about the surrounding element, suitable for use in GUI tools.)
- id:
<display-name> (contains a short (one line) description of the surrounding element, suitable for use in GUI tools.)
- id:
<icon> (contains a small-icon and large-icon element which specify the location, relative to the Struts configuration file, for small and large images used to represent the surrounding element in GUI tools.)
- id:
<large-icon> (specifies the location, relative to the Struts configuration file, of a resource containing a large (32×32 pixel) icon image.)
- id:
<small-icon> (specifies the location, relative to the Struts configuration file, of a resource containing a small (16×16 pixel) icon image.)
- id:
<set-property> (specifies the method name and initial value of an additional JavaBean configuration property. When the object representing the surrounding element is instantiated, the accessor for the indicated property is called and passed the indicated value. The “set-property” element is especially useful when a custom subclass is used with <forward>, <action>, or <plug-in> elements. The subclass can be passed whatever other properties may be required to configure the object without changing how the struts-config is parsed.
Since Struts 1.3, an alternate syntax is supported. By using the “key” attribute instead of the “property” attribute, you can set arbitrary string properties on the Config object which is populated based on the containing element.
NOTE: the “key” attribute is NOT supported for <set-property> inside a <plug-in> element.)
- property: Name of the JavaBeans property whose setter method will be called. Exactly one of “property” or “key” must be specified.
- key: Where supported, the key which will be used to store the specified value in the given config object. Exactly one of “property” or “key” must be specified.
- value (Required): String representation of the value to which this property will be set, after suitable type conversion.
Asynchronously call a remote web page without the complexity of AJAX
Let me first give me my scenario where I needed such a thing, so that it may clear what I mean by the title of this post.
Scenario:-
For a J2EE Online Library project of mine I needed to display a list of books that can be issued. Each book’s entry had a corresponding check box which when clicked by the user is added to the cart of the user. Now the list of items in cart is kept at server side which meant that I have to call a JSP page or a servlet from the client side without actually navigating to that page. This is usually accomplished using AJAX, which is not a trivial task. Hence, I devised simple trick.
The Trick:-
I thought if somehow I could load the called page into an iframe rather than the whole window then that will solve my problem, and it worked! Then make the iframe hidden. Below is the code snippet.
License: GNU Public License version 3.
Code:
[code lang=”html”]
<html>
<pre id="codebox-pseudo-ajax"><code> <head>
<title>Pseudo AJAX call trick by AppleGrew</title>
<script type=’text/javascript’>
function callUpdate(chkbox) {
<strong>frames[‘proxy’].location.href = ‘ServletController?pg=updateCart&itemId=’ + chkbox.value + "&chosen=" + chkbox.checked;</strong>
//alert(frames[‘proxy’].document.body.innerHTML); //Use to retrieve the value returned by ServletController.
}
</script>
</head>
<body>
<br/>
<br/>
<br/>
<br/>
<br/>
<center>
<input name="itemId" type="checkbox" value="1" <strong>onclick="javascript:callUpdate(this);"</strong> /> Item1<br/>
<br/>
<input name="itemId" type="checkbox" value="2" <strong>onclick="javascript:callUpdate(this);"</strong> /> Item2<br/>
</center>
<!–The purpose of this iframe is to imitate a sort of AJAX call. The javascript calls the ServletController and
the loaded page is loaded into this iframe w/o replacing the current page –>
<strong><iframe id="proxy" name="proxy" style="display:none;"></iframe></strong>
</body>
</html></code>[/code]
Where ServletController is the servelt controller of your project or just any other page. Note that if you need to retrieve any value returned from ServletController then it must return generated page as below.
<html>
<head></head>
<body>Put the value to be returned here.</body>
</html>
Using Airtel Edge/GPRS Micromax MMX 610U USB device to surf the internet from Linux
This has been a major headache for me to reboot to Windows just to surf my net, and to update my Linux machine I had to forward the internet connection from a Windows computer to my Linux machine. None-the-less I eventually managed to make it work to day. 🙂
Note that I managed to make it work, and I provide no guarantee that it will work on your computer, but I will share my computer’s configuration so that it may help you.
So, first my computer’s configuration. I have Kubuntu Hardy Heron installed (8.04). My current kernel is 2.6.24-19-generic (installed from the official Ubuntu server). Mine is a 32-bit system. The USB modem I have is Micromax MMX 610U.
Now the steps to setup your USB modem:-
- Plug-in your USB modem. A green light will start blinking. If the light is blue then you have PIN set and I have no idea how to enter PIN code from Linux. In that case, reboot to Windows and from the provided Airtel’s software enter the PIN code and reboot to Linux or disable the PIN altogether.
- Now run the command lsusb in the console the output will be like as below.Bus 005 Device 003: ID 0d49:7410 Maxtor
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 002: ID 046d:c016 Logitech, Inc. M-UV69a Optical Wheel Mouse
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 004: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem
Bus 001 Device 001: ID 0000:0000An Important Note:-
As I have found out that hot plugging of this USB modem doesn’t work. The modem will be detected by the kernel but for some reason wvdial won’t be able to locate the modem, hence, when you insert the modem into your USB drive then reboot your computer (or plug it in before turning on your computer).Note the bolded text above. That’s your modem.
- Now run sudo wvdialconf. This will create the file /etc/wvdial.conf with some of the necessary values.
- Now whatever values the file /etc/wvdial.conf keep that as such except for the ones shown below. If any settings shown below already existed then replace that with the ones below, if they didn’t exist then just add them to the file, but they must appear below the line [Dialer Defaults]. Note that will need to open the file /etc/wvdial.conf as a root. Try using sudo nano /etc/wvdial.conf.Init1 = AT+CGDCONT=1,”IP”,”airtelgprs.com”,””,0,0
Baud = 460800
stupid mode = 1
Phone = *99#
Password = a ;No need to change this to anything else. This is immaterial, and note that no semicolon before Password =.
Username = a ;No need to change this to anything else. This is immaterial, and note that no semicolon before Username =. - Now create a file connAir in your home directory. Copy and paste the following code into it and give it execute permission.
[code lang=”bash”]#!/bin/bash
# BY AppleGrew @ http://blog.applegrew.com (All rigths
# reserved)pid=`pgrep wvdial`
if [ -z $pid ]
thensudo route del default
echo "CONNECTING TO Airtel…"
wvdial &sleep 10s
IP=`ifconfig ppp0|grep -o ‘inet addr:\([.0-9]*\)’`
IP=`echo $IP|sed ‘s/inet addr:\([.0-9]*\)/\1/g’`
echo "YOUR CURRENT IP IS ‘$IP’".
if [ -z $IP ]
then
echo "CONNECTION TO Airtel TIMED-OUT…….. : ("
else
echo "CONNECTED TO Airtel. : )"
fi
sudo route add default gw $IPelse
echo "A CONNECTION IS ALREADY IN PROGRESS."
fi[/code] - Now create another file disconnAir in your home directory. Copy and paste the following code into it and give it execute permission.
[code lang=”bash”]#!/bin/bash
# BY AppleGrew @ http://blog.applegrew.com (All rigths
# reserved)pid=`pgrep wvdial`
if [ -z $pid ]
then
echo "NO CONNECTION IN PROGRESS."
else
echo "DISCONECTTING FROM Airtel…"
kill -INT $pidsleep 6s
pid=`pgrep wvdial`
if [ -z $pid ]
then
echo "DISCONNECTED."
else
echo "DISCONNECTION MAY HAVE FAILED."
fi
fi[/code]
Connecting to Airtel:-
- Open console and type ./connAir.
Disconnecting from Airtel:-
- Open console and type ./disconnAir.
Hope this helps.
Days of my TVM ILP
The post below has not been refined and is almost like a rough note rather than an article, hence you may find the sentences below quite funnily structured and sometimes difficult interpret. Sorry for the inconvenience.
This post is about my friends at ILP and me and not ILP itself. I have used the initials of my friends’ names to conceal their identities.
My friends got their call for ILP seven days before the joining date. They were supposed to report at Guwahati. At the end of that day I was the only one who still didn’t receive any mail. It was very frustrating. I even shot a mail to Kolkata HR about this. I got my mail next day. I was asked to report, not at Guwahati, but at Trivandrum. I was now very upset. Of all the people they chose me and only me to report at the other end of India, why why…! I later came to know that out of 171 people only 23 people were asked to report at Trivandrum and I am the only person from CSE, BIT to Trivandrum.
My accommodation was arranged at Assumpta Tourist Home by TCS. It was not such a good hotel. The walls were quite dirty, but the bathroom was cleaner. We were told by TCS that the bedsheets would be changed every 3 days and the rooms would be cleaned everyday. In reality, bedsheets were changed and the rooms were cleaned only on Mondays. All-in-all, the hotel was okay as it was at the heart of the city. The nearest good restaurant was Arul Jyoti.
Apprehensive about who will be my room partner, I asked Assumpta’s manager to allot me a room. He recommended room 302, as the guy (ShaB) there seemed well natured to him. My first impression of him was that he is from a very rich family and possibly he is a snob. Don’t know why, but I got this impression of him. In a day or two I found out he was a nice guy. In few more days I found out that he was a total clown. We nick named him Charlie after Charlie Chaplin. Not only because of his jovial nature but also because his face has uncanny resemblance to the legend. He has a very unusual way of laughing. When he laughs, his upper jaw-line pops out from behind his upper lips and his face turns red. We all wondered from where did he get his ideas. He never seemed to run out of them. Alas! I have never been able to see deeper into him, beyond his jovial face.
Next morning when we got ready for our first day, other TCSers on our floor, who were all from Mumbai and the very same college from where ShaB was, introduced themselves to me. After that we all got onto the bus that was waiting for us to take us to TCS Peepul Park Campus in Technopark. It was a new day of a new chapter in my life and I was looking forward to make new friends. I had already made one new friend – my roommate. My only worry was making new friends. I being an introvert, is not very good in making friends fast. It took me 1 or 2 semesters to make bonds with some my present good friends from the college. It took me 2 years of my college life to know all the 90 people of my class. I knew I had to somehow make friends and bond with them faster. When we reached the campus I tried to remain with SB and his mumbaiya group, viz. – MA, MS, SD and NG. Sometimes they tried giving attention to me and were very friendly, but still I was usually ignored by them because I spoke much less. It was difficult for me to speak anything random to them as I had almost no knowledge of Mumbai and its life and absolutely no knowledge of their college – VESIT; we didn’t share anything in common, and I was still quite depressed by the fact that TCS chose me to tear apart from my friends. Furthermore, they sometimes used to speak in Marathi, which is as incomprehensible to me as is Malayalam. ShaB was and still is particularly notorious for preferring to talk in Marathi in my presence.
The first three or four days of ILP had been traumatic for me, not only because of the incessant dose of merciless induction lectures one after another but also because I was feeling so alone. I was trying to gel with the mumbaiya bhais and I was still feeling like an outsider. This experience was damn depressing. I hope that I will never have to go through that again. After these initial three or four days my first breakthrough came when SD started paying attention to me. He was the quietest and an introvert among the group. He was my first respite. SD and I gelled well together. He was very much like me. An introvert and a geek by nature. He has a very innocent smile and gaze. Later I gelled with other group people too. By this time I had started feeling much better, but still there was an invisible wall between me and the group. It was the language. They preferred Marathi, which was like Malayalam for me. So, most of the time I didn’t know what was going on and had no choice but to keep mum. Because of this my friends got the wrong impression that I like to remain reserved.
Few days later I came to know two more persons. One punjabi kuri, SB, and another Marathi gal, SA. SB is a good friend of MA. They are friends for past four years, so it was quite natural that they were always seen together, but this gave me the wrong idea that they were more than just friends. SB is an unusual girl. She has a very (as VK puts it) ‘loud’ body language and is very polished. Her first impression over others is usually as a snob. As far as I am concerned, I didn’t feel like that. I formed my opinion about her quite later. I was way too much amazed by her way of talking. Her way of talking is child-like, which in Hindi we call ‘totla‘. Its cute and weird both when spoken by a 21 year old person. I will really miss that voice. Later as I came to know her better I found out that she is also very intelligent, only that she is too lazy or distracted to use it. Things that I like the most about her is her jovial nature. She is always fun to be with. Always happy and rarely sad.
Now about SA. Her first impression on me was that she is a gujju girl. This is because I have an impression that usually gujju girls have good figures and are very simple minded and innocent. She is very much like ‘Gattu’ of ‘Ba Bahu Aur Baby’; simple, innocent, smiling and happy. M is a lucky man. I envy him. She is definitely the most pampered kid of her home. Its awesome, how can someone maintain ones child-like innocence to the adulthood. Her family must have put great efforts in insulating her from the vices of the world. Given that, she gets upset so easily, I can only pray that she grows up soon.
Before our EC1 exam, MA and I decided to stay back at the lab for a whole night to complete the exercise. At around 11 pm changu-mangu too joined us. By-the-way, changu-mangu are SB and SA. I call them that because they always (mark it, always) stay together, as if they are advertising Fevicol-ka-jhor (pardon me for this mercilessly poor joke). Many times they even wear similar dresses. They are similar in more than one ways. They are both jovial, energetic and always remain stuck to their cell phones. I have seen people speaking so much over the phone only when they have bf or gf. It is true in case of SA, but I am still confused about SB. Anyway back to the lab; we started solving our exercises. By 1 or 2 am MA and SB where worn out and started dozing off. SA and I continued to rack our brains. Few minutes later changu-mangu left for their room. Our hotel being 18 KM from Technopark, we had no choice but to wait till morning. I also dozed off for an hour or two and then I continued with the exercises again. After 2 am the only thing MA did was doze off and suddenly wakeup and unlock the screen and then doze off again. At 6 am we left for our hotel. It was Sunday. We then spent the whole Sunday sleeping while our other friends set out for Technopark to complete the exercises.
Before I move on I would like to comment about MA. He has a good personality. He makes his presence felt. He became our unofficial transport facilitator. One thing we all hated about him is his ‘divide by 6’ policy, i.e. no matter how less or more you eat he used the simple rule of equally dividing the total bill amount among all the friends there. Other than that he is a nice fellow. He is slight impulsive and he is a complete phattu. While coding for his project, the moment he used to come across any deadened he used to start sweating profusely and you can clearly notice the tension on his pale face. The best thing in him is that he takes negative comments about him in positive sense and actually tries to mend it.
Before our EC2 exam we made an one day trip to Kanyakumari with 19 friends. It was fun. SA played a nice trick on NG. We were all in the dark Meditation Room on the Vivekanada Rock Memorial, when SA asked NG to ask the person sitting before him to go too. NG thinking that the person was one of the friends, nudged him, only to realize then that he was not. SA was aware of this and did this on purpose. We had a good laugh afterwards.
Kanyakumari lacks a beach hence we went to its shore which had many sharp stones. Many people returned wounded (including me) from that trip. It was fortunate enough that nobody was seriously hurt, which I was afraid of as some of the friends grew too much reckless in their antics and stunts. But it was fun. This is where I noticed, contrary to my expectation, that SA is quite adventurous. MA was rather unusually reserved during this. He took over the charge of taking care of everybody else’s belongings and stayed away from the water. During this trip I also noticed NG’s inclination towards meditation, religion and nature. I too have an inclination towards nature. I don’t usually share my feelings with my friends, because contrary to general wisdom, it makes me feel worse. The sunset and the calm after that usually unsettles whatever is locked inside me. Damn!
NG, as I have already pointed out earlier, appreciates nature and has an inclination towards meditation. He too seems to observe people keenly. He has a very bad habit of using really bad examples to explain things or describe someone. He can sometimes get on your nerves but is usually a nice person to be with. May God help him with his examples. Another very intriguing thing about him is that he is some kind of gay magnet! Maybe it is because of his slight girlish way of talking or anything else.
Back from our Kanyakumari trip, we were greeted by the tense cloud of looming EC2 exam. We had to work on Sunday and late in Monday to finish our project. After EC2 EC3, EC4 and EC5 came at such a pace that I could barely recall anything from then except for random memories. This brings us to Thombya.
Thombya is a Marathi word which is used to refer dumb people. ShaB nick-named MS as Thombya. We used to call him that because of his too short short-time memory and his unusual goof ups. One of his classic goof ups is when after having a cupful of tea he exclaims – It was nice coffee! He actually thought he was drinking coffee when he was actually having tea! He opts to remain quite most of the time, but he has a lot of mischievous ideas running through his head all the time.
After our EC3 exam, many of us planned for a trip to Velli, Kovalam Beach etc. I was looking forward to it as it was our last trip together. On the day of trip even after repeated request from me SD refused to come along. This made me adamant and I too ultimately didn’t go and sulked the whole day in the hotel. Yup, I make stupid decisions when I go adamant. Few minutes later we were scolded on the phone by SA. Oops! That day in the evening SD, MS, ShaB and NG paid a visit to an Ayurvedic Kerela Message center. There they got a lot more than they had bargained for, in particular NG. When they told MA and me what more happened there we had the laugh of a lifetime. I would not discuss it here, because it may embarrass them and there is no modest way of writing it here. One thing is for sure I am never getting a Kerela Message now, nor do I think they will ever try it again.
With this our EC4 and EC5 exams were over sooner than we could realize. After our allocation most of my mumbaiya friends grew a little depressed since only two of them, SD and NG, got Mumbai, rest were allocated Hyderabad. I got my place of choice, Kolkata, but the thought that I will have to part ways with them and don’t know when our paths will cross again, dampened my spirit. I wasn’t feeling happy and felt glum. Damn! I am back to square one. There has been so many times that I had to part ways with so many of my friends, but I felt this glum only once before this, because this time I have the feeling that this bond will snap sooner or later.
We all eight were supposed to return from Trivandrum to Mumbai together via train, but later MA, SB and SA chose flight. Our first day of our two day journey to Mumbai was mostly boring and glum. I don’t know why but we were again and again singing “Yeh tara woh tara har tara” in totla voice even when SB was not around to get teased. The second day of trip was great. Everybody was in form that day and the scenic beauty on the way was breathe taking. There were fifty plus tunnels on the way. NG, ShaB and MS had a great time screaming from the door into the tunnels when the train passed through them. At Thane we bid adieu to ShaB, NG and MS. At LTT I bid adieu to SD and that was it. The end of one month’s memories. Maybe ILP could have been a little longer.
jDCBot nearing its finale – The 1.0 milestone
The open source project DC client framework jDCBot (http://jdcbot.sourceforge.net) I have been working on is now nearing its 1.0 milestone. Version 1.0 means that it will have all the required features that a DC client framework should have, like – managing shared files, hashing them, creating file lists, queuing downloads and resuming them when the source is available, multi-source downloading, etc.
This framework has been created from scratch, so unlike other DC clients which share DC++‘s code for the core functionality and hence provide similar features, jDCBot will provided unorthodox features. For example DC++ clients and its derivatives allow users only to provide different user names and passwords for different hubs. jDCBot on the other hand allows you to be passive or active in different hubs. So you can be passive and active both at the same time. This is useful in situations when say you are inside your college LAN and you want to connect to hubs inside the LAN and outside on the Internet too. In this case DC++ and derivatives will force you to be passive, but in jDCBot you can be active for inside your LAN and passive for outside the LAN. Well, you also get to set different descriptions, email addresses and connection types too.
There some other cool features too which are not present in other clients like allowing you to set different upload speeds for different users (this way you can give your friends a boost), blocking upload to particular users (could be misused but we are giving the power and it is upto the clients who will use jDCBot to make the decisions), using the virtual file list concept which allows the users to organize their share into virtual directories without actually reorganizing the files, the file names in file list can even be different from the original allowing the user to rename the file in the file list without rehashing or allowing the user to re-associate the virtual file with the actual file after the original file name/path changes so that rehashing is not required, and many more. Last but not the least it is pure JAVA framework and hence is platform independent and is very modular.