| Comments

My children are not yet the age where they are asking me for a cell phone or begging for text messaging plan or anything, but I see my friends' children going through this now.  It's weird that this new generation will expect just to have a cell phone, like we did with other items (maybe the most high tech was a calculator).  What concerns me, though, is the abuse of the cell phone and it serving as a disruption during school or other times when it shouldn't be used.

The request is usually made as a "well mom, what if it is an emergency?" type attempt to obfuscate the real reason of "how am i supposed to tell julie about how mark almost kissed me?"  Just the other day I went to visit a friend and his 13 year old came out of the house, immediately flipped her Sidekick open and started texting away.  It was a weird thing to see.  My oldest is about 7 years away from that same spot (if not sooner).  This got me thinking of how cell phone companies have an opportunity here to serve the younger youth market (<18) and that of the parent population at the same time.

You see, some have tried to create family type plans and kid-friendly devices, but I think some are missing the boat here.  The best I've seen was something from Verizon which limited calling capabilities to a mom/dad/home selection type thing.  What I think might be desirable (caveat this is coming from a geek) is a full-featured phone, with the service that is controllable.  For example, I might want:

    • to define the hours of operation for the calling service
    • to define the hours of operation for texting
    • some type of logging on text messaging
    • ability to specify acceptable calls
    • ability to specify 'zone' calling (i.e., states allowed to call)

I think for me, as a parent, having this control would make me feel more comfortable about seeing a cell phone on a school ground.  If I could say the phone can't be used from 9:00 AM - 12PM and then again from 1:00 PM - 3:00PM, then it helps alleviate the abuse of the phone and the use as a disruption in unwanted situations.

But what about those emergencies?

Sure, legitimate concern.  Something is happening on school grounds or a dangerous situation.  I think maybe an effective use of a dual-PIN system is in place here.  First, for incoming calls.  If someone called the device during non-operative hours (same for texting), then the caller would have to know an "accept" PIN.  So if mom needs to get in touch with Julie, she calls, is prompted for a PIN and the call goes through.  Of course, this concept relies on mom not telling Julie what the PIN is and then all her friends know (but again, that is where tracking can come in).

For outbound operation that might get trickier.  If using a simple PIN that doesn't serve any purpose.  Julie will still call/text Susie about Mark...and just enters the pin (reporting here would show PIN abuse).  But what about some type of user-defined threshold?  Mom says the account can only use the PIN unblock for outbound calls a maximum of 2 times during non-operative blocks.  Maybe that would work.

Anyhow, just something I was noodling on late night.  I'd love to see this.  I think it would make for a great product that is flexible and give some ease and control back to parents.  A really nice online application to give the parent control to change these at any time and the effects are immediate is necessary as well.  I can see a situation where the non-operative time needs to be immediately removed.  One click, boom, phone is operational again.

Am I crazy big brother parent thinking here? 

| Comments

Ever since I released my version of the Foxit PDF Preview Handler, I've been flooded with comments about building a version that works for Windows XP.  You see XP doesn't have the preview host that Vista has built into the operating system.

Well, I finally had some time to hunt down some code and get it working, thanks to the help of Ryan Gregg from the Outlook team.  I released the sample code I used as a base for this as a part of our Code Trip project.  You can view my short screencast explaining one of the core pieces here using the Code Trip's embedded player:

You can download the Foxit PDF Preview Handler for XP here.  If you have Windows Vista, I recommend you stick with the existing one for Vista as it leverages the existing preview host that is built into Vista.

Hope this helps!

| Comments

If you are doing Silverlight development, you are no doubt slapping in the <object> tag or using the <asp:silverlight> control (if in ASP.NET) to host your Silverlight content/application.  This is all great, but don't forget about deployment!

When I talk about Silverlight I like to relay a story I heard from one of the Silverlight program managers (PM) a while back.  The PM was pretty excited about a feature just completed in Silverlight and one of the samples that had been created.  He went home to show his wife and told her to 'go to 'dub-dub-dub-dot-something-dot-com' (yelling from the other room of course) and to tell him what she thought.  After a long pause of a few minutes he shouted back 'what do you think?'  Her response: 'It's lame.'  He was no doubt offended until he walked up to her machine and on the screen saw this:

Silverlight Install Image

The Problem

You see, 'Get Silverlight' means nothing to your mother-in-law (or wife in this matter).  Technology means nothing to non-geek users.  Content is king.  And to your non-savvy users (and even your savvy ones), leaving this default experience isn't a wise one.  It doesn't convey that there is anything of value by installing something they might not have.  It doesn't even convey what the action is going to be when they 'Get Microsoft Silverlight.'  Leaving this experience unchecked leaves your users in the dark as well as a reputation rank downward in my opinion.

NOTE: This site is likely riddled with these badges as seen above.  I'm claiming exempt status because they are samples :-).

While in Silverlight 1.0 creating a great install experience was possible, Silverlight 2 makes that process so much easier.  In Silverlight 1.0, the use of the silverlight.js file could aid in detection and direction to an alternate experience.  This method is still possible in Silverlight 2, and in fact might be a best practice still.  Most interactive developers using Flash use some method of script creation in instantiating the Flash host.  This is mostly due to the IE EOLAS "click to activate" issue that has been resolved and will remedy in an upcoming IE update.

Some Solutions

So that brings a few methods for instantiating the Silverlight control host.  You can still use a script method to do the check for you and provide alternate content or redirect to something.  You can also still simply include the <object> tag itself.  My favorite is using the simple <object> tag and tricking the HTML.  You see an object tag might look like this:

<object type="application/x-silverlight-2-b1">
    <param name="source" value="ClientBin/CallingServices.xap"/>
    <param name="onerror" value="onSilverlightError" />
    <param name="background" value="white" />
    <div id="no-sl" class="install-badge">Some descriptive information</div>
</object>

Notice the random HTML after all the params?  Browsers will read the HTML like a book (US-English) from top to bottom.  They get to the object tag and can't understand it, so will look at the next part of the DOM.  Param tags...nope don't get it.  Next part.  Oh, a <div> element...yep I understand...begin render.

Within here you can put an image or some element with a CSS class that is absolutely positioned, etc.  Bottom line is you own that experience.  It is now on you, the developer, to ensure that your users aren't just seeing 'Get Silverlight' but are being provided at least some explanation of what they are about to see, why they should install this plugin, etc.

Some Examples

Perhaps you need some inspiration?  Here's some examples from some recent sites...


Silverlight.net Gallery


Zombomatic Game on Miniclip.com


WWE Insider Video


Hard Rock Memorabilia Site


65th Annual Golden Globes


Major League Baseball Video

As you can see, the options are endless from very simple, to heavily branded. 

Testing your deployment experience

So now that you've decided you are going to optimized that "no Silverlight" experience, how do you go about testing it?  Well, here's a simple trick that I employ to do this.  There is no need to uninstall/re-install the runtime on your machine.  In fact, this will likely give you headaches in doing so and waste endless minutes :-).  Here's a simpler way.

In Internet Explorer you have the ability to manage your add-on experience.  To test your "no Silverlight" experience, simply do the following.

To make it easier go to a page with Silverlight content.  You can do this without this step, but it will cost you 2 extra clicks and I'm trying to save you time.

Next, go to Tools...Manage Add-ons...Enable or Disable Add-ons:

Now, find Microsoft Silverlight in the Enabled section and change the radio button to 'Disable' and click OK. 

You will be prompted with a message which you can just click OK through.  The page will be refreshed and the Silverlight plug-in no longer enabled.  Now any site you visit will give you the "no Silverlight" experience for you to test your deployment experience.  When you want to re-enable, simply repeat the process and choose 'Enable' and you are back in business.  No messy control panel uninstall/re-install mess.

I'm not a Firefox power user and couldn't find an easy way to do this rapidly without installing another plugin, so if anyone knows the similar method in Firefox, please enlighten me (or Safari for that matter).  I tried searching and found solutions of moving the plugin out of the /plugins folder in Firefox so I'd imagine you could batch script this out.  I really like the ease that Internet Explorer provides in managing my own preferences for each add-in running.  Looks like this gets even better in IE8.  I'm actually surprised it isn't a part of Firefox.

Summary

The bottom line is: don't ignore this experience.  This is your chance to explain that the user is about to see premium content, a better user experience, a fun game, whatever it is you are trying to convey.  I hope this has helped at least some be enlightened on ensuring you make that a work item in your task list and the tip of disabling the add-in is helpful to some. 

| Comments

One of The Code Trip sponsors, InnerWorkings, has teamed up to have a coding challenge for developers.  This is open to everyone to participate.  The winner gets an annual subscription to InnerWorkings as well as an XBOX 360 game console.

If you aren't familiar with InnerWorkings, consider this a shameless plug.  I really do believe in their product as it is a unique learning experience from what we traditionally have (i.e., lab manuals with step-by-step instructions).  They have a wide catalog of topics including ASP.NET, WCF, WPF, , CSS, etc. for organizations to choose from.  You really need to check them out if you haven't before.

All the details are available on The Code Trip web site recent post.  Head over there for information on InnerWorkings and the information on the contest.

| Comments

In a previous post, I wrote about some samples of calling various types of services from Silverlight 2.  In the code, I was using constructors in my ASMX and WCF services with specifying a binding type and endpoint address.

It was called out to me that in other demonstrations, people did not use this construct.  While the method I demonstrated works (explicitly specifying the binding and endpoint), in some cases it may not be necessary.  One such case would be if you only have one endpoint and it is basicHttpBinding.

The error in my code/instructions was about changing the binding information in web.config.  The information is correct, however I wasn't clear on when/what you needed to do.  For example, the default information in web.config for the Silverlight project created for you uses wsHttpBinding.  If you add a service reference in your Silverlight project PRIOR to changing that binding information, your generated proxy will require you to specify a binding and endpoint as Silverlight doesn't support wsHttpBinding and it would be trying to use that as a default method.

So the appropriate way is to change the binding type in your web.config FIRST.  Then generate the service reference in your Silverlight application and your proxy code generated will then allow you to new up the service using:

WcfServiceClient wcf = new WcfServiceClient();

for both WCF and ASMX services...which is probably more familiar to most web developers implementing services in their applications.

Again, EITHER way is fine.  Providing no information in the constructor will use the default binding/endpoint information for that service, and if it isn't supported, you'll get a nasty exception.  Whether or not it is best practice to always explicitly call it out in your code is up to you.  I'd argue it is.  In looking at the code above do you know what binding/endpoint is being used at the time of the service call?  No.  You could make some reasonable assumptions (hey, I'm in Silverlight and I know I must use basicHttpBinding), but for maintainability, maybe someone else coming to the code doesn't have the same understanding.

To each his own.  Either way, I hope this clarifies and I've updated my post with the note about this as well.