Google vs. Adobe vs. Microsoft; GAMe on.

The online collaboration faceoff!
The recent launch of Google Chrome has sparked off discussions in more quarters than I thought were possibly interested in online document management and collaboration space. I personally feel that the basic philosophy the companies follow is well reflected in their offerings. 

Adobe is hardly discussed in India as a player in this space primarily because of two reasons. It was a really late entrant, as late as 2008 when mostly everyone had decided on where  they wanted to park their documents and accustomed themselves to the interface. People have great inertia to change only for "Experience". Secondly, the bandwith required for Adobe's websites is much greater than what is typically available in India. The snappy and minimal ajax interface offered by Google is much better suited to the Indian netizen. Most people here have also not explored Microsoft's online offering. I would give credit to Google for cross selling its products here. Adobe has almost no credibility in cross-selling its online offerings, even though it does a great job of packaging desktop software. Most of this migration is attributable to Gmail, which is the de-facto start page for most users who don't start at the google homepage. 

Microsoft unfortunately is not very good at making rich, interactive website. Neither are they rich, nor are they interactive. Atleast Google and Adobe have a design philosophy they follow to the fullest. Microsoft is still stuck in the school-boy-tacky-square-images-make-my-website mode. 

So coming back to the online-offline seamless integration. I wouldn't be surprised if Google Chrome downloads in a couple of days have exceeded all of Adobe AIR's downloads over months. I am yet to meet a person outside of Adobe and the RIA community who knows what AIR is or uses any app based on AIR. On the other hand, everyone I have talked to in the past two days has tried Chrome. Google just gets to the student community like no-one else. Why do the others fail to connect? For one, Google keeps offering nicely integrated applications all the time. In addition its the current media darling and I suspect a huge chunk of its followers are keeping up with the Joneses, only because the fail to associate with a philosophy. So these consumers were up for grabs and google got there first. Period. 

Adobe on the other hand has a set of followers that are quirky to say the least, and would be found sipping beer in a rock concert with a mohawk green hairdo. Well not really but close. There are relatively few people on the planet who consciously experience "Design", which is essentially the philosophy itself. 

Yesterday I walked into the room of an ex-Microsoft Research employee nonchalantly carrying my Mac. Even though he was civil and shook hands, I'm sure he hated me instantly, because even though I had met him for the first time, the conversation started with "Have you seen the new Expressions Studio??", "I was checking out the new WPF in the latest release of Visual Studio 2008, its amazing!". Let me digress a little here, most people working in the technology sector in India are relatively malinformed about what the competition is upto. Primarily because most of this innovation is not happeing on the India campuses. We have still not reached a stage where we can innovate complete products from the scratch. We are great with small features, but few products have been conceptualized and designed here, and I still don't see any move in that direction. Anyway so the point of digression was that I wasn't entirely aware of what MS was upto with WPF. So I nodded politely like you do when you don't understand. (Well atleast I do). Then he went on to show me a XML like declerative piece of code and conclusively stated that Microsoft had done the most amazing thing by separating Design from Logic. He wasn't even actually able to put it that clearly. And I went DUH! It took me a few seconds to open my laptop and show him a piece of MXML, which he glanced at briefly and the impact was minimal. Ok, so Microsoft is still god. Lets see.. Next he went on to show me something crappy he was making, and I instantly retaliated with the Distortion Effects Cube rotation and the amazing FlexBook component. I finally had his attention :). He asked, can this use flash. I took a step back to get a clear view of him and to drink in his reaction. I said this IS flash. No reaction. Ouch. Sometimes you just expect people to get things because you know. Anyway. Next he started off by waxing eloquent about how the compiled code can run as an application and inside the browser. I preferred to keep quiet. He did not know what AIR was and I wasn't going to waste any time evangelizing AIR to a MSR guy. Later in the conversation I did let it slip in that I could compile anything to a desktop App by changing just one tag, but I chose not to drive the point home. 

So whats the point with the Google docs-WPF story. People consume what the see on their platter. They are unlikely to go looking for something better, and they will make do with what they see. 

