NBC Olympics site goes live with Silverlight 2 streaming

nbc

Over the past year, Microsoft has broadly touted their partnership with NBC and the video feeds they will provide for the Olympics.  So on July 4th, I sat back and while watching their TV broadcast and went over to their website http://www.nbcolympics.com.  The first thing you may notice upon visiting the website, is that their homepage is lackluster and that they are using the same drab Adobe Flash photo view.  So where's the cool new Microsoft Silverlight technology?  Hopefully the following will be a primer of the site for you.

The easiest way to see the site in all it's glory, is to click on one of the Video Spotlight links (look under the NBC Beijing 2008 logo for the Register and Login links, it'll be to the right of that).  The next thing you'll notice is ... yuck, the video page is plain and drab too.  Definitely nothing to brag about, and nothing like what Microsoft demo'd.  Well the key is to hit the "enhanced video" button below the video on the bottom right.  Much better, right?  Not really, but that's because on the Standard view, you hopefully noticed the all caps word "BETA" at the top of the "Standard" view.

Now back to the Enhanced View.  The first thing I noticed was that the video was not HD, somewhat disappointing but acceptable since we're supposed to be able to see multiple video feeds at once, right?  (Not!  But hey it's still in beta)  The next thing I noticed was my CPU cycles started going crazy and the video hiccups, occasionally needing to rebuffer fairly often.

In order to access the more advanced features, click one of the buttons of the left (note that you can close out any of these features and continue watching your video by clicking the X at the top right).

If you click on the first, top left, button, the "Control Room", they're still working on it.  However it tells us that you'll be able to watch 4 live video feeds at the same time.
The second button is the "Olympic Sports".  You can select the sport you want to view and it's associated videos.  Yah!  We can finally watch those Table Tennis matches!
The third button is the "Most Watched" videos.  'nuff said
The fourth button is the "As Seen on TV" section.  I'm guessing this is the recorded video for the TV broadcasts. 
The fifth button is the "Highlights" area.  So far, I really don't like the organization.  There needs to be some way to sort them all.

You'll notice anytime when you select a video, you can see it PIP (Picture in Picture).  This will put the video as a small video on video you were previously watching.  You can then reposition the small video, and even swap it out so it's the big video.

One of the best features they made was the "Share" button.  But in order to access all of the "Share" features, click on the "Grab Channel" button.  This will create a popup using Clearspring's widget.  If you don't know about this widget, you weren't the only one, as I am new to it as well.  It features a huge array of ways to share the link.  Everything from popular Facebook and MySpace to Twitter and Vista Sidebar Gadgets.  I counted a total of 62 ways to share and bookmark the site.

Overall, I'm a bit disappointed in the site.  But right now you can only view 2 video feeds at once.  I suppose their fit and finish could have been much better.  The user experience, just isn't as good as what Silverlight is supposed to be able to deliver.  What happened to the video fly ins?  Isn't this supposed to be a Flagship site for Silverlight?

Lastly, I am very concerned with performance.  My laptop handled the two video feeds well enough, but the CPU was going nuts as well as the paging.  Only time will tell as they flesh out the bugs and get the site out of BETA stage ... in less than 35 days.  I really hope they improve on the "cool" factor of the site.  Cause right now, it ain't got none.

 

RegEx tools for Visual Studio & the Social Web

You might want to skip this first paragraph if you are just looking for the RegEx Tools portion. 

I still find it amazing how the web can create an online social inner-networking that bobs and weaves an amazing web of connections (confused?  me too).  Here's what led me to find these wonderful RegEx tools.  So the Microsoft Partner Program has an initiative that gave me a bunch of certifications vouchers.  I am using at least 1, possibly 2, in my giveaway.  I send out an email to the VB Insider's List (an invite only listserv for Visual Basic users).  This leads Chris Love to leave a comment on my blog.  I then visit his blog and come across a posting for a bunch of RegEx tools.  This posting leads me to Ray Osherove's blog, whom I've heard of but never had a chance to look into.  Ray has created a bunch of tools, particularly 3 RegEx tools that look outstanding.

In the software that I sell to a niche market, I use RegEx to parse through long streams of text.  Some of the RegEx strings I use are in excess of over 600 characters.  So when I find a RegEx tool, I'm super excited about it.  Ray Osherove has created several different tools to help in this area.  I hope you find these as useful as I will.

 

RegEx Visualizer - Allows creating "Debug Visualizers" for all types in .NET framework as well as custom types. You can find such visualizers for Datasets, strings and XML, now there's one for RegEx
http://tools.osherove.com/CoolTools/RegexVisualizerKit/tabid/187/Default.aspx

