More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  John Liu .NET: Time for ...ProfileFriendsBlogMore Tools Explore the Spaces community

John Liu .NET: Time for Fun in .NET

dotnet - silverlight/wpf - consulting - games

Sharing a little gem - ASP.NET Javascript String.format

When you are working with ASP.NET 2.0, Microsoft injects quite a bit of Javascript framework stuff.  Most ASP.NET developers don't dive into these libraries and thus never know the gems that Microsoft has added in their Javascript framework.

I'm just going to share a little gem today, Microsoft has implemented a full version of the String.format in Javascript - in the same style as the .NET counterpart.

So in Javascript, you can do:

 

String.format( "{0:d}", new Date() );

or

String.format( "{0:c}", 100 );

Do watch out these values are localized to your current culture - whether it's [en] or [en-us] or [en-au], these are set in your browser's settings.

Have fun!

jliu

New MacBook to have glass trackpad (End of September)

Source
http://blogs.computerworld.com/rumor_macbook_updates_to_include_glass_trackpad_other_goodies

I've got to say the multi-touch glass screen on the iPhone is pretty neat - and I've seen the multi-tracking trackpad on the macbook.  Tristan Kurniawan owns one.  Couple of other guys in the office already have, or are getting their MacBooks soon and dual boots daily.

Personally I'm still not convinced the MacBook is worth twice the cost of other notebooks such as offerings from Dell, Acer or Asus.  A typical dual-core laptop with 4GB ram and readyboost should be able to handily out perform a MacBook any day.

But anyway, with all the chatter about touch trackpads, here's my prediction for 2010:

 

Year 2010, Steve Jobs unveils the MacBook Super Touch Pro.  There is no keyboard or trackpad for this MacBook, the touch keyboard functions as:

  • on screen keyboard + trackpad
  • artpad
  • finger print scanner
  • a numeric keypad is available and slides in from the right (or left-hand) with a simple swipe gesture
  • additional keys can be added and removed from the virtual keyboard
  • keys can be resized.  commonly used keys have a slightly larger detect surface - but you won't see it because SteveJ would rather die than to show a keyboard with non-identical-sized keys.
  • the keyboard is backlit (or how else would you be able to see the keys)
  • There is no gap between the keys so dirt can't get in
  • Water / coffee resistant
  • The thickness of the MacBook is further reduced down to 2cm.  Making this the Thinnest Laptop Ever (tm).
  • The MacBook dissipates some of the heat via the glass keyboard panel so it keeps your hands warm in the winter.
  • The two areas where the palm rests can be configured to show your todo-list, mail inbox, ipod play list, or photos of your loved ones (defaults to your idol SteveJ of course).

In other news, Microsoft complained that this was the same surface technology they've demo'ed 5 years ago in 2005 (but never worked out how to sell it properly).

In yet more other news, Homer complains that he can no longer use the drinking bird to press the Y-key on his MacBook.  Because the keyboard detects human touch only.

jliu

HTML map and area tags not working for FireFox

Here was an interesting problem, what was wrong with the following code, which works fine in IE but not in FireFox

<map id="mymap">
<area ... />
<area ... />
</map>

<img usemap="#mymap" ...>

It appears that FireFox doesn't understand the id attribute and the name attribute is required.  According to W3C recommendations, http://www.w3.org/TR/REC-html40/struct/objects.html#adef-usemap the usemap attribute should match the name attribute of the map tag.

Try this instead:

<map id="mymap" name="mymap">

Customizing CSSLink and ScriptLink for public Sharepoint site

MSDN has quite a thorough topic on optimizing a Sharepoint Server for public facing site:

http://msdn.microsoft.com/en-us/library/bb727371.aspx

