Wednesday, March 03, 2010

The Twitter Question

There used to be a generation which thinks ideas can be stolen. A closed generation, a generation which thinks sneezing can be patented and that would be cool. That generation is slowly dying. Today's generation wants to share. Share what they think, do, feel, opine, laugh and cry about. Believing in the fact that knowledge silos are passe' and tomorrow's world will live by collaborating openly than we do.


I have my blog, I am a member of orkut, facebook and LinkedIn. But nothing prepared me to what twitter was. I wanted to express why twitter was "different" for me. Orkut and Facebook were places for me to catch up with friends. It was always about people I know though most people think differently, I consciously ensure that only people I know are in my circle. LinkedIn was a way of connecting professionally. Being able to connect to both friends and strangers by virtue of common interest or the fact that the connect will be helpful professionally. At the end of the day, I used Orkut and Facebook as a means of ensuring I am upto date with what my friends are doing. My blog had sporadic activity from me since I never felt I can keep writing paragraphs.


Facebook and Orkut encouraged Micro Blogging is some sense, Facebook using updates and Orkut using scraps...but I have never felt the urge to "update" fb or orkut for I dont know what reasons. Enter Twitter.


When I first registered to twitter I was a confused soul. I did not know how I am going to use it or how it will really matter. Infact I didnt understand one bit of what was happening when I first entered, when my cousin told me it will take time to get used it. For me, the single most important change I had to encounter was the fact that twitters rules were different. Here anybody can follow anybody, the darn thing was completely open, unlike facebook or orkut which was personal and restricted and had friend requests. I mean you can read the CTO of cisco wanting to hug her kids in the same breath as visiting Russia for a tech deal. You can read about the CEO of HCL wishing best of luck to kids writing the board exams in the same breath as talking about the indian budget and our hockey team.


For the first time I saw how open this was. But not everybody uses twitter for the same things. I have seen over the past weeks people using it primarily for professional reasons. I have seen PR consultants and Social Media gurus, tweet up links. I have also seen real time updates on the The Carlton Towers fire, Sachin's double hundred and people just tweeting about life, love and their dog all mixed and all confident that their thoughts matter and people respond! 


I think the most important difference between a traditional blog and twitter is not the length. Its the realtime feedback that you get. You know people are reading it and when its 140 characters people really want to say something. This is EMI for Blogs!


The most significant fact is that I quickly formed a circle of people I have never seen. I tweet and they respond and its as if we have been friends all along! I have @omniprasan my cousin who will be tomorrows CEO Entrepreneur @mad_nad who breaks ice with me whenever she is pissed with her cold, @PPrakash a buddy who made me feel at home from day one, @surekhapillai who refuses to reply to even one tweet:), @suja_s who is incredibly polite, @miilee who finds me whenever she searches and whole lot of others like @sudhamshu, @vidyavenkat,@DrDheep...the list goes on. None of these people know me personally. But we know each other! This was the single most important lesson I learnt. I had access to people from various backgrounds who were ready to help me. 


I havent fully grabbed in entirety what twitter will be tomorrow. But I already know that twitter is a door to a different world. A world where people share fearlessly, a world leading to tomorrow.



Tuesday, March 02, 2010

The Change in the rules of the game called IT

There is an interesting shift that is happening in terms of IT as a whole. Its as if the tectonic plates are moving really fast and this is going to cause a huge upheaval some time in the next 5 years. The fundamental driving force behind this change is the availability of a reliable public network a.k.a internet. It has taken some time for me to understand the overall impact that this is going to have on the way IT is today and it was good enough to wake myself from my blog slumber and write this post.


I know a lot of people are talking about Cloud Computing, Public Clouds, Private Clouds, Platforms as a Service and SaaS applications all in one breath though I am sure 90% of the people dont even know what the heck it is. I also know that the industry pundits are still grappling with the right definition of Private and Public clouds with one set saying there is no such thing like "Private Cloud" as it wont provide the scale of optimization and the other set saying Corporate will NEVER agree to push their IT into the public world.


There is another thread to this. With the "on the cloud" a.k.a SaaS applications coming up in tens every month and the fact the tomorrows IT needs will definitely encompass applications on the cloud, the Platform as a Service will eventually force a technology shift and the way software applications are architect-ed and designed. Integration factors to the applications in the cloud and in house applications are a reality and the problems will HAVE to be solved. There is no other way but to solve that problem.


I do see a "Private Cloud". Only not in the sense it is understood today. I am beginning to see the IT outsourcing providers smell something here. I see them beginning to realize that they are already providing services to thousands of customers, these corporations will themselves not be able to do "private cloud" and still get the optimization.


I think the rule change has come. IT Service Providers will have to deliver a lot more value that they do today. They will be FORCED to shift to delivering services on private clouds that they host and operate. This will help the IT Service Companies deliver the shared services optimization to the hardware just like they do in software simply because of their scale. Corporations will eventually have to agree to THAT model. The fact that their IT services vendors can host their apps and deliver IT end to end over a "private cloud" providing them the necessary security cover.