The Regulator - Allows you to build and verify a regular expression against any text input, file or web, and displays matching, splitting or replacement results within an easy to understand, hierarchical tree.
http://tools.osherove.com/CoolTools/TheRegulator/tabid/185/Default.aspx

Regulazy - Visual Regex Creation tool for beginners.  It contains an easy "point and click" user interface, and allows creating regular expressions for simple searches almost instantly without requiring Regex syntax knowledge from the end user!
http://tools.osherove.com/CoolTools/Regulazy/tabid/182/Default.aspx

 

Technorati Tags: ,

Microsoft Certification Exam Voucher Giveaway

I've recently come into several Certification Exam Vouchers and have decided to host a giveaway.  Just post a comment to the blog, and I'll randomly select a winner.  All entries must be in by June 30th, 2008.

You can also post a comment to my cross posting site on MySoftwareStartup to gain an additional entry.  Due to the amount of comments, I will wait to display them all until after the contest.

 

 

Technorati Tags:

Growing your software business, stuck in a rut

The following is a response to the forum question posted here.

 

I had the opportunity to meet Scott while at the Little Rock .Net User Group, and we talked briefly about my thoughts on how to take advantage of the programs available to software startups.  In particular Scott owns a consulting business and he's having growing pains. 

Scott's problems is very typical of thousands of small business consultant shops.  He's busy being the business owner, full time consultant/programmer, bookkeeper, marketing, sales guy, etc.  So how do you start growing this small shop?

When doing consulting my first rule is to set the customer's expectations.  Since you are my customer, here's the good and the bad of growing your business.  You will have to relinquish power.  You will have to accept things that isn't "your way".  You will think quality isn't as good as what you can do, but that is typically because they aren't doing it "your way".  When in actuality, your customers will be fine with the work being done, and they will continue to give you business.  You have to spend money to make money.

So here are my few tips on growing.  Your first hire should be a sales person.  A part time salesman works just fine and will keep you out of the hole, if you're worried about finding the funds to pay him.  At a minimum, you will need to guarantee him one month's salary.  Past that, you need to figure out the salary plus/or commission.  A salesman is only as good as his commission.  Most salesmen work off of a draw against future sales.  For more information on how to setup a commission schedule, talk to a car salesman.

When the salesman has customer calls / visit, you will want to be available.  Let him do all the talking, except when you need to talk tech.  After the customer visit, you should write up the time estimates and as much documentation as you feel is necessary.  Let the salesman handle the quote from there on.

The other tip is to hire a part time bookkeeper / secretary.  I know there are a lot of groans here, but that 10 hours you pay that employee $15 an hour, you could be making $80 an hour.  Time is money, and since you're the owner and consultant, your time is even more valuable.

Once the salesman finds jobs, then you fill it with insourcing or outsourcing.  But remember to never sign agreements that give your code away to the customer and always have the work done offsite. 

Lastly, this has more to do with Microsoft.  The certifications are worthless to a Partner.  Partner level isn't very important, except for the benefits they give you.  Your customers are rarely going to care about your certs or partner level.  Customer availability, responding to their needs, and exceeding expectations are far more important.

I'll try and go over some of the Certification and Partner actual benefits in another blog post.

Congratulations & Thanks to Jay Smith & Michael Paladino

jay-smith_80x80 MichaelHeadshotSquare

A big heartfelt thank you and congratulations to two of the developer community builders in the Northwest Arkansas area, Jay Smith and Michael Paladino with special mention to Zach Young. As a Microsoft MVP, one of our benefits this year, is the ability to award people with a special prize. This prize is an MSDN Premium account with Visual Studio Team Suite, which includes nearly all of Microsoft's business software, free of charge.

Jay Smith works for Tyson Foods, Inc. where he is a PMO Architect and Evangelist, and is the President for the Northwest Arkansas .Net User’s Group.  Jay currently serves on the INETA Speakers Committee and works diligently with others on test bed projects to learn new concepts and designs.  You can read more about Jay on his blog http://www.jaysmith.us or follow his tweets at http://twitter.com/jaysmith.

Michael Paladino is a software developer for EagleOne in Fort Smith, AR, and is the Fort Smith .Net User Group President.  Michael is passionate about building the .NET community in the area and is one of the co-founders of the Fort Smith .NET User Group.  You can contact Michael through his blog at http://www.mpaladino.com or via email at paladinomichael@gmail.com.  You can follow his tweets at http://twitter.com/mpaladino

Go visit the Visual Basic Product Team at TechEd!

It was this time last year at TechEd that Cory Smith introduced me to the Visual Basic product team.  He first introduced me to Ed Hickey, who is the VB MVP Lead at Microsoft.  The funny story about Ed is, less than a week after Ed awarded me the MVP status, he transfers out.  I knew I was hard to work with, but didn't realize I was .... that .... difficult.