I would just like to add a few more points and share some thoughts on our experiences of customizing for performance in addition to this guide.

  1. Design your Sharepoint website with performance in mind.  If you had it as an after thought and think "ooh, I'll just add performance bits at the end", then your options are far more limited.  Not to mention the extra testing time you'll need.  If you are in this situation, I'd say just stick with the caching options.
  2. Most visitors to a public facing site would be anonymous users - in fact, only a very small percentage of people may actually want to modify the website.  So switch on anonymous login and start your optimizations there
  3. The easiest bits to set up are the caching options for Sharepoint.  Sharepoint Server 2007 provides 3 means of caching:
    1. Page Output Caching - this is basically ASP.NET output caching, wrapped within Sharepoint.  Follow the discussion in the article above will get you sorted.  This has the biggest performance improvement for large amount of anonymous visitors.
    2. Object Caching - this is Sharepoint caching recently accessed object's properties (and lists) so that Sharepoint doesn't have to re-access them from Database.
    3. Binary Large Objects (BLOB) caching - this is Sharepoint caching large objects that are otherwise stored in the database on a file server.  Things like pictures, javascript files, audio, SilverLight, Flash, movies, etc.  This has to be set via the web.config (defaults to 10 GB of space allocated for this).
    4. OK, these are the easy stuff - read the MSDN link if you need instructions to set this up.
  4. The article further discusses rendering core.js for only authenticated users.  This takes a bit more effort to figure out.
    1. The idea behind the RegisterCoreWhenAuthenticatedControl is good, but proper implementation requires understanding of how ScriptLink works.
    2. A ScriptLink control can be specified on the page at one point, and subsequent ScriptLink.Register will add more scripts to be added at that point.
    3. A ScriptLink control will always register core.js unless it is in minimal mode
    4. To create a ScriptLink in minimal mode, create one in the markup without the name attribute (yes.  this is really cryptic - here's why you need Reflector)
    5. <Sharepoint:ScriptLink runat="server"/>
    6. Follow by the control specified in the article:
    7. <NoCoreLoad:RegisterCoreWhenAuthenticatedControl runat="server"/>
  5. We took the idea a bit further and thought if we can get rid of the core.js file, how about get rid of the core.css file too, or in fact, anything.  What we need is a wrapper container of some sort.
    1. There are two related classes for CssLink
    2. The CssRegistration class adds CSS files to the Sharepoint context
    3. The CssLink control renders all CSS files added to the Sharepoint context
    4. The CssLink can have additional DefaultUrl and AlternativeUrl specified,  but it will always render the core.css file.  There is no minimal mode
    5. The way we use is to create a wrapper container for CssLink

      public class AuthenticatedPanel : Panel
      {
          protected override void Render(HtmlTextWriter writer)
          {
              if (HttpContext.Current.Request.IsAuthenticated)
              {
                  base.Render(writer);
              }
          }
          public override void RenderBeginTag(HtmlTextWriter writer)
          {
              //disable rendering <div>
              //base.RenderBeginTag(writer);
          }
          public override void RenderEndTag(HtmlTextWriter writer)
          {
              //disable rendering </div>
              //base.RenderEndTag(writer);
          }
      }
    6. <AuthenticatedPanel>
          <CssLink runat="server"/>
          <CssRegistration runat="server ... />
      </AuthenticatedPanel>

      <link rel="stylesheet" type="text/css" href="...path" />
  6. I like the AuthenticatedPanel that we created a lot more than the RegisterCoreWhenAuthenticatedControl - it is far more flexible in terms of the control we get on what gets rendered on the page at the end.

Good luck!

The best way to learn to customizing Sharepoint for an ASP.NET guy - use Reflector

This is probably the best best tip I'm going to share so far with regards to Sharepoint.

Think of Sharepoint as a pre-built framework on top of ASP.NET, if you are working within the confines of the multitude of options Sharepoint gives you, then you need a big thick book on Sharepoint.

If you are thinking about customizing Sharepoint, then you're beginning to face a problem I had.

How does it all work, and perhaps more importantly, why does it just not work?

You can resort to Google.  In which case, I hope you find this blog.

Or you can grab Reflector and peek inside the secrets of Microsoft.Sharepoint (WSS) and Microsoft.Sharepoint.Publishing (MOSS) assemblies.

I'll share with some findings real soon.

Tough to love Sharepoint

Recently started doing some work on Sharepoint, it's really tough to love Sharepoint.

At a glance, it seems that this is just a technology that's build on top of ASP.NET, so surely it's got all the goodness of ASP.NET + more build-in goodness.

Actually, I'd almost say it's the opposite.

It's got all the goodness of ASP.NET locked away where you can't easily use to customize your solution.

So if you are after something out of the box with light modifications, Sharepoint is really your friend.

As soon as you want heavy modifications, it feels like a complete road block.

Still, it has some really great publishing features, which distinctively makes it very compelling for an enterprise to use and set up.

I'll have more to say very soon.

Where is the DataRepeater for Silverlight?

I came across a really puzzling thing while playing with Silverlight tonight, try as I might, I couldn't find a DataRepeater style of control.

Basically, this is what I wanted to do:

<StackPanel x:Name="actions" Margin="10,0,10,5" Orientation="Horizontal" >
    <HyperLinkButton Content="{Binding ActionName}" Click="Action_Click" />
</StackPanel> 

And then bind these to an array of actions in the datacontext.

Sadly, StackPanel doesn't support ItemTemplates, and looking around, it seems that the only controls that supports binding collections properly are ListBox and TabControl.

The Grid control is purely for positioning.

The ItemsControl (and the child class ListBox) supports ItemTemplate, but refuses to tile my hyperlinks one after another horizontally, until the width is full and it wraps around.

Bummer.

I've settled temporarily with adding the HyperLinkButtons in the codebehind inside a foreach loop.  But not using databinding for this task makes me sad.

I will get to the bottom of this.


 

Starting another journey, again

I've finished one leg of my journey at Oakton www.oakton.com.au and have decided to return to my old company www.ssw.com.au to continue my consultant dream.

The reasons are long and numerous, but I'd just say that the biggest factor is there was a really good situation for me and I grabbed it before the window of opportunity disappeared.

In a sense I feel I've learned a lot in the three years I've spent wandering around in the wilderness, I've experienced:

  • Product development - where I'm not doing consultant work
  • Contract work - where there's excellent money but difficult career progression, or choice of technology
  • Working with teams on different time zones
  • Big team development - working in a 20-man team is fun too, but with lots of draw backs.
  • I've worked with proper BA now.  Finally!  Big thank you to the Vero BA's, you know who you are, wherever you are now.
  • Big complex organisations
  • Enterprise level projects
  • I nearly jumped in with a startup and would have definitely done some fun stuff, but I just don't know if I'm ready to settle down on one project

But some things remains the same

  • Agile rocks
  • Waterfall flops
  • Unit-testing is great
  • But hard to do in a web app
  • Windows application is sweet
  • Until you gotta deploy

(Thanks to Dinesh for fixing the rhyme on "flops" for me - second line)

I leave my old colleagues with what I've always firmly believed consultants do

  • We work hard, we write good code, and at the end of the day, the clients are happy and we are happy.

So with a happy fondness for all the great memories, I bid my old colleagues farewell for now.

Your windows service started and stopped

The name-of-your services on Local Computer started and stopped. Some services stop automatically if they have no work to do, for example, the Performance Logs and Alerts service.

I had fun with this one for a bit.  Developing Windows Service is one of those "I rarely do this" activities.  So when I got one of these errors when I start my service, immediately I switch into "Ah I must have forgotten something" mode.

  • May be the process started and didn't do anything and finished
  • May be the timer didn't go off
  • Perhaps I need to spawn a thread to listen / sleep

I couldn't attach a debugger to the service given that it doesn't stay running.  So that limited my options a bit.

Turns out, the "informational message" was pretty misleading, I had the following in my event log.

Service cannot be started. System.NullReferenceException: Object reference not set to an instance of an object.
   at MyService.MyService.OnStart(String[] args)
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

Oops.

Fixed that error, and the service starts successfully.

this.consulting.life

Being a consultant is:

  • Walking on a tight rope
  • Crazy business requirements people on one side
  • Poor internal dev teams (the maintenance guys) on the other side
    • I try to be nice to my fellow devs, they deserve a great system to work with, not a hacked up thing
  • Dual-Whip-wielding project managers chasing you from behind (think: Balrog)
    • (Though to be honest, they are probably chased by stake holders)
  • And if your project is slightly short on money, you might as well dose the whole circus in petrol and set on it on fire.

---

Mark: When you charge a fortune

Mark: The clients expect a miracle

John: So we are "miracle workers"

Mark: Pretty much

---

Client: We have a situation here

Client: One miracle worker may not be enough

Client: We need a team of Moses, to part the Atlantic ocean, cause this thing is sinking pretty fast

---

There are good consultants and great consultants.

  • There are crap ones - those that talk a lot and never get anything done.  To me these people should stop dirtying our work and go find something else to do - they give consultants a bad name.
  • There are good ones - those that gets things done but are too expensive.
  • I don't defend the cost of consultants - the service and the skills are what's being paid for.  But I think a great consultant is one that gets things done, and simultaneously manages the client's expectations appropriately.

---

A consultant (especially an expensive one) is a secret weapon used (usually by newly-appointed upper management) to wedge open layers of old office politics to introduce change.

It is often excruciating for the consultant.

A consultant has to preach new technology, methodologies and win converts.

People do not like change.  They will resist change.

Sometimes they will threaten to leave, and blame it on the consultants.

Ultimately, the company will realize the changes were for the better, but the consultant is never around by then to see the benefits come to fruition.

---

A process takes an internal dev guy 5 days to do.  Because he needs several permissions and find a time that's suitable for everyone involved to have a meeting.

It usually takes an external consultant 2 hours to come to the same decision.  Because an expensive consultant is too expensive to keep around for 5 days.  Management will move mountains, switch appointment times, even *gasp* cut short their lunch break to make a meeting.

Price tag is everything.

Quick tip: Initialising Dictionary inline

var dictionary = new Dictionary<string, string> 
{ 
    { "key1", "value1" }, 
    { "key2", "value2" }, 
    { "key3", "value3" }, 
};
var list = new List<string> 
{
    "value1",
    "value2",
    "value3",
};

You might notice that I like to leave the comma behind the last element in my inline initializers - this is actually unnecessary.  But having it there means that I can copy/paste entire lines and move them around without worrying about missing comma right at the end.

For example, this is valid code:

var list = new List<string> 
{
    "value1",
    "value2",
    "value3"
};
But if I had to swap the order of the elements and end up with this code, this is not valid.
var list = new List<string> 
{
    "value1",
    "value3"
    "value2",
};

Generic EventArgs<T> implementation (but isn't really all that useful)

public class EventArgs<T> : EventArgs
{
    private T t;
    public EventArgs(T t)
    {
        this.t = t;
    }

    public T Value
    {
        get { return t; }
        set { t = value; }
    }
}

To use this class:

public EventHandler<EventArgs<String>> Notification;

protected void OnNotification(string message)
{
    var handler = Notification;
    if (handler != null)
    {
        handler(this, new EventArgs<String>(message));
    }
}

While this code is all nice and dandy, I wonder if it's all that useful.  One of the things with custom event args is that they may grow over time, and this implementation doesn't support future scenarios that well.

My colleague Dinesh mentioned that perhaps I'll end up going down the Func<> route, ie:

EventArgs<T>, EventArgs<T, U>, EventArgs<T, U, V>

Personally I think that's a bit challenging:

If I had to add an future int property to my EventArgs<String>, changing the event to EventArgs<String, int> doesn't automatically fix the issue - as all my event hooks will now stop compiling, because EventArgs<String, int> doesn't imply it inherits from EventArgs<String>

Anyway, nice looking bit of code but I'd say not greatly useful.

A camera of the future

In the future, when you take a picture of something, the camera generates a 3D scene of it and stores it in memory.

Camera will need 2 lens to work out the distances and generate the 3D model.

Camera will record and generate the textures that we can see.

When looking at the scene from the angle that the picture was taken at, the resolution is as good as a flat-picture camera.

Missing entry: setting DateTimeFormat.ShortDatePattern across the entire ASP.NET application

This entry is about a week overdue, nonetheless I shall post it now:

In the global.asax, before page execute, do this:

protected override void PrePageExecute(Page page)
{
    // change short date pattern of the current culture short date pattern
    CultureInfo info = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    info.DateTimeFormat.ShortDatePattern = "dd MMM yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
    base.PrePageExecute(page);
}

I'm using CompositeWeb.WebClientApplication here, if you are using vanilla ASP.NET, you can use a whole lot of different events such as BeginRequest.

Take the current culture, clone it (because the current culture is read-only).  Then set the short date pattern to something universal like "dd MMM yyyy";

This affects all instances where these are used:

datetime.ToString("d");
datetime.ToShortDateString();
datetime.ToShortDateTimeString();  // which is a concatenation of "d" and "t"
datetime.ToString();

This fixes issues for our application that is used by both American (MM/dd/yyyy) and Australian (dd/MM/yyyy) audiences.

Ideally, the user would set the language setting in their browser to the appropriate locale (en-US or en-AU), but this is too hard to force upon our non-technical users and the risk of someone misreading a date is too high, so we've opted for the "dd MMM yyyy" format which everybody understands.

jliu

Updating from SilverLight 2 Beta 1 to Beta 2

Cannot specify both Name and x:Name attributes

I think this is a bug in Beta 2, where you can't set x:Name for a UserControl, and then in the parent XAML that uses the UserControl, use x:Name again.

The trick is to remove the name from the XAML for the UserControl - you can use this in the code behind anyway to self reference the user control, so the name here isn't that important.

Update project references

Old SilverLight 2 Beta 1 projects still had references to version 2.0.3xx, some manual add/remove references was required to get the project all happily working on v2.0.50727

 

That was all the changes I had to do.  I think I escaped lightly this time.  Oh the joy of playing with beta software.

Modelling the system

image

 

Here's a nice pretty diagram of the various components of modelling a (any) world.

In my case here, the world is a virtual world.  You would noticed quickly:

  • The strong MVC reference.  If you really don't see it, try look at the colours
  • World is made of models - which are actually no different from a business application.  The same model pretty much applies
  • SilverLight 2 Beta 2 has strong work done on the visual manager, which I think is best used to utilize for rendering the world
    • In fact, in most games, the graphics component is the main component, in my little model here, it isn't.
  • The command logic is largely work from WPF's command syntax - in a business application, this means we can wire up multiple events to the same command (aka, control-C, menu)
    • In the context of a game, it means we can offer key-bindings and the user can choose what keys he'd rather use instead of the defaults
  • The blue part is the least ironed out section of my little model here - in a pure MVC situation, perhaps the Commands should be responsible for directly making the calls to the server / modifying the game objects.
    • Should I wait for server response before making the object move?  or should I trust the client and let it start moving, and allow the server to 'validate' the client's behaviour

One final work remains in this modelling exercise:

  • Some sort of dependency-injection for making it all work in SilverLight, this way, I can work on each component one at a time and have them plug in/out
    • And unit-test separately
    • There's some good work in the AssemblyPart class
      • Not sure about security implications though

Inspiration strikes - RTS Chess

Chess is typically a turn-based game.  You move, my move, your move again.

I had this inspiration to make a RTS chess, how would it work?

  1. Take normal chess
  2. Remove rules regarding turns
  3. Each player can move as many units as he can at once (no moving two units simultaneously - aka two hands), and as long as each player moves at relatively similar speeds...

We have Real-Time-Strategy Chess!

  • Normal rules of taking the enemy pieces apply, so if you are ready you can take them before they run off (or take you)
  • I think this actually subtly changes the chess 'trading pieces' play.  It's very likely that players will form walls of pawns and the play may come to a stalemate situation where neither player wants to make the next move which may endanger his position.
  • Chess games will be fast though :-)

Do we really need that many controls in Silverlight?

I was digesting Scott Gutherie's blog on Silverlight 2 Beta 2

We ultimately expect to ship over a 100 controls for Silverlight.

It really made me wonder, do we really need that many different types of controls built-in with the default Silverlight installation?

Beta 2 now has around about 30+ controls, and the only one that I've noticed is missing, is the combo-drop down list control.

I'm guessing if they really plan to end up with so many controls, then perhaps they'll start by porting across all the various controls that currently WPF have and Silverlight doesn't.

Edit:

Oh and some sort of Menu control

Lack of statistics for Windows spaces.live.com

The statistics capabilities for Windows Live wetted my appetite for better statistics reporting.  Why on earth:

  • Record only up to the last 3 days
  • No user detail breakdown - where from?  Unique visitors?  Returning visitor?
  • How are people finding my blog?  Word of mouth or blog reader or searching for keywords in Google where my blog showed up?

Anyway, the lack of statistics really is beginning to be a pain in the neck, makes me feel that no matter what I do, Windows Live spaces just doesn't support me to grow my blog, unlike other service providers like Blogger or WordPress.  (Both of them easily integrates with Google Analytics).

Which drives people back to use AdWords.

Sure we hate all things Google ;-)
But where's MS's offering?

