Cross-browser Event Handler Assignment

June 6th, 2007

Making the client side scripts work across different major browsers is not easy, especially when client debugging is not as convenient as more strongly typed programming languages.  Try the following web page.  It works fine on IE but on FireFox clicking the button will trigger nothing to happen.

<html xmlns="http://www.w3.org/1999/xhtml" >
<
head><title>Untitled Page</title></head>
<
script language="Javascript">
function
document.onclick() {
  alert(
‘doc event’);
}
function foo() {
  alert(
‘foo’);
}
</script>
<
body>
<
input type="button" value="ok" onclick="foo();" />
</
body>
</
html>

The page will silently fail and none of the event handlers works.  Change the document.onclick handler assignment into the following and it works on both browsers.  Tools like the Error Console on FireFox is very helpful in diagnosing these type of errors.


document.onclick = function () {
  alert(
‘doc event’);
}

Web ,

Video: Steve Jobs and Bill Gates Interview on D 2007

May 31st, 2007

It feels kinda weird to see they describe the achievement of each other. :)   It’s historical to see these two big guys sitting together on the stage.

Tech ,

Google Gear: Web Applications Going Offline

May 30th, 2007

The offline web applications like Zimbra narrow the gap between the web and desktop applications in many aspects like connectivity, performance, reliability, etc.  The newly released Google Gear is an even bigger hit in that it sets a platform to help bring any web application "offline".  This will change the way people perceive "web application".  You do NOT need to be always connected to a network in order to use a web application any more.

(From TechCrunch.com) Google Gears Lets Developers Take Apps Offline: Tomorrow, Google will be hosting a developer day for 5,000 developers worldwide…

Followed offline app demo above, I tried the offline Google Reader.  It is very cool.  Also tried simulating an unexpected network connection drop.  When browsing the feeds in Google Reader in "online" mode, the network was suddenly disconnected.  It tried to read the content but timed out.  Then it popped up a window reporting the connection drop and asked if I would like to switch to "offline" mode.  Answer "yes" and I was able to continue reading the feeds offline!  After I get back online, the local data (items marked as read) is synchronized back to the server.  I was never a big fan of Google Reader due to its lack of useful features.  But this offline mode really draws my attention and interest to try using it more.

What’s next?  If this offline technology is used in developing mobile applications and it supports automatic smart downloading and synchronizing, it could greatly improve the performance of the sophisticated applications running on mobile devices with limited bandwidth.

An interesting comparison is with the Microsoft Smart Clients offline mode emerged in 2004 with the similar idea.

Web , ,

Building database and web service driven asynchronous google map application

May 22nd, 2007

Map API could help build very cool mashup websites.  Often times a back end database is the source of the objects to be drawn on the map and querying for those objects from the database based on the parameters the users choose on the website (e.g., state, city, search criteria) gets complex.  Also to improve the user experience, asynchronous map loading is desired so that while the next batch of objects is being retrieved from the server, the current ones on the map could continue functioning.  To address all these challenges and build a smooth database driven asynchronous loading map application, web service can serve as the bridge between the server side complex data model and the client side map drawing logic.  The following describes the steps of implementing such architecture and a sample code project created in Visual Studio (free version could be downloaded here).  This time, I played with Google Maps API.

ws_map.jpg

Firstly, set up a basic ASP.NET AJAX-enabled web site through the Visual Studio wizard.  You may need to download the AJAX extension from http://ajax.asp.net/.  Inside Default.aspx, add a div in the body like the following to host the map

<div id="map" style="width: 90%; height: 600px; margin-left:auto; margin-right:auto"></div>

Reference the google api javascript source and your own javascript file (e.g., gmap.js where the client side mapping code is located) in the head section.

Next is to prepare the data on the server side.  It is actually much easier to set up a relational database in Visual Studio by a just few clicks and there are tons of such examples on the web.  So here let’s try a slightly trickier scenario where we only have a static plain text CSV data file (e.g., exported from an legacy system or Excel spreadsheet) that contains various cities and the fun places in them to be drawn on the map.  Add that data file (e.g., mapdata.csv) under the App_Data/ folder in the solution explore.  Assume the data file has 3 columns State, City, and FunPlace.  Now create a web service (e.g., MapDataWebService) to extract the data from the CSV file and serve to the client side mapping code.  To add this web service, right click the project in the solution explore, select "Add New Item…", select "Web Service", and then rename the file name into "MapDataWebService.asmx".  The web service skeleton is automatically added under App_Code/.  Open it and add 2 web methods getAllStates() and getFunPlacesByState(string state).  The former is used to populate the dropdown on the web page to select a state and the latter is to get the fun places of the selected state.  Both methods connect to the data file through OLE DB and query the data using convenient SQL syntax.  To quickly unit test the web method, you could open MapDataWebService.asmx and press F5 to run the web service alone.

