cek.log

Geeky rants, raves, and random thoughts from Charlie Kindel...
Follow me on Friendfeed or Twitter.

February 2004 - Posts

Powder Skiing

This week I'm in Canada on my annual Cat Powder skiing trip. My buddy Erik and I have been doing this (along with a bucnh of other guys) for 6 years. We go to this place called Cat Powder Skiing (www.catpowder.com/indexcatsi.htm) in Revelstoke, BC.

It takes us about 8 hours to drive directly from Seattle to Revelstoke, but this year we stopped first at Mt. Baker on Tuesday, and I'm writing this while sitting in a restaraunt at the base of Sun Peaks (www.sunpeaksresort.com) using a WiFi Hotspot. My back is hurting a bit so I'm taking it easy...saving it for tomorrow when we have our first of four days of cat skiing.

Cat skiing is a cheaper form of Heli-skiing. Instead of flying in helicopters to the top of remote peaks, you take snow cats. It's a lot less expensive and snow cats don't have “hard landings”. Cat Powder in Revelstoke is run by this guy named Clyde Newsome... He runs a great operation and it's a terriffic value. For about $350 a day you get 10000-12000 feet of vertical deep powder skiing, lodging and food. And that's CANADIAN dollars! You do the math.

I've got a website with pics and movies from our previous trips at http://www.kindel.com/revelstoke. Check out the 2003 movie, it's pretty good.

Posted: Feb 25 2004, 08:54 PM by charlie | with 2 comment(s)
Filed under:
Multiple blogs

I tried an experiement of using a blog for a product page. I setup a blog for MCE Controller when I released it yesterday. I really didn't like having to deal with two blogs!

So I ended the experiment and now have just a single blog: this one. If want to comment on MCE Controller apply feedback to one of the MCE Controller posts. If you want to download MCE Controller go to http://www.kindel.com/products/mcecontroller/default.htm.

MCE Controller v1.0.1 Released!
Today I released the first public version of MCE Controller.

MCE Controller allows the Media Center application of Windows Media Center Edition (MCE) to be integrated into an advanced AV control system by enabling programmatic control of the user interface via a TCP/IP connection.

To put it simply, MCE Controller, allows you to simulate a press of any button on the MCE IR remote control by sending a text command to a TCP/IP port on the MCE machine. For example if MCE Controller receives the string “mypictures” it will tell Media Center to go to the “My Pictures” page.

I wrote MCE Controller so I could better integrate MCE into my Crestron whole-house audio/video system. I originally was using IR blasting to control MCE from Creston, but had reliability problems and wanted something more robust. I then tried using Girder (www.girder.nl) and was able to cobble together a solution using Girder's iserver TCP/IP functionality. However Girder's iserver add-in requires an MD5 hash for authentication and it was too much a pain to implement in Crestron's SIMPL system.

Plus, I really wanted to get my hands dirty and write a C# app. See http://kindel.com/blogs/charlie/posts/212.aspx.

I spent too much time while on vacation skiing in Colorado hacking this app together (on the plane and at night). But it was fun. In the end I've produced what I think might be a very useful app for people trying to integrate MCE into their home control systems. In fact, MCE Controller may be useful for anyone trying to integrate any PC based application into such a system. The app is general enough that it can be utilized from any control system that supports sending text strings to a TCP/IP port.

MCE Controller can act as either a TCP/IP client or server. When acting as a client the target host and port can be configured. When acting as a server the incoming port can be configured.

So here it is: http://www.kindel.com/products/mcecontroller. I'd love to hear any feedback people have.

Why do I do this to myself?

I had my Crestron system talking to Media Center just fine. I had written an MD5 implementation required by the Girder iserver component, and although the solution was a bit of a hack, it worked. And well.

But noooo. I have to make it work right. So I set about writing my own app that listens on a TCP socket and controls the ehshell.exe app (MCE Controller). “It will be a great excuse to do some more C# programming and I'll learn to code to sockets and all about PlatformInvoke interop from the .NET Framework.”

So I begin. But do I make it easy? No. Here are the reqirements:

  • Single client sending simple string commands to a listening TCP/IP port.
  • Static set of commands, each mapped to either a Windows SendMessage, SendInput, or CreateProcess call.
  • For the solution to be useful, user has to be logged on to the interactive console on the MCE PC.

