| Comments

I’ve seen some reports and received some emails on email groups that I’m a part of around Windows 8 and Google Chrome browser and how touch is not working.  In fact I was initially confused about this myself because it was working fine for me on my machine (Lenovo x230t) but other people were insistent that it wasn’t working.  Then I asked what machine they were on.

Almost exclusively everyone was on a “high DPI” machine (or had high DPI settings in their display).  If you have a Surface Pro, for example, you are using a high DPI machine.  I installed Chrome on my Surface Pro and indeed saw the problem there.  After some digging it appears to be that Google Chrome is not yet a high DPI-aware desktop application (at least of this writing which was using version 30.0.1599.66 m – phew that was a mouthful of a version number).

Look at this screenshot.  This is from my Surface Pro with no changes.  I’m tapping on the 2nd image in the news highlights (indicated by the touch square indicator) but notice where the target is actually clicking – on the date “October 4” where the context menu is located:

Chrome missed touch target

I asked around the office and received one workaround, which I received, but also found a better one.  Here are both of them for you to consider.

Workaround 1: run in compatibility mode

This involves you getting to the properties of the chrome.exe program and viewing the compatibility tab.  In there you can check the option to disable DPI scaling:

Chrome compatibility setting

I didn’t like this option because immediately after restarting Chrome the display was crisp but “tiny” to see for my aging eyes.  You can see here is the msn.com site before/after this compatibility setting:

Chrome msn.com before

msn.com on Google Chrome with no compat setting

Chrome msn.com compat set

msn.com on Google Chrome with the compat setting enabled

After this setting the hit-targets are fine and work but the content is small (although admittedly more of it is viewable, but that is too small for me).  To mitigate this you can use Chrome’s zoom feature to zoom to 150% to match most closely the high DPI scaling that automatically happens.

Chrome zoom settings

But there has to be a better way…and is (in my opinion).

Workaround 2: set the Chrome flag for HighDPI Support

I learned that Chrome has “flags” that you can set to experiment with certain settings or override other default/automatic settings.  From the address bar, type “chrome://flags” and you’ll see a page of options.  Scroll near the end and you’ll see a “HighDPI Support Windows” setting which is set to Automatic. 

Chrome HighDPI Flag setting

Force this to Enable and re-launch Chrome.  Boom you are working again.  Simpler fix and gets you scaling on your device as well.  Now some of Chrome’s chrome (menus, etc.) aren’t as crisp still but the main content area doesn’t confuse hit-targeting of your touch interaction because of the scale.

The good part is that it appears that the Chrome team is aware of this and a Chrome bug is logged (Chromium Bug 271222: When using the global Windows UI scaling feature, touchscreen touches are off by the set scale).

I don’t use Chrome on a regular basis (nothing against it, just don’t need it) but do get sad when friends have problems so I like to try to help out.  Hopefully if you are in this case with your touchscreen and Google Chrome this will get you fixed up.

Hope this helps!

| Comments

Okay, I think this is pretty crappy.  Say what you want about Microsoft and you hate the company fine, but outright ignoring user expectations and preferences is wrong.

Scott Cate had found something weird happening on his experience with using browsers and the address bar search behavior.  Most modern browsers have a feature that if you type something into the address bar (not the search bar that they all also have), that it will execute a search using your configured provider and display the results.  Works great, convenient for the user and allows the user to provide options of how they want to search.  If you don’t like Live, fine, use Google.  Hate them both? Great, configure for Yahoo!.

But check out what Scott found as his Cox connection was stealing search traffic.  It displayed an incredibly lame search results page.  Here’s the facts:

  • It only happened in IE
  • It only happens from the IE address bar search
  • Cox reports this to be “enhanced error page” but there was no error page (search.live.com is a valid website)
  • Oh, and the “enhanced” is crap – their results suck
  • It does not happen with any other search provider configured (i.e., the same user action if configured for Google works as expected).

Lame.  Bad business.  Whatever.  In some Twittering with CoxTech1 (follow the thread), there seems to be a total lack of accountability other than “opt out” by providing some new DNS servers (yeah, that does not pass the mother-in-law test of usability btw).  It’s an interesting conversation to read.

I recently discovered that OpenDNS was doing the same thing.  Argh.  WTF people!?  Honor my settings, not yours.  If you truly cannot resolve a DNS request, that’s different, then help me.  But don’t override my preferences as a user!  I’ve found a few ways to fix this.

IE – Add a modified search provider

