Tuesday, January 10, 2006

By and large, I'm not a user of emoticons in MSN Messenger (or any Instant Messenger-like application - though I use the keystrokes frequently).  I copy and paste too many code snippets in the window (though purportedly Skype does a better job of handling code, I can't stand Skype's interface) and it gets wearisome to interpret the code sequences rendered as graphics.  I was reading a bit today on the next version of MSN Messenger and saw mention of a hidden MSN Messenger emoticon, so I thought I'd try it out.  Sure enough, it worked!  I then hunted these down.  I believe that they been in MSN Messenger since about version 6 (though the goat may be new to 7.5).  I present them here for your viewing (and using) pleasure:

Image Shortcut Description
(brb) Be Right Back
(ci) Cigarette
(h5) High Five
(nah) Goat
(%) Handcuffs
(tu) Turtle
(xx) XBox
(yn) Fingers Crossed

A couple of years ago I set out to create some of my own (feel free to use them as well for yourself).  The majority of these derive from my passion around board games, in this case Settlers of Catan.  I may take up to creating some more time permitting.  [Update 01/18/2006: I've added a few new icons below (ellipsis and arrow).  Additionally, I have added a zip file (click for link) that provides all of these custom icons in a single download.]

Image Shortcut Description
(bowl) Bowling
($) Dollars / Money (I never liked the money symbol in Messenger)
(scrab) Scrabble
(brick) Settlers of Catan - Brick Tile
(desrt) Settlers of Catan - Desert Tile
(ore) Settlers of Catan - Ore Tile
(wheat) Settlers of Catan - Wheat Tile
(wood) Settlers of Catan - Wood Tile
(wool) Settlers of Catan - Wool Tile
... Animated ellipsis (NEW: 01/18/2006)
--> Right Arrow (NEW: 01/18/2006)
Tuesday, January 10, 2006 4:24:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [36]  |  Trackback

I'm sure many out there get a bit irked when a product doesn't do what you want it to, or it does too much.  This may be one of the most frequent complaints users have with Microsoft Office.  While I don't usually share this sentiment in general, I do agree with respect to it's 'Save As HTML' options.  Word, for example, will inject a TON of unnecessary markup in the end result if all you're wanting is pure, clean HTMl.  This may not always be bad, but if you're intending to paste the HTML somewhere not Office, then you have your work cut out for you.

Jeff Atwood has created a slick little utility that cleans up the HTML within a Word document, resulting in a much cleaner result.  Go check it out...and don't forget to subscribe to his blog - Jeff has some pretty amazing insights and commentary.  A good read all around.

Tuesday, January 10, 2006 9:00:00 AM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  |  Trackback
 Monday, January 09, 2006

I've had a devil of a day diagnosing problems that practically piled faster than I found I could fix!  Ok, enough of the silly alliteration...

For some time now I've been assembling an application in C# 2.0 that relies on RDLC documents (Report Definition Language - Client-side).  I've had a very enjoyable time doing it (the details of which are forthcoming in a follow-up post).  That aside, I ran into an issue today which had me completely baffled.  All of the sudden today my project in VS.NET stopped compiling.  It had been working flawlessly for weeks (even this morning at 4:00 AM it was working).  When I opened the laptop on the plane it stopped working.  VS.NET was reporting “An internal error occurred on the report server.”  Lots of good that did me.  Well, the error message led me to believe that there was an issue with my Sql Reporting Server installation.

Sure enough, when I started going down the path of diagnosing that, I saw that my http://localhost/ReportServer virtual directory would not come up for me, giving me an error along the lines that my permissions were “insufficient for performing this operation.”  Inspecting the logs led me to believe that there was an error authenticating to the SQL reporting services databases.  I thought, “alright, the Windows user account's password associated with the SQL Server service might have expired.”  That turned out to be wrong.  “Ok,” I mused, “Maybe I mistakenly installed a time-bombed version of SQL Server (something I've never done - but hey, I was grasping at straws here).”  That, too, turned out to be wrong.

I went so far as resetting the user's password, connecting to the SQL Server database as that user via RunAs (which worked flawlessly).  As it turns out, I figured it out on the last thing I tried (of course, I didn't need to try any further). :)

