Programming is a wonderful mix of art and science; source code is both a poem and a math problem. It should be as simple and elegant as it is functional and fast. This blog is about that (along with whatever else I feel like writing about).

Sunday, December 16, 2007

I Finally Discovered Flex

Just a little while ago I was considering the possibility of pre-built PHP Display Components, which would allow me to build applications faster and re-use a lot of the boilerplate code that I currently spend too much time on. And once those components are built, they could be improved individually, which would make all my applications better without having to do anything.

It seemed like a good idea, and while considering how I might go about doing it, I discovered Adobe Flex. I'd heard of it before, as "Flash for developers," but had never been that curious. Having investigated Flash before, I was not interested in having to purchase a visual development environment and then messing around with timing, tweening, layers, and all the other crap Flash puts you through.

But Flex isn't like that at all. In fact, it's essentially just a set of visual components you can use in building a visual interface, along with a slew of classes for connecting to web services and easily binding XML data to the visual components. Additionally, ActionScript appears to be what JavaScript wishes it were ... which is nice.

Best of all? They provide a free SDK with a command line compiler. So as long as you're willing to actually write the code (rather than drag-drop-connect, which seems to be the direction the IDE companies want programming to go), you don't have to pay a dime and can check Flex out. So I did.

I decided to write a quick program to calculate quarterback ratings. Since the ratings formulae are different in the NFL and in college, I figured I'd have it calculate both.

Here are links to the app and the source code.

The first thing I did here was set up the visual interface, which is at the bottom. I used Flex's Label, TextInput, and Button components to build a simple form. I used absolute positioning because it's supposed to be better for performance (and because all the examples on Adobe's site use it, which means I haven't learned much about their automatic layouts yet -- I certainly would like to).

These components should be pretty familiar to anyone who's used HTML and Swing ... the tags seem to be a mix between the two, which is pretty interesting.

After writing the interface (and compiling and testing it to make sure it looked the way I wanted it to), it's time to add the functionality itself. The calculations will be done by ActionScript, in the <mx:Script> tag. It's a lot like JavaScript, except that you can define strong types and public/protected/private status, both of which are nice additions. The functions in here are simply designed to pull the data from the input fields, convert to Numbers, apply the formula, and set the label.

The one slightly non-basic feature I used in this program is NumberFormatter. Flex claims you can instantiate any component either with tags or in the script code, but the only way I got this working was to make an <mx:NumberFormatter> tag and reference it from the script. It's actually pretty interesting, and once I get used to having to do that, I may grow to like it.

I then went ahead and compiled it, and it worked quite nicely. Flex looks like a promising way to build web applications -- it's even possible that I could grow to prefer it to PHP + AJAX for my own applications.

Saturday, December 08, 2007

PHP Display Components

Just about every GUI language/framework has standard classes for displaying common datatypes. There are datagrids, sortable datagrids, paginated lists, searchable lists, input forms, display forms, etc. You instantiate them, set up some information about them, and connect them to your data source. Then you call some sort of display() method on the object, and it displays everything on the screen.

The reason I mention this is because PHP has nothing like this (at least not that I know about). In PHP, the View part of MVC is merely an HTML-based layout file with some markup in it to display your data. But isn't is possibly to create a set of components that generate the HTML on their own?

Obviously, we could all just continue to code the HTML in our Smarty templates, recreating the same functionality over and over again in "low level" HTML. On the other hand, we could create components at a higher level of abstraction, and when we figure out a better/cooler way to do that searchable+paginated list (maybe adding some Javascript), we do it once -- in the component -- and it works everywhere we're using it. That's much better than having to change HTML code everywhere we're displaying a list of data (um, a lot).

So what are the goals of these display components?
  • Define a set of reusable components that handle the display of data on a web page and generate the HTML
  • Concentrate the HTML/JS of your application in component code, out of sight
  • Ability to easily create new components, or edit existing ones as needs arise
  • Skinnable -- either set CSS values in the code, or assign a CSS file to the object (also allow for a default CSS file to be set sitewide)
  • Allow you to stay at a higher level of abstraction, so you can get more done with less code
These seem like reasonable goals. They're not trying to shoot the moon ... and they don't seem to demand that you develop a certain type of application if you use these components. However, the problem of defining what components are necessary then quickly arises.
  • Lists of data
    • Paginated
    • Searchable
    • Sortable
  • Header
  • Footer
  • Sidebar
  • Input form
  • Display form
  • Calendar
  • Date selector
    • Single date
    • Date range
  • Time selector
    • Single time
    • Time range
  • Popup dialogs
    • Modal
    • Non-modal
  • AJAX
    • Periodical updating
    • Response to user action
    • Connect a URL-defined data source to a component
