Sunday, October 12, 2008

Code Nuggets: A Side-effect of Using DropDownList AppendDataBoundItems With DataBound Items

Picture this: You have a webform with two DropDownLists, both of them are databound to some data you get from a database. Now the first DropDownList's selection determines the contents of the second dropdown. So you simply do a AutoPostBack = true for the first dropdown and populate the second dropdown in the handler function. Right?

But wait. What if you are required to put in a static item in the dropdown? Something like "-- Please Select --" as the first item in the list to force the user to make a conscious choice. Hmmm, so you look around and find the nice little property named AppendDataBoundItems that will take care of that. All you have to do is declare the first (static) item in the Items collection in the designer (or put a <asp:ListItem> tag inside your <asp:DropDownList> tags) and set AppendDataBoundItems to true. This nice little property tells the DropDownList to add the databound items after the statically declared items, so you can have your happy little "-- Please Select --" in your dropdown.

The Side-effect:

The side-effect becomes evident when you play around with your two dropdowns. Its immediately clear that something is not quite right. The AppendDataBoundItems property forces your dropdown's items from the previous postback to be treated as static objects on this display. Sort of where you get an ever-growing second dropdown with a hangover from the postback, which is clearly not what you wanted in the first place!

The Nugget:

So the quick solution is to use a loop to remove items selectively from your dropdown. Remember you still want to retain your first item, so that's why you use a loop. And a while loop at that.

while (DropDownList1.Items.Count != 1)
{
    DropDownList1.Items.Remove(DropDownList1.Items[1]);
}

There. You won't have a problem with your static-dynamic dropdowns anymore! You can even extend it to other purposes, if you have several static items that you want to preserve, or if you want to preserve static items that are of a particular value. The possibilities are endless, and the pain in your back is gone.

Other Possible Solutions Others Propose:

Some people think that doing a DropDownList1.Items.Clear() would do the trick, but it doesn't. Remember, you want to retain your first object. Or if you want to add your first (static!) object manually again then perhaps you can do that.

Yet others propose a rather swashbuckling DropDownList1.EnableViewState = false, do this only at your own risk and if you are sure that your user would never have to land on this page again during the current flow of your application (of course for which you cannot be sure, what if there is a network timeout?).

A Note:

Perhaps you'd want to use a for loop in place of that while loop, trying to do a quick

for (int i = 0; i < DropDownList1.Items.Count; i++)
{
    DropDownList1.Items.RemoveAt(i);
}

but believe me, it wouldn't work. Why? Because the DropDownList shrinks as you remove items from it, so your loop is bound to fail at some point, terminating earlier than it should. And of course I don't have to remind anyone that you cannot remove items from a collection while using an Iterator.

So that's it, I think the nugget had pretty much sauce alongside it!

(You can get a low-down on AppendDataBoundItems on ScottGu's blog or Andrew Rea's blog)

Sunday, September 28, 2008

Code Nuggets: Getting two SQL column values in a single column

Well this type of thing doesn't come up very frequently (at least to me) and if you're like me working on multiple databases it gets very frustrating when it does come up. Since I don't use it very frequently, I tend to forget how to do it properly in the database system I am using at the time.

So it goes something like this: Suppose you have a simple SQL table called Users. Now this table has three columns, id (int), firstName (varchar) and lastName (varchar). Sometimes you have to return the full name from the database in a single column (for reasons of sanity, or otherwise). How do you do it depends on your DBMS. (We assume that we have a record (1, 'George', 'Lucas') in the table.)

MySQL:

MySQL supports it via the CONCAT function. You can have as many values as you want as the parameters to the function.

Example:
SELECT CONCAT(firstName, LastName) from Users

would return:
GeorgeLucas

and would even be better if you use a CONCAT(firstName, " ", LastName) in its place which would give you a nice space in between the names.

Oracle:

Oracle also supports the CONCAT function, but you are restricted to only two values as parameters. However you can CONCAT the CONCAT function itself on the cost of getting your code ugly. Another way of concatenating multiple strings in Oracle is actually using the || operators.

Example:
SELECT CONCAT(firstName, CONCAT(" ", lastName)) from Users

or

SELECT firstName || " " || lastName from Users