Also last year at TechEd 2007, Cory let me hang out with him at Universal Studios where I rubbed elbows with the Visual Basic product team!  He's really been a great mentor to me, and I'm very grateful.

All this is to say, go visit the Visual Basic Product Team website and meet some of the product team.  They are all very accessible and have always been very friendly.  If you're at TechEd 2008 this year, stop by the Visual Basic booth.  Amanda Silver is one of the most visible team members (and very easy on the eyes), so go strike up a conversation.

MVP Summit, Being Busy, plus Presenting @ the Little Rock .Net User Group

I suppose I was naive in thinking that once I received my Microsoft MVP award, I could breathe a bit.  But we've had sooo much Developer Community activity, I haven't had a chance to breathe, much less blog.  I still haven't had an opportunity to blog about the MVP Summit!  Needless to say, the MVP Summit was a blast (other than having a digestive track illness, where I missed the last day's keynotes).  The best thing about the Summit was the ability to meet and talk directly with the product teams.

You really get the sense of the ability to impact .Net by being an MVP!

On June 12, 2008 I'll be at the Little Rock .Net User Group, and I hope you can join me.  I'll be speaking on SQL Server Reporting Services.  Unfortunately, due to the late notice, I'll be speaking on the same subject that I presented at the Tech Expo (had hoped to prep some other topics by now).  But, I'll have more time to answer questions and hopefully get a bit more detailed on the subject.

Congrats to the new officers there at Little Rock.

Here's a quick synopsis of the content:

One of the hardest parts of learning a technology that is new to you, is getting started.  Join us as you learn the tips, tricks, and fundamentals of Microsoft's SQL Server Reporting Services.  Avoid those common mistakes and get up and running with SSRS in this presentation from Randy Walker, a 12 year veteran of report design.

Writing to .Net Config Files

I've been working with config files for quite some time.  I was recently reminded that I needed to finish my original article and share my final findings on my personal best practices for working with config files.

One of the coolest and most useful features in config files is the file attribute as displayed below (see my other article for a more detailed explaination, preferred-method-for-read-only-config-files).

<configuration>
  <configSections>
    <section name="MyCustomSection" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  <MyCustomSection file="MyCustomConfigFile.config"></MyCustomSection>
</configuration>

If you take a look at the other article, it's a terrific way to setup a read only config file, but what about writing back to it at runtime?  Well, the best way is to use the ConfigurationManager object and then open the raw xml into an XmlDocument object.  (yes yes, I might be a Visual Basic MVP, but I can write the occasional C#)

Configuration config = ConfigurationManager.OpenExeConfiguration(FileName);
ConfigurationSection section = config.GetSection(SectionName);

XmlDocument xml = new XmlDocument();
xml.LoadXml(section.SectionInformation.GetRawXml());

But the problem is, if you have used the file attribute (file="MyCustomConfigFile.config"), it's not smart enough to grab the contents of the file (I'm hoping to contact the product team soon to see if they can address the issue).  Fortunately, there is a way to get the filename from the file attribute.  And by adding in a little recursion, we're able to create an easy method to write back to the proper config file, without having to know the actual filename at runtime.

private const string SETTING_KEY_NAME = "key";
private const string SETTING_VALUE_NAME = "value";

public static void SetConfigValue(string SectionName, string KeyName, string Value)
        {
            SetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location , SectionName, KeyName, Value);
        }

        public static void SetConfigValue(string FileName, string SectionName, string KeyName, string Value)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(FileName);
            ConfigurationSection section = config.GetSection(SectionName);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(section.SectionInformation.GetRawXml());

            if (xml.DocumentElement.Attributes["file"] == null)
                {
                    foreach (XmlElement element in xml.ChildNodes[0])
                    {
                        if (element.Attributes[SETTING_KEY_NAME].Value == KeyName) element.Attributes[SETTING_VALUE_NAME].Value = Value;
                    };

                    section.SectionInformation.SetRawXml(xml.OuterXml);
                    config.Save();
                }
            else
                {
                    SetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location.Remove
                        (
                        System.Reflection.Assembly.GetEntryAssembly().Location.LastIndexOf("\\")) + "\\" + xml.DocumentElement.Attributes["file"].Value.Remove
                            (
                            xml.DocumentElement.Attributes["file"].Value.LastIndexOf(".config")
                            ),
                        SectionName,
                        KeyName,
                        Value);
                }
        }

This creates a new problem though.  You can no longer use the same format of the underlying file, specified in the file attribute.

Old format of the MyCustomConfigFile.config specified in my other article preferred-method-for-read-only-config-files:

<?xml version="1.0" encoding="utf-8" ?>
<SectionName>
     <add key="myKey" value ="" />
</SectionName>

New required format for writing to config files with the file attribute:

<?xml version="1.0" encoding="utf-8" ?>
<!-- You must have an empty file named "MyCustomConfigFile" with no extention in the same directory as this file -->
<configuration>
  <MyCustomSection>
    <setting key="MySetting1" value="True" />
    <setting key="MySetting2" value="File;Email;EventLog"/>
    <setting key="MySetting3" value="File"/>
  </MyCustomSection>
</configuration>

You'll notice that I had a comment in the file specified in the file attritube. (<!-- You must have an empty file named "MyCustomConfigFile" with no extention in the same directory as this file -->)  I honestly can't recall why this is required (I'm posting this article months after I did the work), but it has to do with reading the config file, and the filenames it is looking for.

This new referred config file format creates a new problem.  You can no longer use the reading method I used in the other article.  I've fixed it in the code below as well as provided the full class.

 

Below is the full class that I wrote.  All I ask is that you add a comment telling me how you used it.

using System.Configuration;
using System.Xml;

namespace HarvestIT.Common
{
    /// <summary>
    /// Application settings manager.
    /// </summary>
    public class ConfigManager
    {
        // Configuration file node names.
        private const string SETTING_KEY_NAME = "key";
        private const string SETTING_VALUE_NAME = "value";

        public static string GetConfigValue(string SectionName, string KeyName)
        {
            return GetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location, SectionName, KeyName);
        }

        public static string GetConfigValue(string FileName, string SectionName, string KeyName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(FileName);
            ConfigurationSection section = config.GetSection(SectionName);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(section.SectionInformation.GetRawXml());

            if (xml.DocumentElement.Attributes["file"] == null)
            {
                foreach (XmlElement element in xml.ChildNodes[0])
                {
                    if (element.Attributes[SETTING_KEY_NAME].Value == KeyName) return element.Attributes[SETTING_VALUE_NAME].Value;
                };
            }
            else
            {
                return GetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location.Remove
                    (
                    System.Reflection.Assembly.GetEntryAssembly().Location.LastIndexOf("\\")) + "\\" + xml.DocumentElement.Attributes["file"].Value.Remove
                        (
                        xml.DocumentElement.Attributes["file"].Value.LastIndexOf(".config")
                        ),
                    SectionName,
                    KeyName);
            }
            return null;
        }

        public static void SetConfigValue(string SectionName, string KeyName, string Value)
        {
            SetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location , SectionName, KeyName, Value);
        }

        public static void SetConfigValue(string FileName, string SectionName, string KeyName, string Value)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(FileName);
            ConfigurationSection section = config.GetSection(SectionName);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(section.SectionInformation.GetRawXml());

            if (xml.DocumentElement.Attributes["file"] == null)
                {
                    foreach (XmlElement element in xml.ChildNodes[0])
                    {
                        if (element.Attributes[SETTING_KEY_NAME].Value == KeyName) element.Attributes[SETTING_VALUE_NAME].Value = Value;
                    };

                    section.SectionInformation.SetRawXml(xml.OuterXml);
                    config.Save();
                }
            else
                {
                    SetConfigValue(System.Reflection.Assembly.GetEntryAssembly().Location.Remove
                        (
                        System.Reflection.Assembly.GetEntryAssembly().Location.LastIndexOf("\\")) + "\\" + xml.DocumentElement.Attributes["file"].Value.Remove
                            (
                            xml.DocumentElement.Attributes["file"].Value.LastIndexOf(".config")
                            ),
                        SectionName,
                        KeyName,
                        Value);
                }
        }
    }
}

Tell Internet Explorer 8 Beta to show your site properly using IE7

New IE8 logo

For those that want your website to render correctly on IE8, the recent newsletter gave a great example for enforcing IE7 compatibility via a Meta tag.  (You can see the new IE logo above)

 

Per Site Basis:

Site owners and administrators can include the following custom HTTP header to display all pages in Internet Explorer 7 Strict mode for the site:

X-UA-Compatible: IE=EmulateIE7

Per-page basis:

Site owners and administrators can include the following special HTML tag after the <Head> tag on the page:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>

Technorati Tags: ,,

20 Business Tips from Intuit QuickBooks

Sadly I had meant to post this back in February.

20 Tips Every Business Should Know

Their #1 tip is serving a niche market.  While not a requirement for starting a business, you need to separate yourselves from your competition.  Whether it be in price, service or value.

#3 is something I can vouch for, outsourcing.  I commonly talk about the misconception of the word "outsourcing".  This doesn't necessarily mean an Indian in Bangalore is doing your work.  It does mean simple tasks such as bookkeeping or advertising can be performed by local resources around your town.

As you read through the rest of the tips, remember to not take them literally, but find alternatives to the solutions they suggest.

Technorati Tags:
Twitter