Since Cox and others are looking for the action that indicates it is coming from the address bar, remove that.  I’ve created a little page for fixing the IE/Live issue which does not affect at all the ability to use Live searching or Live suggestions searching.  You can find that button here.  Click the button and it will install the “Live Search – modified” search provider which overcomes this lameness.

Firefox fixing – keyword.url

Here’s how to fix it in Firefox:

  • Open Firefox and type about:config – it will ask you the obligatory “are you sure” – I’m guessing if you are reading this, you’re sure.
  • Filter for keyword.url 
  • Change that to whatever you want.  For Live it would be in the simplest form: http://search.live.com/results.aspx?q= or for Google: http://www.google.com.my/search?q=.

Now if you don’t mind, then don’t change anything.  Note: you can always revert back to the default if you modify either of these like above. 

Why is this bad?  I guess that’s the eye of the beholder.  Yes, I work for Microsoft and I think it is lame as an employee and shareholder.  But as loyal as I am to MSFT, I’m still a believer in honoring the customer and not stealing business.  Search is big business…advertisers pay for spots, etc.  Redirection of valid search results is stealing those advertisers’ wishes in my opinion.

But above all – these companies are not honoring me, as the user/customer, or my settings…that’s bad service.  If I could find that web site that generated the “shame on” signs I would have put a giant on here: shame on you Cox and others!

| Comments

Well the move was inevitable.  Which move?  Well if you are a FeedBurner user and haven’t been paying attention for the past year, you may not have known that Google bought them and are transitioning the service to their infrastructure.  What does this mean to you?  It depends.

