Sunday, June 2, 2013

Infosys brings back Narayanamurthy - my take

Everyone in the industry is talking and writing about Infosys and the reappointment of Narayanamurthy to be at the helm of things. So here goes my two cents on what I understand and see...
 
Let me be honest on how much I know about Infosys - I was reading a bit about the company because I was interviewing with them a few months ago and I wanted to see if I would be able to add any value to their overall vision at any level.
 
From what I have observed in the last few years, since the time of the sub prime crisis in the US and the global economic meltdown, strategies have changed through all the IT Services companies.
Saving cost and providing cost effective solutions seemed to be what every CIO wanted, especially in the core and giant customers.
 
While every IT Service provider was scurrying frantically to find pieces of cloth to cover their hind parts, Infosys went ahead to build the "enterprise for tomorrow" for their partners... it appeared ambitious and I must admit only an Infosys or a TCS could even afford to think of proposing such a thing and I really think we must appreciate the Infosys 3.0 for its sheer guts. Maybe it was just bad timing.
 
But where I think it faltered and went wrong was with winning and retaining existing large/core customers - as their goals and vision where badly juxtaposed with the ambitious ones of Infosys. It is quite natural for the sales teams to get carried away by something as phenomenal as Infosys 3.0 but it is just unfortunate that the global customer base was too worried about today and not able to think or plan big for tomorrow.
 
I strongly believe that a leadership team or a leader of an IT Services company should have a good mixture of Sales, Technology and have a constant watch on what we have in our hands today. Investments can be made aggressively in a booming market but when things are sluggish just keeping every penny close to us and ensuring the existing customers are happy.
 
You never know but 9 out of 10 times there are opportunities within the same customers. Proactive thinking and solutioning, helping customers with their goals even if detrimental to ours actually wins in the long run.
 
The right word to explain the situation is that the market is now SATURATED. Every avenue has been explored widely and now is the time where we are only left with option to dig deeper.
Talking about the leadership team there is not much difference to expect within IT Services company in India as all of them follow the standard Income - Profit = Expenses formula for profitability. Bigger the company the more number of seconds you get to gasp for a breath... BUT bottomline is we are all gasping for breath
 
About Narayanamurthy,  no offence to him, he is just in at the right time and will be able to ride a bit on what has happened in the last few years and get things back with just a little bit of tweaking... of course would involve a lot of hard work and he brings his son to help him out in this venture... typical clichéd hereditary bonding...
 
Setting aside competition within the market and in the general interest of the market, Infosys SHOULD do well in the coming days as they are the pioneers and only large players such as Infosys, TCS and Wipro have the muscle power to pull things through and thereby paving the way for the rest of the industry to march behind.

Sunday, April 28, 2013

System cannot log you on now as the domain is not available - Fix

Just wanted to document this some place where I could refer easily. Faced this issue when I was trying to log on to my  laptop provided at work. The error message was "The system cannot log you on now as the domain (domain name) is not available".

Since I did have the admin rights on the machine, I was able to regedit myself the next day after I consulted with a nice gentleman from the tech support team

Step1:
1. Start --> Run --> RegEdit and hit enter
2. Navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
3. Look for the key cachedlogonscount
4. Set the value to a 3 or a 5
5. Log off and log on while you are on the network for a couple of times to get the credentials cached

That is it. With your credentials cached, you would be able to log on to your system even while you are NOT connected to the network domain.

Sunday, September 30, 2012

How to remove ad.yieldmanager, ad.doubleclick.net, ad.xtendmedia adware/spyware


This annoying adware somehow seeped into my personal laptop and it was really annoying. While I am positive that it was not a virus, it certainly was showing up popup ads on the bottom left corner of almost ALL websites that I would browse.

I tried numerous things including checking my startup application, services to see if there were anything suspicious that I could stop by myself. Nothing helped. Next I tried deleting cookies, clearing my temporary internet files. Still… nothing.

