Thursday, February 02, 2006

@!#%& Quicktime

Every time that I pave my machine, I swear that I'm not going to load Quicktime again, but I eventually need to because I have yet to find a way to play Quicktime videos in Windows Media Player.

Despite explicitly telling the installer that I DO NOT WANT QUICKTIME TO BE MY DEFAULT PLAYER for anything but Quicktime videos, I always seem to see the plugin pop up when I click on, say an MP3 file link on a web page:

Quicktime Plugin Playing My Browser's MP3 Files

(the link being displayed in this screenshot, btw, is another SSWUG podcast where a blog post of mine was mentioned:

http://www.sswug.org/sswugradio/the_where_clause_02feb2006.mp3)

PwopWatcher

Note: I did some blog refactoring, and extracted this information into it's own post. It originally was here.

My little program is a console app that I scheduled to run every 3 hours using the Windows Task Scheduler. It looks to the config file for a list of feeds, and then fetches the RSS from those feeds, and searches for //item/enclosure[@url] elements in order to get the URL for each .torrent file that Pwop publishes. The .torrent file is then downloaded and saved to the drop directory that I configured µTorrent to watch. I mean, this is what everyone's looking for when they say that they want RSS capabilities in their BitTorrent client, right?

Oh, and I kind of take advantage of a little error-handling feature of µTorrent: if it already loaded a particular torrent, it will simply log a warning if you try to load that torrent again. This is useful because my console app blindly downloads torrents each time that it runs, but µTorrent just ignores the duplicates (only new torrents placed in the drop directory will be processed).

I call the program PwopWatcher, but only because I'm not too imaginative in naming projects, and chose this name because... well, because I use it to watch the Pwop RSS feeds (in other words, I don't mean to imply that it was produced by Pwop Productions).

It is a .NET 2.0 console application, and here's the source code (for Program.cs, the main class file that VS2005 creates for Console Application projects). I'm listing it here because I don't think this is rocket science, and it will hopefully benefit people looking for examples of processing RSS feeds and downloading files from the Internet using the .NET 2.0 Framework.


class Program
{
  static string dropDir = @"c:\pwop\drop\";

  static void Main(string[] args)
  {
    try
    {

      dropDir = System.Configuration.ConfigurationManager.AppSettings["dropDir"];

      if (!dropDir.EndsWith(@"\"))
      {
        dropDir += @"\";
      }

      foreach (string feed in System.Configuration.ConfigurationManager.AppSettings["feeds"].Split(";".ToCharArray()))
      {
        ParseTorrentsFromFeed(feed);
      }
    }
    catch (Exception ex)
    {
      Console.Beep();
      Console.WriteLine(ex.ToString());
    }

    System.Threading.Thread.Sleep(30000);
  }

  static void ParseTorrentsFromFeed(string feed)
  {
    if (feed == string.Empty || feed == null)
      return;

    System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();

    try
    {
      xDoc.Load(feed);
    }
    catch (System.Xml.XmlException ex)
    {
      Console.Beep();
      Console.WriteLine("XmlException encountered while loading feed:\n\n" + ex.ToString());
      return;
    }

    System.Xml.XmlNodeList nl = xDoc.SelectNodes("//item/enclosure[@url]");

    foreach (System.Xml.XmlNode n in nl)
    {
      DownloadTorrent(n.Attributes["url"].Value);
    }

  }

  static void DownloadTorrent(string url)
  {
    try
    {
      string filename = url.Substring(url.LastIndexOf("/") + 1);

      using (System.Net.WebClient wc = new System.Net.WebClient())
      {
        wc.DownloadFile(url, dropDir + filename);
        Console.WriteLine("Fetched " + filename);
      }
    }
    catch (Exception ex)
    {
      Console.Beep();
      Console.WriteLine("Exception encountered while downloading torrent:\n\n" + ex.ToString());
      return;
    }
  }
}


The config file is expected to have two appSettings:

"feeds" is a semicolon-delimited list of RSS feeds
"dropDir" is the directory where the .torrent files will be saved to

µTorrent r0x0rz!

I've been seeding torrents for the different Pwop shows for a couple of weeks now. At first, I used Azureus, simply because that's what Carl initially recommended, plus it supported RSS feeds. Then, I discovered µTorrent.

Azureus is by far the most popular BitTorrent client at the moment. However, it is written in Java, and consumes a lot of memory. "But, memory is cheap," you might say. True, but my seeding system only has 256MB in it to start with, so I'm looking for something that is REALLY light on the physical memory.

That's the niche that µTorrent fills. The whole program is contained in a small 133kB executable, and it hardly consumes any memory when it runs. For example, it's been running for a couple weeks now, and I'm currently seeding 23 torrents, and the process is only consuming 2.8MB of physical memory and another 5MB of virtual memory. Compare that to the 40-60MB of physical memory that I sometimes saw Azureus using!

I'm not sure how well the built-in RSS capabilities of µTorrent are. To be truthful, after discovering that it has a built-in directory watcher that will automatically load any .torrent file that is placed into a drop directory, I just rolled my own RSS consumer.

Note: There was originally more info here that detailed the small "PwopWatcher" app that I created to consume the Pwop RSS feeds. I moved that content to it's own post:

http://jasonf-blog.blogspot.com/2006/02/pwopwatcher.html

I'm Trapped in a Time Warp

If anyone is able to read this, please help! I'm blogging from my room at a bed and breakfast in Punxsutawney, Pennsylvania. I've been waking up to the same Sonny and Cher song every day for about a year now, and no matter what I seem to do, tomorrow always turns out to be February 2nd!



(Happy Groundhog Day)

Wednesday, February 01, 2006

Database Performance Increase Tip: Avoid MS-Access

A client of mine wanted to put together a tool to help them determine the profitability of their products. They didn't have a big budget, so initially (last year), they opted for a MS-Access based tool, since they already knew (or thought that they knew) how to use Access. They were also under the assumption that this would be cheaper than designing and building a purely SQL Server based solution (because they don't understand SQL Server).

So, my company developed the tool for them to take a bunch of overhead numbers and distribute the associated costs for a period of time over the list of invoice line items for the same period. Using Access. From a desktop client.

Ok, that's fine. The tool worked really fast with the sample data that they provided. Party on.

But, whoa! Their production data for just 1 month's worth of invoice data was multiple gigabytes in size - much too large to transfer into an Access database (which apparently has a 2GB file size limit). And, typically, the profitability was measured on a quarter's worth of data (3 months). Well, now we needed to introduce SQL Server into the equation in order to hold the large sets of data, while the business logic continued to exist in Access.

Did I mention that I was NOT involved in the architecture or construction at this point?

So, picture this: They would use Access to drive the data migration by linking to the source database in their data warehouse (using ODBC) and the destination database in SQL Server (also using ODBC) and pump all of those gigabytes worth of data through the desktop client. Besides being extremely slow, this also had a nice side effect of bloating the transaction log file (LDF) to the point that it actually filled the disk.

Then, once data for a period was in place on the SQL Server, a VBA module in Access would fire off, open about 15 recordsets to various lookup tables, loop through each row of the invoice data, search the 15 recordsets for corresponding data using .FindFirst, and then eventually update the row in the invoice table with calculated data.

This whole process, end-to-end, would literally take them 3+ days to run. They would start it on a spare machine, and check back days later to see if it completed, or if it errored out (in which case, they had to start over).

Ok, so the MS-Access solution is now being called a prototype, and I'm now in the picture to ensure that they get better performance out of the next iteration of the project. The obvious improvements that I'm making are to use DTS to pump the data from Oracle into SQL Server 2000, establishing proper indexes (including a clustered index that includes the invoice date), and to move everything out of Access. That VBA module is being ported to a stored procedure, and instead of using cursor-based processing, I'm manually converting everything to set-based.

(To be fair, a lot of these changes were actually identified by the original developer of the MS-Access developer before I became involved)

I don't have access to their production data at this point, but based on the data that I have, I'm predicting that the 3-days worth of processing can be completed in 10 minutes. That's 432 times faster (which, if I'm calculating correctly, is 21,600% faster??!), chiefly due to the logic being moved to the data tier instead of pumping data across the wire using ODBC and MS-Access.

I'm excited to see this run on the actual production system...

Warner Bros. In2Movie Service To Use P2P

Something caught my eye as I read Neowin this morning: Warner Bros. is going to start offering movies and television shows for download (obviously at a cost).

But, that's not what caught my eye. The article was a little light on details, but it seems that Warner Bros. will use Peer-to-Peer (P2P) technology to distribute the content. Looking into my crystal ball, I can foresee this service failing, and here's why:

P2P distribution technology, like Gnutella or BitTorrent, depends on users uploading in addition to downloading. As a user, I don't mind providing the bandwidth to upload because I see that as a tax for being able to download content faster. But, this concept only works when the content is free to start with.

As soon as I have to pay for content, then I'm not interested in sharing my uplink. I expect the content provider to have a really big pipe so that I can download everything from that one source, and I don't want to wait forever for the content to arrive. I don't believe that I'm alone in thinking this way, either.