both accomplish the same thing and would return:

George Lucas

SQL Server:

With SQL Server it actually gets a little bit easier if you are used to concatenate your strings through the '+' operator. However make sure that you CAST any numeric values to varchar before trying to concatenate it, as '+' also works as the addition operator.

Example:
SELECT firstName + " " + lastName from Users

That's all to it to the concatenation function, and remember that selecting two values and displaying them as a single values is also called concatenation (a thing that I usually look over).

Wednesday, September 03, 2008

java.CompilerError when running RMIC

The other day I was trying out a Java RMI program in connection to an assignment. Let me be very clear here: I really like Java as it was one of my first proper programming languages (mind you, I am talking here circa 1999-2000 when Java-fever hadn't caught up) and I am a big fan of its elegance. The only turn-off which made me head towards Microsoft's direction was the lack of a proper, Visual Studio-league IDE for Java in those days. Much water has passed under the bridge, and there are many better IDEs for Java now, like Eclipse and NetBeans, but the curse still remains. (You might also want to give JCreator a shot, one of my favorite Java editing tools)

So back to where I was, trying RMI. I made a simple interface class, which compiled fine, and then an implementation class, which compiled fine in itself too. Then I had to run RMIC on one of the classes (which I tried doing from command line, since I am not sure how NetBeans handles it), and plop, I got a java.CompilerError stating that something has gone horribly wrong and the compiler is now mangled, and that I am supposed to file a bug report. Something like this (extra line-breaks have been added for readability):

error: An error has occurred in the compiler; 
please file a bug report (http://java.sun.com/cgi-bin/bugreport.cgi).
1 error
----------log:rmic(7/491)----------
sun.tools.java.CompilerError: mangle NItem1Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem2Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem3Impl     javasoft$sqe$tests$api$java$rmi$Naming$NItem4Impl
at sun.tools.java.Type.mangleInnerType(Type.java)
at sun.tools.java.Type.tClass(Type.java)
at sun.tools.java.ClassDeclaration.(ClassDeclaration.java)
at sun.rmi.rmic.Main.doCompile(Main.java)
at sun.rmi.rmic.Main.compile(Main.java)
at sun.rmi.rmic.Main.main(Main.java)

Undaunted, I ran a Google search for the error which lead me to this bug report. Mind you, there is no solution in there. I figured the solution out myself. You just have to make sure that the jdk/bin directory is in your PATH variable (I am talking about Windows), and then compile the class from the command line from the class's directory. For example, earlier I was trying to run:
C:\Sun\SDK\jdk\bin>rmic 
"C:\Documents and Settings\uxuf\RMITest\build\RMIImpl"
but this threw an error everytime, so after setting the path variable (through System Properties->Advanced->Environment Variables) I found out that I had to pass the parameter to rmic without the quotes, which automatically means without any spaces :) and became something like:
C:\Documents and Settings\uxuf\RMITest\build>rmic RMIImpl
So if you are stuck in a similar situation, when no solution to that stupid error is in sight, try out rmic from the directory which contains the class. It worked for me!

Sunday, April 20, 2008

The Apple Software Update

With all the talk about Apple apparently forcing Safari on unsuspecting users through the Apple Software Update, I wanted to get a piece of it too. Apple Software Update is usually installed if any software from Apple is installed on your computer, like iTunes or QuickTime. I had iTunes installed on my system as I found it quite convenient to use my iPod with, and since then it (iTunes) has become my de facto audio player.

So I fired up Apple Software Update, and voila! There was no Safari in the list, let alone being checked by default. There was an update to Apple Software Update though, and an update to Apple QuickTime + iTunes. So I randomly updated Apple Software Update to the latest version, and when the update completed, there I had little Safari sitting innocently on my list checked already :)

Moral of the story: Update your Software Update before quipping on Apple.

Epilogue: I might give Safari a spin, because I had played a bit with it when the public beta came out last year. But I am not terribly impressed, not much to ditch my existing Firefox 3 Beta 5, which itself is light years fast of Firefox 2.

Monday, March 31, 2008

PHP: Getting your user's IP Address

It's easy, just use $SERVER['REMOTE_ADDR']. Echoing the user's IP address would look something like this:

