Thursday, March 09, 2006

Orb

Over the past six months, or so, there has been a lot of talk about a device called SlingBox, which essentially allows you to stream television (live or recorded) from your home to wherever you may be over the Internet. But, it wasn't until I was reading Jamie's blog that I learned about a similar service called Orb that will allow you to do the same thing with nothing to buy.

It was priced right ($0.00), but I was skeptical (as you should be for free services where there's no obvious revenue stream). Regardless, I created a user account, and installed the client-side software. Because my machine was already running Media Center, I found that the client essentially configured itself! As a disclaimer, though, I have not used Orb with a non-Media Center PC.

The magic of Orb occurs through the piece of client software that runs on your PC at home. This is what has access to both your hardware/media and the Orb servers. So, as long as the client software is running (i.e., icon appears in the task tray) and your home PC is always connected to the Internet via broadband and you have port forwarding properly configured on your firewall, then you can stream any media from that PC to wherever you are by means of the Orb web site.

For example, here I sit at Panera Bread. I know that I recorded Mike Birbiglia on Comedy Central the other day, but that video is on my Media Center PC, not this laptop. Through the magic that is Orb, I'm able to play that video and watch it here through WMP:



In this case, I'm not simply watching the 2 GB MPEG2 stream that Media Center recorded--that's too high of a bitrate to be streamed over my cable modem's uplink. Instead, the Orb client is actually transcoding it: it takes the original video file and transforms it so that it can be streamed across the internet (i.e., changes the audio/visual resolution, changes the compression codec, etc, all the while taking in account the available upload bandwidth of my home connection and the download bandwidth of my current location).

And, I guess this is cool too (for the Europeans and other WMP-haters): it doesn't just transcode to Windows Media format, but will also generate Real Media, 3GP Media, and Winamp streams.

What's more is that you are not just limited to watching video on a PC. I have successfully watched video on a PocketPC, and Jamie reported that he was able to do the same from his EVDO cell phone!

So, the first thing that I see when I login to http://my.orb.com is a dashboard, of sorts. This shows me some of the media that is available, including my most recent recordings:



Because my Media Center has a TV Tuner card in it, I could start to stream live television. Orb helps me decide what to watch by displaying TV Guide data for what's currently playing on the various channels:



When the live television is playing, you can change the channel using WMP's previous/next track buttons. In my tests, there was a lag of about 10 seconds while the transcoding took place.

Orb also provides you with the ability to remotely schedule a television show to be recorded, just in case you forgot to do so when you left the house. This is a common feature of many of the other HTPC software titles, but it is oddly not available out-of-the-box for Media Center (seems like such an obvious feature).

In this case, it is the Orb client that is actually doing the recording, not the Media Center recording service. The resulting file is in DVR-MS format (MPEG2 with metadata saved in the file), which is also the native format of Media Center. However, in my test, no metadata (episode description, TV rating, etc) was saved in the file.

All of the same media that is available to my Media Center is also exposed through Orb, from the Television capabilities, to Audio and Video libraries, and even pictures (for when you want to show off your latest photos that are trapped on your PC at home):



Now for some of the tricky stuff. The Orb client is supposed to have UPnP functionality, which if it worked, would automatically open up the ports on your firewall that needed forwarding (assuming that your firewall/router supports UPnP). In my case, it didn't work, but I didn't really spend a lot of time troubleshooting.

Whatever the issue was, I had to change the Orb client to use port 81 for streaming (instead of Port 80, since my Media Center was also running IIS). Then, I had to manually configure port forwarding in my router:

81 TCP
554 TCP
13398 - 13401 UDP

I'm assuming that the original port 80 was in place to promote access to the streams from behind corporate firewalls and through proxy servers. If I didn't want or need my web server to be exposed as port 80, then I can actually set up my Linksys firewall for PAT (Port Address Translation), which would take any incoming port 80 traffic from the Internet and send it to the Orb client listening on port 81.

I could go on and on, but that would take the fun away from you! Give it a try.

If Carl asked me today "What's the coolest thing that you've downloaded lately?", then this would definitely be my response.

UPDATE 03/13/2006: Uh, oh. The honeymoon is over and now I'm starting to see a few issues. I scheduled my Media Center (i.e., not Orb) to record Saturday Night Live, and when I went to watch the show, it wasn't there. Turns out that Media Center had shown a dialog saying that it couldn't activate the recording service when SNL started. I'm thinking that Orb's own recording service has something to do with this (i.e., if it still had a handle to the DirectShow graph that it was using to access my tuner card, then MCE wouldn't be able to create its own graph).