That's a start, anyhow. More components are probably necessary.

There should probably be a general Page class, or something, that you would attach the other components to. The point of that would be to set pagewide CSS and only being required to call the display() method once per page.

In the interest of separating this from the concept of "scaffolds," I think the way it should work is that each component has a standard/default HTML template that it draws from, and the file it uses is an object variable. If you want, you should be able to create a brand new HTML template and make your component use it instead -- it would be nice to have that kind of flexibility.

Right now ... I don't know if this is feasible. I don't even know if it's a good idea. I'm sure people have tried to do this before, and I've never heard of the results. At the moment, my plan is to think about it for a while longer, and if I continue to think it's a good idea, it may be worth spending a bunch of time on to see what I can come up with. Could be interesting. (Let me know your thoughts, if you have any.)

The First Week -- Mostly Waiting

I just finished my first week on the job. I don't know how typical an experience it was, but I'll run down a quick overview of how it went for me.

It was "Team Week," which means that everyone who works in offices around the country all get together in Chicago for a week of project planning (during the day) and partying (at night). As a general rule I would have jumped on the partying train after work, but I'm adapting to a new lifestyle -- one that involves waking up early and commuting to work -- and have been pretty tired. I don't want to throw a hangover on top of that process. It's already hard enough to prevent myself from drinking coffee.

I really like the team I'm working with, so it's a bit of a shame that they've now all gone back to their respective homes and we'll have to work remotely. But they've been successfully doing it for a while, so I'll just have to slide right in and contribute.