echo "IP Address: " . $SERVER['REMOTE_ADDR'];
But that works only in PHP versions greater than 4.1.0. If you're still using earlier versions, use HTTP_SERVER_VARS, and for heavens' sake, upgrade.

Source: PHP: Predefined Variables - Manual (This page should be on the thumbs of all PHP developers)

Wednesday, December 20, 2006

Friday, October 13, 2006

Moved... http://uxuf.wordpress.com

Finally it was time to bid adieu to Blogger, and all its eccentrities.
The Regulatory Authority in Pakistan has not helped either…

The final nail in the coffin was the blocking of the beta.blogger.com
domain. That helped break down the entire comment system of my lil
blog, prompting me to take immediate action…

This WordPress account was created by me some time ago because I
wanted to test their service. Turns out I'll have to use it from now
on… Please update your bookmarks and blogrolls and feeds accordingly.
Additionally, the uXuf.blogspot.com address would redirect you to the
new place.

Friday, October 06, 2006

Tagged by Maria

I am thinking about...
ramadan in hot weather and that it'll be the same way for the next 12 years!!

I said...
I'll be late tomorrow

I want to...
go home, hit the bunk and sleep my heart out

I wish...
Pakistan could somehow majically shift to the southern hemisphere

I miss...
university! Friends, foes, bullies, begaars, webmasters, cafe, dhaaba...

I hear...
the a/c whirring (but there's no chill), Buzz's typing on the hard mac keyboard and Rubab talking to someone on the phone

I wonder...
how could they be so dumb!

I regret...
not many things in life

I am...
a lot different than what I was

I dance...
very rarely now, headbanging is more like it these days

I cry...
over my misdeeds that I cannot undo

I am not always...
myself

I write...
on bus ki seats (not really :P)

I need...
paani

I finish...
*most* of the things I start

I tag...
JonyDada, Raheel and whoever else still alive...

Wednesday, October 04, 2006

Armstrong finally gets the moon quote right

Armstrong's popular quote:
 
"That's one small step for man, one giant leap for mankind."

has been the subject of much debate among the "correct" grammarians (or whatever they are called) because he (apparently) missed the "a". According to them the sentence should've read:

"That's one small step for a man, one giant leap for mankind."

and that in its present form, it sounds as "That's one small step for mankind, one giant leap for mankind." But now, thanks to advanced sound processing techniques, an Australian programmer claims he has found the "a" that has eluded researchers (and listeners) for decades. According to him, it's there alright. Seems like the amreeki equipment at the time weren't sharp enough to transmit the whole thing in clarity...!

Read the whole story here.

Friday, September 29, 2006

Plethora

I've been meaning to blog lately, but the problem is exactly that, I don't know what to blog...

I was disconnected for a few hours from the outside world as, again, the curse of the red cellphone descended upon me. Though I must admit, that it was a lot different this time. There were no Prosmetics, no kids in cool gear, nor any motorcycle wala, neither any handguns...

Just a plain old mini-bus and lots of people stuffed in it, and I was one of them.

Though I was the chosen one, to lost my phone yet again...

With this phone goes my companion in long and electricity-less nights, the FM radio. The GPRS, with all the games and ring tones I had downloaded and the hours that I have billed on to Warid people, all go down the drain.

This was the third cell. Maybe I oughta call up the Guinness Records people now...

Wednesday, September 06, 2006

Why Materazzi earned Zidane's headbutt...

Italy's Marco Materazzi finally disclosed what exactly he said to incur the wrath of Zinedine Zidane during World Cup 2006 Final. During an interview, he told Gazzetta dello Sport:

"When I held Zidane's shirt, he said: 'If you want, I'll give you the jersey later.'"

"I responded that I preferred his sister, it's true," Materazzi said.

"It wasn't something nice, true. But luckily there have been dozens of players who have confirmed that a lot worse things are said on the field."

Seems like Materazzi also has Pakistani leacher tendencies, always referring to other people's sisters and mothers... Any self-respecting man would be proud to execute that headbutt!

Go Zidane!

Source: Yahoo! Sports

Saturday, September 02, 2006

Environmentalists Alert!

The people of Karachi who have no semblance of placid natural environment in the city, yet again are being deprived of another natural asset, and nobody is concerned enough to keep a check on this atrocity. Yes, the pond that came into existence under the FTC bridge thanks to the incessant rain, is drying up fast. None of the conservation bodies are interested in this issue, so it becomes our duty to save our city's environment.

Just think of it... This pond offers a fantastic view when you take the turn from FTC towards Kala Pul. In addition to this it will also kill a whole generation of mosquitoes, that we have so lovingly bred on puddles and our blood. So I suggest that we get mobilized over atrocity, and work together to SAVE THE POND!!

Tuesday, August 29, 2006

Blogger Babes

It turns out Blogger beta isn't a wasted effort at all! For one thing, you get the "dog" (looks to me so) replacing the B of the Blogger. I realized only today that using the beta is a privilege accorded only to a few lucky ones (I didnt notice because privileges are so natural for me *snicker*).

As I said somewhere, it is good for the non-tech people, as it uses those AJAX enabled snippets to arrange layouts according to the user's taste. The general population (who doesn't even have the desire) wouldn't now have to get their hands dirty with HTML and CSS. Adding custom code for statistics is just drag-and-drop, keeping the flow intuitive.