Scoble at the Oscars?

When I first saw a picture of Scoble, I thought that he reminded me of somebody famous (an actor) but I really couldn't put my finger on it.

Then I watched the Oscars last weekend.

Is it just me, or does Robert look a lot like Philip Seymour Hoffman?

Exhibit A: Click Here
Exhibit B: Click Here

Wednesday, March 08, 2006

ASP.NET Forms Authentication - Problem Solved

ASP.NET is not my forte. Having disclosed that, I'm currently working on a ASP.NET application that takes advantage of the Membership Provider in ASP.NET 2.0 and uses Forms Authentication.

This application worked great from the development web server (you know, that Cassini web server that comes with Visual Studio 2005). But, when I tried to deploy this to a real IIS6 web server, I ran into problems.

When I hit the site, the web server would correctly redirect my browser to the login page. However, upon logging in, my browser would keep getting sent back to the login page (with no error message, like "Bad User name or Password").

I was just about ready to throw my server across the room, and was even drafting a "please help" letter to Josh, when I decided to take another look at my web.config.

And that's when I saw it:

<authentication mode="Forms">
<forms name="AppNameCookie"
loginUrl="~/membership/Login.aspx"
path="/web"
cookieless="UseCookies" />
</authentication>

You see, in my Visual Studio solution, the web project was simply named "web". But, I was trying to deploy it to a more meaningful virtual directory name (i.e., "myapp").

So, I changed the above "/web" to "/myapp", and it started working. I hope that this saves someone the hours of frustration that I experienced today.

µTorrent 1.5 is Out

The latest release of µTorrent is now available from http://www.utorrent.com.

In case you don't know by now, µTorrent (the funny "u" is the symbol for "micro", so I guess it's pronounced MicroTorrent) is a fully featured BitTorrent client that is completely contained in a 150 kB exe. This means that you don't install anything; just download the program and run it. I don't even think that I can get Hello World to compile to under 150 kB with .NET or Java!

The best part, though, is that it only uses around 2-3 MB of RAM as it runs (and maybe another 5 MB of Virtual Memory). Azureus, on the other hand, would sometimes eat 60 MB of physical RAM (according to Task Manager).

Saturday, March 04, 2006

1 << 5

Person Jason = new Person();
Jason.DateCreated = ScottHanselman.DateCreated.Add(TimeSpan.FromTicks(35424000000000));

Thursday, March 02, 2006

What My Readership Looks Like

Interesting to see readership accumulate over time.

14 month graph
The two larger spikes are from when Rory linked to a post I wrote, and when I posted something about brrreeeport.

Comet Now Visible in Pre-Dawn Sky

There is a comet (Comet Pojmanski, designated C/2006 A1) just visible to the naked eye in the pre-dawn sky (i.e., 90 minutes before sunrise). It is located slightly northward of Venus, which will be the brightest "star" in the eastern sky.

http://skyandtelescope.com/observing/objects/comets/article_1684_1.asp

Wednesday, March 01, 2006

Television on Your Car's Radio

I discovered this by chance while driving in Columbus, OH, and rediscovered it the other day while driving in Ann Arbor, MI:

The frequencies used for VHF television channel 6 are:

CH  BAND     VIDEO   CHROMA    AUDIO
6 82- 88 83.25 86.8295 87.75


If you noticed, the audio is 87.75 MHz, and is modulated using Frequency Modulation. Guess what that means? If you are in an area of the country that can receive VHF Channel 6 on rabbit ears, then you can also listen to the programming on a FM radio, since the FM band starts at 87.7 MHz.