The next logical step for the IT services companies is to learn to be Data Center providers like Amazon. Amazon will NEVER be what the IT Service Providers CAN be to companies given the fact that they are already aware of their customers security policies and have learned to work with the restrictions. The fact that the hardware and software  services can be commodatized and delivered is something we always knew. It is just that we are at the right tipping point with technology enabling the need.


Those who leave out on this opportunity will have to close shop. This is because software outsourcing is not going to bring in tomorrows revenue. The ground has started rumbling. I can hear the shift..can you?

Monday, January 19, 2009

Delivering a SaaS Application - Part 2

In the last post I wrote that the entire business process changes for a company when it delivers Software as a Service. Lets continue on this and see what other things change.


Customer Support: Traditional software companies sell licenses and expect customer support to get a call only after some serious debugging themselves and of course there is always the blame on infrastructure, configuration etc that can be the causes for the problems. However in a SaaS based scenario, all users directly and immediately get in touch when they face problems. There is a need to enable users to get back to the provider as soon as they encounter a problem and then track the problem to closure. Not only does this mean lots of customer raised tickets but also the responsibility of availability as well as configuration now lies on the provider. Seamless and quick resolution of the problem is the only solution and traditional customer support process needs to be modified to achieve this. This is not the only change, every customer must be updated with any downtimes, any problems that is being addressed, anything that might affect the availability of the service. This is crucial to avoid customer frustration and ensure stickiness. Being transparent with the customer in explaining what exactly is happening and ensuring that information reaches pro-actively if there is a planned event or as soon as possible if there is an unplanned outage.

Managing Delinquency: Traditionally delinquency existing only in case of support and one can always stop support if customers do not pay. Whereas in the SaaS model delinquency is a major reason for revenue loss. Understanding how much a customer has to pay, how much has alrady been payed, how much can be discounted and whether to take a decision to stop the service (meaning you basically stop access to everything, the service and support) is very important. Once the decision is taken stopping access to the customer must not be a clumsy process but must be seamless.

Re-sellers: Now this is an area which is perenially mythically clouded. As far as I am concerned, partners are not only necessary but the essence of partnership radically changes when it comes to partnership on the cloud. It is always easy to re-brand and sell a CD and price it 10% higher than the original software provider.All the provider needs to do is acknowledge the partner in some manner and maintain a repository of partners. It is defintely not the case in the SaaS model. In most cases partners are the sales channels and they cannot sell as they do traditionally. what is rather required is the ability to enter into a contract with the partners, share the same infrastructure that is being used to deliver the service to the partner also and enable the partner to white-label or co-brand and then either sell pre-configured service plans or even let the partner configure their own plans! Now that is the ideal way of enabling resellers. What is interesting is the fact that a partner would be treated as a customer and billing for the partner(credit/debit) must happen automatically and without any manual intervention. In fact SAP Acknowledged that their sales of Business By Design was primarily enabled by partners who had the domain expertise to handle their customers. Though this might look like a highly-complex service scenario, this applies at all levels. Even normal services require partners to help reach out to customers and as a rule partners can do this more effectively than the provider.

Lets dicuss this further in the next post....


Technorati Tags     ,,,

Saturday, January 17, 2009

Delivering a SaaS Application

Its interesting what it takes to deliver a SaaS application. Most people do not understand the depth of functionality that is required to deliver an application in the SaaS model. In fact most people think that an on premise can be delivered in the SaaS model as long as it is multi tenant and it can be delivered over the web. This is the first step to disaster!


If you typically look at what changes, the entire business process right from sales to payment changes drastically. In fact most traditional software companies are simply not ready enough to deliver something in the SaaS model. They usually find this out pretty late that their traditional model of leads, sales, payment, support, Operations and even their engineering process changes!

Lets take sales, the traditional model of sales people going to sell software simply does not scale for the SaaS model. What you would require is the ability for people to simply visit you website, gather as much information and probably click and subscribe to your service. You dont have big time gaps from contact to subscription. What probably would be required is the ability for your customers to try your software out. 

Subscription: Since the customer no longer requires hand holding for your product, the subscription process must be simple, self explanatory and probably would be driven through a wizard where customer requirements are gathered and the customer transparently knows how much needs to be payed and for how long.

Engineering: 9 months or 1 year releases no longer works. There needs to be continuous innovation on the product to make customers sticky. Customer feedback needs to be immediately fed back into the product. This is probably tough on the product since this requires the product to be able to support a lot of customization via configuration. Since customers are accessing the product in a single instance and the product needs to support individual customer needs, there needs to be a lot of thought on how to allow customers the flexibility of a customized process versus the trade off in having a standard product being shared by multiple customers. Continuous Innovation also brings in anoter complexity in terms of operation which I will discuss a little later.

Recurring Billing and Payment: Given the fact that there are companies like Zuora having dedicated billing and payment solutions for SaaS applications, I believe one immediately understands that this is something that is completely unique to SaaS. One needs extreme flexibility in terms of billing a service. A lot of parameters can be used to bill and simple our right fixed billing simply doesnt work in the SaaS model. You need to genuinely show your customers that you are billing them purely on their usage and they can have the flexibility in controlling the usage if they want to. This is a very powerful point in convincing customers to opt for SaaS solutions.