Silverlight 2 Beta 2 coming really soon

All signs points to Silverlight 2 beta 2 coming within the week:

http://blogs.msdn.com/swiss_dpe_team/archive/2008/06/03/silverlight-2-beta-2-available-later-this-week.aspx

http://msdn.technetweb3.orcsweb.com/maximelamure/archive/2008/06/03/new-features-annonced-in-silverlight-2-beta-2.aspx

The biggest news I can find:

  • "Pushing" data from Server to Silverlight:
    • this is a new duplex channel which implements a smart-pull, the client sends a request to the server but the server does not respond unless there's something to say, and the client will just happily wait on that request (Silverlight does have multi-threading). 
    • If this was implemented in AJAX we'd see the browser seems to be waiting for something (a waiting connection progress bar).
    • I guess when the client receives a response, it fires a new request to the server immediately and keep waiting for new messages.
    • Various people have chipped in that they feel this may be cleaner than working with sockets - may be they just didn't like the way sockets sound, perhaps too low level and not abstracted enough ;-)
  • A tab control!
    • Still no combo drop down?
    • Or trees
  • Commercial go-live license
  • Controls are in the runtime now, instead of being packed with your app
    • Bigger initial plugin download but smaller file?
    • I wonder why they don't allow the missing components to be downloaded from a signed-MS redistribution package when you need it, and have Silverlight install that on-demand.  (instead of putting it in isolated storage where it can't be shared with other apps).
    • Flex solutions pack controls into the swf file and no one seems to be complaining