I then Googled for hours to find a way to remove them and went ahead to try every single suggestion including installing a slew of spyware removal tools. Most of the tools were either not able to even detect these adwares as a threat or even if a few did, they would want you to pay for them to “clean” your PC.

I was not inclined towards paying nor was I willing to put up with the annoying popups. As a matter of fact, since I knew these are adware popups, I became paranoid everytime I saw those stupid ads come up. They were eating up my internet bandwidth and I could do nothing about it.

FINALLY, this is what I did which worked!

On a hunch, I checked the HOSTS file (usually in C:\Windows\System32\drivers\etc folder). The first time I saw the file, it looked clean. I originally wanted to map the ad.yieldmanager to 127.0.0.1, but there was this thing I noticed – the thumb on the scrollbar was too small indicating that there was something I had to scroll down to… And when I scrolled down and further down it was all empty spaces and at the extreme bottom of the file the dirty rascals who had infected my PC had their secret entries made. Each of the websites that the popup links were pointing to had specific IP addresses mapped. I removed them all (after granting necessary permissions on the hosts file because of Windows 7) and as an extra safety measure I went ahead and subscribed for a few TPLs on my Internet Explorer 9.

I then fiddled a few of my browsing sessions and found them to be clean. It was really exalting to fix an issue, completely clean, by yourself!!!

Sunday, November 21, 2010

Scrolling to the Top of an Aspx page conditionally

Sounds like a simple task right? Maybe thats why I accepted to help my team mate on this functionality despite being in the middle of a really hectic week. I admit, it took me a little longer than my estimated "10 minutes" to get this to work. It was one LENGTHY "ajaxified" aspx page and the requirement was - to scroll the page to the top IF there were exceptions on save. Apparently there was an error message displayed on top of the page. So IF there were any exceptions on save - the friendly error text gets displayed there. Among many other options suggested and provided, the business users (you know, the people whom we bill our timesheets...) preferred the scroll functionality - because according to them, I quote - "that sounded the easiest". Yeah. Tell me about it!

I tried registering a javascript to scroll the window to co-ords 0,0 - which did not work.

If I made the page to always scroll to the top, then on EACH callback, the page would go right up - which is wrong again. So had to flag it and follow up and on a conditional basis.

For which I had to make the below code changes to get the page to scroll correctly:

Add the following to the markup:
<script language="javascript" type="text/javascript">

var errorEncountered;

errorEncountered = 0;

function scrollTop() {

 if (errorEncountered == 1) {

 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(scrollTop2);

 };

}

function scrollTop2() {

 if (errorEncountered == 1) {

  scrollTo(0, 0);

  errorEncountered = 0;

 };

}
</script>

Add the following to the code behind at the catch of an exception on save:
System.Web.UI.ScriptManager.RegisterClientScriptBlock(Me, Me.GetType(), "Script", "errorEncountered=1;scrollTop();", True)

Wednesday, June 2, 2010

Flex Glass Headers

When i first started to work in Flex almost a year back, I was so eagerly looking to grab as much goodies as possible and make my application look spiffy. I remember staying all night long at work so many times, just to explore options by visiting many sites and applications built using Flex, primarily to get sources of inspiration.

One such application was the Flex Style Explorer. The one thing that I loved the most was the mild glossy look it had on its title; Luckily it had the view source enabled and I went on to see how the guys had done that.

It was a mere reference to a transparent flash sprite compiled into a swiff file and was referred from inside the CSS - set as the backgroundImage of the panel.

I went on to build my own header using flash in the next few minutes and added my own version of the glossy look to my application.

Click here to see the image of my app title before and after.

It was such a mild difference, people could hardly notice it; but it hugely enhanced the overall aesthetics of my application. People LOVED the look and feel but no one guessed it. I went on to use this header smartly across the application onto different controls wherever possible.

Flex Renderer Recycling

Thought it would be useful to just mention about renderer recycling 'feature' that is inherent in the Flex UI control handling.

Often this could burn your time if not handled properly at the time of building your application.

