March 2006

Monthly Archive

Another side of VB migration

By Jack Vaughan, Editor, SearchVB.com
March 27, 2006

VB6-to-VB.NET migration is much discussed lately. Adding perspective to this issue is Claudio Perrone of InnerWorkings. He says that newly released Visual Basic 2005 will probably prove to be a better vehicle for developers looking to migrate their skills to include the .NET Framework, and he has advice on what type of .NET project to tackle first.

As chief solution architect at InnerWorkings, Perrone is responsible for building the company’s Practice Sets, which are used for building developer skills. Part of the company’s offering is its trademarked Inferent code judging engine that measures performance of coders.

In terms of VB6 to VB.NET migration, there are issues to consider before making the leap. “The big point is to understand why to migrate in the first place,” said Perrone, “one of the things you have to consider as a company is why to move.”

“If you have a business process that never changes, there is probably no need to migrate at all. But where you have policies and complex rules, and you need to deal with rules more dynamically, that is where objects shine,” he said. And the big difference between VB6 and VB.NET resides in the latter’s approach to objects.

For VB6 developers ready to get started, said Perrone, VB 2005 is probably the right product, as opposed to VB 2003.

“If you have classic ASP applications that call Visual Basic COM objects, there are advantages to moving to .NET as migration can be accomplished in stages” he noted. But there is need for special care. “When you modify presentation code in such instances it is pretty easy to make mistakes.” Classic ASP code, Perrone noted, tended to mix declarative code with business rules and queries to databases. “There was no clear separation of concerns, which was a problem when handling complexity,” he said.

“With .NET,” said Perrone, “you get better separation.”

For developers, Perrone’s guidance is to start with a small personal project rather than running the wizards right away.

At InnerWorkings, Perrone and his colleagues have developed a performance-based methodology that lets .NET developers learn by practice. Recently, the company released software that allows developers to access InnerWorkings client application via learning menu and toolbar options from within Visual Studio. Using the Developer Interface v3.0, they can search InnerWorkings’ catalog of coding challenges and associated code files.

“We believe you should learn by solving problems,” said Perrone.

Key to InnerWorking efforts, as described by Perrone, are Practice Sets covering different features and techniques used in .NET.

In the InnerWorking paradigm, design patterns are a means by which developers unravel puzzles and learn the new technology.

Perrone suggests that software migration is one thing, skills migration is another. “A software migration effort cannot focus on processes and technology only. People are responsible for designing, implementing, testing, securing, and deploying software. Skills migration should not be left to a developer’s good will,” he said. Instead, it should follow a rigorous model designed for the development of individuals, teams and software organizations.

Launch Article 

Add this post to: del.icio.us:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings digg:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings spurl:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings simpy:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings newsvine:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings blinklist:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings furl:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings reddit:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings Y!:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings google:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings technorati:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings stumbleupon:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings windowslive:SearchVB.com Interviews Claudio Perrone, Chief Solution Architect at InnerWorkings

In this post, Paul Gielens mentions the article ”Design and Implement a Software Factory” published with the new issue of the Architecture Journal magazine.
The article describes Microsoft’s progress in developing a proof of concept of a factory in the healthcare domain. It is definitely worth a read, particularly if you are (as I am) struggling to find a real, or at least realistic, example of a factory schema.

On a related note, you might have missed Ron Jacobs’ ArcTalk interview to Jack Greenfield and Mauro Regio on the very same subject; the interview serves as an introduction to the HL7 project and to the whole concept of a software factory.
Towards the end of the talk, Mauro gives some comments about the perceived loss of developer creativity that switching to a more “industrialized” process seem to imply. Well, I totally share his view that creativity is not gone at all, but simply repurposed to solve new and more interesting problems.

A while ago, I showed to my team an early prototype of a very simple domain-specific language that I wrote which will be part of a product line that we are building.
To be honest, there wasn’t much to it; after the quick demo, however, one of the previously skeptical developers looked at me with evident surprise and said:
“Claudio, now I finally get it! You are going to remove the boring parts of my job”.
Yes I am, buddy… yes I am :-).