If these are the requiements, why did I spend 2 days trying to implement this as an NT Service? Sure I now understand the .NET classes for Services, the winsta/desktop security model, and that you can't really get it to work on XP and above, but what did I actually accompish regarding the requirements?

Also, why did I choose to implement my server using the lowest level Socket classes, using the full asynchronous programming model when spinning off a thread and using TCPListener would have taken a fraction of the code and time? Remember I only have a single client to this thing, it doens't need to scale, blah blah blah. But nooo I had to do it the hard way. I guess I should be happy that I'm now an expert on .NET socket programming.

Or, maybe that's the point. I don't have all this hardware and software crap lying around because I actualy use or need it, but because I love learning and all this stuff gives me opportunities.

This raises a question. How unique am I in this regard? Is this just my personal manifestation of the geek/hacker ethic?

I'm a hardware geek

Well, actually, I'm just a geek in general. If it makes noise, has to do with moving lots of electrons around, or involves code I'm into it.

And even though I'm mostly a software guy in terms of the things I create, I love learning and knowing about all kinds of hardware. There are a ton of really great resources on the web for someone like me. Here's a sampling of my favorites:

For example, I recently found this article on the Mac G4 on X-Bit. I am not a Mac guy but I've been really curious about how the G4 compares technically to a current AMD64 based PC. This article did a great job of eductating me; I loved learning how the PowerPC970 processor is not really a RISC processor anymore.

Buying hardware is another matter. I have found www.newegg.com, www.tigerdirect.com, www.buy.com, www.cdw.com all to be great online stores. I usually go to www.newegg.com first. If I need to actually visit a store I frequent Computer Stop here in Bellevue, Fry's, Magnolia Hi-Fi, Definitive Audio, and I used to love Active Electronics for low-level components, but they went out of business. Vetco's always great for wasting an hour or so.

I spend too much money & time on EBay as well. I don't mind buying used electronics if the price is right. I've been very successful buying speakers, Ethernet/Serial transcievers (Lantronix UDS-10s), Crestron gear, and who knows what else on EBay. I'm careful to check out who I'm buying from if it is a high-value item.

www.gocables.com rocks when it comes to CAT5 cables.

DELL often has really great deals.

Quick Reivew Creative Labs “SoundBlaster Wireless Music”

I purchased a Creative Labs “SoundBlaster Wireless Music” (the product name is in quotes!) to play with. 

$249 from Creative’s website.

Creative’s website on this is here: http://us.creative.com/products/product.asp?category=119&subcategory=121&product=9192

Summary:

The SoundBlaster Wireless Music (which I will refer to as SBWM below) is an 802.11b (only) “digital audio receiver” or DAR that includes a bi-directional RF (not 802.11b based) remote control for UI. Time from opening the box to when I was playing music wirelessly, using the RF remote and its LCD, was about 15 minutes. The UI on the remote is simple and effective. It’s not snappy fast, but quick enough. A server app must run on a PC somewhere on your network, and you have to use Creative’s MediaSource app to manage the library (but importing from a file share or directory is simple).

The SBWM supports stereo analog and optical SPDIF digital output. I did not test the sound quality of the analog outputs but the digital was great. The SBWM played MP3s, 160kpbs, and 192kpbs WMAs, does not support lossless WMA.

For $249 this is a pretty expensive DAR. However for that price you get a great OOBE, reasonable software, and a very nice RF remote control. While other DARs support wireless, none have a remote like this. I’d recommend this product to friends and family…if they have a PC and a wireless network and they want their music collection in other parts of their house this product will work great.

Installation:

A yellow sticker over the USB port on the SBWM reads “STOP!  Before you connnect Sound Blaster Wireless Music to your computer, make sure you read and follow all of the installation instructions in your Quick Start Leaflet.”  The steps outlined there are straightforward: Install software, Add Tracks to PC Music Library, Connect to stereo, Use RF remote.

-          Installing the software involved installing a driver (unsigned) and the SBWM “media server” and console. It also recommended installing the included “Creative MediaSource” app, which is Creative’s latest attempt at a media player/library management app (I won’t bother reviewing this app here…suffice to say I’ve always viewed Creative’s software as crap…I use Notmad (www.redchairsoftware.com) for interacting with my Creative Jukebox III and Zen portable players). I had to reboot after setup completed.

-          While rebooting I plugged the optical SPDIF out from the SBWM into my receiver.

-          When the reboot completed, Creative MediaSource started up and I told it to import my music from the network share where it’s all stored. A few mouse clicks on default selections and it quickly imported all the metadata.