I will explain the othe differences in the next post...



Technorati Tags     ,,,

Wednesday, December 10, 2008

SDO and SaaS

I have always been impressed by the Service Data Objects specification and the utility value it has when generic services interact with each other. By the very fact that an object can be percieved as a self-describing message makes service orchestration/choregraphy much simpler. The specifications are implemented by ASF with Apache Tuscany(C++ and Java) as well as IBM/Eclipse(Java) - Implemented along with the Eclipse Modeling Framework. Assuming a scenario where application can send messages in any format they want but as SDO objects which self describe themselves, other applications can sucessfully retrieve and interpret the data in a highly decoupled manner. The specification enables interoperability between applications in terms of data models existing between them.


What would be more interesting is to see if any of the SaaS application platform providers actually use the SDO specification for both their integration requirements as well as Data Model Extensions. Amazingly SDO is the perfect candidate to provide extensions to data models since they are self describing and therefore metadata driven.

Technorati Tags     ,,

Thursday, December 04, 2008

User Authentication in SaaS applications

I have been working on a SaaS delivery enablement platform called Agora. I have had some insights after talking to multiple customers and most of them have always hinged on one crucial function, namely, User Authentication. It looks like this is a very common problem.

I believe Salesforce has a feature where in, the customer can implement a webservice interface given by salesforce, provide the details and Salesforce can then call the webservice for authentication. This was primarily done to abstract out the implementation/integration problems of multiple types of authentication.

The other option ofcourse is standards like OpenID. Allow users to have logins based on OpenID Providers and then use the same for the SaaS application too. But corporate customers would'nt want their user accounts to be personal email accounts. But this definitely is an option if the application is end consumer oriented.

I dont think that Federation as in replicating the user details or having a secure VPN between customer and SaaS App Provider is the right way to go, the former completely unnecessary and the later very costly.

I think the Salesforce approach does make sense. For e.g. a corporate customer can allow its users to login into the SaaS application using their corporate credentials for the first time. This action then creates a mapping between the SaaS application and the corporate user account. Subsequently any further requests for authentication can then be done seamlessly. The specifics of the implementation coule be anything ranging from SAML assertions to simple custom API's. The crucial question though is the communciation medium between the SaaS app provider and the corporate. I think either a standard auth gateway at the customer premise if already available or a standard webservice implementation like what Salesforce does.



Technorati Tags     ,,

Tuesday, April 01, 2008

SDP and Backoffice systems

A net native ISV who builds a service and delivers it on-demand basically builds a new LOB. There are no legacy systems and the operations are confined to managing the infrastructure and adhering to the SLA's promised. However, for an existing ISV who has hundreds of existing customers, resellers who are managed by an existing suite of backoffice applications, creating and enabling this new LOB becomes a big problem.
Since the delivery mode of the existing software is following a specific route, integration for the reason of book keeping is absolutely necessary and most of the departments resist changes to th e existing process of order, invoice and payment.
Therefore the platform that is used to deliver the on-demand service would have to integrate with the existing back office systems, with data coming from back office systems to the platform or vice versa.
It will be interesting to know if there are any existing large ISV's who have gone through this process and if there are any interesting learnings that they have accumulated in the process.

Wednesday, January 30, 2008

Are you jacked in?

1) Software is no longer in your desktop. Its out there in the online world.
2) People are no longer "next door", "next state", "next country" or "far away". They are "nowhere" but they are "near". You can talk to them, ask them questions and get to know their needs. Seeing them is no longer a necessity.
3) Are you an SMB (Small and Medium Business) who think IT strategy is another type of chocolate? Is that preventing you from making your business process easier and automated? Are you not able to invest and manage IT resources since that is not your core strength. You are no longer left out of the group of other biggies optimizing their processes. Buy an appliance, configure it and forget about it.
4) You are on the road and you are fed up with the songs that you are hearing. You search and download what you need.
5) You are in the neighboring city and want to know the best Indian restaurant. Use your mobile.
6) You friend called you using a messenger which figured out you were not at home, not at office and therefore tried calling your mobile which was out of reach and therefore it left a voice message which was delivered to your email account which you received via a blackberry when it encountered the next "tower". - Unified Communication.

The above seemingly unconnected points are connected simply because you are now "connected". The availability of the network has made possible tremendous advances in business and personal life.

The internet is becoming eerily similar to The Matrix where you can do extraordinary things simply because you are no longer bound by the physics of this world.

Crowd Intelligence like the Borgs is providing previously unheard, not thought of possibilities. Who in Gods name would have guessed that the best way to write a dictionary of "everything" is to simply create an empty dictionary and ask the world to write it!
Who thought that the best way to create a map of countries, states, cities, streets where accurate data was not available is to simply create a satellite picture and allow the people of the streets, cities, states and countries to do the "mapping"?