So, if WB is planning to just distribute their content using BitTorrent, then they're going to find a vast majority of downloaders who simply leech from the swarm (leeching is when someone downloads without providing any uploading at all, or who turns off the BitTorrent software after the download completes so that no further uploading occurs). The result will be the opposite of what BitTorrent was designed to do: instead of downloads getting faster as more machines participate in the swarm, they will get slower because more demand will be placed on fewer nodes of the network.

Of course, I could be interpreting this incorrectly. Look at what Pwop Productions is starting to do by establishing a network of BitTorrent seeds through their Ambassador program. This is the future of P2P distribution, in case you haven't been paying attention.

Carl, who truly believes that his content must be of great quality, and must be free to the listener, assembled an army of volunteers (this blogger included). BitTorrent clients on these machines subscribe to an early feed that allows them to access torrents hours before they are released to the general public. The goal is that by the time a DNR, Mondays, dnrTV, or Hanselminutes show goes live, that there is already a number of machines seeding the content.

This benefits Pwop in the fact that there are lower demands on their network bandwidth, and benefits the listener in that they are able to download the content faster.

So, any major studio, like Warner Bros., should look to the Pwop model as inspiration for setting up their own distribution network. They can set up a grid of P2P seeder nodes scattered throughout the world, thus eliminating the need for one big central pipe. However, unlike Pwop, the studios cannot count on the same type of upload capability from their downloaders.

Tuesday, January 31, 2006

NW Ohio .NET User Group: January Meeting

Consultant, author, and Microsoft Regional Director (not an employee title, but rather an honorary designation bestowed upon prominent community members) Bill Wagner presented tonight at the NW Ohio .NET User Group (NWNUG) meeting. His topics: Generics in C# 2.0, and LINQ in C# 3.0.

Perhaps having Greg Huber and myself in the same room is bad luck for hardware, for Bill had a little struggle in getting the presentation going. After a reboot and a couple of anecdotes, we were on our way.

Bill, of course, is the author of the highly acclaimed book Effective C#: 50 Specific Ways to Improve Your C#, which I guess kind of makes him an expert on the subject of C#. That didn't stop Scott Wiltamuth from recommending Bill's own book to him at the PDC this past year!

During one of his vamps, Bill pulls out a fresh copy of his book and slides it across the table to me. He then explains to the group that he wanted me to have one that was properly signed (which this copy reads: To Jason, Thanks for inviting me to speak at your group. Bill Wagner)

Now, to understand the significance of this gesture, I need to first take you back to probably the mid 1990's. I was doing a lot of Visual Basic 4 programming, and my definitive source of information was Carl and Gary's Visual Basic Homepage. At that time, the internet was actually not the wealth of information that it is today, and I'm not even sure what the state of the MSDN web site was (if it even existed). But, everything that I needed to know could be found at good ol' CGVB-dot-com.

Jump ahead to maybe 1997. I receive as a Christmas gift a book on Internet programming using Visual Basic 4. It soon became the catalyst that led me into protocol-level programming because I was truly amazed by just how simple these Internet protocols really were. The author of that book: The same Carl from CGVB.com. Cool.

My life then transformed from doing pure Visual Basic programming to web programming, and I spent a great deal of my professional life dealing with angle brackets, client-side scripting, and OSASPADO (Old-School ASP/ADO) on the backend. My visits to CGVB completely stopped, and Carl's book was stored away in a box. I swear it was like the scene in Toy Story 2 when the little girl got rid of the Jessie, the Yodeling Cowgirl, complete with a sad song by Randy Newman. /me wipes away a tear.