-          Following the directions on the quick start guide, I plugged the USB cable between the SBWM and my PC. PnP did its thing and a task bar icon appeared. The directions said to run from the start menu the SBWM Network Setup so I could configure the device for WEP encryption.

-          This little network setup app found both my wireless network and my neighbors. Both are WEP enabled, and it indicated such. I clicked on mine and entered my WEP key. After about 10 seconds my stereo speakers emitted a high-pitched tone. Yow! Surprise! About 10 seconds later the app said “success”, and asked if I wanted to use the library I had imported into the Creative MediaSource app. Very painless operation (except for the ear splitting test tone!).

-          I then unplugged the USB cable from the SBWM, pressed “Menu” on the remote and selected some music to play…

Usage:

The UI on the RF remote control is pretty much identical to what you get on a Creative Nomad Jukebox or Zen. After completing the setup above, I was immediately able to browse my music collection and play music by Album, Artist, Genre, Playlist, etc… It could NOT have been any simpler.

You can optionally use the “Wireless Music Console” application to view what the device is doing from your PC.  I say “view” because you can’t really control the device other than transport controls. There is a lame function to add tracks from the music library to the now playing list, but it’s not really very useful. What I expected was a PC version of the UI that appears on the RF remote control. In addition the MediaSource app does not let you “target” the SBWM device; you can’t use it to select what to play either…it only plays via the local PC’s soundcard. Too bad.

There is a significant (2 second?) lag when using the transport controls on both the RF Remote and the Console (next track). Pause is instant on the RF remote, and very slow (2 seconds) from the Console app.

I tested the range of the RF remote and found I could get about 30-40’ from the SBWM before it stopped working. When it’s out of range nothing works (it appears that all UI is generated on the PC and remoted somehow to the remote).

The Wireless Music Media Server app is an app. It cannot run as a service, so if you log out the server stops.

I tried playing some lossless WMA content, even though the Creative website indicates only bitrates up to 192kpbs are supported for WMA. I got no error message, but no sound either. The “play” status went from play to stop after about 5 seconds.

They support up to four SBWM devices playing at a time. You can have more than 4 on the network, but only 4 can be playing at a time. I’m not sure, but I believe they can all play the same thing simultaneously or you can use them independently. When playing simultaneously I’d be quite surprised if they synchronize the devices such that you can have them in acoustically overlapping rooms and have it sound right…in eHome we figured out how to solve this problem, but it’s fairly complex and I just doubt Creative has addressed it.

End of Review.

Quick Review of Linksys EFG120 Network Attached Storage/Print server

I purchased a Linksys EFG120 Network Attached Storage/Print server device to play with.