Add this post to: del.icio.us:Software Factories and Creativity digg:Software Factories and Creativity spurl:Software Factories and Creativity simpy:Software Factories and Creativity newsvine:Software Factories and Creativity blinklist:Software Factories and Creativity furl:Software Factories and Creativity reddit:Software Factories and Creativity Y!:Software Factories and Creativity google:Software Factories and Creativity technorati:Software Factories and Creativity stumbleupon:Software Factories and Creativity windowslive:Software Factories and Creativity

Last week Jimmy Nilsson expressed his growing dislike for today’s overuse of XML, particularly when conceived as a surrogate programming language.

I really share Jimmy’s concern, especially when I think about the XML abuse I’ve been subjected to while creating languages and recipes using the Domain-Specific Language (DSL) Tools and the Guidance Automation Toolkit (GAT).
On the other hand, I recognize that it is totally unfair for me to complain; this is, after all, the price we pay for dealing with prerelease software.
In fact, the DSL Tools team already announced that will soon provide us with a modeling language able to deal with the .dsldd file and hide that ugly XML from our sensitive eyes.
I haven’t heard of announcements regarding similar improvements on the GAT side, but I choose to be optimistic and wait for new developments.

Unfortunately this problem does not affect prereleases exclusively; released software, both closed and open source, is not immune either.
Let’s face it, it is far too easy to define and process a language using XML for not taking advantage of it; in a not-that-distant future, however, I have no doubts that we will look back and laugh thinking about how we put up with manually dealing with its angle brackets notation on a daily basis for all these years.

Apart from really extreme cases such as XSLT, perhaps XML-based build languages of the likes of Ant, NAnt and MSBuild are among the most obvious and discussed examples of how a good idea can turn nasty when scenarios get a little more complex than anticipated.

Martin Fowler already suggested that today’s enterprise applications require pretty sophisticated builds which are better handled using a full-fledged programming language.

Last year, he also wrote an article about his explorations using Rake, a build language based on Ruby. In a nutshell, using an internal (text-based) domain-specific language such as Rake enables developers to easily switch to the external general-purpose language (Ruby) whenever necessary.

But how sophisticated can builds be? To put a little bit of perspective into things, let me tell you that for more than two years at InnerWorkings we have adopted a continuous integration solution based on CruiseControl. NET and NAnt; unless you’ve read Jimmy’s brilliant manuscript of his upcoming book (in which I was honored to make a small contribution as guest author) you will be surprised to hear that we manage to automatically and continuously build, obfuscate, package, test and deploy several hundred .NET solutions.
While I think that we have done more than a reasonable job at maintaining a good degree of modularity and reuse in our XML scripts, our tolerance to NAnt’s notation has been tested several times.

Resorting to a DSL written on top of a full programming language as Martin suggests would definitely help, but I have the impression that a purely text-based language may still be rather inadequate at solving one of the issues that we often face, particularly when dealing with many scripts in parallel like our scenario requires: lack of run-time visibility about the progress of each build.
Do I have a viable solution? I’m not sure, but I speculate that it won’t be long before we will see the raise of a new generation of continuous integration systems built around the upcoming Windows Workflow Foundation, with steps defined using domain-specific activities.
What do you think? Is it a daft idea?

Add this post to: del.icio.us:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure digg:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure spurl:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure simpy:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure newsvine:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure blinklist:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure furl:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure reddit:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure Y!:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure google:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure technorati:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure stumbleupon:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure windowslive:Sick of Angle Brackets? DSL Modeling is (maybe) the Cure

I attended a lunch yesterday hosted by Enterprise Ireland in the Westin St. Francis Hotel off Union Square in San Francisco. It’s a beautiful old hotel (built in 1904) from the street level, but you realize that you’re not in the old quarters when the elevator opens on the 32nd floor! The Enterprise Ireland team did a nice job gathering some top Irish companies in one room. I spent the afternoon chatting with people from Riverdeep, ChangingWorlds, and Openet - the theme of the event was facing up to the challenges of doing business today as a company based in Ireland and operating in the U.S. The lunch was led by Noel Dempsey, an Irish government representative with the long title of Minister for Marine, Communications, and Natural Resources (the joke being that he should get three salaries for doing three jobs). I’m thinking of expanding my own title as a result…