Edit:

  • Sockets goes cross-domain

Doing a simple timeout page with WebClientApplication

<%@ Application Language="C#" Inherits="Microsoft.Practices.CompositeWeb.WebClientApplication" %>
<script Language="C#" RunAt="Server">

protected override void PrePageExecute(Page page)
{
    // True when the current session was recreated with the current request
    if (Session.IsNewSession)
    {
        // redirect if the requested page is not Default or the Timeout page
        // or if the request method isn't GET
        if ((!(page is Retail.Web._Default) &&
            !(page is Retail.Web.Errors.Timeout)) ||
          Request.HttpMethod != "GET")
        {
            Response.Redirect("~/Errors/Timeout.aspx");
            return;
        }
    }
    base.PrePageExecute(page);
}
 

This approach relies on the Session.IsNewSession property to tell us if the current session was created with the current request, with a bit of convenience support for the timeout/default pages.

Nikhil has a more detailed solution: Detecting Session Timeout in ASP.NET 2.0 Web Applications if you want to differentiate between

  • new session object and user was really new, (aka no ASP.NET_SessionId)

vs

  • new session object and the user really timed out (aka sorry I was surfing the web and the app timed out)

GMail getting slower and sloowweerr

There could literally be thousands of reasons for why GMail seems to be running slower and slower for me:

  • FireFox Extensions?
    • I use FireBug (which Google has told me to switch off)
    • I use GreaseMonkey
    • I use the Web Developer AddOn
  • Network connection?
    • The firewall behaves funnily at work
  • Too many processes running?
    • Doesn't explain why other websites run fine though.
  • FireFox default caching mode?