Whats interesting is that this has always been staring at right in front of our faces. The Grid! The only thing that changed was .... the network. If a problem can be solved by parallel computing, knowledge can be accumulated by 'world'izens a.k.a Citizens. Its the era of people grid computing.

You are no longer bound by time since you can give when you have the time, you are no longer bound by knowledge since the people who have knowledge will provide it, you are no longer bound by cost since people are ready to fund it, you are no longer bound....

Man has finally set himself free simply by understanding what he knows for thousands

Thursday, January 10, 2008

Is the IT Industry screwing other sectors in India?

Yesterday I had the opportunity to do some heavy gray cell squeezing with a couple of friends of mine. One of my friend is a director of a Soft Skills company and the other a Data Architect. The General Manager of firm (Soft Skills) was also present. Their question? IT Industry is draining out skills from other industrial sectors and this is causing a huge strain for resources in other sectors. The sustainability of the growth that IT has had has no guarantee and parent with dreamz are sending their children in flocks to Computer Science engineering. Other Engineering graduates are pouring into IT without sticking to work with the branch they have chosen. What is the role of these people who enter the industry without much knowledge of computer science 5 years down the lane? What if they are not able to sustain the constant adapatibility that IT seems to enforce on technical people. Should they become managers? What if so many people are not required because the industry crashes?

This was a really different topic simply because somebody was talking about the labor crunch in other industries rather than within the IT industry for a change. I smelt some long term strategic thinking that these people are looking at and hurriedly joined the conversation.

The discussion was revolving around different questions. First, whats the future of the "common people" who enter the industry simply because that is were the jobs are for now and that is the industry where money is?

I explained to them that since IT in India has primarily been a services focussed, recurring work(BPO), maintenance activities have been the major source of the so called boom of the IT industry and it doesnt need "trained computer science engineering" labor for more than 60% of the work the industry does which is why we can see so many non CS engineering people entering and being successful in the industry. What is rather required is an analytical mind and this is generally present in most of the graduates since they have done "engineering". This has been the idea behind the industry recruiting engineering graduates in droves.

However there is a certain percentage of work that is primarily involving computer science engineering, cutting edge technology and understanding of computer science as a field.

India is loosing the edge that it has traditionally maintained in terms of low cost labor to countries like china. So the primary chunk of the work that the Indian IT has been doing all these years is at threat to be shifted to the low cost centres. And one can actually see this happening already. What has happened in these years is that Indian companies have breached traditional barriers in type of quality of work and have started to do engineering work involving architecture, design, Total IT outsourcing which has been already done by the Biggies like the Big Blue, Accenture and EDS etc. On the other hand they themselves as a business are opening shop on the low cost centres which is a very strategic and sustainable thing to do. Indian IT has also breached traditional barriers in KPO and have been actively involved in it. Consulting which was previously left to the biggies is part of the portfolio for most companies now.

The Indian IT industry has given a generation of people lots of money and the most important thing to notice is the amount of money the generation is spending. This ensures distribution of the money. Traditionally businessman honest and otherwise have been the sole owners of cars, houses and the other luxuries and IT has broken that mould and therefore has given the opportunity to millions of households to actually see money. Though this seems like a rosy scenario, I am well aware of the imbalance it has created in the society. The industry has suddenly thrust a layer of people way up and the rest of them are still down there. Though it is agreeable that it is simply impossible to bring all sections up at the same time, the difference is very huge in this case.

So much growth thrust upon a country which wasnt ready and was still in the category of "developing" nations has led to chaos in terms of infrastructure, societal imbalance, higher prices for day to day items which still increases the imbalance and huge division with poor people left where they are and the increase in prices leaving them even poorer.

Though this seems like a good viewpoint, I observed that today because of the spending that this industry has induced, industries like infrastructure, research, telecom to grow. It has given the government money to spend. Millions of Software Professional pay hefty taxes that augument the governments ability to put in schemes that were previously deemed unviable. Roads in a span of 2 years have grown at 200% more than the roads that were laid since independence. India is growing at a rapid pace. Entrepreneurs are growing by the day, all having the ability as well as the money to start new businesses and be successful. The IT industry is training people at the college levels. IT Companies as part of CSR's are heavily pouring in money that is helping people. Previously this use to be a privilege of business tycoons. Now IT companies have the muscle to do this. Media is growing at an incredible pace. Look at the news channels! They are bringing in transparency in the democracy. Right to Information Act 2005 allows people to get things done transparently. Mobilizing people against injustice is part of the media culture that we are building. IT is bringing in transparency in the processes of the government and we are leading it. Government employees are becoming more conscious of the possibility of getting punished for accepting bribes.

All said done, we cannot change things in a day, month, year or 2 years. It may take a decade, but it will happen. Common man will be empowered.1995 Nokia or Ford would have thought twice to invest in india, today Ford is pouring in an additional 500m$ to the Indian facilty. We are enabling other sectors to grow.