For Ann Arbor, I was receiving WLNS (CBS affiliate out of Lansing), while in Columbus, I was listening to WSYX (ABC affiliate).

Interesting Asteroid

On 22-Feb-2006, an interesting 16 meter "asteroid" named "2006 DQ14" passed by the Earth with a miss distance of about 5.2 Lunar Distances (about 2 million km, or 1.2 million miles).

What's the big deal about this? Well, the orbit of this "asteroid" was calculated, and it's roughly equivalent to the Earth's own orbit around the sun. Working backwards in time, they figured out that the last time we had close approaches with this object was in the 1977-1979 timeframe.

The interplanetary spacecraft Voyager 2 launched on 5-Sep-1977. It just so happens that a "near miss" of this "asteroid" occurred on 8-Sep-1977. Coincidence? Or is this object actually a piece of space junk from the Voyager 2 mission, like a rocket body stage or something else?

It's scary to think that a huge part of a rocket launched in 1977 could actually slam back into the Earth decades (or centuries) later with no warning at all.

Here's NASA JPL's asteroid orbit applet:
http://neo.jpl.nasa.gov/cgi-bin/db?name=2006+DQ14

Tuesday, February 28, 2006

Driving the Speed Limit

You can thank Aaron for introducing me to this viral video. See what happens when a group of people decide to drive the posted speed limit on I-75 through Atlanta. Four lanes of the highway blocked by four cars all going 55 miles per hour. Pretty funny!

http://video.google.com/videoplay?docid=-5366552067462745475&q=speed

Nick Landry on DNR

On this week's .NET Rocks!, Nickolas Landry talks about Windows Mobile 5.0.

Say, isn't he the one who was trying to pick up the girl on Caesars 24/7 (reality show on A&E):

"... In Vegas, it's said that for every man there's a woman and for every woman there's a man. But does that include geeks? Four big time nerds in town for a computer programmer's convention decide to take a break from boring seminars and try to pick-up a woman they meet at the bar. Are they up to the challenge?"

Reference: http://weblogs.asp.net/cfranklin/archive/2005/01/19/355841.aspx

Monday, February 27, 2006

Upcoming Speaking Engagements

Greg Huber and I have a few more Media Center Presentation's lined up:

Feb 28, Northwest Ohio .NET User Group - http://www.nwnug.com

March 23, Central Ohio .NET Developers Group- http://www.condg.org/default.aspx

Abstract:
Will this be the year of the Home Theater PC (HTPC)? Come learn about Windows Media Center 2005 and decide for yourself. Topics covered include: Overview of Media Center, Alternatives to Media Center, The 10-foot Experience, Developing for Media Center, and using the Xbox 360 as an Extender.

Come check 'em out if you get a chance!

Disclaimer: Blatently plagerized from Greg's post!

I'm really digging this tag-team presentation style. It lets one person have a little bit of downtime to mentally prepare for their next part while the other person does their thing.

Greg and I still do post-mortems and refine the presentation every time that we do it: we watch the audience and make note of where people were falling asleep, and then decide to either improve that section of the agenda, or drop it altogether. And, of course, we've made it part of the show to make an actual sacrifice to the Presentation Gods (hoping that this gesture somehow makes the gremlins go into hiding).

Four Things Meme

This meme has gotten pretty popular lately among the blogs that I follow, so I knew it was only time until I myself got tagged. Thanks, Jim!

Four Jobs I've Had...

  1. Bailing Hay and Straw
  2. McDonald's
  3. Sorting Freight
  4. Programmer

Four movies I can watch over and over...
  1. Back To The Future (trilogy)
  2. Office Space
  3. There's Something About Mary
  4. The Matrix

Four TV shows I love to watch...
  1. LOST
  2. Ghost Hunters
  3. Two and a Half Men
  4. My Name is Earl

Four places I've been on vacation...
  1. Cancun
  2. Turks and Caicos Islands
  3. Virginia Beach
  4. Smoky Mountains

