 | |  |
|
| |
November 28th, 2007
Here’s an article by Cory Doctorow on the current state of copyright, how copyright got to the sorry state it’s in now, and how Creative Commons fits in the picture.
All this is taking the lawyers out of the law, letting us engage in the Internet’s natural, social, conversational modes without turning ourselves into accidental felons, and without hiring $400/hour white-shoe copyright attorneys to sit at our elbows and make sure our copying and pasting is within the bounds of the law.
So if you want your blog or web page licensed, just go to the Creative Commons licensing page, answer the questions and you’ll be told which CC license fits your needs. Choosing different options and seeing which license was selected for me allowed me to better understand the license I had previously selected for my blog. So go take a look and play around. See which license you need and apply it to your work. Search engines will even honor your license when performing searches. What more could you ask for?
November 20th, 2007
I recently held a code review for a bug fix I made and one of the reviewers commented that I should check the return code of GetDlgItem in a line similar to this:
GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(FALSE);
so that I can check the pointer before using it. But if we’re going to that much trouble then technically we should do something more like this:
CWnd *pRemoveBtn = GetDlgItem(IDC_BUTTON_REMOVE);
if(pRemoveBtn)
pRemoveBtn->EnableWindow(FALSE);
else
// Write out to log file
…or perhaps something a little more generic like a macro or inline function which would help keep the line count down but would also make the logging not as specific for each usage.
I don’t know about you, but I’ve never checked GetDlgItem before using it. One simple jaunt through the code during runtime will let you know if it works or not. It’s a different story when you placed the controls on the dialog dynamically, but when you’re using static controls simple unit tests will easily find any typos or bugs in those function calls.
He then commented that during future maintenance say that the programmer renames the control from IDC_BUTTON_REMOVE to IDC_BUTTON_DELETE. While that would definitely bork up the code, I feel that making changes like that fall under what I call “programmer responsibility”. If you change the resource ID of a button, you better do a search (and replace) on all your code for the old resource ID, delete the old resource ID definition (if it’s not used elsewhere) to prevent erroneous compilations with the no longer used resource ID and maybe also run through those dialogs once or twice to make sure that all the old resource ID references are actually gone.
Sure checking for the return code from GetDlgItem will have prevented your app from crashing if you left an old resource ID in there, but if you did that then it’s your own fault. You were either lazy or didn’t care to check the whole source. Also, if you had checked GetDlgItem for NULL before continuing then any references to the old resource ID would not cause the app to crash. The control would simply not perform the action. In the case of EnableWindow, the control would not change to enabled or disabled. It would take either a keen eye in the dialog or a meticulous hand in the logs to see that EnableWindow was not performed, especially in a real time app. In this case, I could definitely argue that letting the app just crash would be preferable since any old references would definitely be caught. So…
Is there such a thing as programmer responsibility or should absolutely every effort be taken to prevent bugs?
November 15th, 2007
On Tuesday, Miro v1.0 was released by the non-profit Participatory Culture Foundation. Formerly known as “The Democracy Player”, this little player improved both its name and the stability problems it was plagued with. After seeing this announcement, I immediately (well after a little thought of “do I really need another media player” followed by “yes”) went to download it.
After playing with it the past few days, I must say I like it. It’s a combination media player, bit torrent client and podcatcher, but this is all very much behind the scenes. With iTunes, I’m still very aware of the RSS behind the scenes and often have to paste in URLs. In Miro, I haven’t seen any address yet. It very much has a need-to-know attitude and hides things (like RSS URLs) that the user doesn’t need to know about. Anyway, let’s get on to the review…
After the install, Miro starts up with a little tutorial. In Step 1, you’re presented with a video that gives you a little overview of Miro:

In Step 2, you can easily add different groupings of channels. You’re not made aware of how these channels are synch’d or what’s behind the scenes, simply click the add button and it’s yours:

And then a little statement that tells you that it’s downloading and that you can start playing around:

So after the install and setup, you’ll have all your channels synchronizing and downloading content. You can easily see all your channels in the panel to the left and also the number of videos downloaded for each channel. There’s also a selection to view all your new (unwatched) videos as well as all the videos currently downloading. In the right panel is a view of the currently selected channel and all the the videos in it. The information and action buttons are very clear and very pleasing to the eyes. You can view the nitty gritty details of each item or just play happily with the overview of each:

As you can see they take their UI pretty seriously, which can be rare in free applications like this. But this isn’t just another pretty application. These guys obviously put great effort towards usability as well. For instance, after I installed it I was messing around with the options to see what was there. I found a field to change the downloaded video folder, so I changed it to reside on my data drive instead of the default. However, by that point videos were already downloading. So I made peace with the fact that I’d probably have to delete all the downloaded videos and redownload them to the new location, but after pressing OK I received this:

So now I don’t have to worry about any of that. Coolness. So what’s left to say about Miro? It’s clean. It’s slick. It’s polished. It doesn’t bog you down with details you don’t need to know or options you don’t care about. It’s simple to navigate and easy to add new channels.