The argument that only IT enabling sectors are growing is a valid point. IT people have more money so they buy cars and therefore car companies are here is a common arguement. However telecommunication and the media revolution we are observing is definitely not attributable only to IT. Every villager has a mobile phone. Telecommunication has empowered the common man across the board.

This was a digression from the initial question, what happens to the average joe entering the industry after 5 years. The answer is simple, what happens to an average joe when her goes to any industry? He adapts he survives. He doesnt, he is thrown out. This is not attributable to a specific industry. If you are truly technology centric, you will learn to adapt to the quick changes that this field is throwing up. There will be skill sets that average joe already has that is requred for the next 20 years and he may get to have his place or he will get to understand his strength in people management and probably become a manager who understands the industry and knows to manage people. It depends on individual interest.

I honestly consider bringing in people who have done their under graduation (B.Sc/BCom) into this industry as sick. Till now the industry has stuck to a minimum Engineering or a post graduation. The possibility of a lucrative job dangling in front of you after your under graduation might take you off track given the environment we live in. And this industry will do better if it doesnt do it. Persuading thousands of young minds to choose quick money over education is really sick. I would rather appreciate if the industry allows higher eduction as a mandatory requirement even if it is done being part of their rolls.

In conclusion there is no right answer. This is one of those gray areas only time can tell. But till then life goes on, thousands queuing up with dreamz in their eyes and uncertainty in yet another generations minds.

Tuesday, January 08, 2008

Phew! its been a year without blogging

Its one of those "I cant say why I did it" thingies. Its more than a year since my previous blog spot and the date is definitely not an indication for my stagnant mind :) I've been doing the usual, trying to be on the bleeding edge, trying to understand new markets, understand SaaS in particular, Web 2.0, SOA, Architecture and some stuff. It was a pretty normal year. I got married too. and you know the usual.... whoa! I got married! It seems kinda odd repeating that to myself. I am a married man! I feel like OLD? :)

Well that apart, I think last year was important in many other ways. It was the yet another year for industry consolidation with companies running amock with M&A's, re-inventing themselves, creating new technologies, churning out new stuff. There is a plethora of Hot Technologies that have gained significance. GWT, RoR, Flex, JavaFX, Scripting Langs, Mashups, platforms and all said and done there are still people who think that Hibernate is bleeding edge:) yeah may be they should feel proud of C!

I have kind of categorized blog posts that people tend to write when they simply cant think of anything else to do..no writing reflections is not one of them ;). They either write stuff like "How to write a Resume" or "Top 10 items for the XXXX" or "Agile XXXX" or "Why Agile Sucks" or "How to improve software development". PPPPPlease.... it all started with Steve Yegge , the funny blogger as I call him started lashing out at Agile. And the band wagon started with Anti-Agilists being a cult theme. You are cool if you thump the agilists! No doubt Steve had some very valid and some very funny points that I completely agree with. Infact he kind'a crushed, and poured mud over Agile's grave. Whats the use of digging up the body and thumping it left right and center? :)

Then all of a sudden people had no idea how to write a resume, atleast thats what the bloggers thought! The rantings about resume continued. Everybody looks at ateleast zillion things at multiple stages in the resume. No use writing about it in a blog, you actually require a 10 volume book for it. The simpler approach is to simply be yourself and make the resume reflect you. You will end up someplace where people actually like you simply because they thought your resume makes sense!

At the end of day the only thing I can think of is, blogs have their advantages and dis-advantages. You give the pen to everybody, you better be ready to get a truck load of S*** from most of them but feel happy that the couple of folks who wrote somethings that made sense improved your knowledge some way!

Coming back to what I did last year, I have been actively looking at SaaS, architected a platform for SaaS based service delivery and did some cool Web 2.0 work with GWT and man I love GWT. We even used GWT for the SaaS Service Delivery Platform and it really works wonders to non-JavaScript guys trying to make sense of what the heck JavaScript is all about. Of course you need some JavaScript skills along with some hard core troubleshooting DOM of different browsers with Firebug and IE Dev Toolbar. But I am happy with GWT and am evangelising it like hell in my org!

SaaS seems to be an intersting market, with its own challenges. A part being application architecture, a part being supporting platform architecture and of course the Operations Architecture. You need to get everything write or you are screwed!

Have been reading Gianopaolo's and Micheal Chong's Blogs since they started to get some insight into what they have gone through. They are pretty cool guys.

Last year also was the year when I got some first hand experience with building and understand SaaS. The Appliance Model seems to be a very interesting compliment to SaaS based delivery and most companies are realising it.

Its been a quiet year with lots of value adds to me and from me to my org. I probably am beginning to better appreciate the future of this business being driven by SaaS as the primary model of delivery with augumented offline delivery modes like Google Gears and Appliances.

Integration with inhouse as well as standard on-premise models as well as on the cloud integration, standards for compatible data exchange between Service Providers, are all things that would evolve over the next years.

and I will be keeping track....

Tuesday, December 26, 2006

Disruptive what?

Every other day my dad keeps calling me over the phone and asks me, "The computer is asking this question? what should I do?" kinda stuff. Probably the only reason he has reduced these questions is because he assumes I am too damn busy to keep disturbing me during my work hours or he has learnt the secret of working with computers - "Just click on any damn button" :)