Four favorite dishes...
  1. Lasagna
  2. Mashed Potatoes and Gravy (served with just about anything else)
  3. Steak (medium-rare)
  4. Any burrito at Qdoba

Four websites I visit daily...
  1. www.bloglines.com (aggregates almost all of my reading)
  2. www.spaceweather.com
  3. news.google.com
  4. statcounter.com (Narcissism: I regularly check who reads my blog)

Four places I'd rather be...
  1. On vacation somewhere that it is warm
  2. Hiking
  3. Riding a motorcycle with no particular destination
  4. Sitting at the swim-up bar in a pool at the Moon Palace in Cancun

Four bloggers I'm tagging...
  1. Aaron
  2. Greg
  3. Carl
  4. Rory

resizeable != resizable

Here's a tip that might save you 30 minutes of debugging a silly problem: Resizable is spelled R-E-S-I-Z-A-B-L-E, not "resizeable".

When using in conjunction with window.open(), it seems that this feature name must be spelled correctly in order to work. ;-)

Hating Mark Miller About Now

Just wanted to add to the cliche: CodeRush rocks! And Refactor! Pro is not too shabby, either.

Now, I'm hating Mark Miller (the Architect of CodeRush) because I have to think of a way to come up with the funds to buy these products outright (or get my employer to do it for me, which I would greatly prefer!).

BTW: Inspired by the dnrTV episode, I wrote a CodeRush plugin myself. The first iteration was quite simple, but when I wanted to get into some language-independent code generation, I quickly got lost in the DXCore API. However, Mr. Miller was extremely helpful in pointing me in the right direction. Great product, great personal support--these guys are awesome players in a neat little niche. Plus, they're sponsors of .NET Rocks, which carries a lot of weight when it comes to me selecting/recommending products.

Saturday, February 25, 2006

Xbox 360 Extender: My "Session Terminated" Cause Identified

Before Greg Huber and I presented on Media Center for GANG, I had built a MCE box that was clean and contained everything that we needed for the presentation. Before (at the Dayton-Cincinnati Code Camp), we had his MCE PC, his laptop, and my laptop, and experienced all kinds of technical issues trying to network everything together for the presentation.

The box worked great, and was all set to go. Well, that was until I tried to connect my XBox 360 to it (which was needed for part of the presentation).

I ran through the PCSETUP program, and everything seemed fine. But, when the XBox attempted to connect to the Media Center session, I would always get a "Session Terminated" error. I tried for hours that day to get the connection to work, but everything failed. Then, when I tried to systematically remove one installed program at a time (hoping that it was my DVD software, or something else that was 3rd party), I ended up hosing the box big-time.

So, we ended up reverting back to Greg's MCE machine and both of our laptops... :(

I recently paved that machine and reinstalled everything. But, wouldn't you know it, the "Session Terminated" problem was still there! However, this time, I had the opportunity to dig deeper into the problem, since I wasn't pushing up against the start time of a presentation.

I was actually able to determine that a GeForce FX5200 was at fault. In order to promote discussion, I detailed the situation on The Green Button:

http://www.thegreenbutton.com/community/shwmessage.aspx?ForumID=58&MessageID=157807

Friday, February 24, 2006

The Code Room Episode 3 Is Out

The third installment of The Code Room is now online:

http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20060223CodeRoom3/manifest.xml

This episode is obviously scripted, whereas the previous two episodes were "reality television". Nonetheless, there is still a very important message presented: developers must consider security during the entire development process, and once a system is compromised, you cannot just patch the original holes because the hackers probably have a collection of backdoors.

(The first Code room "starred" Chris Menegay, Scott Bellware, and Tracy Sawyer).

Thursday, February 23, 2006

Good Week For Observing ISS in North America

Ever get a chance to see the International Space Station (ISS) with your own eyes? Its orbit will provide for a series of highly favorable passes over North America over the course of the next week or so.