Close to hell for us techies, 'cause you cannot live if you cannot customize; and that's just what Blogger doesn't let us do at the moment.

The better thing is that, with the beta release, Blogger marks the shift to the dynamic web. Wonder why it has taken them so long, all the rest of the services are long established on it.

By dynamism of the web, I mean that you no longer have to publish your blog every time you make a change in the template. Old blogger used to publish pages of your blog to its server, and serve the appropriate pages whenever a request arrived. With the beta, the pages would be created on the fly, no more publishing.

All the bitching was due to the fact that I had recently delved into the Blogger codebase, and had come up with really interesting tricks like customizing the individual pages, recent comment box on the sidebar, intuitive layouts; and then *poof*... Blogger beta strips me of any right to modify my template.

These snippets are available if any of the old Blogger people (or the beta users who haven't switched to layouts) want them for their blogs.

Sunday, August 27, 2006

The Craze Beta

What is with everyone coming up with the beta editions of their offerings these days? Starting with Gmail Beta, we get Windows Live Mail Beta, Yahoo! Mail Beta, Yahoo! Photos Beta, Flickr Beta, and now, sweet Blogger goes beta too!

For many services, going beta just means getting AJAX-ified, with little or no improvement in features (Windows Live Mail leads the contest), only getting a face-lift and incorporating oh-those-cool-functions on the page that have nothing whatsoever to do with cutting the round trip time...!

With a sense of loyalty to the technology and the tech community (not to mention the need to be the first in trying things out - izzat ka maamla), I have officially switched to the new Blogger Beta. Switched - 'cause, ummm, beta could be exciting; officially - 'cause Blogger Help says you cannot opt out of the Beta!

So what does this beta has to offer over the old version? For one, the "privileged ones" now have a separate, red carpeted entrance at http://beta.blogger.com. Ordinary mortals should stick to their filthy swamps and keep using the lowly Blogger home page to log in.

The Blogger people have added support for tags - or "labels" as they call them. Der ayed durust ayed is the only thing that comes to mind.

And there is this supposedly cool Layout feature, that help you manage the "template" of your blog. Beware, the "template" word is hushed now, if you're cool, you'll have a layout.

So the layouts help users "drag and drop" widgets, or little snippets (previous posts, profile, description etc) on the page. Intuitive it is, but couldn't achieve its full potential until the "Edit HTML" option starts working. Gives us "power users" that creepy feeling of helplessness!

That means my little blog page has some AJAX elements in it. How I have been dying to have a little Ajax, that would keep my dishes clean... Who said God doesn't listen?!

Oh, and by the way, you'll have to comment by choosing the "Other" or "Anonymous" option on the comments page, your logged in nick wouldn't work here. Of course, what did you think? Its Beta!

Besides that, all the functionality is unchanged. They have tried to spruce up the Dashboard a little, with cramming the various blog-specific options, and the Blogger Buzz posts. Heck, they even forgot to fix the bug that occurs in the Rich Text Editor that it doesnt convert line breaks to hard line breaks :\ So it'd be better to stick to posting via e-mail!

Buss ooper say make-up kiya hai, under the hood its all the same!

Returning to the Craze Beta, I forgot to tell you: Flickr has gone a step ahead, its now Flickr Gamma!

And that gives an excuse for procrastinating office work too. Whenever somebody wants to take you to task, just claim that you've gone beta!

Wednesday, August 23, 2006

Sm**ing the night away...

Meeting with an important client in the morning, and I have just smoked the night away...

Dam Maro Dam.. Mitt jaye gham!

Rings and smoke and despair, acting as a warm blanket over me, taking me in their arms, cajoling me, killing me. Must get around it somehow, the day is already doomed.

Saturday, August 19, 2006

Blogger Reds

There seems to be (yet again?) a problem with my Blogger template. It somehow magically decided to just fly away, leaving me with a bunch of useless code. The backup of my customized template was in my puked up PC, which refuses to connect to the LAN.

So I have uploaded a temporary template, a very stripped down version. But hey, it would load faster, isnt it?

Bear with it for a few days. I'll bring up a rocking new template!

Wednesday, August 09, 2006

Sending mail with System.Web.Mail (.Net 1.1)

If you thought that it was a serious shortcoming that .Net framework 1.1 wasn't able to send email through SMTP servers that used authentication, you are in grave ignorance. On the surface of it, yes, you cannot send an email with the standard System.Web.Mail.MailMessage class; but you can of course play tricks on the Exchange server (yeah, that's what I get out of it that this things works only on an Exchange server) to make it authenticate you.

