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 &

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...