server.transfer() saved my asp

September 25, 2006 under ASP, IIS, Programming

At work, I’m near completion of an ASP ecommerce project. Up to this point in my life, I had never coded with anything other than Perl or PHP running on Apache when working on web-based projects that required dynamically generated content. So this project stole my ASP-on-IIS virginity; this is a good thing.

Server.Transfer() is a useful method that I stumbled upon by accident. I had an ASP script that was called from a POSTed web form. Said script took the form data, did some stuff, and needed to post one of two possible forms, depending on the data. I knew that out-of-the-box, PHP has no way to accomplish this. I became nauseated, believing that I’d have to generate a new form on the fly, complete with some JavaScript to be called in the BODYs onLoad event so as to post the form automatically. Ugh. Then, a gift from the heavens, “heavens” being a Google query, bestowed Server.Transfer() upon me. I found Response.Redirect() as well, but that totally smacked of PHPs header() function, which won’t submit form variables via a POST request, and would not be of any help.

If we’re on a.asp, which contains a bunch of form elements, and we want to go to b.asp, we can do the following:

< %
   ' Go to b.asp and preserve all of the form elements from a.asp.
   Server.Transfer("b.asp")
%>

Now from b.asp, we can retrieve the form elements that were on a.asp via the Reponse.Form() method. You just have to be careful as to what is already written to the browser prior to calling Server.Transfer() as it won’t be requesting a brand new page like Response.Redirect() would. Server.Transfer() is, thankfully, also available to ASP.NET.

This is probably old hat to all of the ASP veterans out there in Internet land, but it’s new to me and I’m glad that it exists πŸ™‚

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 0 »

how to be an awesome developer in 74 seconds

September 19, 2006 under Computers, Programming

eWeek’s article about 10 Programming Languages You Should Learn Right Now, posts like this about the 5 languages that matter, and 5 Easy Ways to be a Better Developer appear to be this week’s trend. Everybody loves a good list; see my list of favourite Firefox extensions in my previous post πŸ˜‰

When it comes to the world of software development, there are no easy ways to do it right and knowing specific languages isn’t a silver bullet. That’s what I’ve learned based on my experiences. Your mileage may vary. When it comes to programming, I’m no Raymond Chen; not yet anyway πŸ˜‰ But I don’t think I suck at it, either. In my brief career, I’ve never had a project fail (minus two death marches), so there’s hopefully no smoke-blowin’ on my part.

This, I know of creating software:

  1. It’s hard.It’s not brain surgery, but it’s far from easy. Taking human ideas and thought processes, and mapping that onto a machine that basically sends electrons hither and yon is not a venture to be taken lightly. When you stop to wonder, programming is like teaching a tree to act like your washing machine.
  2. Formal education helps, but isn’t always required.Does my Computer Science degree help me in my day-to-day work? Not really. The degree is just a way to get your foot in the door for an interview, especially if you haven’t done a whole lot yet. It just suggests to a potential employer that I’m probably able to think on my own. A good Computer Science program should be language-agnostic, IMO. If Bram Cohen were looking for a job, would he really need an employment section in his resume? Probably not; he created the BitTorrent protocol, so it should be safe to assume his skills are in check.
  3. Languages/technologies come and go.What’s hot right now? SMP and multithreaded programming. Ruby on Rails. AJAX. Just a few years ago, OOP/OOD was the talk of the town, but its popularity has since waned due to the loosely-coupled contrast of SOA. What’s popular now, might not be in a few years (or months). I’m a firm believer in having a strong background in the fundamentals of programming, since it’ll allow you to be flexible. C++ used to be popular for enterprise development, but it’s not anymore. If you only know how to cook fried eggs, you’ll have a problem when you’re asked to bake a soufflé.
  4. There’s a lot to know. What will you develop; desktop applications, Web-based applications, games, networking protocols, embedded code, operating systems or any of the many kinds of software? If you’re a database developer, focus on that. Sure, it’s fun to dabble with AI and is perfectly cool if it’s a hobby or you have aspirations of joining the video game industry, but it shouldn’t monopolise the time that you could spend on refining your database skills. You don’t have to be an expert on everything, but having general knowledge about a lot of things is useful, especially during brainstorming sessions.
  5. You can’t stop learning for even a second. It’s a fast-moving industry. If you’re caught standing still, you will be left behind. Read industry magazines and websites. Peek at the code of some open-source projects. Write some sample apps using a new framework. Use it or lose it!
  6. Don’t be a dork. For the most part, you’ll work with a team. Don’t be a mute or a weirdo that mumbles Star Trek dialogue to yourself. You’ll have to communicate with your team mates, and that’s a big job requirement nowadays. Gone are times when the nerdy solitary programmer was common. Programmers tend to be introverts (myself included), but we should have no problem communicating with our own kind. Bonus points if you’re able to talk to non-techies in a manner that they’ll understand.