There is a namespace called http://schemas.microsoft.com/cdo/configuration that does those funny (and highly interesting) tricks. First we would check how to use a simple SMTP server (no authentication), and then we will use authentication to send a message.

//using System.Web;
//using System.Web.Mail;

//The simple SMTP Server
MailMessage message = new MailMessage();
message.From = "src@someone.com";
message.To = "dest@someother.com";
message.BodyFormat = MailFormat.Html;
message.Subject = "This is a spooky mail!";
message.Body = "Heheh, just kidding!";

SmtpMail.SmtpServer = "your.server.address"
SmtpMail.Send(message);

Now lets check out a server that uses authentication. Microsoft provides the CDOSYS object to achieve just that. You wouldn't think they were so dumb that they didnt incorporate some lousy authentication mechanism! Add the following lines before the SmtpMail lines.

message.Fields[
"http://schemas.microsoft.com/cdo/configuration/smtpserver"
] = "your.server.address";
message.Fields[
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;
message.Fields[
"http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
message.Fields[
"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;

//Most of the times the @domain is necessary with the username
message.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = "username@domain.com";
message.Fields[
"http://schemas.microsoft.com/cdo/configuration/sendpassword"] = "urpassword";

//If only the server uses SSL, in this case, the smtpserverport field would be different too
message.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"] = true;


And that would do just fine. There you go, I just saved your time and money!

[P.S. To those whom these lines look like Greek, I must say that this post appears as a record!]

Sunday, July 23, 2006

The day

It inches near, slowly but confidently, until it's looming right on our faces.

I know I should be happy, *must* be happy, but I dont know. Our wishes are about to be granted, we are finally going to achieve what we're striving for the last three years, but I don't know. There's a big smile plastered across my face, but I don't know. People think I am the luckiest man on earth, but I don't know.

I wouldnt know it until I learn to overcome my shortcomings. Isnt the first step in problem-solving the identification of the problem? I have taken the first step, I need help through the rest. I dont want to feel I am trying for everything without any rewards. I dont want to be left alone.

I was an introvert, maybe somewhere deep inside I still have the tendencies, but I am trying to come out of it. I cannot be at gregarious the very next moment, it should be a gradual process.

I feel miserable, but I am shedding my skin. I am changing, and I want people to appreciate.

I accept my mistakes, and of those who are related to me. In no way I'd do anything to hurt anyone, nor I'd indirectly encourage any such activity. People have the tendency to misunderstand situations, and things do not always go exactly by our wishes.

Still, I love you, and I dont want you to feel alone.

So girl, welcome, officially, to my life. We are an irresistable team, and we will always be. Thanks for making my life technicolored!

Monday, July 03, 2006

It'll just take some time!

On my player and my lips these days:

Raghav, Lets work it out

So we had another date another fight
you break down, and cry
and you swear that its over
it seems you pack your bags like every night
girl I know inside
we can be so much more
but..
everytime the smallest thing goes wrong you're out the door
you dont wanna deal with this pain anymore
why dont you understand that some things wont come so easy in life
work with me girl, it'll just take some time!

I'm not letting go
yeah girl thats for sure
wont catch me walking out
so okay, lets work it out!

at every single point you turn around
say I've let you down
that I no longer know you
how can you say to me that I've lost my way
when you're walking away

Once again here we go through that old procedure,
you scream that it's over between us
but I don't believe ya, (nah)
what you want an argument? well I aint speakin'
we come too far now, 'n i aint leaving
and if we got a problem let's get on top (of it)
we aint gotta (split), we can conquer (it)
but we gotta quit over reacting
imagine just last night we're romancing
false passion now we be clashing
i dunno what's happened, you go on a tantrum
as a man I'm making the first move,
u know i never do nuthin to blatantly hurt you,
we got a situation to work through
but patience is a virtue, well baby it takes two,
so..

I'm not letting go
yeah girl thats for sure
wont catch me walking out
so okay, lets work it out!


....

Friday, June 30, 2006

Armageddon

Yes, it will be armageddon tomorrow. The final battle between truth and falsehood, the good and the bad, the bad and the ugly, the ugly and the horrifying... Uhh whatever!

Tomorrow is the last paper of my last finals. The course was called Operations Research, something that I hated with a vengeance. Well it isnt only with OR that I have a problem, but with all maths-related courses. No matter what amount of time and effort I put into practice, the final exam NEVER went well. Woh to ALLAH ka shukar hai ke I havent flunked in any of them, managed to save my face (beizzati kharab hotay hotay reh gayee bus), and my grades.

But kismat plays amazing games with our lives. Now it will be a final showdown tomorrow, my chance to have a last laugh facing my nemesis. Pray to God I be successful in my endeavour. This David should slay the Goliath tommorrow!

Wish me luck!

Wednesday, June 21, 2006

Worldcup funny/ridiculous jerseys award!

I have been busy with my exams, and of course, the world cup. Though I am not getting enough time to follow all the matches, I usually manage to catch some of the interesting ones.
The World cup is in full swing. It is an honour for any player to wear his national colours on a world cup pitch, but hey, what were the designers of the jerseys thinking?
Here are my favourite funny/ridiculous national jerseys of teams that we see in action:

On 7th place is the 'design' of the world cup. I seriously dont have an idea of who ever came up with this design, a white looping out of the neck and burying itself somewhere in the armpits...

Next at 6th place is the Italian Away jersey. I admit it looks cool on the mannequin, but in action, the V of the neck is a little too-low, drooping like a well-worn V-neck sweater!

Whoever thought of draping Paraguay in their national colours, obviously was sleep-deprived. The jersey looks like a sleeping gown! Well-deserved for 5th place!

At number 4 is the Netherlands with their away shirts. I must say, retro is definitely not in. Seems to me they lifted the design straight out of a Boris Becker tee.

There was stiff competition for the last three places, but their are shirts more ridiculous than the ill-fitting Mexican shirts. How on earth would people feel wearing THAT shirt? The designers obviously forgot testing how the 'thing' would look on their players.

Giving a pretty hard time to the judges was the France Away jersey at No. 2. Though the base design of this jersey is pretty neat, the bold spectrum that runs on the chest makes the jersey looks like an ill-designed Flash presentation. Is it necessary to get so different as to make a mockery of yourself?
And the most funny/ridiculous World Cup jersey award goes to.....

ANGOLA!



The Home jersey bears the colours of the flag of Angola, with black representing the African nations, the red depicting the blood of the Africans that died fighting for their homelands, and the yellow stands for something in their flag. All is well, but who asked you to keep the base colour RED?


So that was the World Cup's most funny/ridiculous jerseys awards, tune in again for another set of awards soon!