And on that note, I was completely unable to "slide right in." I expected it to take a day, maybe a day and a half, before everything was set up and I would be working. Alas, no. There were numerous problems with waiting for IT, and one entire day was lost because the one guy who knew what we needed to take a step forward missed a day (spent it with his son in the ER -- apparently everything's okay now). I spent most of the week reading source code, but with no access to the repository or a development server, nor any direction on what to do. Finally, on Thursday, I was assigned projects, and on Friday, I was told what they actually want. But I'm still waiting on CVS access.

In my first week on the job, the vast majority of my time was spent on non-work tasks. I don't think that's very unusual, but it feels weird to have to "wait" like that after you've started the job. From the reactions of the rest of the team, they seemed to expect that it would take 2-3 days. By the end of the week they were getting as frustrated as I was that I still couldn't work.

Hopefully everything gets set up quickly, and next week goes a bit better.

Friday, November 16, 2007

Becoming a Consultant

Last week I decided to look for work. From what I can tell, the best way to do that is to throw your resume up on dice.com and wait for the calls to roll in (well, the best way is probably to know someone who'll get you a job more easily, but I don't). I didn't have to wait long until I had a couple of promising contacts with what I assumed were both recruiting firms. I set up face to face interviews with both of them.

As it turned out, the first firm was in fact a recruiting firm who had a permanent position in mind for me. Everything seemed to go well, and when I left the meeting I felt good (which was significantly different from how I felt when I went in ... I was quite nervous). They were going to send my information along to their client, and I'd have an interview on Monday. While waiting for my next interview a couple hours later, I decided to have lunch at Potbelly Sandwich Works, who make delicious sandwiches for a low low price. (I guess it's not as low as Jimmy John's ... but Potbelly actually cooks their sandwiches.) I got my usual, the "Italian on Wheat." I love restaurants where you can order something that sounds almost non-sensical, and they know exactly what you mean. While eating my sandwich, I took the opportunity to get nervous again. After all, the second interview was in the Sears Tower, which is designed to be intimidating ... and is successful. It has as much security as an airport, and is much, much taller.

I stood outside the massive tower, unable to see the top, for about an hour and a half. This did not help the state of my nerves. Finally, I decided to call my contact at the recruiting firm to get this show on the road. He came downstairs and we held our meeting in the Starbucks in the lobby. I declined the offer for coffee, since I don't drink the stuff, but he insisted "Come on, make me feel good," and I was obligated to order a small bottle of orange juice. It was delicious. You've got to love expense accounts.

Early into our meeting, I learned that this company was not really a recruiting firm, but was instead a consulting firm. It was SPR, and he spent a considerable amount of time convincing me about the greatness of the company. And you know those cases where someone tries really hard to make you think they're great, but the whole time you're sitting there thinking "That doesn't sound so great," and waiting for them to let you leave? Well ... this wasn't one of those times. He didn't have to try very hard at all, because he had a lot of "we're great and it's pretty self-evident" material. He went on to describe the client I'd be working for, and it sounded like a great situation and a great person to work for.

I left that meeting excited about working with SPR, and again nervous since I had to pass a technical screening followed by a face to face interview with the client if the technical screening went well. I had to wait a few days (it was a weekend) for the phone screening, and as it turned out I didn't need to be so nervous (as had been the case every time). I had the interview the next day, and so the next morning I hopped on the bus and rode downtown. I didn't know exactly where to get off, so I sat there the whole time with my iPhone out, matching the streets on Google Maps with the stops on the way. That worked fine, because I managed to get off on the correct street.

This interview was mostly over lunch, and was with the guy I'd be working for as well as another developer I'd be working with. It turned out that they were both vegetarians, and I ordered a meat ravioli (in other words, something that you know exactly what it is when you hear the words, which I don't like as much). At first I thought "What if they think I'm one of those heartless meat-eaters?" Then I immediately thought "If the fact that I'm not a vegetarian is any kind of an issue, would I really want this job?" Neither of them had a second thought about it. That was excellent. So was the rest of the lunch interview. After lunch, the boss went back to work and the developer gave me a tour of the office, and after a little while I went home feeling pretty good about my chances.

When I talked to my dad, he tried to manage my expectations and keep my feet on the ground (though they already were). "Don't get too excited, you don't have the job yet." Yeah. I know. Don't remind me. After that phone call, I was on the edge of my seat, staring anxiously at the phone. It took about two hours, but it rang and the voice on the other end said "I have good news and good news." Well, needless to say, that was good news! He told me the deal, and when I hung up the phone I was a consultant.

The whole way through the process I was nervous, and I shouldn't have been. The key is just to be yourself, and everything will go well. Now I have to wait two weeks before I can start (professional courtesy to the current employer), and then I get to get down to the part I'm good at, which is actually doing the work. It's all very exciting. And since I'll be paid by the hour, the number of 12 hour days will probably decrease just a bit (down from "every day except Sundays").

After I start, I'll know how I like it. I'll post my thoughts here, naturally. Until then, have fun.

Thursday, November 15, 2007

Apache Rewrite Rules

Everybody likes websites that have good, clean URLs. On a minor little project I'm working on on the site, I wanted to give that a try. So instead of seeing a URL like /index.php?username=user1&view=feeds, you'd see /user1/feeds. It's kind of cool ... and remarkably easy!

One assumption this particular projects makes is that index.php is the only page that'll be viewed. It checks the query string parameters and changes its behavior depending on that. I don't personally like this method, but it makes it easier to handle the rewriting rules.

Here's the .htaccess file you're going to want to put into your webroot directory:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9]+)/?$ index.php?username=$1
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z]+)/?$ index.php?username=$1&view=$2
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z]+)/([a-zA-Z]+)/?$ index.php?username=$1&view=$2&action=$3
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z]+)/([a-zA-Z]+)/([0-9]+)/?$ index.php?username=$1&view=$2&action=$3&id=$4


So that seems simple enough. The first option on each line is the regular expression that you want to match. Each match within a set of parentheses corresponds to the $1, $2, etc, flags in the second option. The ^ at the beginning and the $ at the end are regex symbols signifying the beginning and end of the string, respectively. the /? right before the $ on each line makes it so the rule will match the URL whether there's a trailing slash or not. (For example, /user1 and /user1/ will work in exactly the same way.)

Thanks ... and enjoy!

Sunday, October 14, 2007

PHP Profiler

At ZedZone, we found we're having a few problems with performance on a few of our pages. So I needed to find a way to determine what parts of our pages needed optimization so we could speed everything up without wasting our time optimizing functions and queries that don't need it.

There are a few profiling packages available for PHP, but they require installing modules or PEAR packages, and it seemed to me that that's not necessary to profile your performance. So instead, I decided to write my own class.

What I wanted from my profiling class was the ability to measure the entire execution time of the script, as well as the execution time between any given points in the script. I wanted there to be any arbitrary number of measurable points in the script; it should be up to me to decide what parts of the script I want to measure, as well as how many such parts.


