1. Open Letter To Whoever Designed the Turn-By-Turn Feature for Windows Phone

    Posted on October 20th, 2011 by Kevin

    Dear Whoever Designed the Turn-By-Turn Feature for Windows Phone,

    First of all, to the entire Windows Phone team: Good job with Mango.  I’m highly impressed with several of the features.  There is just one feature that really grinds my gears.

    The Maps application.

    You got that one wrong.  Not wrong as in “oops, wrong turn.  I’ll just take the next right.” but wrong as “oops, wrong turn.  Dang, this turnpike is 15 miles long with no exits, adding 30 minute to my commute… wrong”.  That particular example is real life, as I experienced it a couple days ago on a trip to Philly.  Back to that in a minute.

    Where do we being?  How about at the beginning of the experience and work our way through the end of the commute?

    Imagine you’re a user, and you’ve decided you wanted to take a drive from Chesapeake, VA to Philly, PA.  You pull out your trusty Windows Phone and go to the maps application.  All the folks are raving about this great turn-by-turn feature, and having been a Droid user in the past, you decided to give it a go.

    Selecting an address is easy.  Type it into the search box, and tap “Directions”.  You’re provided a map, and your next turn in very large type.  So far so good.  You get into your car, put the GPS in the cup holder and start driving.

    First thing you’re going to notice is that the map doesn’t automatically orient itself so you can make logical sense of where you’re going.  Most (read: all) GPS software do this.  Even if you’re heading west, the map will orient itself so “west” is facing up.  With Windows Phone, you have “tap” the map for this feature to turn on.  It also enables tracking of your position (also not on by default).

    Next scenario, you’re coming up to a very important turn.  Most (read: all) GPS systems will warn you 1-2 miles before the turn.  They’ll say something like, “In 1.25 miles, make right turn”.  Makes sense right?  Not for Windows Phone.  You’ll hear a very distinction “beep” or “boop” or whatever.  That’s the sound saying you’ve should have turned 5 seconds ago.

    Since you heard a noise, you pick up the phone to see what happened.  It says make “10 miles, make right turn”.  What it doesn’t tell you is that those were the instructions 10 miles ago!  Windows Phone doesn’t see the need to provide you up-to-date directional information.  Want up-to-date directional information?  TAP the screen and it’ll refresh.

    “You’ve gone a different route” is what you’ll hear next.  Since you carelessly missed that right turn you should have known about, Windows Phone will gladly recalculate for you, right?  NOPE!  Again, you have to TAP the screen in order to get new directions.

    While we’re on the subject of tapping, Windows Phone will update everything on a tap except one thing: total mileage left and time.  Want to know approximately how much time is left in your commute based on current conditions?  You have to leave the navigation portion of the app and start it again.  Same thing for mileage.  Why can’t we update that as we go, or at least when I tap the screen!?

    I know many of you will defend this application, saying that’s its perfectly acceptable.

    DON’T DEFEND BAD SOFTWARE!  

    It is sold as a “turn-by-turn” navigation feature, and while technically it lives up to that name, it fails to recognize the experience associated with it.  The most common use of turn-by-turn is in vehicles moving between 25+ mph.  You should be able to drop the device in a cup holder and not have to pick it up until you’re at your destination.

    The Maps app for Windows Phone encourages drivers to take their eyes off the road, increasing the chances of them getting into a serious accident.

    And I really didn’t want to use the “G” word in this post, but look… Google did it.  Google did it 3 years ago.  Google is continuing to make the experience better.  Couldn’t you all have just “looked” at the Google Navigation app?  I’m sure you could have designed something similar that was more “metro”.

    Don’t give me the excuse of “there are other apps available on the marketplace”.  If the phone is marketed to have a feature, it needs to be the best it can be.  I shouldn’t have to drop $40 on another application to replace the functionality the phone was marketed to provide in the first place.

    I understand this is “version 2″, and you all won’t get it right until version 3.  So please, take all my comments, grab a Droid/iPhone/Garmin/TomTom and come back with a kick butt new navigation app.  I believe in you.

    Rock on,

    Kevin “it took me 45 minutes longer to get to Philly because of my Windows Phone” Griffin

    PS: For everyone else, leave your thoughts in the comments.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  2. MVP For Another Year (now in ASP.NET)

    Posted on July 5th, 2011 by Kevin

    Looks like Microsoft has granted me the title of MVP again for another year

    However, unlike last year when I was a Client Application Development MVP, this time around they’ve moved me into the ASP.NET/IIS product group.  Really, I feel this is the group where I can really grow and reach out, as most of my day to day work is using ASP.NET.  At the time when I received my first MVP award, I was doing a little bit in WPF and Silverlight, but my focus wasn’t in those spaces.

    And besides, this is probably a good move seeing how Windows 8 is going to be all HTML5 and JavaScript. </sarcasm, please don’t take my MVP away>

    Congrats to all new and renewed MVPs in all expertise’s.  Even if I had lost my MVP, I would continue doing the work that I do every day in the community.  Without this community I don’t know where I would be in my career.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  3. Review: OfficeWriter by SoftArtisans

    Posted on May 27th, 2011 by Kevin

    Disclaimer: I was approached by SoftArtisans to evaluate their software product OfficeWriter, and I was given a free license for the product.

    OfficeWriter is a product that handles two common functions for software applications, reading and writing to Excel and Word documents.

    When I was approached to evaluate OfficeWriter, I had one particular purpose that I wanted to try it for.  The application I was working on required the output of massive excel spreadsheets.  I’m talking about 60 worksheets, each with 75,000-100,000 rows and ~20 columns. 

    In the past, I had used the OpenXML SDK to do all of my Excel manipulation, but I often saw myself writing wrappers around the methods in order to make the process easier.  OfficeWriter not only made the process of creating Excel spreadsheets easier, but it did it in a fraction of the time it would’ve taken me (my code was very optimized).

    I did run into a bug with the large files I was working with.  There is a feature in the library to automatically size the columns of any populated cells in a workbook.  I ran this feature across all my workbooks, and ended up throwing out of memory exceptions. 

    The folks at SoftArtisans were very helpful in providing me the support I needed to work around the issue, even providing me up to the minute builds of the product.  Anyone purchasing the product should expect the same level of support I received.

    The interfaces for the library were easy to work with, and the documentation on the website was a good starting point.  There are several example projects available that cover a variety of use-cases. 

    I did not test any of the Word functionality, as I did not have a need for it at the time.

    I would recommend anyone that’s working with Excel or Word documents at least check out a trial of the software.  There is no link available to a direct demo download, but there are links to contact the test drive team for your use cases.

    http://www.softartisans.com/

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  4. Moving on to Greener Pastures

    Posted on May 25th, 2011 by Kevin

    After four years with my current company, Antech Systems, it is time for me to pack up and move on to greener pastures. 

    I would like to publically thank Antech for providing me with a foundation to build my career off of.  I came to Antech as a college newbie, recently laid off from Symantec, with no .NET experience of any kind.  Within weeks, I was able to grow into a position where I was not only functional, but able to provide meaningful feedback about the applications being built and the processes use to build them.  Antech was the reason I found the developer community, and was one of the leading reasons why I started the Hampton Roads .NET Users Group.  Without them, I have no idea where I would be right now.

    I’m pleased to announce that on June 1st, 2011, I’ll be starting my new position with ComponentOne as a Technical Evangelist. 

    In this position, I’ll be working closely with Rich Dudley to help promote ComponentOne in the developer community.  As a Technical Evangelist, it is my goal to help you all in your communities in anyway possible.  Please feel free to use me as a resource.

    If you’re going to be in the Kansas City area on June 25th, come out to the Kansas City Developer Conference to see me!  I’ll be talking about MVVM!  If you’re in the area, you should definitely come out.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  5. Why You Should Attend MADExpo 2011

    Posted on March 28th, 2011 by Kevin

    A couple weeks ago we announced that we’re going to be holding our first regional event here in the Mid Atlantic, and the name of that event is MADExpo (Mid Atlantic Developer Expo).  Scheduled for June 30th – July 1st.  It’ll be held at the Hampton Roads Convention Center in Hampton, VA.

    Last week, we announced our pricing as well as opened up registration.  Early bird pricing starts at $99 and will run until May 1st.  After that, full pricing begins at $149.

    BUT KEVIN?!  Code Camps and stuff are free!

    That’s correct!  But code camps also have a fraction of what MADExpo is going to have, and suffer from regional fragmentation.  The goal of MADExpo is to unite all developers in the Mid Atlantic, and our sister regions, for two days of awesome developer content.

    What should I look forward to?

    Most code camps have a very “Microsoft” feel to them.  .NET this, C# that.  At MADExpo, we’re making certain that you have the opportunity to explore other avenues of software development.  If you’ve been curious about Ruby, we’re bringing in sessions built for you.  Have you seen people working with touch screens and Natural User Interfaces?  We have leading experts in the field to show you how it’s done!

    There are beginners topics, and more advanced topics that’ll make you scratch your head.

    But wait!  There’s more!

    Additionally, we’re adding a full day side session devoted to electronics and hacking.  If you’re into soldering, or thought it looked interesting, take a talk through our own mini-Maker’s Faire.  Learn from geeks just like you who are building crazy machines with Arduino and code!

    But I have kids…

    Bring them along!  We’re proud to announce a one-day MADKidz workshop for kids of all ages.  This event will help your youngster learn more everything from software developer to electronics.

    The other tangibles

    This event is also about networking.  Meet other developers from other parts of the country (and maybe even different countries!)  Exchange ideas, discuss issues, and have fun!  I will always say that some of my best friends have come from the event I’ve attended.

    The hidden secret

    Want a free pass to MADExpo?  SPEAK!  Events like this are terrific opportunities to get out and flex your presentation muscles.  No developer subject is taboo.  Submitting costs nothing.  Go to http://madexpo.us/speakers to submit a talk!

    Or just register!

    Go!  Register for MADExpo right now.  It’s worth it!

    Register for MADExpo 2011 in Hampton, VA  on Eventbrite

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  6. Test Driven Development Firestarter

    Posted on March 7th, 2011 by Kevin

    Test Driven Development is one of those topics that is heavily preached throughout the community, but very few developers are taking advantage of.

    Two of our locals, Perry Neal and Jeff Muller, have decided to put together a one day workshop for folks that want a hands on “real world” approach to doing Test Driven Development.  Perry and Jeff are great fixtures of the Hampton Roads developer community, and we’re excited to see this come together.

    Additionally, we’re excited to be visited by Dane Morgridge from Philly to assist Perry and Jeff in promoting TDD.

    Seats are limited, so please register soon!

    Here’s the details:

    When: Saturday, April 30, 2011 from 8:00 AM – 4:00 PM

    Where: InfoTec, 100 Constitution Drive, Virginia Beach, VA 23462

    Register today! http://hrtdd.eventbrite.com/

    Hope to see you there!

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  7. Announcing MADExpo

    Posted on February 28th, 2011 by Kevin

    Here in the Mid-Atlantic, we’re a productive group.  We host code camps in  most of our major areas, we have a dozen very successful user groups, and we’re dedicated to making developers like ourselves better at what they do.

    A couple months ago, we held a leadership summit for the Mid-Atlantic.  Several of us discussed the possibility of hosting a major event in our area, similar to a CodeStock, DevLink, or CodeMash.

    MADExpo was born.

    So what is MADExpo?  Short for Mid Atlantic Developer Expo, it’s a two day event that spans across several aspects of the development community.  Whether you’re a Ruby or .NET guy, or you’re active in robotics and microcontrollers, we want you to come to MADExpo.

    I’m personally very excited to see MADExpo come together, because it’s right in my back yard (Hampton, VA).  If you come out to MADExpo, be sure to bring your family, since you’re only minutes away from theme parks, beaches, historical areas, museums, and whatever else you could imagine.

    When is MADExpo?

    June 30th and July 1st, 2011

    Where is MADExpo?

    Hampton, VA.  Venue details will come soon.

    Can I sign up to speak?

    Absolutely!  We haven’t opened up speaker submissions yet, but we will soon.  Please keep an eye out.

    Where can I learn more?!

    Go to http://madexpo.us!

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  8. ASP.NET MVC 3 : RenderSection ‘Required’ Parameter is Misleading

    Posted on February 18th, 2011 by Kevin

    The other night at a user group meeting, I was discussing ASP.NET MVC 3 with a group of people.  During the discussion of Master Pages vs. Layout Pages, I talked about Sections and how to use RenderSection() to add content to your layout pages.

    RenderSection has two overloads:

    RenderSection(string sectionName)

    RenderSection(string sectionName, bool required)

    If you read the comments on the second overload, you’ll read that the required field determines if the section must be defined in any pages that use the layout page.  Additionally, it notes that by not providing the required parameter (the first overload), it will default to False.

    I went to show this to the group, and I was presented with an exception stating that the Section must be defined in my View.  Odd.  It was supposed to be optional.

    Today, I reflected the MVC code and determined the comment is incorrect.  By not provided the required parameter, it is set to TRUE.

    As I understand it, the behavior is correct and this seems to just be a mix up in the Intellisense code.  You should always assume the Section is required, unless you explicitly tell the Layout page it is not required.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  9. A User Group Leaders Guide to the INETA Community Speakers Program

    Posted on February 16th, 2011 by Kevin

    As an INETA mentor, I’ve received a lot of feedback from my community about different things that INETA has done.  The Community Speakers program was started last year in an effort to help promote community speakers and assist user groups with bringing in fresh, exciting new faces.

    A Little History

    Before the Community Speakers programs, there was the National Speakers Bureau.  This group consisted of several familiar faces in the .NET community from across the world.  As a user group member of INETA, you could request one of this speakers to come talk at your user group with all expenses paid by INETA.

    However, you did have abuse of the system.  For example, I’ve heard stories about speakers on the west coast who’d only speak to user groups on the east coast.  Why?  So they could get maximum number of frequent flyer miles.  A bit abusive, huh?  They would turn down a user group on the same side of the country just because they wanted to wait out for a more lucrative offer.

    Changes

    Instead of spending thousands of dollars on flights and hotels for national speakers, INETA decided to abandon that program and focus more on the local communities.

    As a community speaker, you’re interested in a couple things:

    • Getting your name out in the public
    • Teaching the skills you have to offer
    • Free pizza (or tacos)

    Notice I didn’t say: racking up frequent flyer miles.  A community speaker doesn’t worry about that sort of thing.  They speak for the benefit of the community.  Speaking at a user group is a bit of a commitment.  Not only do you have the time involved with preparing the talk, but you have to worry about taking the time away from work, gas to get to the venue, and maybe even a hotel to spend the night.  These things cost money.

    So INETA thought: instead of paying a single person $1000 (I’m rounding here…) for one talk.  Let’s pay several people a maximum of $200 to go out into their local communities and speak.  That’s usually enough to cover a tank of gas, and a night in a hotel.

    The Community Speakers program was born.

    There are currently a couple hundred speakers registered with INETA on a variety of topics.  A user group leader can request anyone, and there is a defined workflow between the group leader and the speaker (with INETA as a mediator).

    Tweaking the System

    User feedback has been very much appreciated by the INETA board.  The process is being tweaked based off our feedback, and it’s only getting better.  However, the one complaint I’ve heard is that leaders don’t know how to use the Community Speaker request application.

    In the rest of this post, I’m going show you step-by-step how to request a speaker.

    STEP 1 – Log in to INETA

    Go to http://www.ineta.org, and log in to your account (the only your user group is registered under).  If you’re unable to do this, please contact your INETA mentor (feel free to contact me if you don’t know who that is).

    STEP 2 – Find the Community Speakers area

    Menu Option

    Find the SPEAKERS menu, and select ‘”Search for and Request a Speaker”.

    STEP 3 – Filter your search

    image

    Maybe you want someone to talk about ASP.NET or Silverlight.  Here is the place to do it.  Also, the state dropdown will show you states the speakers have agreed to travel to.  If your user group is in Virginia, I’d recommend selecting Virginia.  Press search!

    STEP 4 – Find a Speaker

    Now you’ll see a list of speakers who are registered with INETA, and are willing to travel to your state.

    image

    Additionally, you’ll see links to the person’s website and blog.  Also, MVPs are designated by their MVP logo.

    If you want more information, click the Details link.  This will show you more information about a particular speaker, such as the topics they’ll speak on.

    If you want to continue straight to the invitation, select Invite.

    STEP 5 – Invitation

    For this example, I’m going to invite my friend Joel Cochran to my user group (Note, Joel is scheduled to come to HRNUG anyway, so it’s perfect timing).

    On the invitation screen, I see a list of what Joel will talk about, and I can select from that list.  Also, I need to provide 3 dates that are open for Joel.  In case Joel can’t make the first date, he can choose another.

    image

    When you’re all done, press Submit Request.

    STEP 6 – Success

    image

    At this time, emails are automatically being sent.  If the speaker accepts or denies the request, you’ll receive an email.  You can also monitor the request by going to the “Community Speaker Requests” section of INETA.  It’s located underneath the Search option in the menu.

    Menu Option

    STEP 7 – After The Talk

    When the talk is over, you’ll be asked to confirm that the speaker showed up and also to rate them.  This is the most important step, since it completes the workflow and the speaker will get paid.  Please don’t forget to do this.

    Conclusion

    I really hope this has been helpful for you in learning how to request speakers for your user’s group.  The whole process really only takes 5 minutes (if even that), and most of it is automated.

    As a tip, talk to the speakers before going through the INETA process.  Make sure they are available and discuss options for the talk.  Not only will you build a better relationship with the speaker, but they’ll be more likely to work with you.

    Finally, I am registered as a Community Speaker and I’m available to speak at user groups in the VA, NC, MD area.  I’m booked out from now to June 2011, but if you’d like for me to come to your group, just head to my INETA page here and request me.  The link is also available on the right side of my blog.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)
  10. Building better ConnectionStrings with ConnectionStringBuilder

    Posted on February 14th, 2011 by Kevin

    Okay, I never admitted to being a .NET guru or anything, and that’s why I get so excited whenever I run across a gem in the framework that allows me to do something easier and with fewer issues.

    ConnectionStrings has always been one of those things I did the hard way.  For example, I would have a line of code that was like so:

    string connectionString =  "Data Source={0};Initial Catalog={1};User Id={2};Password={3};";
    string.Format(connectionString, serverName, databaseName, userName, password);

    This seemed like a logical way to build my connection strings.  However, it wasn’t very flexible.  That was until I discovered the suite of ConnectionStringBuilder classes.

    Let’s take the above OleDb connection string and use the OleDbConnectionStringBuilder to build it.

    System.Data.OleDb.OleDbConnectionStringBuilder oleDbConnectionStringBuilder  = 
                new OleDbConnectionStringBuilder();
    oleDbConnectionStringBuilder.DataSource = "myServer";
    oleDbConnectionStringBuilder.FileName = "myAccessFile.mdb";
    oleDbConnectionStringBuilder.ToString();

    Look at how much cleaner that is!  Maybe you’re working with a SQL Server database:

    System.Data.SqlClient.SqlConnectionStringBuilder connectionStringBuilder = 
                    new SqlConnectionStringBuilder();
    connectionStringBuilder.DataSource = "myServer";
    connectionStringBuilder.InitialCatalog = "databaseName";
    connectionStringBuilder.UserID = "userName";
    connectionStringBuilder.Password = "password";
    connectionStringBuilder.ToString();

    Isn’t that awesome?!  Now, finally, let’s imagine you’re doing all this with Entity Framework:

    System.Data.EntityClient.EntityConnectionStringBuilder entityConnectionStringBuilder =
                    new EntityConnectionStringBuilder();
    entityConnectionStringBuilder.ProviderConnectionString = connectionStringBuilder.ToString();
    entityConnectionStringBuilder.Metadata = "(entity framework metadata here)";
    entityConnectionStringBuilder.ToString();

    There you go!  Instead of hand writing your connection strings, take a look to see if there is a StringBuilder class that’ll do the work for you.

    Digg This
    Reddit This
    Stumble Now!
    Buzz This
    Vote on DZone
    Share on Facebook
    Bookmark this on Delicious
    Kick It on DotNetKicks.com
    Shout it
    Share on LinkedIn
    Bookmark this on Technorati
    Post on Twitter
    Google Buzz (aka. Google Reader)