The thing is, it really shouldn't be "my problem" to work out what's wrong with GMail.  As far as I'm concerned, other websites continue to work fine, and if I switch to the basic GMail view, it works fine too.  So there must be something wrong with the standard version of GMail.

 

Which really got me to think about the whole connection between web and PC.

I use GMail because:

  • Lots of space - but that's hardly new now - everybody is out there throwing hard-drive spaces at you
  • Can use everywhere, simple and fast - again I'm not so sure about the speed anymore
  • Easy to get my centralized data out - this turned out to be a bit of a false impression.  It is difficult to get data out of Google.  May be there will be new Google API eventually, I can only hope.

I use an offline mail program (like Windows Live Mail) because:

  • Offline reading, if mail server is down I don't lose access to my mail
  • Composing experience offline is better, GMail with its auto-save and FireFox's build-in dictionary comes pretty close though
  • Stripping advertising
  • Combines blog reader, podcast and videocast facilities - which I can then synchronize to a portable player
  • Speed of browsing emails, waiting for an webpage to load is silly

You would think Microsoft should theoretically have an advantage with their desktop/web integration strategy, I'm just not sure why it hasn't been executed (or received favourably) yet.

Laptop has three vertical lines now

Looks like my Dell Inspiron is really heading for the trash can.

Dell customer care has got back to me with some model numbers that the out of warranty replacement covers, unfortunately the bad news for me, my LCD isn't one of those part numbers.

Not sure where to go now:

  • Get the parts and replace the LCD screen myself
  • Purchase extended Dell warranty (feels a bit like getting blackmailed?)
  • Throw the laptop off my level 14 building (I'm sure this would be illegal in most places)
  • Purchase a new laptop
    • Dell again?
    • Or another brand...

Nikhil Kothari's behaviour framework for SilverLight

Nikhil here describes a mini behaviour framework for SilverLight, and then proceed to implement a DefaultCommit, AutoComplete and TextFilter behaviours that can be attached to the SilverLight textbox.

Very cool.

http://www.nikhilk.net/Silverlight-Behaviors.aspx

http://www.nikhilk.net/Silverlight-AutoComplete.aspx

View more entries