class Profiler {
var $startTime;
var $endTime;
var $marks;
var $report;

function profiler() {
//initialize the object
$this->marks = array();
}

function getMicroTime() {
$t = microtime();
$time = explode(' ', $t);

return doubleval($time[0]) + $time[1];
}

function start() {
//start the profiling
$this->startTime = $this->getMicroTime();

$this->mark('Start');
}

function mark($title) {
//mark the current spot
$this->marks[] = array(
'title' => $title,
'time' => $this->getMicroTime()
);
}

function finish() {
//shut it down
$this->endTime = $this->getMicroTime();

$this->mark('Finish');
}

function generateReport() {
$report = array();

$lastTime = $this->startTime;
$totalTime = $this->endTime - $this->startTime;
foreach($this->marks as $mark) {
$mark['diff'] = $mark['time'] - $lastTime;
$mark['percentage'] = ($mark['diff'] / $totalTime) * 100;

$lastTime = $mark['time'];

$report[] = $mark;
}

$report = sortArray($report, 'percentage');
$report = array_reverse($report);

$this->report = $report;
}
}

So the first thing to notice about the script is that when you initialize it, it only sets up the array for the profiling marks. In general use of the script, you call the start() method right after initializing the Profiler object, and the finish() method after all the code on the page.

Then after every function call, query, or section of code that you want to measure, call the mark() method, passing a string that identifies what's being measured between this mark and the previous mark. At the end of the script, call generateReport(), and you can either var_dump/print_r the report instance variable, or you can create another method called printReport() that builds a table to display the results of the profiling.

Note that the sortArray() function is not included in this script. In my code, it points to a quicksort that sorts an associative array by the values in the given key (as opposed to the sort functions that simply sort an array of strings or numbers, rather than associative arrays). I might post that later, but at this point the Profiler class only does this to sort the report by the sections of code that affect performance the most.

This class has worked pretty well for me so far, and hopefully it can be helpful to you too. If I find I need to add to it, I'll post further. Happy coding!

Monday, January 15, 2007

Getting iTunes to Recognize Your TV Shows

