This blog will act as a repository of my day to day technical issues, findings, learnings and solutions. Will cover any/all technology I get to work with including Microsoft .Net, XML, JavaScript, Microsoft AJAX, SQL, Sybase to name a few. It will occassionally contain a few of my musings and rantings too.
Sunday, June 2, 2013
Infosys brings back Narayanamurthy - my take
Sunday, April 28, 2013
System cannot log you on now as the domain is not available - Fix
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
Sunday, November 21, 2010
Scrolling to the Top of an Aspx page conditionally
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
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
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 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
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
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("");
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 >();
ListmenuItems = 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
{
Listlst = 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, ListmenuList)
{
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(ListmenuList)
{
StringBuilder sb = new StringBuilder();
foreach (MenuInfo m in menuList)
{
if (m.menuList.Count > 0)
{
//should continue
sb.Append(String.Format("- ", m.Name, m.Name));
", m.Name, m.Name));
sb.Append(AddXmlString(m.menuList));
sb.Append(String.Format("
}
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
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
Wednesday, June 3, 2009
Debug handle is invalid - Visual Studio 2005
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
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='"http://www.google.com/bookmarks/mark?op=edit&bkmk=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Google Bookmark' src='http://YOUR HOSTED URL/googleicon.gif'/></a>
<!--Stumble Upon-->
<a expr:href='"http://www.stumbleupon.com/submit?url="+ data:post.url + "&title=" + data:post.title' target='_blank'><img alt='Stumble Upon' src='http://YOUR HOSTED URL/stumbleicon.png'/></a>
<!--Del.icio.us-->
<a expr:href='"http://del.icio.us/post?url=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Del.icio.us' src='http://YOUR HOSTED URL/deliciousicon.png'/></a>
<!--Digg-->
<a expr:href='"http://digg.com/submit?phase=2&url=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Digg' src='http://YOUR HOSTED URL/diggicon.png'/></a>
<!--Technorati-->
<a expr:href='"http://technorati.com/faves?add=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Technorati' src='http://YOUR HOSTED URL/technoratiicon.png'/></a>
<!--Reddit-->
<a expr:href='"http://reddit.com/submit?url=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Reddit' src='http://YOUR HOSTED URL/redditicon.png'/></a>
<!--Twitter-->
<a expr:href='"http://twitthis.com/twit?url=" + data:post.url + "&title=" + data:post.title' target='_blank'> <img alt='Twit This' src='http://YOUR HOSTED URL/twittericon.png'/></a>
<!--Yahoo Bookmark-->
<a expr:href='"http://myweb2.search.yahoo.com/myresults/bookmarklet?t=" + data:post.url + "&title=" + 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
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 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
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
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
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.
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 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
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()