Zipping ahead to April 2005 (we'll be getting back to Bill Wagner in just a second, so hang in there): I attended a MSDN event that Bill Steele presented at. Part of the swag that was given away included a DVD loaded with content, including the first 100 episodes of this Internet radio talk show named .NET Rocks!. "I'll have to give that a listen," I thought. BTW, it was after this same MSDN event that I discovered that there was a .NET User Group in Toledo.

So, it began. While working at a client's site, I listened to 2-3 episodes of DNR each day. After a month and a half of a diligent listening schedule, I was completely caught up. Once again, that Carl guy had somehow snuck back into my life. (And, I also found a certain appreciation for the personality known as Rory)

I was really impressed by this sense of community that existed. It was almost like a fraternity, with folks from all over the country (and the world) sharing in their passion for Microsoft technology. Most importantly, I learned that there were others who shared in my beliefs that Microsoft was better than Java. (If you're still reading at this point, you know that I'm trying out some tongue-in-cheek ideas here, right?)

I had the opportunity to actually meet the current DNR duo while I was in San Francisco late last year for the Microsoft Joint Launch Event. I think that it's no secret to readers here that I'm a big fan of Carl Franklin the Podcaster, the Musician, and the Regional Director, so being able to ever so briefly hang out with him was a big highlight of 2005 for me. DNR was the catalyst for me becoming involved in the community.

The day after eating boiled ribs with Carl and Richard at the post-event party, I flew back to Detroit for our own regional version of the same event. There, I met Bill Wagner for the first time. I had taken his book with me to SFO, so as we were standing there at the User Group booth, I pulled the book out and asked if he would sign it. Having no clue who I was, I think that he simply looked to me for guidance about what to write in the dedication. It was then that I said, "To Jason, With Love, Carl Franklin" (as if I didn't know or cared who Bill was). To his credit, Bill actually wrote something to that effect. Party on!

Thanks for the replacement book, Bill! Though, the original one is certainly not going anywhere!

Monday, January 30, 2006

Podcast Mention

So, I was looking over my referrer logs today, and I noticed a visitor coming from:

http://www.sswug.org/sswugradio/

Interesting! Someone linked to me!

I investigated, and found that there's a short (5 minute) podcast called The WHERE Clause that seems to highlight some of the interesting blog posts that Chuck Boyce has found while browsing the blogosphere.

At the end of today's podcast (1/30/2006), my post linking to the fact that Jim Holmes posted some photos from the Code Camp last week was highlighted, with particular note from Chuck about the mountain o' swag!

Neat little podcast, though I would recommend using Shrinkster to shorten the URL's.

What Do You Think About This?

Source: http://www.msnbc.msn.com/id/11098458/

Exxon Mobil posted their Q4 numbers. Their profit for just October-December 2005: a whopping $10.71 Billion. That's $10,710,000,000 for you numerically challenged folks, and that's all PROFIT!

Tell me there's no collusion between oil companies to keep oil prices high. Tell me that the oil companies don't giggle like little girls when there's turmoil in the middle east, or hurricanes in the Gulf, or when tree huggers successfully prevent exploration/drilling on U.S. soil because they know that the futures will continue to go up, which obviously (according to this news story) increases their profits as well.

Do you know why the price of gas is $2.30/gal at the pump? Because the oil companies haven't found today's excuse to charge $2.31. (credit for this insightful joke goes to an ex-employee of Marathon Oil Company)

I'm pretty conservative and pro-business, but not for energy or utility companies. For those, I believe in heavy regulations and tight controls on profit margins.

Sunday, January 29, 2006

Best Blonde Joke Ever

I may be a few days (years?) late, but what the heck. This joke is one of the best ones that I've seen in a while (and it's clean, too!)

http://msmvps.com/blogs/glach/archive/2006/01/29/82044.aspx

Friday, January 27, 2006

Elevator Hack

I saw an article today about a new system to help route elevator traffic. The concept is that you visit a kiosk in the elevator lobby, and based on what floor you're going to, it will tell you which car to wait in line for. Kind of like packet routing for people.

That reminded me of an elevator hack that I learned of quite some time ago. I haven't performed scientific tests to guarantee that it works, but it seems to:

To avoid stopping at multiple floors for people to get onto your elevator car, hold down the Door Close button at the same time that you select which floor you want to go to. On some of the more popular/newer elevators, this will have the same effect as using the Fireman Mode, and will take you right to that floor, regardless of whether there are people waiting on floors in between to ride in the same direction that you are heading.

Like I said, it might not work for all elevators, and I bet that property owners have the ability to disable this feature. But, after learning about it, I've been quite successful in using this hack (be that merely coincidence or not).

Give it a try the next time you're going up!

CruiseControl.NET's Web Application Issue

While I didn't officially make a New Year's resolution, I do want to use more of the developer tools that Agile methodologies have made popular.

For instance, I'm pretty set in my ways, so this whole test-driven development thing is going to be a real challenge to me. But, I see that resistance is futile, so I'll join the Borg now.

One thing that I'm exploring is the role that Continuous Integration provides while working on a project. What this is, as best as I can describe it, is a way of automatically building the project's source code, running tests, and reporting on the results. This way, at any time, you can always get the latest build, and assuming that you have unit tests, can be sure that the latest build passes all tests.

One tool to facilitate Continuous Integration for the .NET platform is CruiseControl.NET. I was first introduced to CC.NET by an article in CoDe Magazine last year written by Dr. Neill in his screenplay-like writing style.

Well, I have successfully configured CC.NET to retrieve the latest source code from Visual Source Safe 2005, build it using MSBuild, and maintain stats through a web application that it provides. A step in the right direction, to say the least.

The CCNET web application includes a link to CCTray (a Win32 client for CC.NET), which points to a path within the CCNET virtual directory structure:

http://servername/ccnet/CCTray/CruiseControl.NET-CCTray-1.0-Setup.exe

When I first clicked on this link, I got a 404 Page Not Found error. "Hmm, that's weird. Why would they not include the setup file that the link pointed to?" I thought to myself.

But, while exploring the server, I noticed that the file was indeed there. Why would IIS return a 404 then?

Well, as it turned out, the CCTray virtual directory was set for "Scripts and Executables". This means that when I requested the EXE, that IIS tried to run the EXE on the server (think CGI) instead of sending me the file's bits through the response stream. In fact, the whole ccnet web application was configured for "Scripts and Executables" out of the box!

The obvious fix was to change the web application permission to just "Scripts". This allows ASP (and ASP.NET) pages to run without trying to execute binaries on the server if and when they are requested.

Dayton-Cincinnati Code Camp Pics

I'm hoping that we'll see more pics uploaded, maybe to Flickr or something. But, Jim Holmes has posted some photos of last Saturday's event on the Dayton Dev Group site:

http://daytondevgroup.net/events/CodeCamp-1-06/CodeCamp-1-06.aspx

Check out the mountain of swag that was given away at the end of the event (primarily hundreds of books)!

Thursday, January 26, 2006

Ghost Hunters

There are a couple of television shows that I personally don't miss each week. One is LOST on ABC, and the other is Ghost Hunters on SciFi.

Just this week, I received a belated present: the first season of GH on DVD. Now I can finally free up about 30 GB of hard drive space on my HTPC that has held those episodes all this time.

One interesting thing that I never noticed before: The Race Rock lighthouse (Episode 104) is also off the coast of New London, CT (home of Carl Franklin, as well as the shipyard that builds our Navy's nuclear submarines). I had previously blogged about another lighthouse in New London that the TAPS team visited in season 2, but never picked up on this fact for Race Rock until I watched the DVD.

Oh, and the internet makes it truly easy to find out where just about anyone lives. For instance, TAPS fans, here's Jay's house with the old TAPS HQ (a trailer) in his front yard:

SQL Server CAST Weirdness

Consider the following number:

3.04878048780488E-03

That's the number that was stored within a varchar field in my client's database. A stored procedure was trying to take the sum of this column and store the result into a decimal(18,2) column of a different table. The author of the stored procedure was smart enough to check for numeric values before blindly trying to take the sum, as in the following:

sum(case when isnumeric(theField) = 1 then cast(theField as decimal(18,2)) else 0 end) as theFieldSum

If you think this is the right way to have accomplish the task, then I'll admit that I was the author. Otherwise, we don't know who wrote this. ;-)

Anyways, the number above is considered numeric by SQL Server, and in fact, you can cast it to a float without problems. However, try casting to a decimal(18,2), and you get:

Msg 8114, Level 16, State 5, Line 11
Error converting data type varchar to numeric.


The exact behavior is documented in the BOL:

Character expressions that are being converted to an approximate numeric data type can include optional exponential notation (a lowercase e or uppercase E followed by an optional plus (+) or minus (-) sign and then a number).

Character expressions that are being converted to an exact numeric data type must consist of digits, a decimal point, and an optional plus (+) or minus (-). Leading blanks are ignored. Comma separators, such as the thousands separator in 123,456.00, are not allowed in the string.

If You Really Want to Fine a Utility Company....

A few days ago, it was announced that FirstEnergy Corporation has to pay $28MM in fines for lying to the government about the dangers of it's Davis-Besse nuclear power plant:

http://toledoblade.com/apps/pbcs.dll/article?AID=/20060121/NEWS02/60121001

That plant is a mere 20-30 miles from me, and about 5 years ago, the reactor head was so badly corroded from leaking acid that we could have had a serious nuclear disaster here on the shores of Lake Erie.

Supposedly, none of that fine is permitted to be passed on to FirstEnergy's customers (ratepayers). How are they going to enforce that? FirstEnergy makes money by generating electricity, which their customers buy. So, how are you going to keep the various monies separate? Somehow, I just don't see FirstEnergy (or, more locally to me, Toledo Edison) suffering as much as I will over time. I can even foresee rate hikes in the name of "increased energy costs" that will somehow restore that $28MM to their bottom line. This, despite the fact that FirstEnergy made close to $878MM in PROFIT (6.8% of revenue) alone last year. I have a real problem with utility companies continually increasing rates when they are already realizing huge profits, but I digress...

I say that if you really want to fine a utility company, don't simply make it a monetary fine. Instead, take it out of their rates. In FirstEnergy's case, force a lowering of rates over the current baseline for a period of time (years) until the $28MM can be realized. This way, you're ensured that the ratepayer is not paying the debt, and that they are in fact experiencing relief.

Of course, Treasury Department, or whomever is the direct recipient of that $28MM, would not receive that huge check, so we'll never see this idea come to be.

Wednesday, January 25, 2006

Detroit Driving Tips

Rodney Fournier posted a series of humorous (but true) tips for driving in Detroit. I tried to add the following comment, but something did not work, so I just decided to post them here:

***

I've noticed that while driving in DEEtroit that the left turn lane is actually the right-most lane. You must turn right onto the road that you're trying to turn left on, immediately get into the left lane, and then wait in a quasi- U-turn lane for traffic to clear, and then you can turn left.

So, the observation here: the infinite wisdom of the DEEtroit traffic engineers didn't want you to turn left at a light, where they can "safely" control the flow. Instead, they want you to turn left from a U-turn lane with oncoming traffic.

But, I guess that's what no-fault insurance is for...

Oh, and if you happen to be on a side street (i.e., not a Mile road or major North-South road), left turns do exist. But, when you're first in line at a red light, and that light starts flashing, that's actually a cue that you can turn left after yielding to oncoming traffic. Waiting for a green light will definitely get you shot.

Tuesday, January 24, 2006

Visual SourceSafe 2005 Webservice Issue

I got the chance today to install Visual SourceSafe 2005 on a new development server. One of the most exciting new features that I want to play around with is the Webservice functionality (accessed via the Visual SourceSafe Internet plugin for Visual Studio 2005).

I configured the server, and changed my Source Control to the "Internet" version, but I could not connect to the web service from my client. All that I would see is the following messagebox:

---------------------------
Visual SourceSafe Internet
---------------------------
Cannot contact the Visual SourceSafe Internet Web Service or cannot access the specified database.

The server returned the following error: A connection with the server could not be established (0x80072EFD)
---------------------------
OK
---------------------------



I next tried to connect to the web service URL from Internet Explorer. This time, I got a familiar ASP.NET error screen. But, it was hiding the true error from me due to the configuration.

So, I changed the VSS web service's web.config to set <customErrors mode="Off">

Now I got a better error message:

The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.


Now, there's something that I can finally work with!

The fix was to grant the NETWORK SERVICE account (since my machine is W2k3 server, otherwise, it would be the ASPNET account) the Modify permissions for C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files.

Sunday, January 22, 2006

Dear Code Camp Audience

Dear Audience of my Dayton-Cincinnati Code Camp Presentation,

I just realized that I started to explain something, promised that I would touch on it later, but then completely forgot. What can I say? The day was long, the hardware was not working, and everybody just wanted to play with the Xbox anyways...

Do you remember that object tag in the HTML that contained my Solitaire control? It looked something like this:

<object
classid="http:SolitaireMCE.dll#SolitaireMCE.SolitaireUserControl"
height="100%"
width="100%" />

Well, that's how you would use a .NET Winforms Control as an applet within HTML, very similar to how you use ActiveX controls. But, because this is pure .NET, you have to be mindful of Code Access Security. The biggest implication is that you cannot use a "file:" protocol to point to the assembly, so that leaves web servers as the only delivery mechanism (so that the source can be verified).

But, you can add some COM Interop attributes to your code, and actually transform your Winforms control into a ActiveX control (as far as Windows is concerned). This is what I did not demo to the group.

Why would you want to do this? For starters, once an ActiveX control is downloaded, it's cached differently than .NET assemblies. The classid attribute contains just a GUID instead of naming a DLL and the object within the DLL. This means that Windows won't try to fetch the DLL from the web server each time the page loads if that GUID has already been registered in the Registry.

And this has great implications for installation of your Media Center Hosted HTML Application: your installation program can do the steps to register the ActiveX version of your Winforms control on the destination MCPC, and then you will not need a web server because the Registry entry for the object's GUID will be pointing to a local copy of the DLL.

Love,

Jason


(ok, so I blatently stole the idea to write in the form of a letter from Rory)

Dayton-Cincinnati Code Camp

I attended my first Code Camp today as both an attendee and a presenter. I'm sure others will agree, but this was one of the best events that I've been to in a while.

While I realize that the formats are different, this was actually better than the last few MSDN events that I've attended (probably due to speaker and topic diversity). Surprisingly, we did not see Bill Steele there, even though I think he only lives a half-hour away. Oh, well, maybe next time...

Jim Holmes and James Avery have already made mention of a possible repeat event in the fall, and you'll most likely see something similar in format from the Michigan and Toledo groups this spring. Disclaimer: Any and all talk is preliminary and unofficial, so stay tuned.

So, my presentation story:

Greg Huber and I presented on Media Center development (the last presentation of the long day), and we were hoping that showing off the Xbox 360 as an Extender would steal the show. The night prior, we had 2 Xboxes, 1 Media Center, and 2 laptops all successfully talking to each other in the hotel room. That process went relatively smoothly, so we didn't expect much less of setting up the actual presentation.

Well, of course, the demo Gods were angry at us. Maybe it's because I ate the ham sandwich for lunch, or something. First, the Xbox's infrared media remote seemed to lock up Greg's media center whenever I used it (the MCPC also had a IR receiver, so it was receiving all of the same keypresses that I was sending to the Xbox located on the side of the room). So, that made us reboot a couple of times.

And then, there came a point where we needed to use my laptop as a web server to load my solitaire demo, and of course, the MCPC couldn't see my laptop. In retrospect, it's probably because late last night, we also tried to use my laptop as a internet connection sharing device to bridge our ethernet network to the hotel's wireless internet (we were trying to connect the Xboxes to Xbox Live, if ya have to know, but we weren't successful). I didn't remember this until just now, but I bet that set up all kinds of firewall policies on the XP SP2 firewall, and port 80 is probably blocked at the moment.