I was thinking why the hell working with a dumb machine got to be so hi-fi for normal people. How many times have you visited a bank in india with the teller telling you (pun intended) that the system has poor software and is not responding when you can point blank see that the System is displaying "Network Error". It scares me sometimes. These people really do not UNDERSTAND what is happening. Because understanding is for the "specialists". Has the washing machine you use ever told you something like "DRYER VALVE UNDER HIGH PRESSURE" or something to that effect? It does scare the hell out of most people I would imagine :)

People talk about distruptive technology all the time. So let me tell all you internet pundits and IT gurus staring over your computer screens this. There aint no use of "distruptive technology" than one which people can actually use it for something! Duh!

Let me state what I actually want to happen:

  • Make the computer a simple thing to work with like the iPod. Stop asking stupid questions and please please stop giving choices nobody needs. Probably you should read this
  • All you virus providers, tool providers, whatever providers, I seriously dont want to read your manuals, know what you do, read your groups, forums, contact you for whatever, all I care about is I am going to switch on my computer, I may be want to click on something to launch something, whatever as long as I can actually do it!
    and then I dont care about Krojans, Common Cold Viruses and Ugly Worms, I dont care about back doors or bams or whatever, I am going to browse and do MY JOB.
Sounds simple is'nt it?
  • I dont care if you will make deals with service providers to install Anti-Virus Softwares and Firewalls in their gateway to prevent all hell from breaking loose.
  • I dont care if you are going to install spam filters at the service provider level.
  • I dont care if you are going to CHARGE ME A WEE BIT MORE AT THE SERVICE PROVIDER LEVEL.
  • I certainly dont care if Google takes you all over and makes a one stop shop.
  • I care about my privacy of course. I dont want other people snopping around and I really dont want to actually hear you say you found a solution. All I care about is doing my job the way I want it done.
Most of you think I have gone insane. Let me tell you something. IT Outsourcing is an old world jargon. Consumer IT Outsourcing is the in thing!

WELCOME TO THE WORLD WHERE COMPUTERS ACTUALLY LET YOU DO YOUR JOB!

Sunday, November 26, 2006

*2.0 is disruptive to the nth power!

We have heard about Enterprise 2.0 and Web 2.0 being really disruptive and the possibilities of them churning out un-thought of possibilities and capabilities very real. Here is an example of "Crowd Sourcing" coming to the forefront after wikipedia. We are Smarter is gathering people to write the first book on business by means of Crowd Sourcing! They have even sorted out the problem of Royalties by allowing the authors to decide on what charity the money should go to! While I was reading about this book, I found it really interesting to note that Microlending websites are already up and running to allow individuals to loan money and the decision on to whom the money should go to will be decided solely by the individual! Now who said Web 2.0, SaaS and Enterprise 2.0 are not for the "real" businesses?

Thursday, November 16, 2006

Cool Mashup

I have come across some wierd as well as some cool websites and mashups across the web. But this one mashup happens to be the coolest and wierdest of them all! I came across this website which is a mashup with Satellite Picture capabilities of Google Maps that gives you the ability to send across messages with individual characters being actually character shaped buildings! I mean every character is a building somewhere in the world. Talk about "Messages from Space" :). Ok let me leave you to check this website out. Click Here to take a look.

Wednesday, November 15, 2006

Six Stages of Debugging

I have come across a lot of developer rants, but I think this one is way up there:) Charlie's humor:

The Six Stages of Debugging 1. That can't happen.
2. That doesn't happen on my machine.
3. That shouldn't happen.
4. Why does that happen?
5. Oh, I see.
6. How did that ever work?

Tuesday, September 26, 2006

Excel and VBA - Locking a Cell

Its been a long time I even saw any code in VB let alone VBA. That was until somebody asked me how they could lock a particular cell in excel based on the list selection in another cell.

That as usual sent me googling and finally I managed to write a script that will do the job for me. For writing the code, I opened the excel sheet and pressed Alt + F11 to open the Macro VBA Editor and selected the worksheet for which I wanted to write the functionality for and then wrote this piece of code on the worksheet change event. I wanted to lock cells C1 to C10 based on the value of cell D1.

Private Sub Worksheet_Change(ByVal Target As Range)
If (Intersect(Target, Range("D1")) Is Nothing) Or _
                    (Target.Cells.Count > 1) Or _
                    Not (Target.Column = 4 And Target.Row = 1) Then Exit Sub
         If Range("D1").Value = "V1" Then
                  ActiveSheet.Unprotect
                  Range("A1:IV65536").Locked = False
                  Range("C1:C10").Locked = True
                  ActiveSheet.Protect
         Else
                  ActiveSheet.Unprotect
                  Range("A1:IV65536").Locked = False
         End If
End Sub

