Tuesday, January 22, 2008
Saturday, December 15, 2007
Logout
Wednesday, June 13, 2007
Code quality
Computers are good at following instructions, but not at reading your mind
// check for empty valueDo you see, why I like to be in this profession and what I hate about it!
static boolean isEmpty(String value) {
Boolean isEmpty = new Boolean(false);
if ((value == null) || (value.length() == 0))
isEmpty = true;
return isEmpty.booleanValue();
}
:-)
Thursday, June 07, 2007
Truth ...
Though leaves are many, the root is one;
Through all the lying days of my youth
I swayed my leaves and flowers in the sun;
Now I may wither into the truth.- W. B Yeats
Friday, May 25, 2007
Latest
Tuesday, May 22, 2007
JBoss, JAXB and JDK 1.6
Tuesday, March 27, 2007
Thursday, March 15, 2007
Friday, March 09, 2007
Final Day
More later...
Friday, March 02, 2007
Moving On ...
I was a pure java/e-App techie until about year and half ago when my present employer made this tempting offer to lead their VoIP/Java initiative at Pune. I joined them leaving behind the comfort and security of a job from $5 billion giant. The new job, however, soon changed due to the changing business plans and they decided to re-engineer everything that existed in Java to C#/.NET. I stayed on. Left Java and picked up strangers like C# and .NET along with SIP, IMS, Soft-switch etc in this VoIP/C# journey. Now, with first generation of the craft already in the market and my team here quite capable of taking it further, I have decided to move on ...
What Next?
So far, I do not have a firm destination. Google was enticing but, it did not work out. SAS is way too far from home and GSL appeared puerile. Right now I am talking to a fledgling company that is yet to establish presence in
Thursday, February 01, 2007
5000 kilometers
Other than usual maintenance and tappet adjustments I had to tighten the cam-gears during initial run-in and replace the oil seals on primary drive case to plug the oil leakage. No other major problems (touch wood) so far, just a couple of cable replacements (clutch at ~4000 kms and speedo at ~3000 kms due to monsoon) .
Cheers!
Tuesday, January 30, 2007
Thank you from Google
Seven rounds of intense interviewing- three over the wire and four onsite at Bangalore. Most of them, I thought, went very well, but ... at the end I guess it was not good enough!
Life goes on... may be for the better.
I will not have to relocate now.
Wednesday, January 17, 2007
Helpdesk at Icici Direct
I reported this matter to ICICIDirect through following email:
Ref: Trading a/c # XXXAfter two days this is the reply I received from their CSA:
Demat a/c # XXX
Hi,
My mutual fund portfolio tracker page ( trading -> portfolio -> mutual funds) is showing wrong data. Some funds are getting reported twice causing wrong portfolio value. Some funds like:
SBI FUNDS MANAGEMENT PVT LTD SBI MAGNUM COMMA FUND - GROWTH OPTION
and
TATA MUTUAL FUND TATA INFRASTRUCTURE FUND - GROWTH
are reported twice on the page each time under different Fund "Category". I have noticed this problem ever since you have implemented new SIP investment options. Looks like your coders have done a shoddy job and QA has failed to notice it.
This is causing a great inconvenience to me by reporting inflated portfolio value. Pls check and correct the bug as early as possible.
Thanks,
xxx
Note the signing authority and her designation..."ICICI Bank".Dear Ms. Jha,We wish you a Happy New Year!
If you wish to delete any transaction from your Mutual Fund Portfolio, we request you to follow the below mentioned procedure:1. Login to www.icicidirect.com2. Go to portfolio section on the trading page3. click on the Mutual Funds link4. Click on the Scheme name of the Mutual Fund which you wish to delete.5. Click on the "x" symbol available on the extreme right side to delete that particular transaction.Sincerely,
XXXCustomer Service OfficerICICI Bank Limited
This is my follow-up reply and I am waiting to hear on this :
It is getting increasingly difficult to get an accurate response from ICICI Direct for any query... but ... what are my options? I have heard more annoying tales about the competition from my friends. Unfortunately most CSA activities are either out- sourced or are manned by less than adequately trained personnel who are quite incompetent to address such queries :-( and what is alarming is such dorky CSAs are polluting the name of ICICI Bank as well by signing under their banner. I think ICICI management should separate the CSA's of ICICI Bank and ICICI Direct- at least that will help them to preserve some respect in ICICI Bank that I want to have!> If you wish to delete any transaction from your Mutual Fund Portfolio, we
> request you to follow the below mentioned procedure:
>
> 1. Login to www.icicidirect.com
> 2. Go to portfolio section on the trading page
Did you understand the issue I have reported? I think it is a totally irrelevant and dumb reply I got from ICICI Direct. Let me try to explain the problem once again.
Say I have a mutual fund called MF1 and I have 100 units of MF1 in my DEMAT account. The portfolio tracker page reports MF1 twice as:
serial# 1 MF1 - units held =100
serial# 2 MF1 - units held = 100
Since, I am NOT adding any transaction MANUALLY into my mutual fund portfolio tracker, it must be coming through the software that ICICI Direct uses. Right!
Another thing is that I have subscribed for SIP, hence MF1 can have 100s of SIP transactions all accumulated under SL#1 and SL#2. Do you expect me to delete each SIP transactions one-by-one through your portfolio tracker? Can you imagine the time it will take to do that?
Another thing, if I delete MF1 at SL#2 what is the guarantee that SL#1 would not get deleted also and I will loose all my portfolio information!!! I suspect both SL #1 and SL #2 to share the same PK in the back end database if your DB is in third normal form (?)
I appreciate that you may not follow all the issues that I have raised here, hence, please escalate it to your Technical Architect or SQA Lead- I am sure he will understand the problem and please do not waste my time (and yours too) by copy-pasting a "set" response from your
repository of replies!
Please...my time is very precious...
Thanks for taking time to reply.
- xxx
Wednesday, December 20, 2006
Two wise men on MS, Yahoo and Google
BJ: they seem to have married with "msn msgr" ...if you mean it is LCS...then yes
pkbehera: well MSN is LCS
BJ: I believe LCS is lot more than MSN messenger
BJ: messenger is a front end to LCS
pkbehera: perhaps they have opened up some web services like stuff on LCS for YM to talk to
BJ: IMHO lcs is a middleware + backend
BJ: perfect
pkbehera: right
BJ: btw web services are "default" mechanism for IPC in .NET
pkbehera: well yahoo tried best to enter enterprised and did not have much success, so LCS is one route of getting into enterprises for them
BJ: possible...
BJ: the main magnet for both MS and Yahoo is the following
BJ: 1. Large existing user base for yim
BJ: 2. large existing users for msn IM
BJ: take union of 1+2 ...and get even 10% to click on the ad links...a potential million $ mkt for them
BJ: and many orgs already using yim unofficially for their multi-site collaboration
BJ: now both yahoo + ms want to exploit that potential too
BJ: btw...did u notice unprovoked apperance of ads in latest YIM tool?
pkbehera: yes
pkbehera: thats irritating
BJ: yeah...call it "ad sense" in yim
pkbehera: and keeps shouting at me "u fool, swith to ggle talk"
pkbehera:
BJ: yeah...but all ur peers too need to move to ggle talk then...i see that happening very slowly
pkbehera: which much less lightweight, less fancy
BJ: these IMs are a sticky tool...my father and your father if they are used to yahoo...will not switch to ggle talk easily
pkbehera: thankfully that adsense is limited to the main ym window
BJ: next version will be those popping on and off as u type
pkbehera: yes
BJ: i have a feeling that ggle wants to come out with a whole suite of tools for "collaboration on the web" and go to big enterprises and reduce their bills on MS Office licenses ...
pkbehera: yeah thats their plan
pkbehera: ggle docs is already very impressive
pkbehera: there is few other such players too
BJ: and all these nuts and bolts like gmail, talk, picasa, calendar etc...are pre launch feelers to get the mind share of peple on the web
pkbehera: yes
BJ: yeah...ggle is acquiring small players in the arena ...
pkbehera: with gmail they introduced a whole new concept of conversations, rather than messages and folders
pkbehera: thats getting hugely popular
pkbehera: www.thinkfree.com, seen this?
pkbehera: and www.zoho.com
pkbehera: they give a little more than ggle docs as of now,
pkbehera: MS office has got serious competition
BJ: yeah...billy has already set his best drivers to steer them home with "windows live" adventure
Thursday, November 23, 2006
Tuesday, November 21, 2006
C# class for Hex encoding
#region HexUtil class
/// <summary>
/// Utility class for doing Hex encoding/decoding
/// </summary>
public sealed class HexUtil {
/// <summary>
/// Holds the hex characters for a fast lookup
/// </summary>
private static readonly char[] HEX_CHARS = "0123456789ABCDEF".ToCharArray();
//Keep the array sorted for faster search
static HexUtil() {
Array.Sort(HEX_CHARS);
}
/// <summary>
/// No explicit client creation needed/allowed
/// </summary>
private HexUtil() {
}
/// <summary>
/// Creates a byte array from the hexadecimal string. Each two characters are combined
/// to create one byte. First two hexadecimal characters become first byte in returned array.
/// If input hex string contains an odd number of bytes, then last character is dropped to
/// make the returned byte array as even bytes. It raises ArgumentException, if a
/// Non-hexadecimal character is encountered while processing the string.
/// </summary>
/// <param name="hexString">String to convert to byte array. It should contain only
/// Hex chars [0-9 a-f A-F] only, else error will be raised. See description above </param>
/// <returns>byte array, in the same left-to-right order as the hexString</returns>
///
public static byte[] GetBytes(string hexString) {
if( ! IsValidHexCharLength(hexString) ) {
throw new ArgumentException("Invalid hexString size");
}
//check for non hex characters
StringBuilder tempString = new StringBuilder(hexString.Length);
foreach (char c in hexString) {
if (IsHexChar(c)) {
tempString.Append(c);
}
else {
throw new ArgumentException("Non Hexadecimal character '"+c+"' in hexString");
}
}
string verifiedHexString = tempString.ToString();
tempString=null;
//check for valid length. If number of characters is odd in the hex string then
//drop the last character
if ((verifiedHexString.Length % 2) != 0) {
verifiedHexString = verifiedHexString.Substring(0, verifiedHexString.Length-1);
}
//Convert each hex character to byte
//Hex byte length is half of actual ascii byte length
int byteArrayLength = verifiedHexString.Length / 2;
byte[] hexbytes = new byte[byteArrayLength];
string tmp_substring = null;
try {
for (int i = 0; i < hexbytes.Length; i++) {
int charIndex = i * 2;
tmp_substring = verifiedHexString.Substring(charIndex, 2);
hexbytes[i] = Convert.ToByte(tmp_substring, 16);
}
}
catch (FormatException ex) {
throw new ArgumentException("hexString must be a valid hexadecimal", ex);
}
return hexbytes;
}
/// <summary>
/// Converts the input bytes array to a String assuming each character as a hexadecimal
/// character. Uses .NET Byte.ToString("X2") implementation to achieve the encoding
/// </summary>
/// <param name="bytes">hex encoded bytes to be converted to the string</param>
/// <returns>A string representation of the input bytes assuming Hex encoding</returns>
public static string ToString(byte[] bytes) {
if( bytes == null || bytes.Length == 0) {
throw new ArgumentNullException("bytes");
}
StringBuilder hexString = new StringBuilder();
foreach (byte byt in bytes) {
hexString.Append( byt.ToString("X2") );
}
return hexString.ToString();
}
/// <summary>
/// Determines if given string is in proper hexadecimal string format
/// </summary>
/// <param name="hexString">string to be tested for valid hexadecimal content</param>
/// <returns>true if hexString contains only hex characters and
/// atleast two characters long else false.</returns>
public static bool IsHexString(string hexString) {
bool hexFormat = IsValidHexCharLength(hexString);
if(hexFormat) {
foreach (char ch in hexString) {
if (!IsHexChar(ch)) {
hexFormat = false;
break;
}
}
}
return hexFormat;
}
/// <summary>
/// Checks to see if the input string is not null and atleast two
/// characters long
/// </summary>
/// <param name="hexString">string to be tested</param>
/// <returns>true if hexString is not null and atleast two
/// characters long</returns>
private static bool IsValidHexCharLength(string hexString) {
return ((hexString != null) && (hexString.Length >= 2));
}
/// <summary>
/// Returns true if c is a hexadecimal character [A-F, a-f, 0-9]
/// </summary>
/// <param name="c">Character to test</param>
/// <returns>true if c is a hex char, false if not</returns>
public static bool IsHexChar(Char c) {
c = Char.ToUpper(c);
//look-up the char in HEX_CHARS Array
bool isHexChar = (Array.BinarySearch(HEX_CHARS,c) >= 0);
return isHexChar;
}
/// <summary>
/// This is a utility method to convert any input byte[] to the requiredSize. If the input
/// byte[] is smaller than requiredSize, then a new byte array is created where all lower order
/// places are filled with input byte[] and balance places are filled with 0 (zeros). inputBytes
/// array is truncated if it is larger than requiredSize.
/// </summary>
/// <param name="inputBytes">input byte aray</param>
/// <param name="requiredSize">the size of the byte array to be created</param>
/// <returns>a byte array of requiredSize</returns>
public static byte[] CreateLegalByteArray(byte[] inputBytes, int requiredSize) {
byte[] newBytes = null;
int inputLength = inputBytes.Length;
if(inputLength == requiredSize) {
//nothing to do
newBytes = inputBytes;
}
else {
//create a new Byte array of reuired lenght and fill the content with
//given byte[] starting from 0 index in the new byte[]
newBytes = new byte[requiredSize];
int len= newBytes.Length;
if (len > inputLength) {
len= inputLength;
}
Array.Copy(inputBytes,newBytes,len); //note: balance is filled with 0 (zero)
}
return newBytes;
}
}
#endregion
Monday, November 20, 2006
Friday, November 17, 2006
Sight...
Tuesday, November 14, 2006
Recipe for inter-operating a C# Symmetric Encryption code with OpenSSL
Interoperability is not a difficult thing to achieve. Yet, it is not an easy thing to get either- predominantly because the relevant information are widely fragmented and even Google fails to compact all of them together- leaving you rummaging through a pile of web pages to fish out really useful information from them. I am posting this for my own help- may be in future I will need to come back here to look at this again to see what I did!
I needed to write some C# code which will take in a plain text file and run some Symmetric Encryption routine over them using a given Initialization Vector (IV) and a Secret Key (SK). The output will be some encrypted binary data which should be decoded by the OpenSSL tool. Basically, I wanted following OpenSSL command line to work for me always:
$openssl enc [-aes-128-cbc] -in <CipherData.bin> -out <ClearData.txt> -d -K <SomeSecretKey> -iv <SomeIV>
Here <CipherData.bin>
With -–K (and -iv) option, OpenSSL expects only Hexadecimal secret key (and IV) string whose valid size differ for different algorithms employed. The input hex string is converted into a byte array and used as SK (and IV). The interesting part is that OpenSSL and .NET crypto behave differently if you do not supply a valid length hex stream against these data. While, OpenSSL intelligently (and silently) pads the byte array with trailing 0s to make up for the shortfall in “legal” size or truncate it if the same goes beyond the adequate size, the C#/.NET crypto code dies with an exception, leaving you puzzled- what went wrong? Sometimes, to baffle us more, a secret key which had worked in C#/.Net seems to give you "“bad crypto"” in OpenSSL and vice versa.
The crux is how you encode (and decode) a Hex string into byte[] for SK and IV. Basically the point to remember is that a simple Hex text like "“CAFEBABE"” is 8 ASCII character (8 bytes array) but, becomes 4 bytes array when converted to Hex encoding. I have a sample HexUtil C# class which illustrates these things... wait for next post.
Problem # 2: Line breaks in base64 encoding
$openssl enc -a -A -d -in <B64EncryptedData.txt> -out <B64EncryptedData.txt.out>


.jpg)
.jpg)