To be favorable for naked-eye observation, you must be in the dark while the ISS, flying overhead, is illuminated by the sun (so, this happens either hours after sunset or hours before sunrise).

Use the Heavens-Above web site to help figure out when the ISS is visible from your location, and where to look in the sky. Be sure to synchronize your clock with the official time (important, since the window is only a few minutes).

When it's flying over, you pretty much can't miss it. It will be comparable to viewing Venus or an airplane with its landing lights on, but will slowly move across the sky until it crosses into the day/night terminator, at which time, it will just disappear.

Heavens-Above will also calculate for you other satellites that you can observe in pretty much the same way. The best viewing that I can remember was one year when the ISS and Space Shuttle flew overhead shortly after the Shuttle had detached from the space station. So, instead of one point of light, I saw two in close proximity to one another.

Windows Vista SKU Featureset Revealed

I hope that KenLin had the authority to reveal this info at this time:

http://msmvps.com/blogs/kenlin/archive/2006/02/23/84582.aspx

Since I've been presenting on Media Center lately, I immediately scanned the features matrix to see if it was going to be available across all of Vista's SKUs. Bottom line: Nope! Only the Windows Vista Home Premium and Windows Vista Ultimate SKUs will include the Media Center functionality.

Wednesday, February 22, 2006

MSDN on DVD

I received my first MSDN shipment yesterday from the subscription that I was awarded for being a Finalist in the Connected Systems Developer Competition.

I've been in charge of receiving the MSDN subscription media for my branch, which we receive as being part of the Microsoft Certified Partner program. These always came on CD, because all of our servers have CD-ROM drives (not a one has a DVD drive).

But, my personal subscription is on DVD. I'm amazed at how many products are crammed onto each disk, and by how much smaller the shipments are when compared to the number of CD's that we would normally receive at a time.

This comes as a relief to me, because I don't know what I would do with hundreds of CDs in my house (it's going to be bad enough keeping track of scores of DVDs!)

Mug Shot

The observant ones among you regular readers might notice a new addition to the sidebar...

Tuesday, February 21, 2006

Miniature Windmill Generator

This should come as no surprise to anyone, but somebody came up with a miniature windmill generator that looks like a small electric fan. At peak output, it appears that it can do 1 amp with a potential difference of 12 volts, which could be used to recharge a cell phone.

Big deal? Yeah. But, it interested me because of my thoughts a while ago of using arrays of micro-generators, like these, in order to produce significant levels of power (maybe enough for your house):

http://jasonf-blog.blogspot.com/2005/10/pressure-generator-array.html

One caveat, though: The huge electric generating windmills with the 30-foot blades continue to spin after the wind has stopped. This is because they store energy as angular momentum, like a flywheel. So, that benefit would not exist with the array of micro-generators (essentially, when the wind stops, so does your electric generation).

Monday, February 20, 2006

Burned by Floating Point Numbers

For those following along at home, you know that I've been working over the past few weeks with a big SQL Server database on a relatively small partition (until the new hardware arrives). Because of this, I've been trying to keep space consumption/database growth under strict control. When you're talking about millions of rows of data in a table, even 1 byte difference in the size of one numeric field translates to millions of bytes of extra disk space.

Well, one choice that I made was to represent decimal numbers using the "real" data type. This is a floating point decimal that uses 4 bytes per number. Other possible alternatives were all 8 bytes per number, so I essentially cut my storage in half (albeit, with some "acceptable" loss in precision).

While reconciling the results of my calculations to the set of control data, we came across a very good example of where this absolutely is the wrong choice of data type.

One field of the table contained Quantity information, and this was not always integer data (i.e., maybe it was weight). Well, my "real" numbers had no problems representing this data, for the most part. But, there was one point of sale where all of the sales were reversed (so that every record with a positive Quantity value would have a corresponding record with a negative Quantity value). The net quantity for this location was zero.

But, upon examination, my net quantity was coming out to be something like 0.000007472 due to errors introduced by the floating point math. Yeah, it's close to zero, but, it led to a serious flaw in my calculations.

