With Internet Explorer 8 it’s easy to build Silverlight Web Slices; great examples of this are the OneRiot Today’s Hottest Video or MIX 09 Web Slice.
But…how does it work?
Let’s have a look to the “Imagine Cup Web Slice”, just uploaded to the IE Gallery. The slice has been written by Sergei Golubev, one of the most brilliant (ex-) Microsoft Student Partner around the world!
You can install it here.
I think the architecture is very interesting, as it include a lot of best practices.
(Click on the image for high res)
- The Web Slice aggregates several data sources: the IC RSS Feed, the IC Twitter tweets and the tagged images from Flickr.
SYNC (ICSlice.aspx):
- It use the Alternative Update Source to show updates in the Title. If the content changes, the title of the Web Slice will go bold and flash for a few seconds.
- The content of the Alternative Update Source is just the date of the last update of the data sources. This way we reduce the bandwidth needed for each sync.
- The back-end logic use a .NET Web Service, with an internal caching layer. This allow to avoid the common Twitter limit.
- The TTL is set to 15 minutes; this is how often IE will do a sync and check for updates.
VIEW (ICView.aspx):
- Client UI and logic written in Silverlight, using the Alternative Display Source.
- In case Silverlight is not installed on the machine, a graceful message will appear.
OTHER:
- The Bookmark link has been set to the Imagine Cup homepage.
- All the links in the Web Slice will open in a new tab (target = "_Blank”)
- The entire project is hosted on Windows Azure. Free, cool, easy. Just awesome.
Check out this blog for the source code! Coming soon…
Adaptive Blue recently released the Glue Toolbar for Internet Explorer 8. Glue helps you discuss things you are interested in with your friends around the web; it connects conversations, recommend new books, music or movies to your friends…and reveal what things users are paying attention to as they browse the web.
This is how Alex, one of the mind behind this very sophisticated architecture, commented the development of Glu:
“This is seriously, one of the most challenging projects in my 15 year software of software engineering. The good news is that resulting product is elegant, sharing 90% of common core code with 10% adapters for each platform. Yet more satisfying is the performance on IE8 is the same as on Firefox.” (Alex Iskold, AdaptiveBlue)
Here’s the steps to try out Glue:
- Install Internet Explorer 8
- Install Glue Toolbar for IE8
- Create an account
- Browse to your favorite site (for instance, www.amazon.com)
- You’re done! You can now view your friends suggestion, give your 2 cents tips, …
Ok, but how all this work? Alex has already written a few posts to go through the API, and I know is preparing an article to share his experience with this project. In the meantime, using the Developer Tools integrated in IE8, I did my homework :-)
When you visit a site, Glue append dynamically a small script to the page; you can see how this script asynchronously retrieve the complete Glue library, which is a proxy to the logic developed within the BHO component and the Glue web services. It’s a very clean approach, which allow AdaptiveBlue to extend any site without affecting the existing behaviors or functionalities.
I find this toolbar very attractive, specially if you have hundreds of friends in your social networks :-)
The next step is probably to build an IE8 Accelerator or an IE8 Web Slice connected to Glue. Anyone from the community want to take the challenge?
Well done Adaptive Blue!
Creating Web Slices is extremely easy and fast, and at the same time it can provide amazing results. In this post I will show how the Swine Flu Web Slice has been created (in less then one hour!). The full project with source code is provided at the end of this post.