This has been working for me thus far. Actual results may vary. Batteries not included.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 1 »

programmer's day

September 14, 2006 under Computers, Programming

Would you believe that nobody outside of work wished me a happy Programmer’s Day yesterday? Of course, I work for a company that’s chock full of programmers so there were plenty of well wishes to go around, but c’mon, people. It’s just one day out of the whole year. Is that too much to ask? Sheeesh πŸ˜‰

Yesterday, Joel Spolsky and Jeff Atwood should’ve put their differences aside for Programmer’s Day and made no mention of Ruby vs Wasabi, or business needs vs technical elegance arguments. Can’t we all get along for just one special day? πŸ™‚

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 0 »

the ubuntu way, part 2

September 6, 2006 under Computers, Linux, Programming, Ubuntu

Upon reviewing my web server’s logs, a lot of people stumble upon this website o’ mine by submitting queries for “ubuntu phpmyadmin” to search engines like Google, Yahoo! and MSN. I’ll assume that it’s because installing PHPMyAdmin on a fresh Ubuntu Linux install isn’t all that straightforward. Everybody lands on this post from last year. Unfortunately, I never actually mentioned how I installed PHPMyAdmin on Ubuntu in that post at all, so it’s probably pretty useless to most. Like Dr. Sam Beckett, I will attempt to put right what once went wrong, and hope that each time somebody wants to install PHPMyAdmin on Ubuntu, this will be the leap home.

Once you have installed Apache, PHP, MySQL and configured MySQL by creating users and maybe a database or two, you’ll quickly find out that you can’t install PHPMyAdmin from Synaptic or apt-get (Synaptic is merely a nice GUI for apt-get). The reason? All of the software (“packages” in Ubuntu parlance) that you can install via Synaptic or apt-get comes from repositories. Out-of-the-box, Ubuntu is configured to use only three Ubuntu-approved repositories, none of which have PHPMyAdmin on them. You can, however, add other repositories. On those other repositories, you’ll find PHPMyAdmin. To quickly add those repositories via Synaptic, go Settings | Repositories. For the Ubuntu 6.06 LTS, Ubuntu 6.06 LTS Security Updates, and Updates repositories, add the Official and Restricted Copyright to each one. Make sure you click the OK button for each repository to make the changes stick.

Synaptic Channels

Now you can search for “phpmyadmin” in Synaptic.

Synaptic PHPMyAdmin

Using apt-get from a console should accomplish the same thing:

$ sudo apt-get phpmyadmin

Fire up your browser and go to http://localhost/phpmyadmin/, and you should be pleasantly surprised. Now, off you go to build the next Digg or Flickr. Or maybe skip the whole Web 2.0 flurry entirely and be a Web 3.0 pioneer; Web 3.0 being the designation given to websites that can…whoa whoa, I’m not giving away that secret just yet πŸ˜‰

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 0 »

speak 'n' code

August 21, 2006 under Computers, Programming

Filed under “Ain’t It Cool?”.Speak-N-Code

The NRC has released an open-source application, called VoiceCode, that allows software developers to code with their voices instead of their hands. Sure there are plenty of consumer applications in existence, such as Dragon Naturally Speaking, that allows people to use their computers and enter text by speech. VoiceCode, on the other hand, is aimed at developers’ needs and the actual process of coding. Take a gander at a video demonstration of how VoiceCode works.

Years of hockey, video games, golf and now programming have begun taking a toll on my wrists. It’s not constant – perhaps it strikes a couple times per month – but it’s definitely noticable and uncomfortable. Someday, I envision that an app like VoiceCode will become a welcome relief to me. Although I’m somewhat concerned about voice-enabled applications. Not due to reasons such as the software’s accuracy converting human voice into correct instructions, because I have seen how accurate it can be. My apprehension revolves around the environments in which we work, and by “environments” I’m refering to the offices in which our day jobs exist. Programming in the business world isn’t a solitary endeavour. People are everywhere – perhaps within range of your microphone.

Imagine that you’re a part of a team developing an app that will bury Photoshop and claim the title as the number one choice for raster graphics software. You’re tasked with writing some image format converters. Another member on your team sits directly behind you, working on some GUI code. You’re speaking your code and so is the other member of your team. You’re deep in the middle of a function that will convert your app’s native file format to BMP. As you’re in a block that’s responsible for writing out the file header, the following is entered into your editor:

if (bFillBucket == true)

Ack, keep your code in your own modules….so shut up! Your sweet-ass converting code block is also prone to having things like “who do you think will win tonight?”, “beer for lunch today?”, “as if every meeting room is booked”, and “dude, you should’ve seen this chick I met last night” appear in it. Pass the mic, and get a quality headset, I suppose πŸ˜‰

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 2 »

a lost apple ad?

I’ve been doing a couple of contract jobs over at RentACoder for some extra cashola. One of them involves writing a tool that will convert over 700 MOV files to MP4. Ideally, the user should be able to run the tool, pass in two arguments (source directory and destination directory), be prompted for the export settings (window size, framerate, etc) and then be able to sit back and watch the conversions take place. I learned a few things with this project. For starters, I think Apple needs yet another one of those PC vs Mac ads, and it should go a little something like this:

Mac: I’m a Mac.
PC: And I am a PC.
Mac: Straight outta Cupertino, ya’ll! Hardcore to the Apple-core, biotches!

[PC has a confused and bewildered look on his face]

Mac: I buy my clothes at a wicked store in the mall. See these jeans and this shirt? It looks like it came from a thrift store but they actually cost like $150! Check me out, honeys!
PC: I purchased this suit at a Moores.
Mac: I run Mac OS X.
PC: I run Windows.
Mac: I can also run Windows, but for best results you should use Mac OS X. It’s tight!
PC: I have Microsoft Office.
Mac: I have Microsoft Office too, and it’s all sexy lookin’.
PC: I can integrate Microsoft Office with enterprise apps like SharePoint, BizTalk, Exchange, ERP, CRM and much more.
Mac: Dude, I said I have Microsoft Office. Duh. Who cares about enterprise shmenterprise? There’s like a trillion kagillion wozillion viruses and spyware out there for you. None for me. Nada. Zip. Zilcho.

[Mac high-fives a barefoot and bearded digital artist named Mordecai]

PC: This is true, but I am working on it.
Mac: Aw, man, you always say that. You’re all like “I’m working on it” and I’m all like “yeah whatever, now go get your DirectX on so I can play Prey“.
PC: So I’m not as lame as you say I am, or so it would seem.
Mac: Puh-lease, get over yourself, PC. You show up in ugly brown boxes…boxES. That’s plural, dude. And they’re all cardboard-y and stuff. I arrive in like one box, and it’s smooth and white. You look like you’re from a dirty factory and I look like I’m from another galaxy…or Finland, or something like that.

[A penguin enters and interrupts the conversation]

Penguin: I’m Linux.

[The penguin exits]

Mac: Who’s that guy?
PC: I do not know who that strange-looking fellow was.
Mac: Anyway. I can make movies and music and all sorts of cool stuff that people could post on MySpace.
PC: I also can do that.
Mac: Yeah, but not as cool as me. And your apps don’t begin with a lowercase ‘i’. The ‘i’ means “me” which is “you”. Deep stuff.
PC: Touché. Well played, my good man. However, I make it easy for developers to create software for me. I provide thorough documentation with plenty of examples in multiple languages, and there are many aficionados out there providing help and communities, too.
Mac: Oh yeah?
PC: That’s correct.
Mac: Oh yeah?!?!?
PC: Indeed.
Mac: Yeah…umm…well. I have half-assed documentation for my COM library for QuickTime, none of which resembles structured documentation; it’s more like an extremely brief FAQ at best or a conversation between two programming pals at worst. See what I mean? And I claim that said COM control can reuse serialized export settings in XML format, yet I explode and have yet to provide a fix or explanation, as evidenced here, here and here.
PC: I see. It is surely a pity that you do not provide stellar support for 3rd-party developers like I do.
Mac: But dude, I have a Dock that when you mouseover icons, it’s all “boop-boop-boop”. Rock! Cool! Bling! ‘Sup! No fat chicks! Ummm…give peace a chance? Yeah, that works! Wooohooo! Peace out, homeslices!

Apple makes some nice, albeit pricey, hardware. And Mac OS X is a great operating system. But their documentation for developers needs a lot of work.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 6 »

SendKeys()? meh. how about SendFood() or SendMoney()?

April 1, 2006 under Computers, Programming, Ruby, SendKeys, VBScript