My only problem is that now with Miro, Beyond TV, and the other video podcasts out there, I’m never short of video. If it were only legal to watch video while driving…
November 13th, 2007
Sometimes the workplace can be a little boring: Tester reports bug. Developer researches bug. Developer fixes bug. Repeat.
So the other day, I was researching an SCR and a particular foul one at that. In the SCR, I commented that whoever did this “should be tarred and feathered… hopefully it wasn’t me…” A little later, I received an email from the person doing the doc for the SCR saying that it cracked her up. Raymond Chen told an amusing story of poetry in a bug report:
I don’t know what overcame them, but the analysis was written in iambic pentameter… At any rate, the device driver team added one comment to the bug immediately upon receiving it: “We ain’t much fer book lernin’.”
So how do you keep it fresh and lively in the doldrums of bug tracking?
November 13th, 2007
I recently received an exported event log from our testing department. Usually our tracing is all I need, but in this case where the application in question simply won’t start, it’s kind of hard for the tracing module to initialize. So we had to resort to the event log. Although I don’t use the Event Viewer much, I must say… I’m not a big fan. Everything I’ve seen is a usability nightmare. For example, the log I received started logging events a few days earlier than the event in question. Ok, so I just need to scroll a bit… Whoops, it looks like saved event logs are paged. You only get about 250 rows before you have to go the next page. Ok, paging isn’t toooooo bad. We can deal with that:
So I click “Next Page” several times to get where I want. Uh oh. I went too far. That’s ok, I just need to click the… Wait a second, there’s no “Previous Page” button! There is a “Next Page” button and a “Back to Top” button for all those times you want to go back to the very first page, but no “Previous Page” button. Did we not have our thinking caps on when we designed this, Microsoft? What use is a web browser with no back button? Little. So what use is an event viewer with no previous page button? Not much, I gotta tell you.
So maybe now you’re thinking “But wait a second, Mike. You can just click on the ‘Date and Time’ column header to sort on that header and get the most recent events at the top.” Sorry, but that doesn’t work either. Sorting only works on the current page, which isn’t all that useful. And even if it did sort through all the pages, what would the page number show? If you’re observant, you probably saw the page display only shows the name of the log followed by the current page number. It’s not “Page 5/12″ or anything useful like that, it’s just the number of the current page. I still don’t know how many pages my saved event log contains.
So what’s the lesson here? Is it “Don’t display partial information”? Is it “Don’t provide partial functionality”? Is it “Don’t design for only a partial set of use cases”? I think any of those would work…
November 7th, 2007
I recently upgraded my three monitor PC from XP to Vista. The install went smoothly and it booted up fine. So I go into my display settings only to see two of my three monitors available. So I mess with trying to get the other driver to load. I play with the video settings in the BIOS. No luck. As it turns out, the problem is that Vista simplified their display architecture by allowing only one video driver to load:
…the Windows Vista Display Driver Model (WDDM) brings fundamental changes to the management of multiple graphics adapters and external displays. This includes a new restriction, because WDDM drivers do not support “heterogeneous multi-adapter” multi-monitor implementations.
Well, that may be good for them, but it’s surely bad for us. Not all is lost though. Microsoft makes a suggestion:
The user could change the graphics hardware configuration by choosing multiple graphics adapters that use the same WDDM driver. Graphics adapters from the same ASIC family generally have the same graphics driver. In late 2006, each of the major graphics vendors had a single WDDM driver for all supported WDDM graphics adapters.
So it sounds like I just need another NVIDIA card. My PCIe slot is being used by my first NVIDIA card so I just need to get a new PCI NVIDIA card. Ok, no big deal. I call up IT and after a little finagling I walk back to my office with a GeForce FX 5500. Not the greatest card in the world, but it’ll do. I pop it in, start up the PC and am welcomed by this:
Ok, what’s going on now? As it turns out, the 5500 is using a WDDM driver and the 8500 is using the “Version: 7.15.11.5818″ driver. Trying to force one to use the other’s driver just results in a lot of blue screens and other funness. Using a 6200 or another similar card fixes the issue since they use the same driver as the 8500. But say you don’t have that option. What does that leave you with?
If you have another PC or laptop at your disposal, you have a couple options:
1. Maxivista. This is a client/server set of utilities that let you run the client PC as a secondary display device for the server PC. You can use the same keyboard and mouse across monitors/PCs, drag windows across monitors/PCs and use the clipboard across monitors/PCs. It truly feels like a 3rd monitor. That is, if I could get it to work. After installing Maxivista, I still received the “incompatible display adapter” message. No amount of disabling Aero, shutting down Ultramon or reinstalling would make it work. Too bad too.
2. Synergy. This is another great little client/server tool. It’s similar to Maxivista, except for a couple things. Synergy doesn’t act like a secondary monitor. It still displays the desktop from the client PC. It simply lets you share a single keyboard and mouse across multiple computers. It supports full clipboard functionality across computers too (Maxivista costs a little extra for that). But Synergy is totally free! Maxivista definitely is not.
I can definitely see the benefit in simplifying the display driver architecture for Vista. Simple = better when you’re talking about source code. However, in terms of usability this is definitely a step backwards. This only causes pain and configuration issues (and usually expensive new cards) for the user. Maxivista would have been a great substitute if I could have gotten it to work (even though having to disable Aero would have been a shame), but Synergy will still give me the three monitor feel that I wanted.
November 2nd, 2007
Similar to the other maps of the Internet, here’s a nice visualization of the complete address space of the Internet (and in javascript, no less). You can zoom in and out and move around all Google Maps style. Click on any part of it to display who owns that address. The grey boxes are unrouted, the black boxes represent the registries and the red boxes represent known spammers.

From just a little scouting around, you can see how much of the Internet isn’t routable yet. I don’t know why IANA has all those reserved blocks, but it sure looks like we don’t need IPv6 anytime soon…
|
| |
 | |  |
|
|
|