I have quite a few movies on my computer, as I've mentioned in previous articles. I've encoded most of them in H.264, which I find gives the best quality. Since I never felt like looking up my Quicktime 7 key (which I legally purchased when it came out, hoping it would allow me to encode DVDs more easily), I always played all my videos using VLC (because Quicktime doesn't let you do full screen). The process was annoying: I had to find the movie in the Finder, then drag it down to the VLC icon in the dock, then go to full screen. And VLC doesn't have an onscreen controller during full screen playback (at least not on Mac, I don't know about the status of other operating systems).

Needless to say, I started to find this pretty cumbersome. When iTunes first got the ability to play video, I jumped at the chance to have a program manage my video playing needs. I was grossly disappointed by how slow it was, and after a few hours of trying to set it up, went back to my Finder-VLC approach. Well, it's been a few iTunes updates since then, so I decided to give it another go.

The first thing you need to make sure you do is to set iTunes so it doesn't automatically move your files into the iTunes directory. This won't work at all when your main drive is full and most of your movies are on an external hard drive. Plus, it takes a really long time to transfer those files.

Adding the movies is very simple. Switch to the Movies tab on iTunes, then select all your movies, and drag them on over to iTunes. It'll chug for a little while, then give you a list of all your movies. You can set it to automatically play them full screen, which I like, and they give you a nice onscreen controller during full screen playback, which I like more.

But in addition to my movies, I also have quite a few television shows on this thing. And while iTunes does support TV shows, they seem to prefer that you buy them from the iTS rather than play your own. But I don't feel like repurchasing all these shows from Apple, so I need to get iTunes to recognize that they are, in fact, TV shows instead of Movies.

For an individual episode, this isn't too bad. You go to Get Info, then Video (a tab on top). Here you can set it to TV Show, and also enter the name of the show and the season number. Cool.

But that's really cumbersome if you have a lot of TV shows. You know, like a season. Or ten. Or, in my case, many many more. There MUST be a better way!

Doug's Applescripts give us Set Video Kind of Selected, which allows you to do this very thing to an arbitrary number of files. Awesome. Just download it, toss the Applescript file into /Users//Library/iTunes/Scripts, restart iTunes, and you're ready to get started.

Select your files:


When you drag them to iTunes, remember to select them all again and choose the script from the Applescript menu:


This will bring up a little dialog box where you can change the Video Kind to TV Show, the Show Name to, for example, "The Simpsons" and the Season Number to, say, 6.

It chugs for a few seconds, and then it says it's done. Popping over to the TV Shows tab in iTunes shows us that it did in fact work nicely, turning 5 or so minutes of tedious data entry into just a handful of seconds of just telling your computer what you want.



And the TV Show interface is kind of slick. Maybe it's possible for it to be a bit nicer or more usable, but come on ... it's easily a dozen times better than Finder+VLC. And iTunes certainly isn't as slow as it used to be.

And now I'm off to watch a bit of television. In iTunes. Tally ho!

Sunday, January 14, 2007

Is the NFL Fixed?

I feel like I'm the only person in America who hates the New England Patriots. That's like hating apple pie and Neil Armstrong! How could anyone hate the Patriots? They're an American flag with a football, and they're so good as to be unbeatable. But does anyone remember a time before their dynasty started, and exactly when it happened?

In the year 2000, the Patriots were 5-11. (2000 Standings.) They weren't a good team. At the beginning of the 2001 season, nobody expected them to do anything, and for good reason. They started off 0-2, as expected. Then the unthinkable happened. The World Trade Center towers got knocked down, and everyone needed to pull together and be patriotic. And ... the Patriots started winning. A lot. Tom Brady, a nobody, a quarterback from the Big Ten (which is not very well known for producing great quarterbacks these days), who didn't play at all in 2000 (not technically true; he played in 2 games, and was 1-3 for 6 yards and 0 touchdowns), suddenly became the best quarterback in the league. People are now trying to go so far as to say he's the best quarterback of all time. (This is complete crap, by the way. Johnny Unitas, Joe Montana, Dan Marino, Brett Favre ... at least you can say Brady's name in the same sentence, but he's not as good as any of them.)

In 2001, the Patriots won the Super Bowl, after an amazing turnaround from the previous season. They started playing well after a big tragedy. And the "dynasty" has been going strong ever since. After the 2001 season, I had begun to suspect that something fishy may be going on in the NFL. How did the Patriots get so good all of a sudden? Why did a team called the "Patriots" suddenly become the best team -- by a long shot -- right when everyone in the country was supposed to start being really patriotic? It seemed like too much of a coincidence, but I had to sit and wait until something happened again before I could point any fingers.

Then, a year and a half ago, Hurricane Katrina devastated New Orleans. Despite all the pain, death, and damage, what was the main focus by the people charged with rebuilding the city? The Superdome. They'd been planning to demolish the Superdome anyway, since it's so old and crappy. The Saints wanted to build a new stadium, and since they might not have gotten one in New Orleans, they were considering leaving for a city with a better fanbase. It didn't matter where. New Orleans fans had always been bad to their team.


Why did everyone care so much about rebuilding the Superdome and keeping the Saints in New Orleans? Surely the money could have been better spent elsewhere in the city ... unless the Saints had a good season for the first time in their history and actually got fans into the stadium, made some money, and united the population of New Orleans.

Last season, the Superdome wasn't ready. The Saints didn't play any home games all season. They were miserable, going 3-13. This team had no future, no quarterback, no coach, no talent. Then they drafted Reggie Bush -- despite all the hype, there was no way he could be ready for the NFL already. And they picked up Drew Brees from the San Diego Chargers. It was the first time in NFL history that a team acquired a quarterback who had a passer rating of 90 or better for the previous two seasons. I was surprised by this until I realized that if you have a quarterback doing that well, you're not going to give him up. Well, the Chargers did (and it wasn't a bad move by any means, thanks to Phil Rivers), and the Saints really lucked out.

This year they made the playoffs, got a first round bye, and even won a game, sending them to the NFC Championship game against the Chicago Bears. It was the second playoff game the Saints had ever won. It will be their first trip to the NFC Championship. And it is the most remarkable one-season-to-the-next turnaround in NFL history. No other team had a worse record in the year preceding a trip to the Championship game.

We'll see how the Saints do in the rest of the playoffs. Will they manage to defeat the Chicago Bears, at Soldier Field? It's possible; the Bears haven't looked good in the second half of the season, despite their early dominance. And depending on the outcome of tonight's game between the Patriots and the Chargers, as well as next week's AFC matchup between the winner of that game and the Colts, it's just possible that the Saints will be matched up in the Super Bowl against -- get this -- the New England Patriots. The two teams who actually benefited from tragedy will be facing each other. Will the torch be passed from New England to New Orleans? From the Patriots to the Saints? From Belicheck to Payton? Only time will tell.

Another possibility is that the Chargers will beat the Patriots, and then the Colts (which is likely, considering LT's awesomeness and Indy's lack of a defense), and go on to face the Saints in the Superbowl. And we'll get to see if San Diego made a mistake by getting rid of Brees, or if they made the right move in going with Rivers. (By the way, in case anyone was paying attention, Drew Brees is another Big Ten quarterback.)

Frankly, I'm rooting for the Chargers over the Patriots. No surprise, I despise the Patriots. But that's a passing thing. Five years from now, my hatred will have subsided. But for the sake of the sport, I hope that on Superbowl Sunday we don't see a scoreboard with the Saints and Patriots both on it. That would just be too much. For all us football fans out there, who have spent so many years of our lives following our teams and our favorite players ... is it really so meaningless week in and week out that the only thing that you need to do to have a Superbowl caliber team is to suffer some horrible tragedy?

Saturday, January 13, 2007

TVMini HD

A while back I bought the Miglia TVMini HD, which allows you to view HDTV streams on your computer. It's essentially an HDTV tuner. There are many other such products, many of which have more impressive features than the TVMini; but this one gets to brag about its size (for what that's worth).