You see, I was already trapping for Divide by Zero situations using a CASE clause:

SELECT CASE 
WHEN SumQty <> 0
THEN (Qty/SumQty)* ValToSpread
ELSE 0
END

If it weren't for the floating point math, then this particular SumQty value would have been zero, and the result of the calculation would have been zero. But, in this case, the floating point's "zero" was a small fraction--not zero.

A tangent: Do you know why Divide by Zero is illegal? It's because the Y-axis (x=0) is an asymptote for the hyperbola y = a / x. This means that as the number that you're dividing by gets closer and closer to zero (i.e., a fraction approaching zero) that the quotient gets larger and larger (approaches infinity). So, dividing by zero is undefined because it's actually +/- infinity at the same time.

What's the point of this mathematical mumble-jumble? Well, the sum of my quantity was not zero, but rather a small fraction: 0.000007472. The result of dividing by this number turned out to be a very big number, when the true result that was needed in order to reconcile with the control data should have been zero. So, my results were way off of where they should have been (to the tune of millions of dollars). Whoops! Good thing this was just in QA!

To resolve this one case, I changed the quantity field's data type to a "decimal", which is a fixed-precision number (I can specify how many total digits and decimal digits are maintained). I still went from a 4-byte number to a 8-byte number, but the result of the calculation was dead on.

So, the lesson learned: sometimes it's quite necessary to make the trade-off of space and speed provided by floating point numbers for the accuracy of fixed precision.

Day of .NET

Here's an exciting announcement:

What: Day of .NET (1-day Conference)
When: May 13, 2006 9:00 AM - 5:15 PM
Where: Washtenaw Community College, Ann Arbor, MI

Website: http://dayofdotnet.org/

A cooperative effort between:

Sunday, February 19, 2006

Breaking Change in No-Touch Deployment (2.0 Framework)

A peer of mine (Murph) brought this breaking change to my attention:

In prior version of the .NET Framework (v1.0 and v1.1), you had an option to distribute executables by hosting all of the files (EXE, config, and other necessary assemblies) on a web server, and then opening the EXE file by means of a URL. This is actually a precursor to ClickOnce, and was referred to as No-Touch Deployment (or HREF EXEs).

Well, it seems that by simply installing the 2.0 Framework onto a machine, you break the ability to continue using HREF EXEs.... when the server is in the Internet zone. The web server will log the GET request for the EXE, but you will not see any requests logged for the config file, and the user will get an OPEN or SAVE AS dialog, which in turn does absolutely nothing.

Credit to another member of my organization (Jones) for pointing out the following MSDN Product Feedback record, which discusses that this is by design:

http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=ef4ae9a2-1d40-4241-aca4-61d579929793

The workaround is to get the site out of the Internet zone. If it's a trusted server, then you can trust the site, and that will change the zone. Otherwise, you're left creating a new CAS policy. Either way, this does not sound like fun if the application was deployed to hundreds of client machines using HREF EXEs.

Saturday, February 18, 2006

Spot the Bug

Here is a completely made up query, but is close to one that I wrote recently to spread an overhead cost value (@MarketingExpenses) over a list of invoices. This is just one step in a complex series of calculations that helps to determine profitability of products or services sold.

SELECT 
CASE
WHEN COALESCE(b.sum_of_sales,0) > 0
THEN (a.sales / b.sum_of_sales) * @MarketingExpenses
ELSE 0
END AS ShareOfMarketingExpenses
FROM
invoice a LEFT JOIN regional_sum b
ON a.region_code = b.region_code


This query assumes that there's a table called [regional_sum] that has the sum of sales for each region. The [invoice] table is joined to [regional_sum] by linking the "region_code" fields of both tables, and since a LEFT JOIN is used, it will include all rows from [invoice] and only those rows in [regional_sum] that matches (if there is not a match, then NULL values will be used for the [regional_sum] data).

Now, the point of the COALESCE function is to return the first non-NULL value in the supplied list of values (b.sum_of_sales and zero). In this case, I'm simply trying to handle NULL values by changing them into zeros.