The return value of getFunPlacesByState(string state) would be an array of objects (type of class Place), each of which contains the latitude and longitude of the city and the name of the fun place in that city.  The class Place is the object oriented representation of this information.  The web service will return the objects to the JavaScript caller.  In order for the caller to get the consistent objects and dereference them the same way as in C#, the following directive should be added to the top of the web service code and a reference to the assembly System.Web.Extensions.dll needs to be added to the solution too.  If you don’t have this assembly already installed on your machine, you could download and install "ASP.NET Ajax" from http://ajax.asp.net/.


using System.Web.Script.Services;

    [ScriptService]
    [GenerateScriptType(typeof(Place))]
    public class MapDataWebService : System.Web.Services.WebService
    {
….
    }
    public class Place
    {
….
    }

After the data service is created, the getAllStates() web method could be used to build a data source to populate the dropdown list.  Drag and drop a dropdown list onto the Default.aspx, select to create a new data source from its context menu, choose object as the type, MapDataWebService as the business object, and getAllStates() as the SELECT method.  The data binding is automatically done.  Add an onchange event handler to this control to trigger the mapping function (e.g., drawMarkers) and we are almost done.

The last step is to implement the mapping method drawMarkers() in gmap.js.  It retrieves the state that the user chose in the dropdown and use it as the parameter to call the web service method getFunPlacesByState(state) asynchronously.  The callback function will receive the resulting list of Place objects and then use the Google maps API to draw them on the map.  To successfully make the web service call from JavaScript, it has to be registered in the Default.aspx like the following.

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
        <asp:ServiceReference Path="~/MapDataWebService.asmx" />
    </Services>
</asp:ScriptManager>

To make it more fun and improve the user experience, during the async web service call, a spinning progress icon could be display indicating that the data is being loaded.  Overall, no whole page loading is done and web page looks better.  If you are interested the sample solution and code can be downloaded GMapExample.zip.  Before you can compile and run this web site, go to http://www.google.com/apis/maps/ to register your API key and replace the place holder "YOUR_API_KEY" in file Default.aspx and App_Code/MapDataWebService.cs.

By the way, a comment about Google Maps API.  The markers manager is a convenient way of aggregating all the markers, but removing objects from the manager seems buggy.  Whenever the map zoom level is changed, all the removed markers come back on the map.  The markers in the manager are not controlled by the map.removeOverlay() either.  Other than that, the API works pretty well.

Sample code download: GMapExample.zip

Web , , , , , , , , , ,

innerHTML could invalidate the event handlers of its child elements

May 10th, 2007

In Javascript, using an element’s innerHTML property to dynamically edit its content provides much flexibility and convenience.  But special care needs to be taken when using it, because it could bite you silently.  Take one of my experiences as an example, it could break the event handlers of the child elements.  Sample code as the following:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>innerHTML</title>
</head>
<body>

<hr /><div id="myd"></div><hr />

<script language="javascript">
function myaction()
{
    alert("hello");
}

var d1 = document.createElement("div");
d1.onclick = myaction;
d1.innerHTML = "child div";

var d = document.getElementById("myd");
d.appendChild(d1);
//d.innerHTML += "parent div";
</script>

</body>
</html>

This code works well and when you click on div, "hello" will pop up.  However if you uncomment the last line of the JavaScript code.  The message won’t pop up any more.  innerHTML manipulates the content of the element as a string instead of DOM, so it might just break the underlying "wires" that hooks up the elements and their event handlers.  So watch out, when any of the events stops working as expected, look for the evil "innerHTML" first.

Web , ,

Live.com Zillow Gadget for Tracking Your Home Value

May 6th, 2007

I just created and published a new gadget on live.com called "Zillow Home Value Estimate".  Please give it a try!  The above link points to the gadget hosted on gallery.live.com.  If you are brave enough, you can also try the one I hosted on my own site by clicking the following link "Add the gadget to your live.com" or "Add the gadget to your live space".  I would normally upgrade the 2nd one quicker :)