I have a cheap 37" HDTV (doesn't have an ATSC tuner, supports 1080i/720p only), but I don't have cable TV. I use the television as a computer monitor for my G5 tower. It works pretty well in that function -- all I use it for is watching movies and television shows that I have saved to the computer. But now it's time for playoff football, so I need to be able to watch television. So I had to get the TVMini working again.

My G5 doesn't have wireless (I bought an AirPort card, but there must be something wrong with either the card or the computer, as it won't work ... I bought them both refurbished, so it doesn't bother me much), so I hadn't had it connected to the internet. But apparently the EyeTV software that comes with the TVMini requires an internet connection. I bought a 25' ethernet cable and ran it from my Mac Mini to the G5 and turned on internet connection sharing. Instantly, the G5 was online, and the EyeTV software came alive.

It scanned the airwaves for what channels were available, then downloaded the program information and displayed it. The interface is pretty, but not quite *that* intuitive. You have to right click the channel name on the left of the screen to get the options you want, and there are 2 options that always stand out in my mind. "Go To Now" and "Tune To" ... it turns out that "Go To Now" does not mean "go to this channel now," but rather "change the program display such that what's currently on television is displayed." I don't know what would be a better name, but I found that confusing. "Tune To" did what I wanted: go to the channel and view it. It seems to me that if you double click the channel name, it should tune to it.

I must say, ATSC over-the-air broadcasts look really, really good. Of course, not all stations are broadcasting in HD, so I'm getting some SD content too (broadcast over HD frequencies), but those programs that actually are HD are stunning. I'm watching the Eagles-Saints game right now, and the picture quality is fantastic.

But, there's a problem with the move to digital television, and that seems to be the very nature of "digital" itself. Unlike your father's TV sets, if the signal isn't quite good enough, you never get static and the picture quality is never compromised. It just stops and waits for the signal strength to get back up to a sufficient level again.

According to a cursory study of the signal strength graph, the TVMini cuts out if the signal strength drops below 50%. Unfortunately, the antenna they give you really bites, and I have yet to see a signal higher than 66%. Worse, every 5-10 seconds it drops down to 30-40% for a few seconds, meaning that the television viewing experience is pretty jarring.

The EyeTV software includes some really cool features, like scheduling/recording shows, pause/resume live television, encode for iPod, etc. (I tried encoding down to H.264 several months ago, and it's _slooow_ ... much slower than the x264 codec used by Handbrake.) But I can't use any of these features because the feed I'm getting through this antenna is too miserable.

I don't want to sign up for cable (because I hate Comcast), so I may have to buy a higher quality ATSC antenna. And I'll have to get a good one that does both VHF and UHF, because I'm in Chicago and CBS, for some reason, is the only UHF station and is also broadcasting at extremely low power. There are technical reasons for this, but I don't understand the political reasons for them being put into place.

It's too bad, too. The TVMini HD is a pretty cool little product, hampered by its generic remote control which relies on the functionality of mostly unlabelled buttons and a bargain basement antenna that destroys the quality of your signal. I can't recommend this product by itself unless you have cable (but you can't use it with a cable box, you need to plug it directly into the cable and hope you're getting an unencrypted digital Clear QAM signal) or are planning to buy a high quality ATSC antenna along with it.

But I did get to watch football on my HDTV today, even if the CBS nonsense prevented me from watching the early game (it was AFC so it was on CBS) and the bad antenna made the late game (NFC, so it's on Fox) nearly unwatchable. It's still football, and it's still the playoffs. And it was a really good game, to top it all off!

Until next time, take it easy.