Then my colleague wanted something different. He said, that he wanted the user to be alerted that value cannot be entered into a cell based on the selected value of another cell for which I modified the above code slightly to get this:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Target.Column = 6 Or _
           Target.Column = 9 Or _
            Target.Column = 12) Then Exit Sub
    If Not (ActiveSheet.Cells(Target.Row, Target.Column - 1).Value = "C")  _
     And Not (ActiveSheet.Cells(Target.Row, Target.Column).Value = "")       
     Then
             MsgBox ("No value possible here")
             ActiveSheet.Cells(Target.Row, Target.Column).Value = ""
    End If
End Sub

The above code alerts the user if the user tries to enter some value in a cell when it makes no sense to do so because of the selected value of another column.

Tuesday, September 19, 2006

Uninstalling Linux without screwing up Windows

I have a Windows XP, Mandrake Linux dual boot PC. I had installed Linux after windows as normally anybody will do.  I had done this almost 2 years back and unfortunately out of nowhere I had given a 2 GB Partition for the Windows Installation Drive. I know, I know...What on earth was I thinking?

My system started complaining of too less space in the OS directory and applications started behaving abnormally (probably because they expected some space in the temp directory and didnt find much). So I decided to uninstall Linux and resize by Windows Installation Partition. The problem was I didnt have a clue how to?

So I went on a search on how to uninstall Linux without screwing up the windows installation because simply deleteing the partition will screw up my MBR and would leave my hard disk useless.

Finally I did finf a way. I used the Windows Installation CD to boot and went inside the Windows Recovery Console (Press F10 or R). I then used the command fixmbr to overwrite my MBR.

Then I restarted the machine which automatically booted to my XP and then used the Windows Device Manager to delete and format the Linux Partitions.

I then used Partition Magic to resize my OS installed Drive and then restarted my machine to apply changes. It all went like a charm!

Friday, August 25, 2006

Custom Cell Renderers and Custom Cell Editors in Swing - Part III