Screenshot:

zillowGadget.jpg

If you are a home owner put this gadget on your own personalized live.com homepage, so you could closely monitor the value trend of your property.  Type in the street address and city/state (or zip code) of the real estate property that you are interested in, the zillow estimate (zestimate) and the 1 year value trend chart will appear on your live.com personalized home page.  To change the address, click on the underlined address itself and the editing functionality will show up.  The gadget uses zillow web services API to query the home value estimate.

A tip for developing live.com gadgets is beside publishing your new gadgets to the live.com gallery, you could also post a quick link on your own website/blog too so that the visitors can add your gadgets to their home page by a simple click on your site.  All you need to do is put a hyper link http://www.live.com/?add=URL_TO_YOUR_GADGET_XML_FILE for adding to live.com and http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=URL_TO_YOUR_GADGET_XML_FILE for adding to live spaces. For example: <a href="http://www.live.com/?add=http://stanley.jojoyao.com/live_gadgets/Zillow/ZillowGadget.xml">Add to Live.com</a> and <a href="http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=http://stanley.jojoyao.com/live_gadgets/Zillow/gadget.xml">Add to Live Spaces</a>

Web , , ,

Usability, Usability, Usability

April 29th, 2007

Just begin with some of the many good and bad examples of usability cases.  In google search, when you click the "search" button after typing in the keywords, at the top of the search result a tip will appear saying "Tip: Save time by hitting the return key instead of clicking on ’search’ ".  This approach is light footprint yet effective.  The users see the tip right after they did a "stupid" thing.  They have the motivation to try the tip right on the spot and found it really helped.  This whole process of stupidity->gotcha->cool happens in a streamline and I believe the user will remember the tip in the bone.

In live search, when users type in a non-English keyword, there are very small amount of snippets/summary for the non-English sites in its own language, which is not very international user friendly.  Those who typed in a non-English language keyword most likely know that language well enough to read the results in that language.  Having summary in the website’s native language is a very natural thing to do and an expected result for the users.  Even if the search engine is facing NA market, since there are a large number of foreign people in NA, having some degree of International language support makes sense.

The importance of usability is elevated to a even higher level in the web 2.0 era.  The center of computing is shifting from computers to human users.  After many years’ of advancement, computers begin to fade into the background as commodity.  The real power is organizing and combining exploding information generated by people and eventually used by people.  However, people are "lazy", "impatient", and "greedy".  Making the human users satisfied becomes more and more critical to the success of software and services providers.  The business model and vehicle to deliver the software and services in Web 2.0 era is so unique that contributes in "spoiling" the users too.  The barrier of entering and Web 2.0 industry is so low that a few good programmers with a good idea could make a very successful website.  The services of huge number of those websites are very innovative, powerful, and, more importantly, free most of the time thanks to the online ads business model.  The release and delivery of newer and nicer online services has so low impact to the users, with no hassle of installation, upgrading, or troubleshooting on the client side.  With all these things together, the users end up being the spoiled king!  They have so many choices and they are free.  So they can switch to any better product without much difficulty.  Now it’s time for the software and service providers to worry about the user experience their products bring to the customers.

One big resistance to achieving good usability is from the software developers.  Most of them are passionate about technology and tackling challenging problems, while feeling bored about non-technical stuff.  Being customer obsessed and having a mind set of building software for human instead for machines would be a very appreciated capability of an excellent software developer.  The new ways of organizing emails in gmail, the search engine keyword spelling correction feature, and so on are all from developers who made this step ahead.

Search Engine ,

Difference in Paradigm: Open Source .vs. Microsoft

April 28th, 2007

One can enumerate hundreds of difference between software from open source community and companies like Microsoft.  There are fundamental things that cause the difference – the paradigm of programming, the architecture of software family, and development productivity, etc.

On the server side development platform for example, popular open source tools are the well known LAMP.  Four pieces are done by totally different groups of people, on different time schedule, and with different design style.  They are all good products without doubt.  They work together very well for sure too.  Coding something on LAMP feels super geeky, because you control everything from top to the bottom.  Commercial software makers like Microsoft have some different considerations.  For good manageability, installation, configuration, migration, and so on mostly have easy to use (at least try to) GUI.  For productivity, many of the routines are abstracted and hidden away from the application developers.  For example, in ASP.NET, post backs, event handler registration, page templating and all those kind of wiring work is hidden.  Writing server side code feels more straight forward like writing desktop application.  ASP.NET really evolves from a programming language up to a server side framework.  With the Visual Studio .NET’s help like IntelliSense, debug tracing on both server and client side, visualized server control customization with sample data, and so on, developers are more free to focus on the business logic of the software, which is critical for business.