Log on to your local machine as your administrator user (because you're not running  as an administrator user, of course), and browse to http://localhost/Reports.  Grant your user account 'Browser' rights.  Alright, that fixed my SQL Reporting services issue.  Great.  Go back to Visual Studio and recompile...BZZZZZZZZT!  Same error!  It turns out that I simply had never configured my user account with SQL Reporting Services permissions....

I was pretty irked by this time because most of my day was already shot diagnosing an issue that wasn't the root of the problem.  I then decided to backtrack through what I had last done in the project by removing the last two reports from the application.  When I did this, I found that I had some compile-time errors in my code.  I fixed them, brought the reports back in and it worked great!  At least I now know that if you're getting this strange “internal error” during a compile, chances are it's an error in your code and not the report server.

With all this mayhem, I then decided to go back and run my application (which relies on SQL Express User Instances) and lo and behold, I get a new error message “Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance.”  Man!  The fun just never ends!  I suspect this is happening because I was futzing around with my SQL Server configuration, changing passwords, etc.  Long story short, I found the solution while browsing around online.

SQL Express User Instances rely on content found in the “C:\Documents and Settings\[USER]\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS” folder.  Simply delete this folder (you'll have to shut down the SqlServer process first) and reboot your machine.  SQL Express will then repopulate this folder with the appropriate Master, Model, TempDb, etc when the next User Instance database is requested.  In fact, that's probably why SQL Express takes a little extra time to load on the first time for a given user - because it has to copy files into this folder at startup.  This can lead to timeouts on first load.  Subsequent loads, however, should go more smoothly.

So there were three issues resolved today:

PROBLEM:  Permissions “insufficient for performing this operation”
FIX: Grant user 'Browser' permissions via http://SERVER/Reports virtual directory

PROBLEM:  “An internal error occurred on the report server.”
FIX: Temporarily remove the .RDLC reports, recompile, fix compile errors, add reports back (or recreate them)

PROBLEM: “Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance.”
FIX: Delete “C:\Documents and Settings\[USER]\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS”

Monday, January 09, 2006 4:22:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [8]  |  Trackback
 Sunday, January 08, 2006

I took a bit of time today and updated the look and feel of my blog site and the root site for the community blog.  While its hardly revolutionary, and just slightly different from the look that it had, I like the new style quite a bit more; yet there is still some work to be done on it.  I also made a few more improvements so that the site would appear better in FireFox (I get quite a few visitors using said browser, and wanted to make their experience pleasurable).  There is still more work to do in that arena, particularly regarding the left-most bar, but it's still usable.  Any ideas on what I should do to better the site?

I've also made some upgrades and enhancements to my rating control which I will be posting tomorrow, time permitting.

Sunday, January 08, 2006 5:53:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Wednesday, January 04, 2006

Wow! This is pretty exciting!  I received today an email from Microsoft that I have been accepted as a Microsoft MVP in ASP/ASP.NET!  I'm stoked...my feet haven't yet touched the ground.  The emails were supposed to go out yesterday so when I didn't receive it I figured, oh well, I'll just work harder next year.  However, when I received the email today I was elated.  Even now, I'm gonna try even harder next year, so that goal is in place.

Thanks to all my friends that have and continue to support me, my colleagues, and also to the community (especially the Utah .NET User Group)!  This has been a fun and exciting year - hopefully we can do more this coming year.  There are days where I think I should get do something else for a living...but this is definitely NOT one of those days...I'm revitalized for a long time now. :-)

What a way to start the new year!

Wednesday, January 04, 2006 3:55:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [5]  |  Trackback
 Sunday, January 01, 2006

Every so often something comes across one's desk that results in a “hey! what's that!?” moment.  Now I'd like to believe that I have acquired a deep level of comfort and familiarity with the syntax of my favorite development language (C#).  Today, however, I had one of those moments.  I saw a line of code that resembled:

Console.WriteLine(userName ?? "User name not specified");

Note the ?? operator.  It took me a bit to find information about it, I really had to do some digging - it wasn't coming up on the msdn sites...I wonder if the search engines just didn't like the question marks.  Whispering from the recesses of my mind I seemed to recall having seen it, but all memory of its usefulness had vanished...I had to relearn it.

Anyway, this operator (termed a null coalescing operator) is new in C# 2.0...and it's pretty slick.  The null coalescing operator provides inherent null-checking capabilities.  The result of the expression is based on whether the first operand is null.  If the first operand is not null, it is the result of the expression, otherwise, the result falls to the second operand.  In other words, return the first value if not null, otherwise the second.

In effect, the previous line could be written thus:

Console.WriteLine( null != userName ? userName : "User name not specified");

That's pretty awesome - especially since in general I'm a fan of the ternary, conditional operator (?:), I think I can really fall in love with this new capability.  I suppose the null coalescing operator (??) is just syntactic sugar, but I like it nonetheless.

Let's suppose you had a function named 'getCustomer' that accepts an id that is used to retrieve a customer object from some underlying store (such as a database, collection, file, etc).  If the customer exists, it is returned.  However, if it doesn't exist, a value of null is returned.  In this particular instance you might have an operation that indicates that if the customer doesn't exist to create a new one:

Customer cust = getCustomer(id);
if ( null == cust ) cust = new Customer();

You could effectively rewrite the previous lines as

Customer cust = getCustomer(id) ?? new Customer();

Note, you would NOT want to do the following for reasons which are self evident.

Customer cust = ( null == getCustomer(id) ) ? getCustomer(id) : new Customer();

A couple of links that I did eventually find which are good reads: Fritz Onion's blog and Oliver Sturm's blog.

Ya (re)learn something new everyday.

Sunday, January 01, 2006 8:40:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [44]  |  Trackback

In keeping with the tradition we established last year, we had some friends over to commemorate the coming year.  This time, however, rather than watch a movie marathon we decided to do a boardgame marathon, though much more abbreviated than last year's movie marathon.  We had Eric and Kimberly Tolman over to eat dinner and play games, and play we did.  We tried some new games which were loads of fun.

We played:

  • Speed Scrabble - A variation on Scrabble that the Tolmans taught us consisting on building out your own private set of tiles before everyone else.  I love Scrabble so this is a welcomed addition to our gaming repertoire.
  • Mystery of the Abbey - a whodunnit mystery game similar to, but quite distinct to Clue.  That was a good time.  Oh, it was Brother Harold whodunnit you know, the thin, hooded, clean-shaven Brother Templar.  Just as I suspected.
  • Shadows Over Camelot - a fantastic game that works hard against you.  It whooped our butts.  We need to develop a strategy for beating this game.  I look forward to the next time we can play this.
  • Carcassonne - A now-staple game around our house which we discovered nigh a year ago now, we played with the Inns and Cathedrals and the Princess and the Dragon expansions.  Lots of fun.  Carcassonne is a wonderful tile-based game.

All in all we had a great time!

Perhaps I should post something about setting goals, my personal goals, etc in a post such as this, but I just wanted to report on our evening.  I'll be touching on other more lofty topics in the days to come.

Happy New Year!

Sunday, January 01, 2006 4:37:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Friday, December 30, 2005

I met Ron Crumbaker today (he's an SMS MVP) out there in Kentucky.  He's been wanting to enhance his blog (and about 50+ others on his site) with various sundry items such as a rating control, CAPTCHA, etc.  He was having a few issues with it so we got together on the phone and worked through the issues and now he's up and running and it looks great!  Plus he's now up and running on the custom build of the Clearscreen CAPTCHA control by Miguel Jimenez that I made that actually preserves your contents across a post if the code the user enters is invalid, etc.

It's always exciting to have people use your software and be pleased with it.  I hope it works well for him!  You gotta check out his blog.

NOTE: You can find the latest rating control (version 1.0.1.1) here.

Friday, December 30, 2005 4:53:00 PM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [1]  |  Trackback
 Wednesday, December 28, 2005

I was just reading a post by Scott Hanselman on switching off of Acrobat Reader to Foxit's Reader.  I must say I wish I had known about this tool a long time ago.  While I've never had Acrobat crash as Scott did, I've never really enjoyed using it.  Among other things its load time was WAY too long simply to read a document (sure, there are ways to speed it up, but it's a headache).

  1. Gone are the load times; Foxit Reader 1.3 loads almost instantaneously.
  2. Gone is the bloat; Foxit Reader is about 2.5 MB and runs without an installer and with a smaller memory footprint (about 50% smaller).

It's added to my \Tools directory and my thumb drives...awesome!

Wednesday, December 28, 2005 5:34:00 AM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [4]  |  Trackback
 Monday, December 26, 2005

Several months back I went down to my local Circuit City and picked up a NetGear RangeMax Wireless Router WPN824.  It wasn't, however, until December 24th that I actually had a chance to do something about it.  Over the years I've been impressed with NetGear's routers, having long employed a NetGear RO318.

In setting it up, I was able to effectively eliminate the RO318 (which is a wired router) and my other wireless router and consolidate them to a single unit with many more capabilities.  I am very excited and impressed with the new RangeMax as it offers many things that my other routers could not do, or at least didn't do well.

DHCP Reservations - One reason that I so thoroughly enjoyed Windows-based DHCP is that of reservations.  The effectively allow you to assign a hard IP address to a particular MAC address on the LAN.  My other routers did not offer such a capability, but this one does.  It both acts as my DHCP server as well as assigns hard IP addresses to devices (such as my Brother HL-5170DN printer, servers, etc) so I don't have to go in and configure them manually.  :-)

Firewall - My other routers of course offered firewall protection...which was very welcome and expected.  This router, however, has a double firewall for additional security.  And while I've seen it in other routers (and yes, my RO318 was rather antiquated), this router provides me to specifically designate the protocol (TCP/UDP) to accept over a given (set of) port(s), it also allows for an arbitrary list of ports.  My RO318 would only provide a set of about 10 ranges of ports for incoming traffic.  For the most part this might be sufficient, but I was constantly banging my head against a wall when needing to open other ports because my list was constantly full.  This RangeMax, on the other hand, doesn't yet seem to have an upper limit on the number of ports and ranges of ports that I can open.  Additionally, it allows me to 'name' the port range.  I fall back to simple protocol names, but it sure makes it easier to remember why I opened port 372 (arbitrary port # of course) and what it was for.

Wireless Security - I have rarely encountered a wireless router that didn't have problems with wireless security.  I've had, oh, three or four different wireless routers from different manufacturers and anytime I set up wireless security (be it WEP, WPA-PSK, etc) the router would freeze, I couldn't reconnect, or I could connect for a bit and then it would drop me...basically I had issues.  The best I could do on security was simply to disable SSID broadcast and lock it down with MAC filtering.  This one, however was a snap!  I setup the wireless security, MAC filtering, and disabled the SSID broadcast and it all just worked...and continues to do so.

Even though I don't have the recommended NetGear Wireless PC Card (which I might pick up today just for kicks to get the 108 Mb performance), I have never dropped, consistently had an 'Excellent' 54 Mb connection, and the router is traversing more walls and floors than before.  I am impressed.

If you're in the market for a router, want additional security, want awesome performance, and a greater network range, definitely take a look at the RangeMax router...I'm hooked already.

Monday, December 26, 2005 3:57:00 AM (Mountain Standard Time, UTC-07:00)  #    Disclaimer  |  Comments [0]  |  Trackback