Now lets take a look at how the CustomJTable code looks like. In order to allow external controllers to specify which column of the JTable will render itself as JRadioButtons, we have a method called setRadioGroup.  We also declare the custom Table Model which hides our internal structure and works the Model magic of Swing by extending AbstractTableModel.

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class CustomJTable extends JTable {

  /**
   * Give support for Grouping Radio Buttons in
   * different rows of a specific column in the table
   <br>
   * Optionally also allow a CellRendererValidator
   * which can choose which rows in the table will
   * have the radio button visible
   
   @param columnIndex -
   *            The column to which the grouping must
   *            be enabled
   
   @param validator -
   *            An optional CellRendererValidator to
   *            choose which columns have visible
   *            radio buttons. By default all column
   *            will show the radiobutton
   
   @see CellRendererValidator
   */
  public void setRadioGroup(int columnIndex,
      CellRendererValidator validator) {
    getColumnModel().getColumn(columnIndex)
        .setCellEditor(
            new RadioColumnCellEditor());
    getColumnModel().getColumn(columnIndex)
        .setCellRenderer(
            new RadioColumnRenderer(
                validator));
  }

  public boolean isCellEditable(int rowIndex,
      int vColIndex) {
    return true;
  }

  public Class getColumnClass(int column) {
    Object value = getValueAt(0, column);
    if (value != null)
      return value.getClass();
    else
      return super.getColumnClass(column);
  }

  /**
   * CellRendererValidator - This is an interface
   * that will be implemented by any class that
   * wishes <br>
   * to specify whether a CellRenderer is valid for a
   * specific column and row. <br>
   * This is pretty useful when specific rows of a
   * column will <i>NOT </i> the renderer set for the
   * entire column
   
   @author rajeshv
   */
  public static interface CellRendererValidator {
    public boolean isValid(JTable table,
        int rowIndex, int colIndex);
  }

  public static class CustomJTableModel extends
      AbstractTableModel {
    private List dataList = null;

    private String[] properties = null;

    public CustomJTableModel(List list) {
      dataList = list;
      LinkedHashMap map =
          (LinkedHashMapdataList.get(0);
      Set keySet = map.keySet();
      properties = new String[keySet.size()];
      int index = 0;
      for (Iterator iter = keySet.iterator(); iter
          .hasNext();) {
        properties[index++=
            (Stringiter.next();
      }
    }

    public int getColumnCount() {
      LinkedHashMap table =
          (LinkedHashMapdataList.get(0);
      return table.size();
    }

    public Object getValueAt(int rowIndex,
        int columnIndex) {
      LinkedHashMap table =
          (LinkedHashMapdataList
              .get(rowIndex);
      return table.get(properties[columnIndex]);
    }

    public int getRowCount() {
      return dataList.size();
    }

    public String getColumnName(int columnIndex) {
      return properties[columnIndex];
    }

    public Class getColumnClass(int columnIndex) {
      return String.class;
    }

    public void setValueAt(Object aValue,
        int rowIndex, int columnIndex) {
      LinkedHashMap table =
          (LinkedHashMapdataList
              .get(rowIndex);
      table.put(properties[columnIndex], aValue);
      fireTableCellUpdated(rowIndex, columnIndex);
    }

    public boolean isCellEditable(int rowIndex,
        int columnIndex) {
      return false;
    }
  }

  public static void main(String[] args) {
    CustomJTable table = new CustomJTable();
    LinkedHashMap firstRow = new LinkedHashMap();
    firstRow.put("column1""test1");
    firstRow.put("column2", Boolean.TRUE);
    LinkedHashMap secondRow = new LinkedHashMap();
    secondRow.put("column1""test1");
    secondRow.put("column2", Boolean.FALSE);
    LinkedHashMap thirdRow = new LinkedHashMap();
    thirdRow.put("column1""test1");
    thirdRow.put("column2""test");

    List dataList = new ArrayList();
    dataList.add(firstRow);
    dataList.add(secondRow);
    dataList.add(thirdRow);
    table
        .setModel(new CustomJTable.CustomJTableModel(
            dataList));
    table
        .setRadioGroup(
            1,
            new CustomJTable.CellRendererValidator(){
              public boolean isValid(
                  JTable table,
                  int rowIndex,
                  int colIndex) {
                if (rowIndex == 2) {
                  return false;
                }
                return true;
            });
    JFrame frame = new JFrame();
    frame
        .setDefaultCloseOperation(
                        
JFrame.EXIT_ON_CLOSE);
    frame.setSize(600600);
    frame.getContentPane().add(table);
    frame.setVisible(true);
  }
}

Thursday, August 24, 2006

Custom Cell Renderers and Custom Cell Editors in Swing - Part II


RadioColumnEditor
:
 The Editor is pretty much standard and the method to note is getTableCellEditorComponent() which contains the core logic.



import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.EventListenerList;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;

public class RadioColumnCellEditor implements
    ActionListener, TableCellEditor {
  Color currentColor;

  JRadioButton button;

  boolean state;

  public RadioColumnCellEditor() {
    super();
    button = new JRadioButton();
    button.setOpaque(false);
    button.setBackground(Color.WHITE);
    button.addActionListener(this);
  }

  protected EventListenerList listenerList =
      new EventListenerList();

  protected Object value;

  protected ChangeEvent changeEvent = null;

  protected int clickCountToStart = 1;

  public void setCellEditorValue(Object value) {
    this.value = value;
  }

  /**
   * Add a listener to the list that's notified when
   * the editor starts, stops, or cancels editing.
   */
  public void addCellEditorListener(
      CellEditorListener l) {
    listenerList.add(CellEditorListener.class, l);
  }

  /**
   * Remove a listener from the list that's notified
   */
  public void removeCellEditorListener(
      CellEditorListener l) {
    listenerList.remove(CellEditorListener.class,
        l);
  }

  protected void fireEditingStopped() {
    Object[] listeners =
        listenerList.getListenerList();
    for (int i = listeners.length - 2; i >= 0; i -=
        2) {
      if (listeners[i== CellEditorListener.class) {
        if (changeEvent == null)
          changeEvent =
              new ChangeEvent(this);
        ((CellEditorListenerlisteners[i + 1])
            .editingStopped(changeEvent);
      }
    }
  }

  protected void fireEditingCanceled() {
    Object[] listeners =
        listenerList.getListenerList();
    for (int i = listeners.length - 2; i >= 0; i -=
        2) {
      if (listeners[i== CellEditorListener.class) {
        if (changeEvent == null)
          changeEvent =
              new ChangeEvent(this);
        ((CellEditorListenerlisteners[i + 1])
            .editingCanceled(changeEvent);
      }
    }
  }

  public void actionPerformed(ActionEvent event) {
    fireEditingStopped();
  }

  // Implement the one CellEditor method that
  // AbstractCellEditor doesn't.
  public Object getCellEditorValue() {
    return new Boolean(button.isSelected());
  }

  // Implement the one method defined by
  // TableCellEditor.
  public Component getTableCellEditorComponent(
      JTable table, Object value,
      boolean isSelected, int row, int column) {

    if (!value.getClass().getName().equals(
        Boolean.class.getName())) {
      return null;
    }
    button.setSelected(value != null
        && value.getClass().getName().equals(
            Boolean.class.getName())
        && ((Booleanvalue).booleanValue());
    TableModel model = table.getModel();
    // Make all the radioButtons, except the
    // selected
    // TRUE
    for (int i = 0; i < model.getRowCount(); i++) {
      if (model.getValueAt(i, column!= null
          && model
              .getValueAt(i, column)
              .getClass()
              .getName()
              .equals(
                  Boolean.class
                      .getName())) {
        model.setValueAt(Boolean.FALSE, i,
            column);
      }
    }
    model.setValueAt(Boolean.TRUE, row, column);
    button
        .setHorizontalAlignment(
                              
SwingConstants.CENTER);
    return button;
  }

  public boolean stopCellEditing() {
    fireEditingStopped();
    return true;
  }

  public void cancelCellEditing() {
    fireEditingCanceled();
  }

  public boolean shouldSelectCell(EventObject eo) {
    return true;
  }

  public boolean isCellEditable(EventObject eo) {
    return true;
  }
}