Talking about the hot AJAX.  Interestingly this technology was started by Microsoft when building the outlook web access.  Because it is majorly for business rather than the consumers on the Internet, it didn’t surface that much until Google Suggest and Maps made the splash with it.  To code in AJAX there are a lot of plumbing work underneath to wire up the connections between the client side scripts and the server side handler, AJAX for ASP.NET wraps all these up and provide a few straight forward abstract controls to improve the productivity of the application developers.

There are debates in many companies and organizations about Wiki and SharePoint too.  Again like the comparison between PHP and ASP.NET, SharePoint is more of a platform that contains Wiki features and many other capabilities.  Wiki starts out to do collaborative web content editing, while SharePoint is designed to be the collaboration platform which integrates with Office suites, workflow, enterprise search engine, content management, SharePoint Designer (visual design tool), etc.

Open source software products are simple, developer-enjoyable, and inexpensive upfront.  Commercial products are more business friendly, enterprise infrastructure oriented, productiviey oriented (sometimes productivity and developer-enjoyable are not well aligned :) ), and more expensive upfront.  They have much difference in the fundamental design paradigm.  Comparing the two different types of products really depends on the specific requirements rather than a religious belief.

Tech , , , , , ,

Open source protester in Bill Gate’s event in China

April 22nd, 2007

clipped from news.yahoo.com
Photo
  powered by clipmarks blog it

The behavior of this protester is not wise. I think this gives people a bad and impolite impression of the open source world. Also, why this guy’s looking down instead holding the head up high if he believes what he does is smart?

It was said that the protester is the chief representative of LPI (Linux Professional Institute) in China and assumed significant positions in some companies and organizations before that. But technology is technology instead of religion. Competition is good and boosts improvement in the industry. But proving it and speaking up is a smarter thing to do than acting like a clown in front of the world, unless his purpose is to make himself (instead of open-source) well-known. Be grown-ups!

Tech , , ,

A letter from Pandora founder – Help Save Pandora and Internet Radio

April 17th, 2007

It’s sad that the Internet radio is undergoing a struggle to survive.  Actually I found Pandora pretty nice that it incorporates some cool innovative search technologies to help you customize your radio station with your favorite genre, artists, and songs.  When playing your favorites, it will also try recommending other songs and artists that have similar characteristics according to your taste.  Great way to discover new songs.  By interactively rating on those recommended songs you help to continuously refine your customization.  The UI is pretty cute too by the way.  The following is the original letter the Pandora founder sent to many listeners:

Hi, it’s Tim from Pandora,

I’m writing today to ask for your help.  The survival of Pandora and all of Internet radio is in jeopardy because of a recent decision by the Copyright Royalty Board in Washington, DC to almost triple the licensing fees for Internet radio sites like Pandora.  The new royalty rates are irrationally high, more than four times what satellite radio pays and broadcast radio doesn’t pay these at all.  Left unchanged, these new royalties will kill every Internet radio site, including Pandora.

In response to these new and unfair fees, we have formed the SaveNetRadio Coalition, a group that includes listeners, artists, labels and webcasters.  I hope that you will consider joining us. 

Please sign our petition urging your Congressional representative to act to save Internet radio: http://capwiz.com/saveinternetradio/issues/alert/?alertid=9631541 

Please feel free to forward this link/email to your friends – the more petitioners we can get, the better.  

Understand that we are fully supportive of paying royalties to the artists whose music we play, and have done so since our inception.  As a former touring musician myself, I’m no stranger to the challenges facing working musicians.  The issue we have with the recent ruling is that it puts the cost of streaming far out of the range of ANY webcaster’s business potential. 

I hope you’ll take just a few minutes to sign our petition – it WILL make a difference. As a young industry, we do not have the lobbying power of the RIAA. You, our listeners, are by far our biggest and most influential allies.

As always, and now more than ever, thank you for your support.

tim_signature.jpg 
-Tim Westergren
(Pandora founder)

 

Web , , ,