Before starting, you need a website (unless you already have one). For the sake of this scenario, we will use Microsoft Visual Web Developer 2008 Express Edition to create an ASP.Net Web Application.
Step 0: Define the Architecture
IE8 Web Slices development is described in detail in this MSDN Article. In this scenario we want to have full control over the Web Slice content, so we will use an Alternative Display Source. We also want to customize the update and notification mechanism, so we will implement an Alternative Update Source. The overall architecture looks like this:
.gif)
Step 1: Creating the Preview page (aka Alternative Display Source)
The first step is creating a standard web page (Default.aspx ), that will be used by IE8 for the Web Slice preview; the content of this page can be pure HTML, CSS, JavaScript…but also Silverlight or any other ActiveX available on the machine.
In talking with the CDC (Centers for Disease Control and Prevention) and the WHO (World Health Organization), they available made two data feeds:
Those feeds are downloaded and parsed in the code behind of the page, as follows:
private static DateTime GetLastRssUpdate()
{
using (WebClient client = new WebClient())
{
string content = Encoding.ASCII.GetString(client.DownloadData(Rss_Feed));
XmlDocument rssDoc = new XmlDocument();
rssDoc.LoadXml(content);
HttpContext.Current.Cache.Insert("SwineFluRssFeed", content);
return DateTime.Parse(rssDoc.SelectSingleNode("/rss/channel/item")["pubDate"].InnerXml);
}
}
Note that we are caching the feed on the server side, in order to improve the network performance. Once we have the data, we can use the ASP.Net Framework and LINQ to bind the data to our UI.
private void BindRssFeed()
{
string content = Cache.Get("SwineFluRssFeed") as string;
XDocument rssFeed = XDocument.Parse(content);
rssList.DataSource = (from item in rssFeed.Descendants("item")
select new
{
Text = Short((string)item.Element("description")),
Url = (string)item.Element("link")
}).Take(5);
rssList.DataBind();
}
Step 2: Creating the Update page (aka Alternative Update Source)
The second step is to customize a few properties of the web slices and define the logic that will notify the user when there is an update.
In order to do this, we will use a second page (SliceUpdate.aspx ).
<body>
<div class="hslice" id="SwineFlu">
<div class="entry-title" style="display: none">
Swine Flu Updates
</div>
<a href="http://visitmix.com/WebSlices/SwineFlu" rel="entry-content" style="display: none" />
<a href="http://www.cdc.gov/swineflu/" rel="Bookmark" style="display: none" target="_blank" />
<span class="ttl" style="display: none">15</span>
<div class="entry-content" runat="server" id="updateTrigger">
</div>
</div>
</body>
Let’s have a look more in detail to each section of the body:
- class=”hslice” id=”SwinFlu”: by setting this specific CSS tag and an unique id, IE8 will recognize and threat this section of the page as a web slice.
- entry-title: define the title of the web slice, that will be visible in the Favorites Bar.
- <a rel=”entry-content”: this page, defined in the previous step, will be used for the preview window.
- <a rel=”Bookmark”: IE8 will open this link when the user clicks on the blue arrow.
- <span class=”ttl”>15</span>: we are setting an update interval of 15 minutes.
- <div class=”entry-content”>…</div>: IE8 (in the background) will download the SliceUpdate.aspx page every 15 minutes. If the content inside this div element is updated, the title of the web slice in the Favorites Bar will blink and will become bold. In this scenario, this div contains only the DateTime of the last tweet or post (from the two feeds); this information is enough to trigger updates and it minimize the bandwidth needed.
Step 3: Making the Web Slice Discoverable
The last step is to make the web slice discoverable. The CDC will soon include the web slice on their main site; in the meantime, the slice is available on the IE8 Addons Gallery.
The “Add to Internet Explorer” button calls a simple JavaScript function.
<button onclick="window.external.AddToFavoritesBar(
'http://visitmix.com/WebSlices/SwineFlu/SliceUpdate.aspx#SwineFlu',
'Swine Flu Updates',
'slice')">
Add to Internet Explorer
</button>
Note that the AddToFavoritesBar function point to the Alternative Update Source page followed by the ID of the slice (SliceUpdate.aspx#SwineFlu).
Conclusion and source code
That’s it! With a couple of RSS feeds and a bunch of lines of code we made a very useful web slice!
The best part is that this Web Slice can easily be customized to show any other RSS or Twitter feed! ;-)
You can download the full project with the source code here.
You can preview the slice here.
Happy coding!
A question I’ve been asked recently is “How can I detect IE8 using JavaScript?”. There are several ways to accomplish this task, and each one will have his pros and cons. In this post I will show the best practices to detect IE8 on real world scenarios.
If you have any feedback or you would like to suggest an alternative method, please feel free to add a comment to this post.
Detect the IE rendering engine
In the past, the Version Token (the token of the User Agent string which looks like “MSIE 7.0”) used to be a clear indicator of the browser version (IE6, IE7, …). Today, since IE8 include 3 rendering engines (IE8 Standards, IE7 Compatibility, IE6 Quirks), IE8 will set the Version Token dynamically, based on the user compatibility settings for each site.
For instance:
- Using IE8, if the site is in the compatibility list view, the VT will be MSIE 7.0
- Using IE8, if the site is in the compatibility list view, and the site owner used the X-UA-Compatible meta tag with “IE=8”, the VT will be MSIE 8.0
- Using IE8, if the site is NOT in the compatibility list view, the VT will be MSIE 8.0
- If you are debugging a site using the IE8 Developer Tools and you set the Document Mode to IE7, the VT will be MSIE 7.0
- Using IE7, the VT will be MSIE 7.0
As you can see from the previous examples, the VT shows what rendering engine is used by IE to display the site...no matter the version of the browser.
function getInternetExplorerVersion() { var rv = -1; // Return value assumes failure.
if (navigator.appName == 'Microsoft Internet Explorer') { var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); if (re.exec(ua) != null)
rv = parseFloat(RegExp.$1);
}
return rv;
}
function checkVersion() { var msg = "You're not using Windows Internet Explorer.";
var ver = getInternetExplorerVersion();
if (ver > -1) { if (ver >= 8.0)
msg = "You're using a recent copy of Windows Internet Explorer."
else
msg = "You should upgrade your copy of Windows Internet Explorer.";
}
alert(msg);
}
Check this MSDN article for more information about this function.
Detect if Web Slices, Accelerator, Visual Search are supported by the browser
The previous function will not tell us if the Web Slices, Accelerators and Visual Search are supported by the current browser (remember, those features always work in IE8, regardless the rendering engine adopted).
In general, the best practice is to check if each feature is supported by the current browser; this statement might sound generic or “too complex”. However, since web standards and browser keep evolving, it’s not possible to know today if a feature will be supported from the same (or other browsers) in the future. Obviously this concept applies to either Internet Explorer, Firefox, Opera, ….
In particular, I recommend to use the following functions:
function WebSliceSupported { return (typeof (window.external.AddToFavoritesBar) != "undefined");
}
function AcceleratorSupported { return (typeof (window.external.AddService) != "undefined");
}
function VisualSearchSupported { return (typeof (window.external.AddService) != "undefined");
}
NOTE: in case you are adding web slices to your site, I recommend to build them for any browser (they will be transparent to other browsers…); or, if you want to send them only to IE8, you should detect the browser on the server side.
Detect IE as browser
There are scenarios where you might still want to know the version of IE installed on the machine. For instance, let’s say you want to suggest your users to upgrade from IE6 to IE8.
In this case, the best client-side solution is to check if the query string contains the new token “Trident 4.0”.
function IsIE8Browser() { var rv = -1;
var ua = navigator.userAgent;
var re = new RegExp("Trident\/([0-9]{1,}[\.0-9]{0,})"); if (re.exec(ua) != null) { rv = parseFloat(RegExp.$1);
}
return (rv == 4);
}
NOTE: since the Trident number will most likely change in the future, we don’t recommend to use this function as an indicator of web slices, accelerators or visual search support.
Other useful resources
IE Blog: IE8 User Agent string
Version Vectors
Happy detection!
You’ve seen the new IE8 features on a website, on a video, on the IE Gallery, on Channel9, on a blog, on your friend’s pc…and you are interested to build your own version?
Here’s a few links to start!
More info available here.
Internet Explorer 8 brings a lot of new features to web developers. Check out these free Virtual Labs if you want to know more!
|
|
Virtual Lab |
Manual |
|
Building Web Slices with Internet Explorer 8 |