Several shared business issues came up during the event, not least the constant demand for qualified computer science graduates in Ireland. Although the Irish education system is generally well regarded around the world, several of us expressed the concern that it suffers from complacency and lack of innovation today. From personal experience, I know that InnerWorkings is always looking for qualified VB and C# developers and the Irish universities just aren’t producing enough talent to meet the need. I’m guessing that our R&D facility in Dublin is typical of many Irish start-ups, with an energetic mix of nationalities and personalities from all over the world. This influx of programming talent from abroad allows our company to continue driving product innovation and it underlines the fact that Dublin has become a very desirable (albeit expensive) place to live. This isn’t news to anyone living in San Francisco, by the way…

Certainly, Ireland is not alone in the challenge to recruit and retain highly qualified software engineers. Scott McNealy, CEO of Sun Microsystems, went public in the San Francisco Chronicle last week about the need to increase the quota of immigrant work visas in the U.S. If skilled immigration is not increased, McNealy made the very descriptive observation that “there will be a great sucking sound of innovation out of the U.S.” Silicon Valley venture capitalist John Doerr makes a good point when he poses the following scenario: “Imagine innovation in America without Andy Grove, without Jerry Yang, without Sergey Brin — Hungarian, Chinese, Russian. These immigrants have contributed enormously to innovation and our well-being.”  In an eWeek interview last year, Bill Gates went on the record about his concerns over staffing Microsoft’s product groups with top talent: “I’m very worried about it,” Gates said. “Microsoft is trying to hire every great college graduate that has computer science skills.”

As the Enterprise Ireland lunch finished up yesterday, the general consensus was that governments need to invest in both home-grown talent and encouraging skilled immigration. If the doors to recruiting new talent are closed by a country’s legal or educational systems, innovation suffers and companies lose the ability to compete at the highest level. And let’s face it - it’s a lot more fun to have a chief solution architect who hails from Genoa. Isn’t that right, Claudio?

Add this post to: del.icio.us:Andy Grove, Jerry Yang, and Sergey Brin… digg:Andy Grove, Jerry Yang, and Sergey Brin… spurl:Andy Grove, Jerry Yang, and Sergey Brin… simpy:Andy Grove, Jerry Yang, and Sergey Brin… newsvine:Andy Grove, Jerry Yang, and Sergey Brin… blinklist:Andy Grove, Jerry Yang, and Sergey Brin… furl:Andy Grove, Jerry Yang, and Sergey Brin… reddit:Andy Grove, Jerry Yang, and Sergey Brin… Y!:Andy Grove, Jerry Yang, and Sergey Brin… google:Andy Grove, Jerry Yang, and Sergey Brin… technorati:Andy Grove, Jerry Yang, and Sergey Brin… stumbleupon:Andy Grove, Jerry Yang, and Sergey Brin… windowslive:Andy Grove, Jerry Yang, and Sergey Brin…

Pleasanton, CA - March 15, 2006 - Developers have told us that they’d like to see more reference materials built into our Practice Sets. We pay close attention to feedback from our developer community, so we’re delighted to announce a great new enhancement that comes at no additional charge to you.

Effective immediately, every InnerWorkings Practice Set includes access to three complete technical books selected from Safari Books Online. With these new references, developers can now directly access a series of highly-relevant online technical books that have been hand-picked to support the topics covered within each Practice Set.

The three books chosen for each Practice Set are available for the full activation period and are accessed through links on the Support tab of the InnerWorkings Developer Interface.

Safari Links