Ohh on a side note, The MS word on Mac does not display documents the same way it does on windows. So, I was booted into windows when I went to his room. So when he plugged a mouse into my mac, windows did not pick it up. Now I really don't know if this is a problem with Windows or BootCamp, but his response was priceless. "You can always restart the driver". GAWD. If developers think that way, all software is surely tending towards unix. 

So where does Yahoo figure in this equation? Ill-informed as I am, I have no idea. I think they were the earliest people to offer the "Briefcase", a concept they completely failed to take forward. Someone correct me if i am wrong. What exactly are they doing in this space?

So coming back to Adobe's problem. No one knows what they are doing! Despite occupying the most precious real estate on the most visited sites on the net, all they practically do is offer a "about flash blah" on the right click. That is a really big lost opportunity according to me. I fail to see anyone beating Google at this if things continue the way they are. Picasa enhanced their online offering a couple of days ago, and now Photoshop express will take a hit, if anyone is using it.

I'm looking forward to the barcamp at IIM Bangalore next week. I really want to get a pulse of what people think of this issue. Hopefully I will be able to back my post or reject it with some sampled data from the best minds in the country.

Back to ANOVA.

Labels: , , , , , , , ,

Posted by Vivek at 10:58 PM | 0 comments | links to this post read on

Vector Thrusting in Ferrari

Ok, the post title is misleading, just so that my absurd effort sounds cool. What I did was make a fat matchstick-vector-ferrari-fan. I know, sheesh.


This is a gross devaluation of Illustrator's capabilities, and also of my potential. ;) I used to think that the pen tool was a pain, but then I saw this really old video on youtube, in which John Warnock demonstrated the capabilities of one of the earliest versions of Illustrator, and the ease with which he used it caught my fancy. As you can see, I have caught on!

More vector art thrusting its way through to you in the future!

Labels: , ,

Posted by Vivek at 2:58 PM | 1 comments | links to this post read on

Error Code: 0xC0150002 : The application failed to initialize properly. Click on Ok to terminate the application.

I was in the process of making a few changes to a DLL, and whenever I ran the application on any machine other than mine with this new DLL, I got the message : "Error Code: 0xC0150002 : The application failed to initialize properly. Click on Ok to terminate the application.". Now, this error message isn't very nicely documented, even by Microsoft. In fact, their website claims this error is caused because of some Office 2003 -WinXP Pro combination. My error has nothing to do with that.