|

|
|
Preparing for Internet Explorer 8- Application Compatibility |

|

|
|
Using Accelerators and Web Slices in the Enterprise with Internet Explorer 8 |

|

|
|
Creating Accelerators In Internet Explorer 8 |

|

|
|
Internet Explorer 8 - Debugging and Application Compatibility |

|

|
|
Internet Explorer 8 Improved Programmability |

|

|
|
Using New AJAX Enhanced Layout Standards Support with Internet Explorer 8 |

|

|
Technorati Tags:
IE8,
Lab,
Tutorial
You’ve probably already seen how Internet Explorer 8 Accelerators allow you to perform searches very quickly on the web. What about going one step ahead, showing a video preview instead of a “plain text” result? Check out the result!
A- Add the MSN Accelerators
B – Test it here :-)
- Hello World
- Dream Theater
- Metallica
- Bon Jovi
- Bill Gates
- Roberto Benigni
- Back to the future
- Ask a ninja
C – Look and download the code
Now that you’ve seen the accelerator in action, let’s have a look at the code behind.
You will notice that – for this sample – I’ve written only client side code (Javascript), using the free Visual Web Developer 2008.
The complete source code of this sample is available here.
MsnAccelerator.xml
<openServiceDescription xmlns="http://www.microsoft.com/schemas/openservicedescription/1.0">
<homepageUrl>http://localhost/MsnAccelerator</homepageUrl>
<display>
<name>Play with MSN</name>
<icon>http://localhost/MsnAccelerator/favicon.ico</icon>
</display>
<activity category="Play">
<activityAction context="selection">
<preview action="http://localhost/MsnAccelerator/MsnPreview.htm?sel={selection}" />
<execute action="http://localhost/MsnAccelerator/MsnSearch.htm?q={selection}" >
</execute>
</activityAction>
</activity>
</openServiceDescription>
The Accelerator descriptor contains the details of our accelerator. In this case we are creating a new accelerator in the custom category “Play”; the accelerator will send the selected text to MsnPreview.htm page through the sel parameter.
MsnSearch.htm
This page will be called when the user click on the “Play with MSN” menu; in this scenario I’m redirecting the user to the existing search page on the msn.com website (providing the current search keyword in the querystring).
Discover.htm
The code required to add the accelerator is easy as follow.
<button onclick="window.external.AddService('MSN.xml')">
Add MSN Video Accelerator
</button>
MsnPreview.htm
The preview is probably the most interesting and powerful part of an accelerator, since it can show really rich content using any client language (HTML, Javascript, Silverlight, Flash, ….).
In this scenario I’m performing the following operations using Javascript, in order:
- Get user selection
- Search video on msn.com
- Build player control
Let’s break it down to functional peaces.
1- Get user selection: the selected text is provided to the preview page through the sel parameter of the querystring, as described previously.
function getQueryStringParameter(param) {
var qs = window.location.search.substring(1);
var ps = qs.split("&");
for (i = 0; i < ps.length; i++) {
var p = ps[i].split("=");
if (p[0] == param) {
return p[1];
}
}
return null;
}
window.onload = searchVideo;
2- Search video on msn.com
Going around the live.com site, I found that the following url perform a search on msn.com, returning the result as RSS feed.
http://edge4.catalog.video.msn.com/Search.aspx?q=QUERY&responseEncoding=rss
Due to cross-domain restriction with the server (remember, we are doing the call client side here), I created a pipe (using Yahoo Pipes) that will return the result of my query using JSON format. Note that this is just one of the possible ways to do this; if the server supported cross-domain requests, I would used instead the new XDomainRequest.
function searchVideo() {
var selection = getQueryStringParameter("sel");
if (selection != null) {
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://pipes.yahoo.com/pipes/pipe.run?_id=VjRuAucf3hG8ewtoZcag4A&_render=json&run=1&sel='
+ selection +
'&_callback=getVideo';
document.getElementsByTagName("head")[0].appendChild(newScript);
}
}
function getVideo(feed) {
var result = feed.value.items;
if (result != null && result.length > 0)
buildVideo(result[0].content);
else {
setContent('No result found.', true);
}
}
As you can see in the following picture, the pipe will get the feed, extract the first item and return only the guid value through the designated callback.
3- Build player control
The last step, given the id of the video, is to build dynamically the video player and add it to the page.
function buildVideo(id) {
var video = document.createElement('embed');
video.src = 'http://images.video.msn.com/flash/soapbox1_1.swf';
video.type = "application/x-shockwave-flash";
video.flashvars = "c=v&v=" + id + "&ifs=true&ap=true"
video.width = "320px";
video.height = "240px";
video.allowfullscreen = "false";
setContent(video);
}
That’s it! With a bunch of JavaScript code, I now have a very powerful accelerator.
The complete source code of this sample is available here.
D – Next step
Exercise to the reader: it would be interesting to improve the UI and show more than one video result, maybe using Silverlight ;)
If you want to know more about IE8 Accelerators or you want to build your own, I recommend reading the following resources:
Ciao!
Technorati Tags:
IE8,
IE,
Accelerators
Disclaimer: the accelerator in this post is not supported by the writer, neither by MSN or Microsoft. They are rather provided as is, for the sake of learning and having fun :-)
If you missed the funny Internet Explorer 8 video at MIX, you can watch it again here…together with a funny collection of…well, you will see :-)
IE8 is back! As we announced last week at MIX, Internet Explorer 8 RTW has been released. You can download it for Windows Vista, Windows XP or Windows Server here: http://www.microsoft.com/ie
If you missed the Lap Around IE8 session at MIX 09, you can watch it here:

As an high level summary of the session, we went through some of the new features of Internet Explorer 8:
- IE8 is CSS 2.1 fully standards compliant and include features from CSS 3 and HTML 5 as well. This is a huge improvement over previous versions (and, as you can see in the session, we are succeed more CSS 2.1 tests than any other browser) and allows website to be more interoperable across different browsers. You can see the 7201 test cases we contributed to the W3C Community here.
- IE8 has compatibility built-in features that allows you to run website designed for older browsers without compatibility issues, using the X-UA-Compatible meta tag.
- IE8 is fast, is really fast. Check out the performance video to see with your eyes how IE8 compares to Firefox or Chrome. Or test IE8 on your machine :-)
- IE8 include new user features, such as Web Slices, Accelerator and Visual Search that allow a better and faster navigation and experience over the web.
- I will share soon on this blog the source code for the MSN Video Accelerator, the Twitter Web Slice, the Hulu Visual Search and many other…
- IE8 include Developer Tools in-the-box, that allows you to debug, test, profile the CSS, HTML and JS code in any website.
- IE8 is the most secure browser available today, with 18 new security features that prevents Malware, Click Jacking, …
Still at MIX, the IE team delivered other great sessions about Javascript Performance, Security, User Experience…check them out here:



I’m really excited for this release. I’m looking forward to receiving your feedbacks!
Thanks,
Giorgio
This year I have the pleasure to present the A Lap Around Internet Explorer 8 session at MIX.
In this session, you’ll hear the inside story behind the development of Internet Explorer 8. We’ll show you how to develop innovative user experiences with Web Slices, Accelerators and Visual Search. You’ll discover nearly twenty new security enhancements that make browsing safer than ever, and you’ll find out about performance improvements that will help you build faster AJAX applications. Finally, we’ll show you why we think Internet Explorer 8 is one of the most standards-compliant web browsers on the market.
Note: this is a session for devigners* from a devigner. I WILL use Visual Studio during the presentation. :)
* Devigner = Developer + Designer
See you in Delfino 4103, 10:30, Thursday March 19.
Check out the agenda of the other IE sessions and parties!
The MIX website has been IE’fyed! :) If you go to http://2009.visitmix.com/ (using Internet Explorer 8 of course ;), you will notice two new user features:
1) You can subscribe to the news from MIX and see at any time the news, the tweets going on around MIX09 and a video feed. All inside a Silverlight Web Slice!