The Problem:
When you scroll through a list control which has a huge list of items and is bound with an itemRenderer, the items in the list control tend to shift its positions randomly, as you scroll.

The Reason:
Flex by default tries to reuse the item renderers. In other words lets say your list control has about 40 items. It is not necessary that Flex would generate 40 itemRenderers to display the list.
Instead, based on the display area available, it would generate a few itemRenderers, just enough to handle the current display area and probably a few more for buffering.

As the users scroll through the same itemRenderers get reused and the contents that need to be displayed, in other words the next item data will be rewritten onto that itemRenderer.

So in total the creationComplete event on the item renderer would just fire once and it is not necessary that it would fire for every item added to the list again because of this reusing concept.





The Solution:
Override the set data function on your itemRenderer which would give you access to the actual item that is being bound to the itemRenderer at that point in time, and in this function you could take care of binding the item the way you want.

The set data is bound to get called many times during the process of creation/change resize etc...
For an example of overcoming the renderer recycling issue and how to override the set data function, check the example here.

Flex TileList ItemRenderer with Drag and Drop Sample

Moving on to Flex 4 since last month, I think it is time to publish a few of the small things I had done in Flex 3.

This one is a simple but nice - drag and drop example from one of the modules I had built. It is not the entire application of course; just a stripped down to basics version that just explains a few

The example handles issues like renderer recycling and explains how a custom item renderer can be used which in turn could have its own set of child controls.

The source for this can be found here and a live example here.

P.S.: When viewing the demo, just click on Open if your browser prompts you about handling the file.

Monday, March 1, 2010

Flex Expand Collapse Panel - Custom Component

It has been an extremely long time since my last post. To explain the delay, I would need to write about half a dozen posts. That comes later. This post is just to record a very simple and basic custom component I did a few days back.

It is a simple component extending the Panel and just adds a small Maximize/Minimize toggle button on the top right corner that resizes the panel based on the dimensions specified in the markup.

I blame the requirement for the simplicity of this component. It is just what they wanted. Nothing fancy about it.

It was quite simple to do. The only challenge was to deal with Flex as it does not know what to do when the component has its own set of child components declared internally and also when we try to add a few more, at the declaration…

The solution was pretty straightforward. The source code is available here and I tried to host an example here. When viewing the demo, just click on Open if your browser prompts you about handling the file.

Friday, August 14, 2009

Flex Time

The last 3 to 4 weeks were terribly tiresome. The application that we were building was already running on a stiff deadline and we had entered into the meat of it at this point. It was thrilling to execute everything that was earlier planned. I kept foraging my desk draw for the invaluable information I had had hurriedly scribbled some weeks back. They help me to remind myself of what exactly was discussed. Somehow, no soft copy could do that for me.

Anyways, working late night continuously has helped me gain some decent level of fluency in coding with Flex. The Java Web Services were pretty straightforward.
Also, since I was at times given company by my colleague who is from Orissa, I have learnt how to swear in Orriya. I often swear at the Flex builder for being so shamelessly slow or at some of the insipid methods or definitions in ActionScript.

Somehow a few of the bigger challenges have been taken care of. There are a few more to go before we reach the comfort zone. Of course, when the testing phase is on it could all come down – but then that is a different story altogether.

Wednesday, July 8, 2009

Dynamic Menu using Flex

I think it is time now to share some of the initial work I have done in Flex which served as a part of my learning process as well.

A dynamic menu - fully populated from data stored in MS SQL - fed via a web service.
It is important to mention that most of the functionality was pretty much handled in the web service (IMO, that is how it should be).

The only thing I learnt in flex through this project was to use the Menu control and to perform a simple WS call.

The database has a table 'tbl_menu' that stores all the menu details. It references itself via the field ParentMenu_id for sub menus.



The only input the Flex page needs is a cleanly formatted xml string. So that is what the WS is going to return:


[WebMethod]
public string GetMenuByClass(String usrclass)
{
StringBuilder sb = new StringBuilder();

Dictionary> dict = new Dictionary>();
dict = GetMenuDict(usrclass);

sb.Append("");
sb.Append("");
foreach (int key in dict.Keys)
{
sb.Append(AddXmlString(dict[key]));
}
sb.Append("
");

return sb.ToString();
}


It is just a plain method that uses StringBuilder to append the xml string. There are a hundred different ways to construct the xml, but that is not part of this sample.

Also you would notice soon that we are using a simple object class 'MenuInfo' that represents the actual DB entity which will be used that to pass around data.

Next, the GetMenuDict function takes care of populating a dictionary with all the menu data it pulled from the DB:


private Dictionary> GetMenuDict(string userAccessCode)
{
Dictionary> dict = new Dictionary>();

List menuItems = new List();

menuItems = GetMenuFromDB(userAccessCode);

foreach (MenuInfo m in menuItems)
{
// root element - 0 or NULL
if (m.Parent_Link_id == 0)
{
if (dict.ContainsKey(m.Parent_Link_id))
{
dict[m.Parent_Link_id].Add(m);
}
else
{
List lst = new List();
lst.Add(m);
dict.Add(m.Parent_Link_id, lst);
}
}
else
{
// not a root element - parent exists. find it and add this guy to his list
MenuInfo mInfo = null;

foreach (int key in dict.Keys)
{
mInfo = FindMenuInfoRecursive(m.Parent_Link_id, dict[key]);
if (mInfo != null)
{
mInfo.menuList.Add(m);
}
}
}
}

return dict;
}


The GetmenuFromDB just reads the data from the Database using a datareader and returns a list of MenuInfo. The more inportant function is the FindMenuInfoRecursive, which takes care of handling the sub menus. With this method the sample supports infinite level of sub listing menu items, by just setting the appropriate ParentMenu_id.


private MenuInfo FindMenuInfoRecursive(int id, List menuList)
{
MenuInfo menu = null;

foreach (MenuInfo item in menuList)
{
if (item.Menu_id == id)
{
menu = item;
break;
}
else
{
menu = FindMenuInfoRecursive(id, item.menuList);
if (menu != null)
{
break;
}
else
{
continue;
}
}
}

//finally return the menu object
return menu;
}


The AddXmlString is the method we are going to see next:


private string AddXmlString(List menuList)
{
StringBuilder sb = new StringBuilder();

foreach (MenuInfo m in menuList)
{
if (m.menuList.Count > 0)
{
//should continue
sb.Append(String.Format("", m.Name, m.Name));
sb.Append(AddXmlString(m.menuList));
sb.Append(String.Format("
", m.Name, m.Name));
}
else
{
sb.Append(String.Format("", m.Name, m.Name));
}
}
return sb.ToString();
}


With all this done at the WS, it leaves us with very little to do at the Flex end. We would just be making the call to the WS and merely bind the results.


public function WSMenuSvcResultHandler(event:ResultEvent):void{
var dataXML:XML = new XML();
dataXML = XML(event.result.toString());

var myMenu:Menu = Menu.createMenu(null, dataXML, false);
myMenu.labelField="@label";
myMenu.show(10, 20);
}


The full C# source for this example is here and the Flex source is here.

Sunday, June 14, 2009

Syntax Highlighter - Where to upload .js javascript files used for blogs

I had read about the syntax highlighter scripts a few months back but never really found the time to add it to my blog.

Today I decided to do it. Soon I ended up with the same problem quite a lot of others had already faced. Hosting .js files. Most of the code examples on the internet showed people uploading the .js files in Google pages. But Google pages is discontinued and it is now Google Sites, and Google sites does not permit uploading .js files.

Though the required files are available in Google code for you to refer, still I had modified a few things in the script which I wanted to host somewhere. Another option was to insert all that script inside my template, which I did not like.

Some blogs suggested some alternative free hosting sites, but I found my way out.

Here is what I did. I renamed all the script files with a .jsc extension and uploaded them in Google sites - it gave me no problem. I then referred these files in my template and it works like a charm. I just did a quick test on my default browser - Chrome. Also tested in IE 6 and Firefox.

Saturday, June 13, 2009

Going with the tide...Flex and Java

For the past few months, I have been coding lesser and lesser in .Net. That was because I was doing some groundwork for the next project, which we had planned to build in Flex consuming either Java or .Net Web Services. Compared to my exposure in Java, I can say I know .Net like the back of my hand. But then, that is what willful programming was all about - exploring new horizons. Added with that was my personal interest in wanting to learn and work in Flex. Besides, I should also learn to go with the tide, shouldn’t I?

I have a moderate level of experience working in Flash, but that was 4 years ago when my friend and I would stay awake all night building flash web templates. She was exceptionally creative at designing and I focused more on the ActionScript.

Also having worked in WPF, I was basing myself a lot on these experiences and began building some sample applications as I learnt. So going forward, one can expect a lot of Flex and Java related posts more often.

Wednesday, June 3, 2009

Debug handle is invalid - Visual Studio 2005

I have had so many people at work coming to me with this issue. So, think it is worth making note of it here.

Problem: Visual Studio 2005 - when you try to run any application pops up this window with a message - "debug handle is invalid".

The fix is to get your "Terminal Services" running.

Start -> Type Run -> type services.msc and hit enter ->
Look for the the Terminal Service -> Right click that and Start.

Probably you could make it Automatic to start every time you boot up.

VS 2005 hooks up with this service to run its debugger session.

Thursday, May 28, 2009

Social Bookmarking your Blogs

I had long wanted to add those tiny icons to my blog posts. Finally found some time today. Googled it and realized it was quite simple. Making very little template code changes would be enough.

1. You need to host the icon images somewhere, I used Google sites.
2. Go to your blogger dashboard. Click on Layout of the blog you wish to modify
3. Click on Edit HTML
4. Check the Expand Widget Template
5. Search for the text “post-footer-line-3”
6. It was a ‘div’ tag in my template. I think it should be the same in most templates
7. Inside this is where you add your code for the links (Which I have explained further below).
8. Save the template

Code to add the links:
It is a simple anchor tag, making an icon/image or some text or both link to the submit url of the respective social site.

Try adding it one by one. Just remember these things:
1. Set the target value to _blank so that the user does not actually navigate away from your blog but instead opens these sites in a new window
2. The post.url and the post.title variables will get you the current page details, which you would be submitting to the respective social site
3. You might encounter some xml parse errors – usually with the actual ampersand symbol – replace it with the text &amp;

Examples from what I have done:

<!--Google Bookmark-->
<a expr:href='&quot;http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Google Bookmark' src='http://YOUR HOSTED URL/googleicon.gif'/></a>

<!--Stumble Upon-->
<a expr:href='&quot;http://www.stumbleupon.com/submit?url=&quot;+ data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'><img alt='Stumble Upon' src='http://YOUR HOSTED URL/stumbleicon.png'/></a>

<!--Del.icio.us-->
<a expr:href='&quot;http://del.icio.us/post?url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Del.icio.us' src='http://YOUR HOSTED URL/deliciousicon.png'/></a>

<!--Digg-->
<a expr:href='&quot;http://digg.com/submit?phase=2&amp;url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Digg' src='http://YOUR HOSTED URL/diggicon.png'/></a>

<!--Technorati-->
<a expr:href='&quot;http://technorati.com/faves?add=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Technorati' src='http://YOUR HOSTED URL/technoratiicon.png'/></a>

<!--Reddit-->
<a expr:href='&quot;http://reddit.com/submit?url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Reddit' src='http://YOUR HOSTED URL/redditicon.png'/></a>

<!--Twitter-->
<a expr:href='&quot;http://twitthis.com/twit?url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Twit This' src='http://YOUR HOSTED URL/twittericon.png'/></a>

<!--Yahoo Bookmark-->
<a expr:href='&quot;http://myweb2.search.yahoo.com/myresults/bookmarklet?t=&quot; + data:post.url + &quot;&amp;title=&quot; + data:post.title' target='_blank'> <img alt='Yahoo Bookmark' src='http://YOUR HOSTED URL/yahooicon.png'/></a>

Tuesday, May 26, 2009

Exception Handling in .Net

A project task came up late last week to revamp and redesign an existing site, which was developed about a year back. The source was in C# and I had to quickly do a code walkthrough and prepare an effort estimate.

While reviewing the code, I noticed that almost every function, method and even tiny code snippets were wrapped around a try catch and the code within the catch section was either left empty or was simply throw ex;

I just wanted to write a quick note about exception handling based on what I have been doing over the last few years:

1. Catch an exception only when:
a. You are really intending to handle it and handle it appropriately
b. You want to find if it was some specific exception

2. There is no point in writing a try catch throw,
i.e. Writing the code given below is equivalent to writing nothing at all:
try
{
//Your code here
}
catch (Exception ex)
{
throw ex;
}

Instead you could just write your code and let the exception to bubble up.

3. Build a decent exception handler module that can contain options to log/publish the exceptions and helps to support the system.

4. A try catch in the UI would make more sense and it should appropriately redirect the user to a common errors page. Usually in the middle tier, the exceptions can be left to bubble up for the UI code to handle.

5. Create custom exception classes for specific purposes and throw them around your MT code. Using a try catch to find out if such a custom exception was thrown makes sense.

Example:
Write a UserNotFoundException that inherits from System.Exception.
You could throw this exception from a method that tries to fetch a user.
From another part of the code you can check specifically if this exception was thrown, and based on that you can route your code.

I am surely going to re-factor this website code and change it accordingly.

Thursday, May 21, 2009

Outlook does not display images

I ran into this problem suddenly last week. None of the forwarded emails, my friends sent (which had funny pictures and some really hot photos) were getting displayed. Instead it got replaced with the standard IE image not found symbol - A big red X.

I then Googled it and realized that the problem was due to Outlook's temporary folder draining out of its designated disk limit;

Solution:

1. Open your registry (Run -> Type "regedit")
2. Navigate to HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security
3. Find the key "OutlookSecureTempFolder"
4. Copy the value and access the folder (Again try Run -> Paste the path)
5. Clear all contents inside this temporary folder

Now try re-opening the emails. The images would now get downloaded into the temporary folder and the preview pane would display the images correctly.

Monday, May 18, 2009

Training and Knowledge Transfer sessions with the Chinese

For the last 2 weeks we were providing training and knowledge transfers to a team of engineers from Beijing. These people would be supporting one of the major accounts that we were supporting till now.

The team comprised of 4 engineers who arrived to the ‘warm’ welcome of the Chennai summer. Not used to such conditions, they found it a real challenge to make it to the office building after getting out of the car. They saw to it that they never went out during the day time. They got their lunch delivered and served at one of the conference rooms.

I had to do a KT for 2 systems and train a couple of them. They both appeared very friendly and kind. I could sense a fair amount of nervousness, but that is reasonable given the fact that they have not worked in .Net before and also do not have much knowledge about the business. They spoke in low voices and struggled hard to understand our accent which by the way was mutual.

The girl to whom I initially started the training could not follow what I was saying and I had to slow down while I spoke. But still it appeared as if I was difficult for her to follow, so I started writing down while talking. She was able to understand better now and that is how the remaining sessions went by. Almost an entire notepad was over within the next few days. After each session she borrowed my notes and copied them over.

As per plan, I explained everything I knew about the system and emphasized on areas of caution where issues were faced frequently. Also, I gave them the list of items that are pending or partially completed and items that have been completed but are in User Testing status. The overall training went smooth and everyone was happy. The girl to whom I did the knowledge transfer gave me a small present – like a souvenir – a Weifang butterfly kite with some terrific artwork. I liked it and it was so nice of her.

Sunday, May 10, 2009

Web Services: Code-First vs Contract-First approach

One of my colleagues who recently moved to work in a maintenance project based on Java, came back to discuss about the Web Service pattern followed there. He used terms like ‘Top-Down’ and ‘Bottom-Up’ approach and mentioned that so many different things were possible in the Java world.

Curious to find out more on what he exactly meant and also in a secret desire to defend .Net, I explored based on the details he gave.

1. Parameters passed to the web method can be validated based on a limit/range.
a. Ex. Value passed in for an integer parameter can be checked if the value is within a defined range or format. Or a date parameter can have a range specified
2. The Web service code was generated from a defined WSDL and not the usual other way around.

Below are my findings:
There are two approaches to build a web service: Code First approach and Contract First approach.

1. Code First approach – where you write the web methods and then add a web reference of this service in whatever client you are using. If it is a .Net client, it will generate a wsdl file and a reference.vb (or .cs) to define the types and methods used/defined in the service.

2. Contract First Approach – you start working on building the WSDL file first. Define and write your types and methods in the WSDL. The code is generated from this WSDL (.Net provides the option through the wsdl.exe tool).

Which approach to choose, purely depends upon the requirement. The contract first approach is surely the only option when you are leaning on interoperability. If your web service is just going to be consumed internally by your own applications (like how I have been using it all along), then the code first approach should be totally fine.

The contract first approach is tedious and could easily get messy if you are not sure of what you are doing. Also it requires a person to have a very good understanding of the schema design and should be able to fluently code. But then there are quite a few schema designer tools available. But by modifying the schema, you can perform restrictions on the parameters and can even perform schema validations.

One solution that is very popular is Thinktecture Contract First. They provide you with a nice option where it integrates smoothly into the Visual Studio IDE and makes the code generation out of a schema file pretty simple and easy. Also among the many other options, they have encapsulated the Web Service custom validation of SOAP requests against the definitions defined within the source WSDL file using Attributes.

I shared these findings with my colleague and made him realize that what he had seen in his new project is not something related specifically to Java.

References:
http://www.frotscher.com/download/JUG-ContractFirst.pdf
http://ftp.mcs.anl.gov/pub/tech_reports/reports/P1319.pdf

Saturday, May 9, 2009

Project Separation

Similar to how things are in many cases in the industry right now, our company, which is a captive center, lost another account. The client account, an insurance company based out of Singapore, which recently was sold out of the parent corporate company, decided to get its systems supported by another company in Beijing.

Though a lot of reasons were attributed towards this decision, which was so suddenly announced, I can surely tell one thing with a lot of confidence – the decision was not based on any performance issue from our side. There were no loose ends in any delivery or in quality and the managers and stakeholders were clearly pleased and satisfied with our services.

There were corporate political reasons, beyond the control of the managers at the client side; and the shift happened. Now came the phase – project separation. This was a new experience for me. As an individual, many times, I have moved around different projects and twice to totally different companies. But never have I been a part of an account getting shifted. So after being done worrying about what was coming next, a part of me was just curious and excited to see how this whole separation thing goes through; and it sure had a lot of comical moments.

Our delivery manager called upon a meeting to announce this to much of all our surprise.
MOM and takeaways after the meeting:
1. Singapore client is gone. (What the …? Really?)
2. They are shifting their projects to a company in Beijing, China (Yeah, All I care…)
3. We would need to do a knowledge transfer to this Chinese firm (Oh shit!)
4. The shift is only due to the corporate decision at the client end, not us. (Hmmm…)
5. And don’t worry, there are some projects in the pipeline, so you will all be settled soon (Lets see about that)

We came out talking to each other, as usual, making jokes to hide our surprise. In a subsequent meeting, the plan was revealed:

1. People from the Chinese vendor are already at the Singapore office and are receiving KT.
2. The coming week they would be at our office and would require us to do an extensive knowledge transfer and training session for 2 weeks.
3. During this 2 weeks, any production issue, would be primarily supported by us and the new vendor would be secondary support
4. The 2 weeks after that, we would go to secondary support mode and they would be providing primary support.

The plan looked okay to us, given the fact that we were never given any training on the systems and had to work our way up. Also, I strongly believe that any team with some decent technical background can easily support the current client applications.

We were now preparing for the KT. The stakeholders from the client end had prepared a reasonable schedule and we reviewed it. After highlighting a few points we accepted that. Things looked fine till now, but soon turned around.

A couple days before the scheduled arrival of the team from the new vendor, we were called upon and instructed NOT to give a good KT. We were advised to even misguide them. It appeared so stupid to me and a few others. Why should we do such a thing? And when we asked, the answer given was that this is a waste of time. If we were training a resource within our company then it makes sense, but why should we train someone else?

That was OUR next question, why should we?, if we are not going to do a good job? After all we are still going to be in the same business aren’t we? There are very good chances for us to cross path in the future. It is sheer foolishness to burn bridges.

While this was going through, there came another instruction to be extremely pessimistic in our estimations. While it makes sense to give out estimates with some extra buffer, there was one really simple task that was estimated at 20 man days! It would have hardly taken a developer 4 hrs to complete the work. All right, I agree that we have to be cautious; maybe we could add some buffer for that. But even then, how can one explain the 20 man days thing? 

And when I asked the manager, who proposed this oversized estimate about this, he simply kept telling that this is a task that could cause a lot of other impacts and hence needs a lot of analysis. What the hell? I wonder what these sudden impacts would be which pops up just now and not till just the day before until when we had taken up similar tasks and completed even without sending an estimate.

I just could not avoid arguing with him on this one until I got a convincing answer. Now come on – I am not an all innocent, never utter a lie kind of prick; but certainly I would need myself to be able to defend the situation. And when we send such an estimate to a client whom, btw, we have meticulously trained on getting his ass kissed with each project, shit is bound to hit the ceiling, for sure!

And on top of all this, if we tell him the reason for the high estimate, which is as flimsy as a wet toilet paper, it certainly is not going to be taken well. The counter argument is that after all he is a client whom we have already lost, what is there to gain, why should we impress? 
I don’t want to please or impress him, but what about our dignity of work? Okay, forget the dignity shit, what if we get to a point where we may need to work with him again?

After all this gawky behaviour by my immediate manager and some people above him, I realized that such client separations are not new just to me, it was totally new to them too.

I really hate it when managers take some instructions too wrongly into their heads and overdo and overreact. Maybe I am wrong in my thoughts, maybe I should learn to be as dumb and unreasonable as this moronic manager I am working with. I am curious to know how such project closures are handled elsewhere...

Tuesday, April 21, 2009

The administrative limit for this request was Exceeded - LDAP

Last week I was writing an ASP page that fetched information from Active Directory using LDAP queries.

It was a straight forward page - the manager from the client side wanted to check some attributes. I wrote the asp code and began to test it. That’s when this error popped up, after processing the page halfway through:

“The administrative limit for this request was
Exceeded”

The error was self-explanatory and also the error popped up exactly after fetching 499 records. I was quite certain of the issue, but I just wanted to know if I had to access 500 records at a time by modifying the query or could the ADODB Command object (which I was using) do the trick.

Googled it quickly and got the answer – setting the page size on the Command object was enough:

comm.Properties("Page Size") = 100

The Code snippet for reference purpose:

Dim rs
Dim conn, strSQL
Dim dictDeptList, szUserID, szUserName, intDeptID
Dim comm

szCountry = Request.Form("CountrySelCtl")

strSQL = "select cn, " & CONST_TEL_KEY & _
" from '" & GetMemberContainerPath & "/ou=" & szCountry & "' where objectClass='Member' "

Set conn = Server.CreateObject("ADODB.Connection")conn.Provider = "ADsDSOObject"conn.Open "ADs Provider", Application("AD_UserName"), Application("AD_Password")

Set comm = Server.CreateObject("ADODB.Command")
Set comm.ActiveConnection = conncomm.CommandText = strSql
' Removes the Max Allowed Restriction
comm.Properties("Page Size") = 100

Set rs = comm.Execute()