On clicking an embedded Safari link, developers are brought straight to the relevant page of the associated book on the Safari website. They can also jump to a main Safari page that allows complete access to any of the three books related to the Practice Set. No additional logins are required and access to all books is totally seamless.For the learner, the embedded Safari links add a new dimension to the tailored support provided by the Personal Tutor and the wealth of MSDN reference material already available with Practice Sets. Developers now have access to even more comprehensive and useful support materials to help them complete the required coding challenges. For example, Safari books can provide essential background and orientation for users with limited experience of the topic under discussion.

The new Safari books facility is available to all existing customers at no additional cost and is now built into our standard product. From today on, all Practice Sets downloaded will automatically include the embedded Safari links. Developers who wish to see this functionality in Practice Sets that they’ve already downloaded will simply need to re-install these Practice Sets (with no effect on their scores or progress) to benefit from Safari access. Enjoy!

Add this post to: del.icio.us:InnerWorkings Offers Customers Free Access to Safari Books Online digg:InnerWorkings Offers Customers Free Access to Safari Books Online spurl:InnerWorkings Offers Customers Free Access to Safari Books Online simpy:InnerWorkings Offers Customers Free Access to Safari Books Online newsvine:InnerWorkings Offers Customers Free Access to Safari Books Online blinklist:InnerWorkings Offers Customers Free Access to Safari Books Online furl:InnerWorkings Offers Customers Free Access to Safari Books Online reddit:InnerWorkings Offers Customers Free Access to Safari Books Online Y!:InnerWorkings Offers Customers Free Access to Safari Books Online google:InnerWorkings Offers Customers Free Access to Safari Books Online technorati:InnerWorkings Offers Customers Free Access to Safari Books Online stumbleupon:InnerWorkings Offers Customers Free Access to Safari Books Online windowslive:InnerWorkings Offers Customers Free Access to Safari Books Online

Despite the fact that you probably haven’t noticed or cared, I want to apologize for my lack of posting in the last few months.
Sure, I’ve been extremely busy, but in many ways I feel like I’ve been a horrible member of our software community, unfairly learning without sharing my findings with everyone else.
So here I am again, promising that I will try to contribute more in the future with the hope to encourage others to do the same.

There are several things I feel I should write about (including the amazing software architecture workshop that took place last month in Cortina d’Ampezzo, Italy) but today I will just mention the more recent Microsoft Architect Forum 2006 which was superbly organized by Bill O’Brien here in Dublin.
I really couldn’t miss the full-day event since Beat Schwegler and Ingo Rammer were set to dig deep into a topic that I simply can’t afford to ignore these days: Software Factories .

Beat and Ingo were excellent in articulating Microsoft’s vision of how to combine model-driven development, guidance, frameworks and tools together with the objective of creating one or more product lines able to systematically exploit commonalities among the members of software product families .
Bill has kindly made available all the slides in this post so I won’t go into the details of each session.

During his analysis, Beat emphasized that we should consider that, in many cases, up to 70% of the cost of a software project goes into operations rather than pure development; as a consequence, he recommended that we should start adopting model-driven development not only for code generation, but also for requirements, deployment, configuration, and, more generally, for all other activities that are involved during the full lifecycle of a project.
While in principle I don’t disagree with this thought, today I find quite unlikely that different stakeholders (business analysts, network engineers, enterprise architects, solutions architects, developers, security specialists, QA testers, etc.) would accept to use the current incarnation of tools and designers and be confined to one single hosting environment, namely Visual Studio Team System.
But hey, in fairness we are talking about a medium-to-long term goal here, so I will surely change my mind on this point whenever Microsoft (or I :-)) will get there.

Ingo was really impeccable throughout the day and used several examples to illustrate the capabilities of the DSL tools. In one specific instance however, I could not help but notice that the version of the domain specific language that he used did not provide a particular option he needed for his demonstration; he then resorted to manually modify the generated code to accomplish his objectives. Tut-tut Ingo, you are not supposed to do that ;-).
I know I know, it was just a demo, and I really sound way too fussy.