2) You can search sessions and speakers through the integrated Internet Explorer 8 MIX Visual Search Provider.
Want to know more? Join my session at MIX for the code behind…
Check it out!
About one year ago, almost at this same time, I’ve been given the opportunity to attend MIX 08. I’ve been in many places and conferences…but that was my first, ever, MIX: I don’t think to have the words to describe the super-extra-gorgeous-awesome-fantastic experience I had there! I can say – without any doubt – that MIX 08 changed my point of view, my career, my life.
This year I’d like to offer the same experience to someone out there. I will give away 1 FREE pass to MIX (FYI, the pass include the conference ticket, breakfast, lunch, parties, bag, bits, …but not the hotel and the flight). Btw, the value of the ticket, according to the latest stock report, is about $1400 :)
If you are interested (to change your life, OR just to get a free ticket :))…this is what you need to do:
“Share a creative picture about Internet Explorer”
The following rules apply:
- You can take a picture with your camera, use
Photoshop Paint, use your phone, a pencil, oil on canvas, the sand …or any other “tool” you can image. - You will need to upload the picture online (i.e. use SkyDrive) and add a comment to this post with the URL to the picture. I will not accept entries sent by email.
- The picture must be original.
- You will need to include your email address (I’m not going to send you any spam, I promise :P).
- Submission deadline: February 23rd, 20:00 pm PST
On February 24th, I will review all the entries and choose the best one. My criteria will be:
- Original: try to be as much creative as you can. I like people thinking “out of the box”
- Appropriate: the theme is IE (*). I need to get the “Internet Explorer” idea somewhere in the picture (either the background, a big label, a tattoo,… but also a Web Slice, an Accelerator… ;))
- (*): you can target IE5…but IE8 will give you more points!
- Quality: I don’t expect picture with a 6000x4500 resolution…but at the same time I will not consider blurred pics.
If you are looking for inspiration, you can start from the IE website or the new IE Add-on Gallery.
Have fun!
To summarize with one picture the great recap of the Compatibility View written by Scott on the IE blog…
…you can make your site compatible with IE8 just adding the META tag:
<meta http-equiv="X-UA-Compatible" content="IE=…." />
Internet Explorer Compatibility Center: msdn.com/iecompat
If you are using the ASP.NET Menu control, you might encounter under certain circumstances an issue where the menu appears as a white box in IE8 Standards Mode.