You'll also notice that I'm using a SQL CASE statement. I do this because I need to prevent the dreaded "divide by zero" error, so I ensure that the "sum_of_sales" field is not zero before trying to calculate a percentage (otherwise, I return zero as the result of the calculation).

The percentage is then multiplied by the predetermined "@MarketingExpenses" value in order to give you a number of marketing dollars that could be attributed to that one invoice record ("ShareOfMarketingExpenses").

Let me just assure you that the query above compiles and works as written, so the bug is not a syntax error. However, there was an issue that came up as we were trying to reconcile data from the new system with old/validated numbers (the sum of all of the "ShareOfMarketingExpenses" values did not equal the specified "@MarketingExpenses" value).

I'll leave it as an exercise to the reader, but I'll also provide some sample data:

============
REGIONAL_SUM
============

region_code sum_of_sales
----------- ------------
a0001 12345.67
a0002 432312.33
b0001 -123.23
b0004 34322.23
b0005 -12.12
c0006 234328.23

(Negative sales are probably due to internal accounting of moving inventory around from one region to another, but I'm not that close to this [fictitious] business, so I can't explain the numbers any better).

=======
INVOICE
=======

customer_id region_code sales
----------- ----------- ----------
1 a0001 12.32
1 a0001 33.23
2 b0001 5.34
3 c0006 1232.21
3 b0004 322.22
4 a0003 232.23
[the list goes on, but pretend that the
sales for each region correctly sums up
to the values listed in the above table]

It was a pretty cool "Ah ha!" moment for me when I spotted the flaw. Your mileage may vary.

Thursday, February 16, 2006

Is Google Preventing Analysis of Their Search Results?

Robert Scoble has been doing an experiment over the past few days where he asks his readers to include a simple non-existent word in their blogs in order to create a new meme: brrreeeport.

Some initial findings can be found here:

http://scobleizer.wordpress.com/2006/02/15/brrreeeport-crazy-and-more-search-engine-lies/