It would be good however if somebody out there explained that, in the real world:

  • We obviously cannot modify code once generated since the DSL models will diligently overwrite everything at the next transformation; as a consequence:

    • Put a comment header in each template to explain that “This code has been generated by a tool…do no modify…etc.”
    • Do not put the generated code under source control. That code is a dispensable artifact. Put the designer file and the templates under source control instead.
  • Modifying a template is clearly a better option, generally however:

    • You need to put it under source control
    • You need to deploy it in a centralized location so that it can be shared across different applications in the same family
    • A change in the template may not be done lightly as it could easily break all other existing solutions that use the same template.
    • You need to unambiguously identify the version in use (you may put a version number in the header of even resort to change file name if changes are substantial and break existing applications that use it)
    • A change in the template that breaks existing applications may trigger the beginning of a new product line, particularly if you can’t accomplish 100% code generation of a solution and you can’t afford to retrofit all the existing solutions.
  • If we are unable to build systems that achieve 100% code generation (which happens if the degree of variation in a product family is not completely known):

    • We need careful guidance (patterns) to understand how to happily write manual code beside generated code. How do we create the extension points? What do you put in the underlying frameworks and what do you keep in a template? Who should make the changes in the first place? Is it up to us to rediscover these tricks over and over? Sure we can use base classes, template methods, etc. But no, the one-size-fits-all solution of using partial classes does not work all the time (wake up people, we often deal with xml files with little or no control on the reader…has anyone heard of the app.config file for example?)
    • There is an evident abstraction leak as developers need to appreciate the generated code as they are going to write beside it and even debug it if necessary (tip: keep templates “thin” by leveraging rich frameworks instead). By the way, the idea that the “smartest” people will write DSLs and templates while the others will just use them is flawed in my opinion, but I will definitely save an explanation for another post.

I’m exhausted already and I’m aware that this list is far from complete; and I haven’t even started talking about how I see we could version a domain specific language or an entire product line using the current tools. Or maybe I should attempt to figure out how I would assemble effective teams within this new paradigm. Has anybody discussed yet how to deal with developer’s natural resistance to model-driven development? How should we address their concerns of domain-restricted job specialization and the rightful dislike for anything that contains the word factory in it? Or has everybody agreed that this is not an issue?

As often happens, the real problem is that the tools are getting there, with their capabilities and limitations, and we really need to go beyond the simple APIs to be good at using them.
But perhaps it is unfair to ask a toolmaker to tell us out how to excel at using those tools.
After all Mozart wasn’t a piano maker, right ;-)?

Add this post to: del.icio.us:Back on Track (and the Software Factories Architect Forum 2006) digg:Back on Track (and the Software Factories Architect Forum 2006) spurl:Back on Track (and the Software Factories Architect Forum 2006) simpy:Back on Track (and the Software Factories Architect Forum 2006) newsvine:Back on Track (and the Software Factories Architect Forum 2006) blinklist:Back on Track (and the Software Factories Architect Forum 2006) furl:Back on Track (and the Software Factories Architect Forum 2006) reddit:Back on Track (and the Software Factories Architect Forum 2006) Y!:Back on Track (and the Software Factories Architect Forum 2006) google:Back on Track (and the Software Factories Architect Forum 2006) technorati:Back on Track (and the Software Factories Architect Forum 2006) stumbleupon:Back on Track (and the Software Factories Architect Forum 2006) windowslive:Back on Track (and the Software Factories Architect Forum 2006)

As a dedicated Netflix subscriber, I go through a lot of documentaries and PBS specials that would never see the light of day in my house under normal circumstances. Netflix is such a clever and efficient service - you build an online queue of movies, carefully rank them by preference, watch your wife change everything, and see what the postman delivers every few days. When a DVD arrives in your mailbox, you are almost obliged to watch it unless the first 20 minutes are completely unbearable. This has happened with a few Adam Sandler movies, but it’s generally not a problem.