I eventually found a pointer at one of the forums (due credit, but I can't find the website anymore!). So how to fix it. Do this:
Open both the old DLL that works, and the new DLL you made that refuses to port onto another computer in Visual Studio. Expand the tree and see the Manifest Version. Are they different? Voila! (Assuming they are ofcourse). The problem is that when your runtime MS DLL's (msvcrt family) belong to a VS installation other than yours, your new manifest embedded in the new DLL is unable to use them, hence the crash.

Solution? Recompile the DLL on a machine with the same manifest/VS version. Try again.

Hope this helps!

Labels: , ,

Posted by Vivek at 12:25 PM | 4 comments | links to this post read on

Tech Ouch!

Pain...!!
How ruthless. I will never ever Bank with db in by life!
btw, this is the first document I am embedding from Adobe Share. Some of my previous posts describe the python methods to connect to this site. Here I showcase what it is really capable of. Flash and PDF together!.

Labels: , , ,

Posted by Vivek at 6:04 PM | 0 comments | links to this post read on

Connecting to Adobe Share using Python V2

In the previous post about Python and Adobe Share, I explained the very basic step of communicating with the Share server and obtaining a Authorization token. The next step is to use this authorization token to start a session with the Share server. Lets start with the basics again, no explanations this time.

1. Get the AuthToken
import time, md5, httplib2, xml.dom.minidom, sys
shared = "085960468662212c21417dce2e1XXXXX"
calltime = str(int(time.time()))
datastring = "POST /webservices/api/v1/auth/ apikey=fdc464509d733be99c30c6ccfacXXXXX calltime=" + calltime
sig = (md5.new(datastring+shared).hexdigest())
url = "https://api.share.adobe.com/webservices/api/v1/auth/?apikey=fdc464509d733be99c30c6ccfacXXXXX&calltime="+calltime +"&sig=" + sig
bodydata = '<request><username>vkapoor@adobe.com</username><password>XXXXX</password></request>'
http = httplib2.Http()
response, content = http.request(url , method='POST', body=bodydata)
Doc = xml.dom.minidom.parseString(content)
L = Doc.getElementsByTagName("authtoken")
authToken = str((L[0].childNodes)[0].data)


2. At the end of this, authToken should have the Authorization Token. Now use this to start a new session.

calltime = str(int(time.time()))
datastring = "POST /webservices/api/v1/sessions/ apikey=fdc464509d733be99c30c6ccfacXXXXX calltime=" + calltime
sig = (md5.new(datastring+shared).hexdigest())
url = "https://api.share.adobe.com/webservices/api/v1/sessions/?apikey=fdc464509d733be99c30c6ccfacXXXXX&calltime="+calltime +"&sig=" + sig
bodydata = '<request><authtoken>'+ authToken + '</authtoken></request>'
response, content = http.request(url , method='POST', body=bodydata)
Doc = xml.dom.minidom.parseString(content)
L = Doc.getElementsByTagName("sessionid")
sessionid = str((L[0].childNodes)[0].data)
L = Doc.getElementsByTagName("secret")
secret = str((L[0].childNodes)[0].data)
L = Doc.getElementsByTagName("name")
name = str((L[0].childNodes)[0].data)
L = Doc.getElementsByTagName("level")
level = str((L[0].childNodes)[0].data)

3. At the end of this, some relevant data, such as the SessionID, the new shared secret and other information is available in variables such as sessionid, secret, name, level etc. Other information can be extracted conveniently using XML methods.
Now, let us do something productive. Starting a session has no meaning if you can't do anything. So, just to prove that you can, I'll write a snippet that will list the contents of the root directory. Here goes..

calltime = str(int(time.time()))
datastring = "GET /webservices/api/v1/dc/ apikey=fdc464509d733be99c30c6ccfacXXXXX calltime=" + calltime + " sessionid=" + sessionid
sig = (md5.new(datastring+secret).hexdigest())
url = "https://api.share.adobe.com/webservices/api/v1/dc/?apikey=fdc464509d733be99c30c6ccfacXXXXX&calltime="+calltime +"&sessionid=" + sessionid + "&sig=" + sig
response, content = http.request(url , method='GET')


4.Parse the variable content in order to get relevant information. If all goes well, it should have a list of files, or rather a tree of files in the root of your Share account.

Notice that we recalculate the calltime before each new action. The Share server is ok as long as the calltimes are non decreasing. Also, in the last part, i.e. the directory listing, we use the new shared secret which is unique to a session.

This should get you started. I have used the Query String methods for all of these examples. I have reason to believe that if the Header methods are handled correctly, they should work too. I was not able to get the Header techniques to work, and I especially had doubts about the multipart upload techniques for uploading files. If anyone figures this out, I'd like to glance at the code.

I personally however gave up on using Python, and used the Java API provided by Adobe instead. That works like a dream to say the least, but I'd like to get this working too. Help!

Labels: , ,

Posted by Vivek at 5:42 PM | 4 comments | links to this post read on

My Photo
Name: Vivek Kapoor
Location: Delhi, India

I'm just another face in the crowd. I have the same dreams as every other engineer in the country, the same lifestyle, the same aspirations. Yet, we all feel we are so different. Maybe we are, but we do little to prove it. We do little to live by our convictions, to share our thoughts. I'm trying to do a million things at once. Thinking about my future is more a habit than a hobby, and running an e-commerce website my present biggest obsession. Yet, on paper, I'm just another software professional like so many others.. doing a 11-5 (yeah, lovely timings) job. This blog is testimony to the fact that I may not get very far, like millions of others, but still, I'm different, and hopefully, I'll get around to proving myself.