You can buy these online for $675 or so (e.g. http://www.newegg.com/app/viewProductDesc.asp?description=56-124-001&depa=1). The Linksys page describing the product is at: http://www.linksys.com/products/product.asp?grid=35&prid=555.

Summary:

The EFG120 is a expandable 120GB NAS device with a built-in print server. It includes drive bays for 2 removable IDE hard drives; one is occupied by a Maxtor 120GB drive (6Y120L0). Installing a 2nd drive gives you either double the disk capacity or backup of the first drive. The network port is 10/100/1000 (Gigabit). The fact that it supports two drives and Gigabit Ethernet puts it above the current “ultra-low-end” NAS market represented by the likes of the Tritton TRI-NAS120 ($270), but below the mainstream “low-end” NAS represented by the DELL PowerVault 725N ($1799).

The Tritton 120GB model includes a single IDE drive and is slow (even though it supports 100baseT my tests showed 5-8mbps throughput). The DELL is running Windows Server and has 4 40GB IDE drives and supports RAID 0, 1, and 5 as well as Gigabit Ethernet…and it’s 1U rackmount form factor.

Linksys is targeting this device at small businesses and workgroups. Setup was easy and usage was not horrible. A naïve small business owner would be hard pressed to understand why he should spend $1800 on a DELL or Iomega NAS vs. this thing.

Details:

Setup was simple. If you have UPnP enabled on your system (it’s off by default on XP, you have to add/remove programs to turn it on), the EFG120 shows up in Network Neighborhood. Double clicking takes you to the web-based admin page.

Configuration was a bit goofy. The UI is not very intuitive but workable. Setting the device’s name to “NAS” allowed me to open \\NAS and see all the shares. So netbios naming is supported (it also supports WINS in some fashion).

The 2nd drive can be used either as more storage or as a “backup” for the first drive. If the 2nd drive is used for expansion there is no striping or other fancy stuff. You can simply share out the 2nd drive via another share name (this means that you can’t copy a 200GB file to the device even though you have 240GB of drive space. For backup the device does NOT support RAID mirroring, but instead copies the files from the first drive to the 2nd. The effect is the same though.

The device supports “advanced” functions such as defrag, “chkdsk”, and email alerts.

You can add users and groups and assign permissions to the shares you create appropriately. The built-in “Everyone” group allows anonymous/non-authenicated access. This is good for me because I use DFS at home and Domain DFS can only access protected shares using NTLM auth (although it’s unsecure, but for my music collection who cares ). This was a ding I had against the Tritton; it didn’t support the concept of “everyone”.

I didn’t test the print server functionality, but I assume it works as advertised.

Performance seemed good, but I didn’t test it quantitatively.

I don’t know if you can put a larger than 120GB drive in it. A google search didn’t help answer this and I don’t have a spare larger than 120GB drive lying around to test. Since it boots from flash, not the disk, you should be able to put any disk in it to test. I may give this a try at some point.

There you go...

 

MCE Controller

In my post on XMLSerialization I mentioned that I was working on an app to enable control of MCE remotely over a TCP socket. I call this app MCE Controller and it's basically done. Here's what it does:

  • Runs as a taskbar icon and allows you to view a log of what it's doing by double clicking on the icon.
  • Supports 45 commands. These include all MCE keyboard shortcuts (equivalent to all of the remote control buttons) as well as commands for starting MCE and ensuring that it is maximized.
  • Commands are extensible. You can edit an XML file that MCEController loads to add or change commands. This will be useful for future versions of MCE that have new functionality as well as for controlling other apps (e.g. I have a scenario where I want to change screen resolution via PowerStrip. I can easily add a set of commands that let me do this remotely).

What it doesn't do (yet) is support the MCE State Aggregation Service which will allow me to send current MCE state to the remote contolling system (Crestron in my case).

If you are interested in this app let me know. I'll be posting a beta of it soon.

A question that I'm noodling over is whether I should persue generalizing this app. I have basically the beginnings of a alternative to Girder. I like Girder. It's very flexible and has tons of community support. However I think the implementation stinks. It's ugly, hard to use, and it's extensibility is just weird.

Do you use Girder? Do you like it? Would you think there's an opportunity to improve on it with a new/different app?

XMLSerialization

XMLSerialization absolutely rocks. I am blown away by the flexibility and richness it provides and how easy it is to use...once you get past the initial learning curve.

I implemented it for a tool I'm writing that allows me to control Windows Media Center Edition remotely via a TCP based protocol. My home AV control system uses Crestron and I need to be able to have Crestron be able to control MCE. For various reasons I can't use IR for this, so I want to do it over Ethernet.

So I built an app in C# that listens on a TCP socket for text commands and does the appropriate SendInput, SendMessage, and "create process" actions required to control MCE. For example the command "up" results in a SendInput call with the VK code for Up. "mymusic" results in a Ctrl-I, which is the shortcut for MyMusic in MCE.

As I built this thing I realized that I was basically re-writing Girder. I have been using Girder to solve this problem for a while, but it's TCP support requires an MD5 hash for authn and that is causing me headaches. Instead of trying to fix Girder's TCP support I decided to write this tool (I needed an excuse to do more C# coding!)

There are roughly 45 commands that MCE exposes, and a few more that other apps I want to control need. So I wanted an extensible way of adding/modifiying commands. Initially I got the app working by hard coding the commands into it. I have a class "Command" with sub-classes for each of the types of commands and I put these in a HashTable based on the commandname I defined.

Once I had this working, I wrote a "Serialize" method and started playing with XMLSerialization to cause my hard-coded command entries to be written to an XML file. After getting over things like XMLSerialization not supporting IDictionary objects (I had to "wrap" my HashTable), XMLArrayAttributes, and so forth I was able to tweak the output so that XML file was something that I (and others who use this app once I release it into the wild) could easily edit to extend/update. This involved changing the default behavior for some members to use attributes instead of elements etc...

Once I had this working , 4 lines of code in a "Deserialize" method I wrote WORKED THE FIRST TIME to read the latest XML I had generated from my hard-coded entries. I simply commented them out and now I can use the XML file to change my config!

Very, very cool.

More Posts