Last night I watched a great DVD called “Commanding Heights: The Battle for the World Economy”, based on the book by Daniel Yergin and Joseph Stanislaw. This documentary was recommended by a friend of mine (another great Netflix feature is the ability to share your DVD queue) who pays attention to things like the global economy and free markets. Anyway, this particular DVD passed the Adam Sandler test and I found myself engrossed from the outset. It begins by exploring global economic conditions at the turn of the 20th century and examines all the major technical innovations that transformed the world back then. To appreciate the magnitude of these innovations, viewers are encouraged to picture a wealthy London gentleman who wants to order tea from India and exotic Indonesian spices. Rather than writing a letter to the king, he simply orders these goods and services with his new telephone and reasonably expects door-to-door delivery by the burgeoning shipping industry in a matter of weeks. And it wasn’t just the telephone - telegraphs were bouncing all over the world with important messages transmitted across national boundaries in seconds. Cars, televisions, commercial aviation, antibiotics, space travel - when these human achievements are listed out in historical format, you can really appreciate the scale of innovation across a few generations.

This started me thinking about the parallels between the turn of the 20th century and the turn of the 21st century. Substitute the rise of the telephone with the rise of the Internet, which is clearly one of the commanding heights of today’s economy. Indian tea and Indonesian spices are no longer the exclusive territory of wealthy gentlemen in capital cities with international shipping contacts. People in many countries across the world can search massive databases, run real-time price comparisons, and order the most obscure or exotic items online. Shipping and fulfillment is almost an afterthought - you pay a little more if you want it to arrive a bit faster. If it’s a birthday gift, Amazon will gift wrap it nicely for you prior to delivery and your grandma will never know. Today, all shapes and sizes of companies are moving their sales and distribution model online, delivering software as a service rather than packaged on a CD or sold on a shelf. The gap between purchaser and supplier is getting ever smaller and products can evolve within a wide network of users sharing a common interest. Even at the most ordinary level, daily tasks like buying groceries or reading the paper are transformed by this new economy of software services. For example, I don’t need to walk to my video store to see if they have ”Commanding Heights - Part II”, only to be told by a sulky teenager that it’s out of stock and I owe $10 in late fees on “The Waterboy”. The world economy is changing and it’s all about software and it’s all about service.

Add this post to: del.icio.us:Commanding Heights of Innovation digg:Commanding Heights of Innovation spurl:Commanding Heights of Innovation simpy:Commanding Heights of Innovation newsvine:Commanding Heights of Innovation blinklist:Commanding Heights of Innovation furl:Commanding Heights of Innovation reddit:Commanding Heights of Innovation Y!:Commanding Heights of Innovation google:Commanding Heights of Innovation technorati:Commanding Heights of Innovation stumbleupon:Commanding Heights of Innovation windowslive:Commanding Heights of Innovation

I recently read an interesting article from a link in one of the several newsletters that are constantly filling my inbox.  Even though I don’t necessarily remember ever signing up for most of them, I still try to sift through the quagmire of “junk” for an intesting tidbit that may be hiding in the muck. 

It just so happens that I was spending some time “sifting” recently, and I stumbled across an article; penned by the ever entertaining and profound Billy Hollis.  Apparently, he has had some of the same thoughts and ideas regarding the extreme influx of technologies and techno “stuff” as I have. 

( see  my post on 2.24.06  for reference- http://cs.innerworkings.com/blogs/jim_kayler/archive/2006/02/24/24.aspx )

Knowing that people the likes of Billy Hollis are experiencing the same anxieties, (about keeping up with the technology), as the rest of us “mere mortals“, makes me feel a bit better.  Not bad company to have, I guess!!

So, I thought that I would pass on the article, I found it pretty interesting!! 

http://www.ftponline.com/weblogger/forum.aspx?ID=18&DATE=02/11/2006&blog=#532

Enjoy…

Add this post to: del.icio.us:Interesting and Relevant Article digg:Interesting and Relevant Article spurl:Interesting and Relevant Article simpy:Interesting and Relevant Article newsvine:Interesting and Relevant Article blinklist:Interesting and Relevant Article furl:Interesting and Relevant Article reddit:Interesting and Relevant Article Y!:Interesting and Relevant Article google:Interesting and Relevant Article technorati:Interesting and Relevant Article stumbleupon:Interesting and Relevant Article windowslive:Interesting and Relevant Article

Categories

Archives