If you use the core FeedBurner service and use the “feeds.feedburner.com” URI for your subscription links, then generally speaking you should be fine.  Google has planned to redirect that URI to their updated one once you move your feeds (or you could also use “feeds2.feedburner.com” afterwards as well.  Users that fall into this bucket I think will not see much issue.

Those of us who use the “MyBrand” feature of FeedBurner, where you can use your own top-level-domain as the feed link (i.e., feeds.timheuer.com) are more affected.  I moved all my feeds to the Google infrastructure yesterday (they will force move everyone by 27 Feb 2009 anyway so I figured “why not”).  Here’s what happened.

  1. Initiated the move
  2. Move seemed flawless for the 25 feeds I have “burned” with FeedBurner – it transitioned to my Google account fine
  3. Went to check my "feeds.timheuer.com/timheuer” link and boom, 404 error.  Suck.

Even though I followed the new instructions on changing the CNAME it was still failing and my FeedBurner URI was getting a 404 Server Error page (as was anyone wanting to subscribe).  I’ve since gained some wisdom and wanted to share it with you.  Here’s my recommendations for those who use the MyBrand service.  I know others have had issues, and I just wanted to share my experience with the interwebs in hopes it might help some others.

NOTE: MyBrand is a feature of FeedBurner (now Google Feeds) that allows you to use <something>.yourdomain.com as the primary URI to your burned feed instead of the default feeds.feedburner.com URI.  This is highly valuable as then ultimately you are in control of your feed endpoint.  If for some reason you want to move away from FeedBurner in the future, you are still in control of your main feed URI and can redirect users accordingly.  If you aren’t using it, I highly recommend it.

First, prior to the move, change your DNS record TTL (time to live) value NOW.  Most DNS services have a long TTL value for CNAME records.  Most of the time the default values are around 24 hours (TTL=86400).  That means any change to that value *could* take at least 24 hours for the Internet to catch on.  Prior to your move, change this value to as low as you can.  My provider lets me change it to 1800 (30 minutes) is the lowest.  Change that value to as low as you can and wait at least 2 days.  What this does is improve your chances that when you do make the CNAME change, that it will replicate faster across the Internet. 

After you’ve set the TTL on your CNAME and waiting 2 days, initiate the transfer.  Have several tabs in your browser open in the event you need to do some testing/changing of your DNS records, site, etc.  Have access to anywhere you have your MyBrand link on your site ready (i.e., open that Remote Desktop if needed).

Once the transfer has been complete, Google will tell you all is well.  It isn’t, if you use MyBrand.  Follow these remaining steps.

Login to your new Google Feeds account.  After logging in click the My Account link:

Now click on the MyBrand link on the left.  This will show you the current MyBrand vanity domains you have set up. 

Your new CNAME record will be displayed on this screen and will be something like <loginname>.feedproxy.ghs.google.com.  As soon as you get to this screen, go to your DNS management and update your CNAME record (as well as add a backup record – i called my “feeds2” at the same time)!!!

After you’ve updated your DNS record, go back to the MyBrand panel and scroll all the way to the bottom and click the “Deactivate” button to deactivate the service:

Trust me, you need to do this.  All the instructions that tell you to simply remove/re-create the vanity URI at the top of this screen are wrong.  You must deactivate first.

Once deactivated, go back to the same screen and add your domains back in (as well as your backup one you created) and click Activate again. 

You should now be fine.  It’s weird but this Deactivate/Activate step seems required if you are already using the MyBrand service prior to moving your feeds.  If these steps don’t work and your original vanity URI is still showing a 404 error, then use your backup – it is likely working.

I hope this helps anyone prepare during the move!  Once you are satisfied things are back to normal, I recommend going back into your DNS settings and modifying your TTL for your CNAME record to a higher amount (86400 or higher) so you can reduce DNS lookups for your users.

| Comments

A few days ago Google announced “event tracking” for their Google Analytics platform.  My account was invited to participate in this initial wave so I decided to take a look.  The main reason of course is because of a keyword in their email they sent to me (emphasis mine):

“Event Tracking allows you to track interactions with Web 2.0 style content such as Flash, AJAX, Silverlight, social networking apps, etc.”

I have the script already running on my site for general analytics so I figured I’d whip up a quick sample to see how it might work with Silverlight.  If you are in to analytics you may also want to check out Michael Scherotter’s webcast with WebTrends on some analytics techniques with Silverlight as well.

There are a bunch of existing techniques you can do today using existing analytics packages and scripts, but it is really nice to see movements toward recognizing unique characteristics of rich Internet application activities and the need for something more granular that represents user behavior rather than just a view.  After all, “paths” for normal web browsing have been available for analytics for a long while…why should RIA have to suffer?  The main reason is that no analytics packages have successfully managed yet to provide enough artificial intelligence to reflect on the behavior within the RIA.  As RIA development becomes more mainstream in applications facing the consumers, it will be increasingly important to understand where/what the user’s are doing to discern better usability changes, etc.

Google calls their feature “event tracking” and enables a function on the existing script to track an event, much like a Windows event log (for those who are familiar with it).  You provide a category and action, then optionally a label and value (where value is an integer value, generally going to be used I assume for counts of actions).  The “action” doesn’t have to actually be an literal action such as “click” but something you can put together.

In my less-than-creative mind I just thought of putting together two category scenarios: media and e-commerce.  My commerce actions would be: Add Item to Cart, Sample Music (i.e. a music store action), Start Checkout, Complete Order…all rolled up in a Commerce category.  My Media category would include Play and Pause tracking.  The signature of the event tracking method in Google is:

   1: _trackEvent(category, action, [label], [value]);

This would be called on your variable given to whatever your _getTracker() call was made with (mine is called pageTracker, using the default from the script).

NOTE: This post assumes you know some of the terminology from Google analytics offering.  If you don’t, you can read about it at their Analytics page.

Since all of this was Javascript calling from Silverlight I’d have to use the HTML bridge capabilities.  You can learn how to call Javascript from Silverlight from here or view a walk-through video on how to do it on the Silverlight community site as well.  I created a simple function on my page that basically wrapped the actual function call.  Honestly I figured it would be here that you may want to do some error handling or any other event-based “stuff” – but for now, it’s pretty much just a wrapper to the same function and looks like this:

   1: <script type="text/javascript">
   2: var pageTracker = _gat._getTracker("PROFILE_CODE_HERE");
   3: pageTracker._initData();
   4: pageTracker._trackPageview();
   5: </script>
   7: <script type="text/javascript">
   8:     function trackEvent(category, action, label) {
   9:         pageTracker._trackEvent(category, action, label);
  10:     }
  11: </script>

As you can see, in my sample I wasn’t concerned with the value parameter for now.  Now in my Silverlight application I just created some lame looking XAML that would more generally be spread out throughout a typical application, but just for playing I put it in one place.  Here’s the XAML:

   1: <UserControl x:Class="GAEventTracking.Page"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
   4:     Width="400" Height="600">
   5:     <Grid x:Name="LayoutRoot" Background="White">
   6:         <StackPanel Orientation="Vertical">
   7:             <Button Width="200" Content="Added Item to Cart" x:Name="AddCart" />
   8:             <Button Width="200" Content="Sampled Music File" x:Name="SampleMusic" />
   9:             <Button Width="200" Content="Started Checkout" x:Name="StartCheckout" />
  10:             <Button Width="200" Content="Completed Order" x:Name="CompleteOrder" />
  11:             <MediaElement x:Name="LakeVideo" Width="320" Height="240" 
  12:                           Source="Lake.wmv" AutoPlay="False"/>
  13:             <StackPanel Orientation="Horizontal">
  14:                 <Button Content="Play" x:Name="PlayVideo" />
  15:                 <Button Content="Pause" x:Name="PauseVideo" />
  16:             </StackPanel>
  17:         </StackPanel>
  18:     </Grid>
  19: </UserControl>

On the relevant code I’ve wired up the buttons to the same event handler for simplicity and just looking at the name and content for what to do.  Here’s what that looks like:

   1: public Page()
   2: {
   3:     InitializeComponent();
   4:     AddCart.Click += new RoutedEventHandler(EventButtonClick);
   5:     SampleMusic.Click += new RoutedEventHandler(EventButtonClick);
   6:     StartCheckout.Click += new RoutedEventHandler(EventButtonClick);
   7:     CompleteOrder.Click += new RoutedEventHandler(EventButtonClick);
   8:     PlayVideo.Click += new RoutedEventHandler(PlayVideo_Click);
   9:     PauseVideo.Click += new RoutedEventHandler(PauseVideo_Click);
  10: }
  12: void PauseVideo_Click(object sender, RoutedEventArgs e)
  13: {
  14:     LakeVideo.Pause();
  15:     HtmlPage.Window.Invoke("trackEvent", new object[] { "Media", "Pause", "Lake video was paused" });
  16: }
  18: void PlayVideo_Click(object sender, RoutedEventArgs e)
  19: {
  20:     LakeVideo.Play();
  21:     HtmlPage.Window.Invoke("trackEvent", new object[] { "Media", "Play", "Lake video was started" });
  22: }
  24: void EventButtonClick(object sender, RoutedEventArgs e)
  25: {
  26:     Button btn = sender as Button;
  27:     string actionName = btn.Name;
  28:     string label = btn.Content.ToString();
  30:     HtmlPage.Window.Invoke("trackEvent", new object[] { "Commerce", actionName, label });
  31: }

So you can see here at line 30 above is where the relevant code is.  Using the HTML bridge, I can invoke a method on the hosting page and provide the arguments to it.  That’s it!  So what does this look like on the reporting side?

For a summary view of the categories you’ll get some decent information about the action:

But then when you also drill into a specific category, your label information will be viewable:

So that now using methods like this you could track specifically what is going on within your RIA.  As I mentioned, you can do this with existing platforms today with being clever of how you track a “PageView” but it is nice to see a specific implementation for event-driven tracking.  And this isn’t limited to just RIA, you can still (obviously) use this event tracking in your AJAX applications, static pages, whatever.

The Google links demonstrated how to implement this with ActionScript and Flash, but while they mentioned Silverlight, they didn’t provide a relevant sample.  Luckily basically the steps are as easy as outlined here:

    • Include the tracking script
    • Decide what/when/where you want to track within your Silverlight application
    • Use the HTML bridge (Html.Window.Invoke) to call out to the _trackEvent function

Again the relevant code for Silverlight is:

   1: HtmlPage.Window.Invoke("[methodName]", new object[] { "[category]", "[action]", "[label]"});

Where the “[methodName]” is whatever Javascript function you are calling that exists in the hosting page (and matching the proper signature you’ve set up.  As I mentioned I didn’t use the optional value parameter in the event tracking, but had you done that (say you wanted to know how many times a media item had been played) you’d add a value of “1” for example and the reporting would provide aggregate summaries of that action within the category.

Have fun and hope this helps some!

| Comments

I had been a customer of T-Mobile for 10 years (through a few company changes) and only recently changed to AT&T about a year ago.  As a general assertion, I’ve been happy.  I like the 3G speeds and the coverage in my house is far better than T-Mobile, which was the ultimate driver as someone who works primarily from a home office.

That being said, I think I’m agreeing with what a friend said when the first iPhone launched.  He said (paraphrasing of course) If the iPhone has any shortcomings it won’t be because of the device or Apple, it will be AT&T and that could have been one of the worst decisions Apple could have made.  Now I’m not sure there is any “better” decision because in the US, mobile carriers all generally map to the same business plans.  But that being said, the first year of the iPhone seemed to be successful.  Sure, AT&T had the exclusive, but the plans were cafeteria style and relatively simple…you pretty much picked a minute plan.  I’m not arguing about any pricing, that’s for you to decide what is best for you.

Introduce iPhone 3G.

As much as I thought Apple really had changed the game for US mobile carriers, I’m starting to rethink that.  I think the power of the mobile industry is proving itself.  Why?  Well, Apple may have still changed the game with regard to the actual device and maintaining the purity of the platform (i.e., controlling the platform completely), but the carrier (AT&T) clearly decided that the time is up for other aspects of control.  The iPhone 3G plans I thought had gotten simpler, but it turns out the key feature for the iPhone 3G, the “3G” part, is becoming the most confusing.

It should be pointed out that Apple has had varying business and personal plans for a while, but with iPhone they weren’t present because of the exclusive deal, all company discounts, etc. never applied.  And there was a flat rate for unlimited data.  Now it’s $30 for “personal” or $45 for “enterprise.”  First, I hate the word enterprise to define a company.  Is a 10 person company who uses a hosted exchange platform an enterprise? 

Here is where the confusion begins.  Confusing and not-so-solid information on what the enterprise data plan will give you.  In an interview with some AT&T folks, NY Times columnist David Pogue asked the question to AT&T public relations personal specifically:

Q: Why is the business rate more expensive than the standard iPhone rate?

A: Business pricing for the iPhone is $45 for unlimited data, plus a voice plan. Business customers tend to be heavier users of data than consumers, and we price our service accordingly.

source: Questions — a Baker’s Dozen of Them — About the iPhone Calling Plans

So there is one answer.  Then there are others that say if you connect to an Exchange server you pay enterprise rates.  Well what about services that provide friend/family/small biz hosted Exchange platforms?  How is AT&T going to prevent these?

Here it seems just an added way to get an additional $15 from people.  Apple employee Nathan C responded on the forums discussion on this topic that:

The iPhone will support ActiveSync regardless of which data plan you are on with AT&T.

Sure, but is that only via WiFi, etc?  It’s an interesting thread from beginning to end to see peoples’ distaste for how AT&T is handling the plan changes.  And there in lies the rub.  Will iPhone 3G get a bad rap because of AT&T?  It already is in places like Canada because of Rogers pricing. 

I don’t think AT&T is equipped to monitor handsets all day long to determine if rate plans should increase.  And how is MobileMe any different?  Heck Apple is marketing it as Exchange for the rest of us.  So if AT&T policy indicates that if you connect to Exchange you should pay the higher data plan, shouldn’t the same apply for MobileMe users?  I mean the services provided by MobileMe are similar and still include the push email features…so really it should be considered the same at a carrier service provider level.  And what about Google Apps users?  How is that usage any different?  It might not be push, but heck they even label it Google Apps for Enterprise (GAPE) – so subscribers of that should pay enterprise data plans too?  This segmentation is just confusing even to smart people.  And AT&T has yet to come out with a clear answer.  Now the clearest I’ve seen is one of two things: if you are getting a corporate discount provided by a corporate plan and/or if you sign up for a voice business plan.  Even still though, I’d bring up the smaller businesses that aren’t necessarily “enterprise” how we usually define those companies.

SIDEBAR: Apple keeps throwing Exchange around like it is Kleenex or something.  No service/trade mark attribution or footnoting on who owns that name…shame on them :-).

If you take the AT&T PR response on “heavier users” – seriously?  Grab a college campus popular kid and give him an iPhone 3G.  I bet it is heavier data usage than your average employee at any company.  That’s just a cop out.  It is a poor benchmark of terms that PR person chose in my opinion.

So I think my friend might be right.  AT&T really has the potential of screwing up the iPhone.  Carriers have had a trend of not really caring for what their customers needs are..it’s a highly competitive business and customer service isn’t high on the priority list most of the time (at least that has been my experience when I’ve needed it).  So with regard to the plan debacle, I’ll end with this open letter to AT&T:

Dear AT&T,

Can you please clarify under what conditions the enterprise plan is required specifically?  For the companies who wouldn’t consider themselves ‘enterprise’ but still are able to take advantage of inexpensive hosted Microsoft Exchange for their companies (or purchase Small Business Server from Microsoft), why would they be lumped in with companies of 10,000 or more employees?

So bottom line it for us AT&T: If I have a personal data plan, will I be able to synchronize my email, calendar and contacts with my personal Exchange account that I either get for free or pay for via a hosted service?

Might I make a suggestion that you just come up with a single unlimited plan like you did with the iPhone first generation?  You made no distinctions there and yet ‘enterprise’ people were still able to get their mail.  If people who desire to use EAS over IMAP are penalized, that is ridiculous especially given that you’ve made no indication that a company choosing to use MobileMe or Google Apps for Enterprise would require such a distinction either.