I, of course, was not in the audience, so I can't judge how well we did trying to recover from the unexpected hardware issues. My only hope is that at least my message about using .NET Winforms controls inside of HTML was useful to the audience, because that is applicable to more than just MCE/Xbox.

If you caught our presentation, I'd love to hear your personal feedback in comments. We're giving an extended version of this presentation to GANG on 2/15, and besides the obvious equipment issues, would like to know what else needs work.

Saturday, January 21, 2006

Searching for Prem_SMS Mobilesidewalk?

As a PSA, if you arrived to my blog's homepage looking for info on "prem_sms", "31000", and/or "mobilesidewalk", then look here:

http://jasonf-blog.blogspot.com/2006/01/i-think-ive-been-crammed.html

That post has fallen off of the main page, but the search engines have not updated themselves yet.

Friday, January 20, 2006

What Could Kill the Xbox 360

I'm a big fan of the Xbox 360, especially since Mt. Dew paid for mine. You can't beat getting something for free in order to become a raving fan of it. But, looking into my crystal ball, I can see a scenario that will absolutely kill the mass adoption of the Xbox 360.

By now, everyone knows of Microsoft's secondary motivation behind developing the Xbox 360: to become THE device to bridge your television with the rest of the computing world. I'm not sure if I agree that the way that they're doing it is necessarily the best, and a competitor could easily take this role away from the Xbox.

You see, out of the box, the Xbox 360 allows you to access audio and images that are on your home network and play them through your home entertainment system. For example, you can listen to MP3's on your stereo, or view a slideshow of pictures on your HDTV. Microsoft, being the friendly chaps that they are, even gives away software to facilitate this. But, the other aspect of multimedia - video - does not come for free.

If you want to view video through the Xbox, then you must use another Microsoft product: Windows XP Media Center Edition. Ah, and now we see where synergy enters the picture.

Over the past couple of months, I have taken a deep dive into the world of Media Center. It truely is an interesting technology and the improvements coming down the road in the Vista timeframe will make it even better (especially how they will allow developers to enhance Xbox 360 extender experience). But I don't think it's the best piece of HTPC software out there.

I'm willing to bet that a significant population of Xbox 360 owners have no interest in buying or building a dedicated HTPC running Media Center Edition. But, that doesn't mean that they do not want the ability to watch video on their Xbox. Herein lies the fatal mistake that Microsoft is making, IMHO.

By strongly tying video playback capabilities of the 360 to another SKU that the user may or may not have, Microsoft is opening the door for Sony or Nintendo to release an open solution to allow for their consoles to serve as a HTPC extender. If this were to happen, then you know that MythTV, FreeVO, MediaPortal, SageTV, BeyondTV, GB-PVR, and every other piece of PVR software will immediately work on supporting that console as an extender.

What would Microsoft do then? They would have significant market penetration, but as we all know, game consoles are replaceable devices (even at the $400 price tag). The early adopters of the Xbox 360 will likely jump to the next big thing when it comes out anyways.

Assuming that they would still pursue the vision of the Xbox 360 being the central device in the total media experience, then Microsoft would be forced to either offer equivalent capabilities for the Xbox (via an update), open up their extender technology to the other PVR software folks, or just sit back and watch the Xbox become obsolete.

It will be interesting to see if Sony or Nintendo will think to offer this in their next generation consoles.

Sunday, January 15, 2006

.NET Rocks! Episode ???: Bob Reselman

UPDATE #2: Apparently, Bob didn't feel comfortable with the outcome of the interview, so they opted not to "air" the podcast:

http://codingslave.blogspot.com/2006/01/q-why-didnt-you-do-dotnetrocks.html

UPDATE #1: Seems that Mr. Franklin already had a previous episode in the can, because the current .NET Rocks show is with Shawn Wildermuth. The following discussed the show that was taped last Friday (1/13/2006) with Bob Reselman:

We (the live listeners of .NET Rocks!) got lucky on Friday evening because Carl managed to get the media server working (after first announcing that it would not be up). After a few hiccups, I found myself listening to the first live stream since sometime near the beginning of December.