At work last week, it so happened that I had a very tedious manual task to perform. Due to an NDA, I can’t say which server application this task involved. Let’s just say that there isn’t an easy way to import lots values for a picklist field. I had to add 245 values from an Excel worksheet to 3 picklist fields – that would require me to switch to Excel, select the value, copy, switch to the server application, click “Add”, paste, click “OK” 735 times! There is apparently a way to do this by writing a .NET assembly, but I was assured that finding the neccessary info to accomplish this would take longer that actually doing the manual task. And that’s when the thought of my wrists in firey pain from repetive stress foced me to recall and old friend of mine from shell32.dll – the SendKeys() method.

SendKeys() does what it sounds like…it sends keystrokes. Plain and simple. For that task, I knew what keystrokes I needed to do. I could’ve written something in C# or VB.NET, since there’s a SendKeys() method in the System.Windows.Forms namespace, but time was not on my side. There’s nothing like the cling and static-free scripting languages to save the day πŸ™‚ So using the Windows Scripting Host and 15 minutes of my time, I wrote some JScript code (as an aside, it appears that Microsoft is downplaying VBScript more and more all the time) that read all of the values from the Excel worksheet, stored them, and then switched back to the server application’s window to add values in the manual process. I could then take my hands off of the keyboard and watch my “ghost writer” do the work, saving me plenty of time and preventing a repetitive stress injury πŸ™‚

SendKeys() seems old-school to me, but comes in handy when an application you’re working with doesn’t have any of its functionality exposed via COM or .NET or whatever. Even if it does, sometimes it’s quicker to send keystrokes than read API documentation. As a cheesy example, let’s fire up MSCONFIG and automatically switch to the “Startup” tab to see what’s launching when Windows boots:

// Let's get to the good stuff in shell32.dll.
var objWSHShell = WScript.CreateObject("WScript.Shell");
 
// Launch MSCONFIG.
objWSHShell.Run("msconfig");
 
// Wait a couple of seconds for MSCONFIG to launch.
WScript.Sleep(2000);
 
// Switch the focus to MSCONFIG.
objWSHShell.AppActivate("System Configuration Utility");
 
// Keystroke time!
// SHIFT+TAB sets the keyboard focus to the row of tabs.
objWSHShell.SendKeys("+{TAB}");
 
// Hit the right cursor key 5 times to get to the Startup tab.
for (var i = 0; i < 5; i++)
    objWSHShell.SendKeys("{RIGHT}");

Pretty simple, and you don’t need the Windows Scripting Host to use SendKeys() from a scripting language. You can use non-Microsoft languages too. For example, the scripting language that has my attention lately is Ruby – it’s like Python on steroids. This script will do the same thing as the one above, but this time, I’ll write it in Ruby (without comments):

require 'win32ole'
 
objWSHShell = WIN32OLE.new("WScript.Shell")
objWSHShell.Run("msconfig")
sleep(2)
objWSHShell.AppActivate("System Configuration Utility")
objWSHShell.SendKeys("+{TAB}")
 
5.times do
   objWSHShell.SendKeys("{RIGHT}")
end

Think of the fun you can have automating all sorts of tasks in Windows with the SendKeys() method πŸ˜‰

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 0 »

don't be frugal with your code, …

February 16, 2006 under Computers, Programming

…be Krugle! That one was a groaner, I know πŸ˜‰

It’s a source code search engine that I’ll be keeping an eye on. Anyone who falls into the “not invented here” trap is doomed to fail in their software development endeavours. Sure, Google is great, especially if you actually know how to use it. However, specialized search engines are handy as well. There already exists a few good ones like Koders, but there are some pretty weak ones too like igrep.

Krugle promises to be akin to Koders but as a “Web 2.0” app (I’m sick of that term already). As a Web 2.0 app, it uses large fonts, bright colours and plenty of contrast like any good Web 2.0 site should (I’m rolling my eyes with large doses of sarcasm here). It also appears to promote some interactivity in a wiki sort of way, which I can see being benficial. Check out this presentation.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 0 »

wow, you're ugly

February 1, 2006 under Computers, Programming

I’ve got a question and I’m looking for an opinion. If somebody has written some code and they’re looking for a bit of help with something, is it rude to clean it up if it’s hideous to look at? Now I’m not talking about instances where they used a gazillion variables to store some data instead of, at the very least, an array. I’m talking about the look of the actual code. Often during the course of a day, somebody requests that I take a look at their code and offer them some help. I have no problem with doing that. What irks me is how some people do absolutely nothing to make it easy for anybody else to read and follow their code. For example, reading something like this isn’t fun.

function Dostuff(xval,yval,zval)
dim d
dim zx,zy,zz
 
dim aname, greeting
aname = inputbox("What's your name?","Name Prompt")
  greeting = "Hello, " & aname & " . I'll yammer on here."