What IE8 is doing IS correct (by design), in the sense that in Standards mode IE8 is following the standards. Specifically, (element).currentStyle.zIndex returns "auto" in Standards mode when zindex has not been set. The ASP.NET Menu control assumes a different value.
I’d like to suggest a few possible workarounds to solve quickly the issue (note, you can use either one of them, depending on your scenario):
- Overriding the z-index property
- Using CSS Friendly Control Adapters
- Adding the IE7 META tag to the website
1 – Overriding the z-index property
You can manually set the z-index property of the Menu items using the DynamicMenuStyle property of the asp:Menu control (note lines 9-14 and 20). Full source code is:
1: <head runat="server">
2: <title></title>
3: <style type="text/css">
4: body
5: { 6: background-color: Silver;
7: }
8: </style>
9: <style type="text/css">
10: .IE8Fix
11: { 12: z-index: 100;
13: }
14: </style>
15: </head>
16: <body>
17: <form id="form1" runat="server">
18: <div>
19: <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
20: <DynamicMenuStyle CssClass="IE8Fix" />
21: </asp:Menu>
22: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
23: </div>
24: </form>
25: </body>
This solution is the least intrusive, but it require a page-by-page update (unless your menu is a Master Page).
2 – Using CSS Friendly Control Adapters
Thanks to Tim for this solution. In order to add the CSS Friendly adapter to your project, you will need to:
- Download CSSFriendly.dll and CSSFriendlyAdapters.browser from here.
- Inside your project, add a reference to CSSFriendly.dll.
- Add the special folder App_Browsers to your project, and copy the file CSSFriendlyAdapters.browser.
The CSS Friendly Control Adapters will render all the listed controls (Menu, TreeView, DetailsView, …) using CSS and HTML standards.
3 – Add the IE7 META tag to the project
By default, Windows Internet Explorer 8 will attempt to display content using its most standards-compliant mode, the IE8 Standards mode. However you can still switch to the IE7 Standards mode adding a particular META TAG to the head of the page:
1: <html xmlns="http://www.w3.org/1999/xhtml">
2: <head runat="server">
3: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
4:
5: <title>IE8 ASP.NET Fix</title>
6: </head>
7: <body>
Using the tag, the website in IE8 will look and work in the same way as it does in IE7.
You can do a “live test” of this feature without the need to modify the page, using the new IE8 Developer Toolbar (press F12 to open the toolbar, and switch the Document Mode to IE7 Standards).
Note that you can set up the META tag at page level, at web.config level, or in IIS, or in Apache, …
What happens next?
The ASP.NET team is currently working on this issue and we will most likely create an official KB to address this issue before IE goes RTW.
EDIT: Hotfix are now available. Check here.
Thanks to all the community feedbacks we received so far.
Technorati Tags:
ASP.NET,
Menu,
IE8
Internet Explorer 8 Release Candidate 1 is finally available! In order to get started with all the news, I suggest you to:
- Download and Try it!
- Read the official IE Team announcement
- Go to the updated portal at http://msdn.com/ie for tons of developer content
In particular I recommend those pages:
Once again, well done IE Team!