This week's episode was different. I'm not sure how much editing that Carl and the gang will do (I'm writing this before the episode is released), but whatever the result, don't expect a highly technical show. But, do expect to take away some common sense approaches to the business of software development. There was some great content discussed, and I'm going to give the show a second listen.

One thing that I found interesting is that Bob once worked for a company that had an open payroll policy. That is, everyone knew what everyone else was making, so there was never the thought in the back of your mind that your employer is screwing you by paying you far less than a peer. Speaking for myself, I know about that distraction all too well...

Another point that Bob made was the fact that people are too afraid of the truth. For instance, a project manager would rather have somebody lie to them about when a task will be complete, rather than an honest "I don't know" answer. In my personal experience, "I don't know" is really the best answer in a lot of cases. Sure, I could say that something will take a week, but that's a guess. It could really take 2 days, or 2 weeks.

Friday, January 13, 2006

PSA: How to pronounce Hauppauge

As an owner of the Hauppauge PVR-150, and someone about to embark on a MCE presentation next week, I thought that I would learn how to pronounce the word "Hauppauge".

From Reference.com:

Hauppauge is a US company most known for its WinTV line of TV tuner cards for PCs, but is also a producer of PVR's, digital video editors and digital television products. The company is named after the town of Hauppauge, in which they are based. Hauppauge is pronounced HOP-HOG.

Wednesday, January 11, 2006

C# Generics

Today isn't the first time that I've programmed using Generics in C#. But, I'm so impressed at the moment, that I just have to tell someone.

I'm currently converting my GB-PVR Solitaire plugin into a Media Center Application. (I know that Media Center already has Solitaire, but it doesn't have my Solitaire, plus I'm using this as code that I can demonstrate).

The GB-PVR plugin was written using the .NET 1.1 Framework. I'm converting to the 2.0 Framework, and I'm loving Generics!

For example, in 1.1, I used a lot of Stack and ArrayList objects. I mean A LOT (more than 10 in order to manage the state of the game as it's being played). Every time I accessed an object from one of these collections, I had to cast it to my Card type:

Stack column = Columns[col] as Stack;
Card c2 = (Card)column.Pop();

This made the code quite ugly, because these casts were happening all over the place. Well, with Generics, I can use the type Stack<Card>, and all of my type checking is done at compile time. This greatly simplifies the code:

Stack<Card> column = Columns[col];
Card c2 = column.Pop();

Or, if I don't need to reference the variable "column" any futher, then I could just do:

Card c2 = Columns[col].Pop();

And compile-time type checking totally kicks the ass of run-time type checking, especially in a strongly typed language like C#.

But, there is an apparent downside. It looks as if Generic collections do not implement ICloneable, like the old Object versions do. So, I have to think about workarounds for some of the things that my code does.

A reminder to people in the Toledo, Ohio area: Bill Wagner (Regional Director, Author) will be presenting to the NW Ohio .NET User Group on this very topic (January 31, 2006 at 6PM in downtown Toledo).

Upcoming meeting information: http://www.nwnug.com/dotnetnuke/Default.aspx?tabid=31

HanselMinutes Podcast

Today was the debut of Scott Hanselman's HanselMinutes Podcast, a Pwop Production.

Scott's always fascinating to listen to. Rory described Scott's style the best with the following:

Scott could get up in front of you, talk for an hour about beavers, and you’d probably walk away satisfied even though the talk’s title was “Obscure ASP.NET Errors That Only Scott Has Encountered”).

http://neopoleon.com/blog/posts/16327.aspx

So, in this debut episode, you get a taste of everything that we've come to know Scott for: tools, tips, and cool technology.

For example, one tool that I was generally unaware of was TimeSnapper. Being a consultant, I am responsible for recording my time in different "buckets" for all of the various clients and projects that I'm assigned to at any one time. Well, if I forget to record my time at the end of the day (or sometimes, over the course of several days), I find it hard to remember exactly which projects I worked on, and how much time I spent.

Up until now, I've been using my email as a memory tickler, checking to see what I sent and what I received on any one day. TimeSnapper will be another tool to help me to fulfill my weekly time entry requirements.

What it does is periodically (user-defined interval) takes a screenshot of your system, and saves it to a file. You can then go back to any date/time that it was running and see what your screen looked like at that point in time.

Thanks for the tip, Scott!

(Now that I've typed this, maybe TimeSnapper is going to be a double-edged sword, because I can see how much time is spent on non-client work)

Tuesday, January 10, 2006

I Think I've Been Crammed!

In early November, I went to San Francisco for the Joint Launch Event. Shortly upon returning home, I kept getting these unsolicited text messages on my cell phone, like the following:

From: 31000
U have 0 pts next question: What is the name of Hilary Duff's sister? A Heidi B Haytie C Yogi Berra D JoeDimaggio

Sometimes, the messages would include text like: "2 end reply stop." Once or twice, I even tried to reply with the word "stop", but I would just get a Undeliverable Message error.

So, I didn't think any more about it until I started looking at my December cell phone bill. Each of these messages were coming in at a $0.99 charge! Verizon is listing them under "Get It Now downloads" as:

Prem_sms 31000 Mobilemessager Trivia

Sigh... This is the last thing that I needed to spend time trying to resolve...

Log of Steps That I've Taken to Resolve the Issue

2/8/2006:

Unsubscribed before any further messages arrived. You're supposed to be able to do this by replying to a trivia message with "STOP" (to 31000), but every time that I tried, I would always get a Undeliverable Message response. Instead, I just used their website:

http://www.mobilesidewalk.com/Service/Unsubscribe.aspx


2/8/2006:

Contacted the company:

Address:
42 Corporate Park
Irvine, CA 92606
United States of America

Phone:
1.800.925.5285

Fax:
949.777.3707

Email:
support@mobilesidewalk.com


Since I prefer to use email whenever possible, I sent the following:
Since about November, I have been receiving unsolicited prem_sms messages from 31000 to my VZW cell phone (419-410-xxxx). Sure, the messages stated that I could reply with STOP to opt out (which never worked, by the way--always undeliverable), but to my point, I never opted in to any trivia game.

Imagine my surprise when I reviewed my VZW phone bill to discover that at one point, each trivia message was being billed at $0.99 a piece, and a monthly SMS message was priced at $9.99.

I discovered your web site this morning, and used the online Unsubscribe feature to prevent any further unsolicited messages. I need to know that you will be cooperating with reversing any and all 31000 prem_sms charges made to my phone since November, in which case we can simply write this off as an accounting mistake. Otherwise, I'll be forced to believe that there is interstate fraud involved.



2/9/2006

I received a reply from "Ashley N.":

Please fax a copy of the bill to 949 777 3707. And after reviewing it we
will someone will be in contact with you.

Thank you,

Ashley
www.mobilesidewalk.com



2/9/2006

I complied with the request, both faxing and emailing a scanned copy of what I faxed.

2/13/2006

I received the following reply from "Ashley N.":

I have received your fax. Please reply back with your billing address, so I can complete your request for a refund.

Thank you,
Ashley
www.mobilesidewalk.com



2/13/2006

I replied via email with my billing address. At the end, I also requested to know how my number ended up in their system.


3/31/2006

Never found out how my number ended up in their system, but I did get a check for the amount of the disputed charges.

The check was from:

New Motion, Inc
42 Corporate Park, Suite 250
Irvine, CA 92606
(949) 777-3700




UPDATE 02/13/2006

I found this while Googling(Source):
Before you enter Mobilesidewalk, READ THE FINE PRINT. In order to sign up for their service and receive ringtones, you have to agree to participate in the Mobile Sidewalk Music Trivia Challenge. As part of the challenge, you will receive trivia questions in the form of text messages at the cost of $0.99 per text (the charges will appear on your cell phone bill).

If you choose to sign up and enter Mobilesidewalk, the service will charge you a monthly fee of $9.99. However, if your phone service is through Verizon, Nextel or Alltel, don’t bother unless you just want to play the trivia challenge, these phone services are not compatible with the ringtones offered.

I don't specifically remember browsing for ringtones, since I'm not really into that, but it shows what kind of M.O. this company has: the $1 per message trivia is obviously their money maker.

Sunday, January 08, 2006

DVD Annoyance

I can understand why tech savy people prefer movies in a DivX or other nefarious format: to avoid being force-fed previews and FBI warnings!

There is nothing worse than renting a DVD from the corner video store, and still being forced to sit through previews that autostart when the disk is inserted! Somehow, the MPAA has figured out a way to prevent any of my DVD controls from working while the previews are playing (same behavior as when the FBI warnings are being displayed).

Even when I pressed the Stop button, the "You can't do that" icon on the screen. No, take a moment to appreciate what I just said: the STOP BUTTON, who's very purpose is to stop the video, could not be used! And this is on a Sony DVD player!

(Update: I did some searching after writing this post, and this exact behavior is not only common, but also years old, because I found mention of it dating back to 2000. Goes to show how little movie watching I actually do.)

The movie was Mr. and Mrs. Smith. I finally figured out that the "Next" button (>>|) would skip to the next preview (so it was inaccurate for me to say that none of the controls worked), but what ever happened to just being able to press the Menu button to go to the DVD's main menu, regardless of what you are currently watching?

Now, let's think about this: If someone has the chance to watch a movie at home and have the choice between (1) just the movie, or (2) be forced to watch previews, FBI warnings, and THX sounders before the movie starts, which do you think they will choose?

I, for one, am looking forward to the legal downloads of movies sans any of the annoying features mentioned above. Let me pay, download them using a Bittorrent network, and burn them onto a DVD. Let the movie autostart right away with NO PREVIEWS. That's what I'm talking about.

Friday, January 06, 2006

Resistor Problem

There's a question on the Google Aptitude Test about resistors:

10. On an infinite, two-dimensional, rectangular lattice of 1-ohm resistors, what is the resistance between two nodes that are a knight's move away?

I don't think that the answer is as complicated as what people are making it, since every node is the same value. Here's what I think the solution is:

A knight's move is a combination of 2 squares in one dimension, and 1 square in the other dimension. So, if you imagine all of these 1-ohm resistors in a grid:

  ! ! ! ! ! ! ! ! ! 
-+-+-+-+-+-+-+-+-+-
! ! ! ! ! ! ! ! !
-+-+-+-+-+-+-+-+-+-
! ! ! ! ! ! ! ! !
-+-+-+-+-+-+-+-+-+-
! ! ! ! ! ! ! ! !
-+-+-+-+-+-+-+-+-+-
! ! ! ! ! ! ! ! !


then you're trying to find the total resistance from one intersection to another one that is, say, 2 down and 1 to the right (i.e., resistance from A to F):

A-B
! !
C-D
! !
E-F


Despite the fact that this is an infinite grid, all resistors outside of this area will not have any effect on the system between the points A and F.

Breaking down the network:

A-B-D = 2 ohms
A-C-D = 2 ohms

The total resistance from A-D, therefore, is 1 ohm because:

Rt = 1/(1/R1 + 1/R2) = 1/(1/2 + 1/2) = 1/1 = 1

D-F = 1 ohm

So, the total resistance following path of the network A-B-C-D-F is 2 ohms.

But, there is another network in parallel: A-C-D-E-F It's value is also 2-ohms.

In all, going from point A to F is like having two 2-ohm resistors in parallel, which we showed above to be 1 ohm total.

I'll probably build this circuit and take physical measurements, but as I type this, I think that the answer is 1-ohm.

I'd gladly admit defeat if someone who actually studied this in school has a different explanation. ;-)

Wednesday, January 04, 2006

LinkedIn

My coworkers are currently going ape-sh1t about this social networking tool: LinkedIn. People are building out there networks, myself included (sorry if any invitations that I sent annoyed you). Most people that I have searched for were already users in the system, so this tool is probably years old... But, that's par for the course for me (catch on to things after the wave).

So, after getting people to actually accept your invitation (and become part of your network), it's cool to see just how many people you become connected to. You know, just like the Kevin Bacon game.

Speaking of Kevin, I don't know if this is truly him or not, but he doesn't seem well connected on LinkedIn (has only 1 connection):

Friday, December 30, 2005

Blog Feed Experiment

I got a little free time today, so I started looking into some ideas that I've been developing.

Can you do me a favor? I'd like to see how this fieldset element comes across in the various RSS aggregators.

If you subscribe to my feed, could you email me a screenshot showing this post in your particular RSS reader? Thanks.
One involves some look-and-feel issues with this blog. But, I don't want to possibly screw up people who read the blog using RSS feeds.

So, this post is an experiment to see how various aggregators handle certain HTML elements (specifically: FIELDSET/LEGEND).

PSA: MediaPlay Going Out Of Business

I'm probably the last person to know this, but Media Play is closing all bricks-and-mortar stores across the country (online presence will remain) effective some time in January 2006.

A co-worker and I walked through the store in Ann Arbor yesterday, and there was still a few decent things on the floor at a 40-60% discount.

I'm personally going to keep an eye on the inventory of guitars, and wait to see if they will increase the discount any further (most of their electric guitars of varying styles were originally $199, marked down to $119 as of yesterday). I figure that if by some chance they hit 75% off, and the inventory remains as high as they were, that I could make a low-cost jump into electric in the near future!

I'm not quite sure what their reason for going out of business is. But, at one time, the store nearest to me had a great selection of books, but that went downhill after they remodeled or something. I was never really compelled to purchase a lot of things from Media Play, so maybe that has something to do with it.

See if there's a store near you:

http://www.musicland.com/StoreLocator/storefinderMP.html

Einstein Riddle

I love logic problems. This one took me about 25 minutes to solve.

http://www.manbottle.com/trivia/Einstein_s_Riddle.htm

Tuesday, December 27, 2005

Copying Messagebox Text

Here's a little nugget of information that I think is not widely known:

What do you do when you're testing a program, and a message box pops up to display an error condition? Well, most of my testers will ALT-PrintScreen and email the whole screenshot to me. Then, I must manually type the message into a textbox if I'm searching the Internet for information about the error.

Well, it seems that there's been the ability all this time to just hit CTRL-C when the messagebox is modal, and onto the clipboard will go a text-only version of the messagebox contents, including title, message, and buttons!

For example, I'm currently being forced to create some Crystal Reports (I'm sorry for using such obscenities) for a client. Of course, something is not installed or configured correctly, because the designer is showing an error via a messagebox. Well, CTRL-C on that error gives me the following:

---------------------------
Crystal Reports ActiveX Designer
---------------------------
Failed to load database information.
Details: The database DLL 'crdb_adoplus.dll' could not be loaded.
---------------------------
OK
---------------------------

Thursday, December 22, 2005

ZMachine.NET Workspace

I have fulfilled a promise to the community by establishing this workspace for my ZMachine.NET project. I have uploaded the ZMachine class library code, as well as the console application code.

What is a Z-Machine? Refer to the following:

http://en.wikipedia.org/wiki/Z-machine


Where does the project go from here? Well, I would like to see support for later versions of the Z-Machine added (currently, only V3 is supported). And, there's got to be better ways to do things, like saving games, etc.

What's the buzz all about?I looked at my referrer logs, and noticed a large spike in the number of hits landing on this page from search engines. Is there a Z-Machine buzz that I'm missing? Please leave comments!

Wednesday, December 14, 2005

Squeaky Wheel Gets The Greasin'

Mike Judge, creator of the cult classic Office Space also produced another little cult classic called Beavis and Butthead. Now, there's not much that you can take away from that show, but I did get a one-liner stuck in my head:

The character Tom Anderson (who sounds remarkably like Hank Hill on another MJ production, King of the Hill) said, "If you get bad service, you've got to complain. Squeaky wheel gets the greasin'!"

And what better way to complain about bad service than through a blog read by tens of people!

Being the Christmas season and all, we decided for the second year in a row to take a family portrait and have it printed onto a Christmas card so that we can send it out to friends and family. This way, we think, everyone can see how big the kids are getting, and how much older we're starting to look. You know, all that fun stuff that a cheesy family portrait printed on a Christmas card provides.

Well, the portrait session itself was a nightmare. You see, procrastinating until right before Thanksgiving (which is like 4-5 weeks before Christmas) was a bad idea. We could not get an appointment at Photo Innovations (great place to take pictures, btw) or anywhere else in town before we left on a little vacation over the T-giving break.

We did finally book a photo session at the Sears Portrait Studio in Findlay, OH, which is maybe 45-minutes from my house, and was on the way to our destination. How lucky were we??!!

Well, as it turns out, we weren't all that lucky after all. You see, we started on the road driving in the first major snowstorm of the season, so the drive between our house and the store was extended. And, our appointment was right in the middle of the twins' naptime. And, Sears was running like 45 minutes behind (we had gotten there about 30 minutes early--seems the drive wasn't that bad after all). And, the twins did not want to get dressed (after we arrived at the store).

When we finally got into the studio, the twins did not cooperate. And, the photographer had a quota of shots that she had to take in order to try to upsell us on all of the great photos that are always taken after the boring "package" photo.

After about 20 minutes in the studio, we told the photographer that she had to give up because the babies did not want to be there any more. So, she had us sit in the lobby area so they can show us the pictures, and we can put together an order.

Well, maybe a half hour after that point in time, the temporary employee who was assigned to show people their pictures and take orders finally got around to sitting down with my wife (I was outside in the store walking the kids, trying to keep them from crying). And according to my wife, the temp didn't know what she was doing, and had to keep asking the supervisor questions.

So, two hours after our appointment time, we finally got back on the road, sans Christmas cards. You see, Tina specifically made an appointment at this Sears because they offered in-store printing of pictures (like Photo Innovations). What they don't tell you is that it's an extra per-sheet fee to have them printed on-site, and that Christmas cards are not included. Yup, we would have to wait about a week to get them.

Well, one week came and went. My wife gives them a call, and they insist that the order should be shipped and we should receive them before December 7 (which is like 2 weeks after the appointment).

December 7 comes. No pictures. Tina calls Sears. They will ship that day.

December 8 comes. Tina calls to confirm that they have shipped. Sears has no idea. No, wait. Sears says that they haven't even been printed! WTF!

December 9 comes. Tina calls to confirm. Sears has no idea. I've got a pissed off wife onhand.

December 12 comes. Still no cards. Christmas is two weeks away and we've still to receive the cards (and then mail them) before the holiday comes and goes. Tina goes over the store manager's head and calls the Sears customer service center. It seems that they can somehow force the store to print them on-site (albeit, the resulting cards will be of a smaller dimension) and then the store can overnight them to us.

"Heh," I think to myself. "If only the store would have printed them that day, then I wouldn't have to blog about HOW CRAPPY OF SERVICE WE'VE BEEN GETTING!" No wonder K-Mart owns Sears...

December 13 comes. Findlay Sears swears that they're going to "Overnight Air" them to us. I wonder how that's going to work, since the store is a 45-minute drive from my house. They'll probably ship them UPS, truck them to the air hub in Louisville, KY, and then realize that they don't need to go onto an airplane, truck them back to Toledo, OH, and place them onto a local truck. Oh, and we're supposedly getting a 20% discount.

December 14 (today): NO PICTURES! But, they were "definitely" shipped out this morning by "Next Day Air". Oh, and get this: the customer service rep refused to escalate Tina's phone call to a manager because "there's nothing more that they would be able to do for [her]". Umm, here's a note for anyone in a customer-facing role: That was definitely not the right thing to tell an upset customer.

Sigh...

Sunday, December 11, 2005

Windows Live Local Bird's Eye Imagery

I was playing around with local.live.com's Bird's Eye view again, and noticed that they have multiple sets of data online at the same time. That is, you don't always get the exact same photo each time you view an area.

I would expect that as you change the view to spin around North, East, South, and West that the times of day, and even maybe the time of year might change. But, I noticed while spying on my house that sometimes the year itself that the picture was taken for any given view changes! I can't figure out when it decides which picture to show, either.

Examples:

All three of these are "South-facing" views of my house.


This one was definitely taken before the fall of 2004, because the big spruce tree between the two houses was cut down then.


This one was taken on a Friday morning (garbage day--see the cans by the street?) in what I would say the spring of 2005 (the spruce tree is gone, but leaves are not on any of the trees yet. Also, my red-roofed neighbor had not yet let himself into my backyard to clear away the leaves that I left there over winter).


And this third one was probably taken on the same day as the second picture, only in the afternoon (no garbage cans, and the shadows are casting eastward).

XBOX 360 as a Media Center Extender

I finally got around to enabling the XBOX 360 as a Media Center Extender ("Bobsled" device). The process was pretty straight-forward from the PC Setup side.

However, the whole experience, while positive, was without a few disappointments:

1. I could not find a way to view videos that are located on a fileshare (i.e., not locally saved on the MCE PC). In my case, I use GB-PVR to schedule and record shows on a less-powerful machine, and then just play them back on a more powerful machine across the network. I had hoped to be able to do the same from the XBOX connected to my TV (using the Media Center PC as a bridge).

2. There are times where the Media Center experience seems to be hung, only to take off again 10-20 seconds later. For example, when the XBOX first connects to the MCE PC (using RDP, which I think it just the coolest use of technology, BTW), the main menu will appear. But, if I use the up/down arrows on the remote, nothing appears to happen. But, 10-20 seconds later, those "keystrokes" are finally processed and the menu selection changes. Similar unresponsiveness was witnessed after stopping a video.

3. This one was expected, but a little disappointing nonetheless: XViD/DivX encoded videos apparently cannot be played. :( I need to investigate this a little more to see what codecs are actually supported, because I don't want to keep MPEG2 files around (1.8 GB/hr is what I record them at) when I can transcode to a more compressed format.

UPDATE (12/13/05): Chris Lanier makes the case for why DivX is not (and will not be) supported on the XBOX:

http://msmvps.com/blogs/chrisl/archive/2005/12/12/78975.aspx

Thursday, December 08, 2005

Windows Live Local.... WOW!

The battle between Google and Microsoft over mapping continues. I was a little skeptical when the big announcement about Windows Live Local was made. I mean, we've already seen everything, right?

Well, I went to the site, typed in my address, and then saw a notice that a Bird's Eye View was available in my area. "What's this?" I asked myself. I didn't get a reply.

Now, both Google Maps and Keyhole...er, Google Earth... have pretty sucky imagery for my neck of the woods. So, I was expecting pretty low-res results.

Lo and behold, there's actually kick-ass aircraft imagery of my neighborhood!

SQL Server 2005 Editions Comparison

I found the following buried in a document (SQL Server 2005 Product Guide), but I could not locate it on the Microsoft site.

UPDATE: The link was staring me right in the face on the SQL Server homepage! Think of the table below as being a summary for this: http://www.microsoft.com/sql/prodinfo/features/compare-features.mspx

EnterpriseStandardWorkgroupExpress
$24,999 per processor
$13,499 (server + 25 users)
$5,999 per processor
$2,799 (server + 10 users)
$3,899 per processor
$739 (server + 5 users)
Free
Fully integrated data management and analysis platform for business critical enterprise applicationsComplete data management and analysis platform for medium businesses and larger departmentsMost affordable and easiest to use database solution for smaller departments and growing businessesFastest way to learn, build and deploy simple data-driven applications
Unlimited Scale and Partitioning1-4 CPUs
Unlimited RAM
1-2 CPUs
3 gigabytes (GB) RAM
1 CPU
1 GB RAM
4 GB database size
Advanced database mirroring, complete online and parallel operations, and database snapshot


Advanced analysis tools including full OLAP and data mining


Advanced reporting with customized, high scale, and ad-hoc reporting


Advanced ETL with complex data routing and transformation capabilities


Available in native 32- and 64-bit editions*
Database mirroring


Basic ETL


Standard OLAP server with Analysis Services


Standard reporting with Reporting Services


Data mining


Full replication and SSB publishing


Available in native 32- and 64-bit editions*
Management Studio


Import/Export


Limited replication publishing


Clustering


Back-up log shipping


Basic reporting
Simple Management Tool


Simple reporting


Replication and SSB Client

*Supports Itanium 2 and x64

Why Didn't I Think of This?

I can't add much to this, so just read Alex's blog entry:

http://blogs.msdn.com/alexbarn/archive/2005/12/07/501398.aspx

WIndows XP MCE

I've finally rebuilt the "family" PC. The last time I built it was when Server 2003 came out. It's funny to see how much stuff accumulates on a hard drive over time.

Anyways, I installed MCE this time primarily because I want to see what the XBOX 360's Bobsled capabilities are all about. I personally use GB-PVR as a VCR alternative (running on a different machine), and MCE is able to connect to a file share on that machine and play recorded TV shows. So, it should also be able to send audio/video to my XBox, allowing us to actually watch those TV shows on, well, a TV. (Up until now, we just used WMP to view the shows).

Stay tuned for more of this saga!

Tuesday, December 06, 2005

My Addiction

I don't do drugs. Never touched the stuff. I don't smoke, and really only drink every 1-2 months. So, when I mention that I'm addicted to something, it's not a chemical dependency that I'm talking about.

Rather, I am addicted to Qdoba Burritos. There, I said it.

In the last week, I've eaten at a Qdoba Mexican Grill three times. And the closest one is an hour's drive from my house!

I've got a menu in my truck that I use to track which items I have tried (I'm working towards eating everything at least once). Let's just say that there are more items checked than unchecked.

If you've never been to a Qdoba (which is very similar to Chipotle), then what are you waiting for? The burrito is the size of your head, yet when you are finished eating it, you become sad that there is no more of that yummy goodness to devour.

Placing an order is sort of like being in the Soup Nazi's line: there's a sequential workflow that takes place as the burrito is assembled before your eyes.

First, you decide which of the burritos you want. Throw a dart--they're all delicious. But for the sake of argument, let's say that you want a Steak burrito.

They'll steam the 12" tortilla, and ask you what kind of beans that you want (black or pinto). I always go for the black beans myself. Onto the flour tortilla goes a heaping scoop of cilantro rice and your beans. Then your meat is added, and you are asked what kind of salsa you desire.

Here's where you can order in spanish, because the salsa names are, well, en español. There's the Pico de Gallo, Roasted Chile Corn Salsa, Salsa Verde (my favorite), Salsa Roja, and finally the hottest: Fiery Habañero Salsa.

Further down the line, you'll hear a question asked of you: "Cheese or Sour Cream?" This sounds like an exclusive or, but just say "Both, please" and they'll top the burrito with a glob of sour cream and a handful of shredded cheese.

If you want some Guacamolé, here's your last chance. Because someone will soon fold the burrito into it's familiar shape, wrap it in foil, and serve it to you.

What can I say: ¡Muy delicioso!

12 Subscribers!



Ladies and gentlemen, a new record milestone has been reached. We now have a whopping 12 people who subscribe to this blog's RSS feed (through Feedburner)!

What can I say, but I am truly honored. I mean, a true dozen of you actually care enough to add the feed link to your aggregator. /me wipes tear.

Watch out, Robert Scoble and/or Joel Spolsky: I'm catching up to your readership levels!

720p vs 1080i

Rory provides some insight into what goes on inside of your HDTV, and exactly what role Oompa Loompas and Hobbits play in displaying your picture:

http://neopoleon.com/blog/posts/16711.aspx


Personal Endorsement (Unpaid)Email newsletters just don't work anymore. They want to hear your voice. Let's get your edge back!

For high-quality podcast production services, including editing, promotion, and distribution, you need PWOP Productions.

My own take on the 720p vs 1080i debate:

720p has an addressable pixel resolution of 1280x720. If you want to show 60 frames a second of this resolution in a progressive mode, then you need to have bandwidth capable of addressing 1280*720*60 => 55,296,000 pixels per second.

1080i has an addressable pixel resolution of 1920x1080. If you want to show 60 frames a second of this resolution in a progressive mode, then you need to have bandwidth capable of addressing 1920*1080*60 => 124,416,000 pixels per second.

But, if you interlace the 1080's resolution, then you only need to have bandwidth capable of addressing 1920*540*60 => 62,208,000 pixels per second.

So, for roughly the same bandwidth, you can have a higher resolution image, but it takes twice as long to load each complete frame. This is great for still shots, but when you have fast movement on the screen, you can have motion artifacts (I suppose that the quality of your monitor's deinterlacing abilities will dictate how much artifacting is perceived by your brain).

However, 60 fields per second (30 complete frames per second) is not a terrible thing, though. That's what you see when you watch normal television (NTSC). Do you notice motion artifacts? Probably not, unless you're standing 1-foot away from a 27" television set. You see, your eyes and brain tends to merge the fields together into a fluid motion picture. It also helps on regular television sets that the resolution is lower so that individual pixels tend to blur with their neighbors, which in turn helps to hide the combing (motion artifact).

Now I don't own a HDTV set, but I've stared at them in Best Buy on occasion, wishing that Santa Claus would just mistakenly load an extra one in his sleigh, realize that fact while in-flight, and just leave it at my place. And here's what I can say to people debating 720p vs 1080i: Waah, waah, waah.

Saturday, December 03, 2005

Little Annoyance with XBOX 360

Here's something that kind of annoyed me:

When I fired up the XBOX 360 for the first time, I had to create a HDD (local) profile in order to play. This is the profile that I used to get past many bosses in Kameo (and unlocked many elements).

Deleting Xbox 360 ProfilesA lot of people landing on this post have been searching Google for ways to delete profiles from their Xbox360. This is done through the dashboard.

Be sure to sign out of Xbox Live, and then navigate to the following:

System -> Memory -> Hard Drive -> Gamer Profiles

Select the profile that you want, and then you'll have the option to Move or Delete it.
Well, I also created a second profile when I signed up for XBOX Live (gamertag: JasonMF). I did this primarily because I didn't really understand how Live worked, so if it was something that I needed to continue paying for, or any other reason why I didn't want it, then I could just delete the profile without disturbing the HDD-only profile.

Turns out that now I can't find a way to transfer all of my achievements from the HDD profile to the XBL profile. So, I probably have to play Kameo from the beginning again so that I get credit on XBox Live.

Though, I wonder if I just associate the HDD profile with my XBL gamertag, if everything would be automagically be recorded... I'll have to play around some more.

Wednesday, November 30, 2005

Oh, So That's Why You Change Strings!

I bought some new strings today for my guitar.

Being self-taught and all, I really didn't know that you are supposed to periodically replace all of the strings (like monthly, if not more often). I had just thought that you only replaced them when they broke. Silly me.

I did notice after having my guitar for about a month that the tone really started to become dull. That should have told me that it was time for a string change, but I just thought that my playing was getting worse! Again, silly me.

My new strings: Elixir Nanoweb Acoustic Light.

The great bright tone that I loved when I first picked up this guitar is back! And, being coated, these strings are supposed to last longer and keep the squeaking down. They were a little more expensive ($15 at Guitar Center), so we'll see how long they last.

Tuesday, November 22, 2005

Let the Price Gouging Begin!

The XBox 360 launched in stores today. And it already looks to be this year's Cabbage Patch Kid. One quick look at eBay, and you can see the price gouging in action: BIN prices of $3500??! I surely hope that those auctions close with no bidders.

I wonder how much a lightly used (a.k.a., personally tested to ensure that it is defect free) unit would go for as Christmas nears and all stores remained out of stock???

Sunday, November 20, 2005

XBox 360 Pictures


The brown box contained a game (Kameo), the XBox 360, and a note saying that the game that I selected originally will arrive separately in the mail.



I carefully opened the lid of the XBox, and this is what I first saw.


I remove the unit itself, exposing some documentation.


In the bottom of the box is all of the goodies. That long green thing at the top is the power supply block, and it's huge! Also included was a CAT-5 cable, a wireless controller, a IR remote, a headset/microphone that plugs into the controller, and A/V cables.


At the top of the rear of the XBox is a connector for A/V (supports both TV and HDTV). The I/O section has a 10/100 Ethernet jack, and a USB-2.0 jack (which the wireless network adapter would plug into).

I tried plugging in a SMC USB WiFi adapter that I had, but no luck--it didn't detect it. I did notice that they gave some instructions on the screen for configuring their own WiFi adapter, and it includes running software on a XP machine to load something onto a USB flash stick which you then transfer to the XBox. I may play with that to see what files it creates.


Unlike the old XBox, there are no dedicated connectors for hard-wired controllers--every controller is wireless. However, in the front at the bottom are two more USB-2.0 connections.


The fabled Hard Drive! It snaps onto the top of the unit. It is a sealed unit, but it is only big enough to contain a laptop-sized HDD.


Here's where the hard drive unit snaps in.

Saturday, November 19, 2005

Big Brown Box Arrived Today

Yawn. Another boring day. Not much happened today except the Buckeyes pulled another win out of their asses against the Wolverines in the last minute of the game, and my XBox 360 arrived!

I didn't know which version the Pepsi/Mt. Dew "Every 10 Minutes" contest was giving away. Turns out that it was the tricked out version, with the hard drive and media remote control. Sweet!

I was actually contemplating ebaying this thing, since I could probably have pulled in a cool $1000, especially as Christmas nears. But, I felt it was time for me to have a new toy. In other words, I have no self control, and immediately ripped into the box to see what all was included.

Look for some pictures to be posted later, as well as a first thoughts write-up.

Tuesday, November 15, 2005

Text Games Rule!

http://games.slashdot.org/article.pl?sid=05/11/15/1435221

If you've never played a Text Adventure Game (a.k.a., Interactive Fiction), then you don't know what you're missing!

I have a vested interest in this genre because I grew up on these games, and was so interested in their inner workings, that I coded a Z-Machine interpreter (emulator) in C# (which I then showed off the power and ability of SQLCLR to use existing complex business logic by running the emulator entirely on a SQL Server).

At least one other person that I know of is also interested in this genre of entertainment, and has given presentations around a tool used to create your own stories.

UPDATE: Many people coming to this page through Google may be interested in the following GotDotNet workspace:

http://workspaces.gotdotnet.com/zmachine

Saturday, November 12, 2005

DNR Road Trip Tracker++

I actually created this a while ago, but it wasn't on a server that I could allow the general public to access. Last night, I signed up for a free ASP hosting service (websamba.com) so that I could finally blog about this.

The DNR Road Trip Tracker that Dr. Neil and his team put together was nice. It allowed a GPS-connected PC inside of the boat to periodically send it's current geolocation to a server, which the Via Virtual Earth team saved to a XML file. When the tracker page was loaded (either from the DNR Road Trip Homepage or from the VVE URL directly), the ASPX would take the coordinates from the XML, and stuff the data into the HTML by means of a [table]. Javascript would then iterate through the rows of the table, and create a pushpin for each geocode (lat/long pair).

This was cool, and let you more or less see where the DNR team was at any point during their drive. But, because each point was plotted individually, it took a very long time to get through all of the points to the end of the trip. Also, it appears that in order to get updated information, that you had to reload the ASPX, which meant waiting for all pushpins to be plotted again.

I wanted to see why the plotting was so slow, and what could be done to improve the rendering. I also wanted to see if I could eliminate the need for the ASPX to include the data (i.e., a HTML/JavaScript-only solution). So, I set off to improve the work that Dr. Neil, et al, had initiated.

Making the page HTML-only was easier than I thought. The ASPX was really only needed to merge the data into the resulting HTML. But, since the XML was also accessible to the web, I immediately thought of AJAX (in concept, at least). But, the data was on another server, so the browsers were having a fit security-wise with trying to access it.

My solution was to use a simple ASP and ServerXmlHTTP to act as a proxy server. That way, when my ASP was executed, it fetched the XML from VVE, and then returned the result on the Response stream.

dim x
set x=server.createobject("MSXML2.serverxmlhttp")

x.open "GET", "http://www.viavirtualearth.com/DotNetRoadtrip/tracks.xml", false
x.send ""

response.contenttype="text/xml"
response.write x.ResponseText

set x=nothing

Instead of using a Msxml2.DOMDocument object on the client (which FireFox did not seem to like, but since I don't like FireFox, the feeling is mutual), I opted to do straight-up javascript string parsing to extract the data points.

Then I started playing with the VE API, and seeing what I could do to improve the render time of the pushpins, as well as look-and-feel things. Well, I discovered that you could render 50 pushpins in not much more perceived time as one pushpin with a minor code change. Also, by inserting some pauses, I gave the map some time to load tile images, so that the pushpins would plot on top of, well, a map instead of on a blank canvas (this was another annoying issue with VE and slow connections or heavy CPU loads while the trip was being plotted). This worked surprisingly well with little code change from Dr. Neil's.

I also added some "nice to have" things, like when the date changes, I create a top-most pushpin with the new date so that you can see where that day's leg starts. Also, I cycle through colors to distinguish one day's leg of the trip from another's.

Here, just take a look. It's all client-side (HTML/JavaScript), so you can examine the code for yourself. Hopefully, this free ASP host won't cause problems (i.e., with that proxy ASP that grabs the data from VVE in order to prevent cross-site security issues).

http://www39.websamba.com/JasonF/trip2.htm

11/13/05: If you get a map, but no dates start showing up, then chances are that the WebSamba server is overloaded (happened once since I started hosting on it). IOW, try again later. :(

Friday, November 11, 2005

CNN Has A Sense of Humor

Browsing headlines on CNN.com, the following stood out:

Man glued to toilet sticks to story

Thursday, November 10, 2005

The Mystery Guy Who Was Also In San Francisco

I said in a previous post that I flew on the same red-eye flight between San Francisco and Detroit with someone who was wearing a staff shirt from the SFO launch event. This guy looked really familiar to me, and I couldn't place him.

I sort of thought that maybe he was on the floor (maybe at a kiosk), and I talked to him. But, that didn't seem right. Then I thought that maybe he was a speaker, and I watched him present. But, that also didn't sound right. No, I somehow knew this face from months before.

When we arrived in Detroit, he got off the plane long before me, so I was unable to stop him and ask. I figured that he was heading to our event, so I decided that I would just locate him there.

I looked for him all day, but didn't find him. Maybe he's a local then. Or, maybe he was just connecting through DTW... Oh, well.

After the launch event, Drew Robbins (DE for Ohio, Michigan, and Kentucky) had invited me to dinner with a lot of blue badges and other community members. Had a nice time, and talked to a few people. I also learned that Josh Holmes is not a fan of SQLCLR. ;-)

But, about midway through, in walks the mystery guy! Now I had the chance to find out just who he was and how I knew him.

I first start my covert operation by asking Josh who he was. Josh is pretty connected, being an INETA speaker and a MVP. And, of course, Josh knew exactly who he was. Chris Mmmmmggeedsreasdjk. Or, at least I didn't recognize the name. But, I learned that he was an RD out of Dallas, and ran a company named Notion Solutions, and was a VSTS guru.

That was all well and good, but I still had no clue how I knew him. Being a RD, he probably gave a Grok Talk that I watched. But, that's not enough to make a big impression on me. No, I watched this guy for a good length of time before.

After dinner, while people were leaving, I saw my opportunity. I walked up, and introduced myself, and then just right out and said, "How do I know you?" I think after a few wrong guesses, he finally said "Coderoom".

Of course! He's the "No, I’ll do code then, if you’re going to just sit here and bitch." guy from the pilot episode! Chris Menegay, not Mmmmmggeedsreasdjk!

We chatted for a while about certain behind-the-scenes aspects of the show, and I was satisfied that I finally solved the mystery of who this guy was. Now, I'll know him as the VSTS expert instead of the cranky Texan who smuggled bottlecaps into the Coderoom filming.