Now I don't know the full story, but Google is apparently no longer serving up any results for the term "brrreeeport". Is the DNE (Do No Evil) Gang worried about Robert's findings surrounding the accuracy of their reported search results? (In other words, it appears that Scoble's experiment is calling them out on the fact that they inflate the reported number of search matches)

Where did all of the brrreeeport matches go?

UPDATE Feb 17, 2006 8:00AM EST: I checked this morning, and the 22,700 results are back online from the main Google web search. But, since you can only have a maximum of 1000 results returned for any given query, how can anyone verify that there are indeed 27,000 real matches for "brrreeeport" in the Google database?

They're Back!

Tuesday, February 14, 2006

Special Appearance, 1 Night Only!

Greg and I will be presenting at the Great Lakes Area .NET User Group (GANG) meeting on Wednesday, February 15th at 6PM (Microsoft Southfield office (in the Fifth-Third tower near Evergreen and 10-mile/Lodge)).

http://www.migang.org/Default.aspx?tabid=22

The topic will be Windows XP Media Center Edition 2005. The first part will include a general introduction to MCE (what, why, and how). The second part will include some examples of how to develop for this platform. And, we're sure to whip out my XBox 360 at one point or another.

There is a bit of irony in me doing this presentation on Wednesday: I'll be bringing my HTPC machine with me for the demo, so there will be no PVR at my home to record LOST. :)

BlogCode looks cool

Scoble blogged about this: If you have a blog that you like, BlogCode will let you find other blogs that are similar in nature. It goes well beyond just keyword matching.

brrreeeport!

Monday, February 13, 2006

Future of Touchscreens

You MUST watch this if you haven't already:

http://www.youtube.com/w/Crazy-Multi-Input-Touch-Screen?v=zp-y3ZNaCqs&search=crazy%20multi-input%20touch%20screen

UPDATE: Richard covered this on this week's Mondays!

Sunday, February 12, 2006

Cool Video

HV Switch Opening at a power substation

Friday, February 10, 2006

Overlooked Database Space Optimization

While looking for places to cut down the size of this huge database that I'm working with, I realized that all strings were being stored in nvarchar fields, which uses Unicode, or 2-bytes per character. This is likely because the database was originally prototyped in MS-Access, and when they imported all of the Access data into SQL Server 2000 using DTS, it transformed the Text fields into nvarchar fields.

Well, it turns out that all of the string data is ASCII anyways, so I was able to nearly cut in half the storage requirements of the database by changing the nvarchar fields into regular varchar fields. This also had a positive affect on the runtimes of my stored procedures that moves data around within the database.

Thursday, February 09, 2006

Finally Saw the Light

After all of the wondering I did about the value of the new DELETE TOP(x) in SQL Server 2005 (here), I finally saw the light today as I worked on a SQL Server 2000 project.

Picture this:

  • A huge-ass table with 2.5 million records taking up about 5.5 GB of disk space.
  • Most, but not necessarily all, of this data needs to be replaced monthly with a new snapshot that will be generated via an ETL (Extract, Transform, Load) process.
  • Due to disk space, the database has a hard limit of 12 GB, and the transaction log is also size fixed.


The data is marked with a month and year, so replacing data consists of deleting existing records for the months/years that are being imported, and then copying the new records into the table. But, it's not that simple.

If you just remove all of the records in one batch using DELETE FROM table WHERE..., then you need to have enough room in the transaction log to write the "undo" information in case the batch fails (so it can roll back the entire DELETE). If the transaction log cannot accomodate the 5.5GB of data that will be stuffed into it, then the batch will fail.

So, you need to find a way to break up the deletes into smaller chunks. Each smaller DELETE will still use the Transaction log, but after the command successfully terminates, that space will be reclaimed for subsequent operations.

Under SQL 2000, you're stuck with things like using Cursors in order to iterate through a list of month/year combinations from the incoming data (assuming that it was saved to an intermediate table first), and then using those values as part of a DELETE statement within the loop.

But, with our new friend SQL Server 2005, you can use something like multiple "DELETE TOP(1000) FROM table WHERE..." in order to break up the transaction.

Now That's Product Placement!

On last night's LOST, Hurley was reading a manuscript for a mystery novel that was presumably written by one of the people aboard Flight 815 who did not survive.

Well, looky what's on Amazon (read the "About the Author" in the Editorial Review):

http://www.amazon.com/gp/product/1401302769/sr=1-1/qid=1139457754/ref=pd_bbs_1/002-3377525-3860841?%5Fencoding=UTF8

So, LOST is not using product placement in the form of showing a character drinking Pepsi. It's introducing original works, and then marketing those same products to us consumers in the real world. Brilliant, IMHO!

Wednesday, February 08, 2006

Has Anybody Seen My Code?

About 6 years ago, I wrote some great code as part of an ASP site. There was a SQL Server stored procedure that ran for a long time, an because of this, it would periodically update a status table with percent complete (it was performing cursor-based operations that applied a set of rules to a set of data, so it could accurately report how far long in the set of rules it was at any one time). The stored proc was kicked off from ASP/ADO script, and that web page would keep refreshing itself in order to update the % complete.

I had a very similar need today: to kick off a stored procedure from an OSASPADO (Old-School ASP/ADO) site and load a status page that kept refreshing while the proc continued to execute on the server. You know what? I can't find my old code, and I couldn't find a way to recreate it!

In the world of classic ASP running on IIS 6 (Windows 2003 Server) using a SQL Server 2000 backend, connections appear to be recycled shortly after the script finishes executing. I tried probably 6-10 different ways of starting the stored procedure, but it would always stall out within a minute.

I finally gave up, and went with the out-of-band approach: The ASP script would insert some parameters into a "jobs" table, and then a SQL Server scheduled job (via the SQL Agent) would check this table, and execute the stored procedure using these parameter values if data existed in the "jobs" table.

I realize that this description is a little bit on the abstract side, but how the heck was I able to accomplish this task in the past on IIS 5/Windows 2000/SQL Server 7.0???

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):