msgbox greeting
 
          zx=0
          zy=0
          zz=1
                d=(xval*zx)+(yval*zy)+(zval*zz)
 
If d= 0 then
dostuff = True
else doStuff =FALSE
End if
end function

Arg, my eyes! I can’t even begin to understand how this is readable to anyone. Sure, VBScript isn’t case sensitive, but consistency is nice, I think. The use of white space – sometimes overuse and sometimes lack thereof – is mind boggling. Where’s the comments? I’d rather read English to quickly learn what the code will do, rather than determining that by reading the code itself. And the variable names. The variables names!!!

Using the style that I’m acustomed to, I’d probably clean it up to look like below.

' Purpose: Determine if the supplied vector
'          is perpendicular to the Z axis.
'       I: X value of supplied vector
'       I: Y value of supplied vector
'       I: Y value of supplied vector
'       O: True = perpendicular, False = not
Function IsPerpToZAxis(iXVal, iYVal, iZVal)
    Const ZAXIS_X = 0         ' Z-Axis vector X value
    Const ZAXIS_Y = 0         ' Z-Axis vector Y value
    Const ZAXIS_Z = 1         ' Z-Axis vector Z value
    Dim iDotProd              ' dot product
    Dim strName               ' user-supplied name
    Dim strGreeting           ' greeting to user
 
 
 
    ' Prompt the user for their name and display a useless
    ' greeting.
    strName = InputBox("What's your name?", "Name Prompt")
    strGreeting = "Hello, " & strName & _
                  " . I'll yammer on here."
    MsgBox (strGreeting)
 
    ' Calculate the dot product of the supplied vector and
    ' the Z axis vector.  If the dot product is 0, then
    ' the supplied vector is perpendicular to the Z axis.
    ' Return the result.
    iDotProd = (iXVal * ZAXIS_X) + _
               (iYVal * ZAXIS_Y) + _
               (iZVal * ZAXIS_Z)
 
    If (iDotProd = 0) Then
        IsPerpToZ = True
    Else
        IsPerpToZ = False
    End If
End Function

Yes, I could’ve created my own point class or used an array for the Z axis, but that’s not the point I’m trying to make. I think the latter code snippet is much more readable than the former, don’t you?

The real question is, though, is it ok to modify somebody’s code to make it more readable and then send it back to them like that. Or should you preserve the way they did things in the first place?

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 1 »

learning the lingua franca of cs

January 30, 2006 under Computer Science, Computers, Programming

What’s the best language to learn the fundamentals of Computer Science?

Joel Spolsky is against Java – he posted this a while back. Then I was reading an article linked on Digg by veteran programmer named Doug Ross and he says pretty much the same thing. I will too.

At Lake State, the first programming language that we were introduced to was Borland Delphi (Pascal with RAD features). For a frame of reference, this was 1997. Delphi taught us the bare basics; variables, functions, conditionals and loops. I don’t know if it was possible to fail CS105: Intro to Computer Programming and I still doubt that it was a weed-out class. However, the next course, CS121: Principles Of Programming, was the first of two weed-out classes. This course used C++ instead of what Joel and Doug prefer, C, but not a whole lot is different in an “intro” type of course. Now we were being bombarded with pointers, simple data structures, recursion and a smidgen of OOP. This class was also the breaking point for many; they’d usually change their majors to Math or Business at some point during the semester. I found it hard since I had done hardly any programming prior to switching my major to Computer Science, but I hung in there somehow. The following class, CS201: Data Structures And Algorithms, was the final weed-out class. If you could survive that course and the subsequent math courses, you were pretty much on your way to earning your CS degree.

Now, did I benefit from learning the ugly nitty gritties of Computer Science using a “hard” language like C++ instead of an “easy” one like Java? You bet. Pointers in C and C++ force you to think about what that code that you’re writing is actually doing to the computer. Sure Assembly would really give you insight into what’s going on, but then I find you’re fighting with the language more than learning the basics. Java, on the other hand, is suited for building a cross-platform application quickly and glosses over the fundamentals. I think that learning the basics with C/C++ gives programmers a solid foundation. I don’t particularily like C/C++ for day-to-day use. Up to this point in my career, I’ve never worked on a project that offered me the time and resources I’d need to make a C++ project slick. 99% of time they are rush jobs that are customized for clients and I remember hating the overhead associated with C++ when I didn’t have a choice in the matter. When given a choice nowadays, I’ll opt for languages other than C or C++, if possible. But having that C++ experience is like a badge of honor that you can take into the battles that are real-world software projects, be it with languages like C#, Visual Basic, Java, Python, Perl, Ruby, PHP or whatever.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
comments: 3 »