When I first heard that the iPhone had a camera built-in, as well as WiFi, those two features triggered the following thought:

It would be really hot if you could upload the pictures from the camera directly to Flickr.

When I got my iPhone, I figured out a workflow that I could use to post pictures from the phone to my Flickr account, but it totally sucked balls was less than optimal. For each picture I wanted to upload, I had to open the picture in the Photos app and email it to a special address that Flickr had associated with my account.

Negatives of this approach? Impossible to use for more than a couple of images at a time, primarily, but also, annoyingly, the Mail app on the iPhone scales and recompresses the JPEG images before sending - and it strips them of their EXIF data, too.

So I was mildly displeased, but there was a way I could get it to work, kinda.

Then the iPhone got cracked wide open. People started figuring out how to write third-party apps and get them installed on their iPhones, and - to be honest - the UI for it, via Installer.app, is - even though it's not from Apple - better than anything I've seen on any other mobile phone, ever.

The Friday before last (September 7th), I decided it was time to take matters into my own hands. Finally learn Objective C. Start writing my dedicated "Push all of the images in my Camera Roll to Flickr, right now dammit" application. And I got a pretty good start! Got the toolchain to build working iPhone apps, and that only took a few hours. Started reading through Flickr's API documentation. Started implementing some functions that didn't require authorization to call - learning how to use Flickr's REST API, basically. Once the first couple of unauthenticated calls worked and did what I expected, I knew it would only be a matter of time before I had my app working.

My first thought was "Dammit, somebody beat me to it." And I was a little depressed for a bit.

I downloaded it and tried to get it working. No offense to the iFlickr devs, but they clearly didn't put a lot of thought into the user experience (or if they did, I posit that their ideas about "good user experience" work completely differently from mine). I didn't end up getting it to work, but it's open-source, right?

Naturally, my next thought: "Well, I've been working on mine, and this doesn't really do what I wanted. But... maybe I can steal some of their code at least!"

And then I looked at the code.

My eyes still burn a little bit from that. That ... that was not a good idea. I've had much better ideas in the past.

I worked on this for the next few nights, realized that I could completely avoid the messy minitoken crap by using the "Desktop app" authentication mode from Flickr, deleted all of my code that dealt with mini-tokens, and the other night, I finally got it to actually upload pictures to my Flickr account. (My friend Cliff's help was so valuable as to be incalculable.)

I'll post more technical details later, but the important thing is: MobilePushr is out. The UI is going to get a lot of love in the next few days, because the current one doesn't provide nearly enough feedback, but as of right now, MobilePushr lets me do something that I've wanted for almost three months.

I can push my JPEGs directly from my iPhone to my Flickr account with the push of a single, giant red button. (And so can you! If you go download it and install it on your iPhone, that is. Assuming you have an iPhone.)

Also, of course, MobilePushr is Open Source / Free Software, released under the GPLv2. If you use git, you can look at my code by cloning git://mg8.org/MobilePushr and poking around.

The really awesome thing about all of this is that, through Flickr, I can see how many people have given my app permission to link to their account, and in the first twelve hours alone over a thousand people have activated support for MobilePushr on their Flickr accounts.

I hit another case of "Python really makes me angry" today and I thought I would share it with you all, since I know how much you love reading about things that enrage me.

I have a chunk of code that (while being significantly more complex) looks like this:

def baz(): print kitties # This works fine.

def bar(): print kitties # This one throws an exception!

kitties = 'delicious' # The exception is because of this.

def foo(): stuff = {'kitties': 'squishy'}

for k, v in stuff.iteritems(): globals()[k] = v

baz() bar()

This is another example of Python's scoping being weird, and in my opinion, broken.

Let me explain, in case you didn't bother copy & pasting that into a python shell and running it.

baz() will execute properly. bar() will not. But the error you get from bar() is worthless - it tells you that you're trying to read from an unassigned local variable, except you're trying to read from a global variable. The problem I have is not that bar() fails - it's that it is inconsistent with baz() working. I realize that adding a global kitties makes bar() work properly; but I think that in this case, the error should really be when you try to reassign a global variable that hasn't been declared as global.

I like getting around to implementing the various ideas that I bounce back and forth inside my skull.

One of those ideas that I had for a long time was to solder a PS/2->USB converter directly into an IBM Model M keyboard, along with a USB plug so that I could just swap out USB cables to plug the keyboard into the computer.

I have to say, this kicks way more ass than even I had hoped. (ajax, eat your heart out.)

Still on the list:

finish the Qt4 frontend for HandBrake

write my own email client that doesn't suck balls

write my own AIM client that doesn't suck balls

hack up some apps for Qtopia/Opie/whatever for my shiny new iPaq 3670

I know there's more than that, but those are the ones that are currently taking up the most brainspace, so I'm going to have to get to them sometime.

Due to United Airlines sucking balls, Dave Airlie crashed at my place last night after they called back and cancelled his flight from SFO to Sydney. I've said this before, although maybe not on this blog, but United are a bunch of cockbags. They have fucked up at least one leg of every single trip of mine that they've ever been involved in. In any case, I know far too many foreigners named Dave.

Also, I've been growing this out for the first time ever. Looks like I'm going to have to update my various avatars...

I really love it when I can easily find something that bothers me in a piece of software, dive into the source, and start fixing things.

That's what I've been doing lately with this little DVD ripping app called HandBrake - it's a cross-platform GPL DVD ripper that makes it almost painfully easy to take a movie from a DVD and turn it into a file that you can watch whenever the need strikes you.

There are some problems, though. Right off the bat, there is the issue that (when ripping a DVD) libdvdread spews out hundreds of lines of output, warning me that a value isn't 0 and it should be. It's not fatal, but it certainly is annoying, so I whipped up this patch up to fix it.

Also, I don't have a video iPod at the moment, or a Sony PSP (and I don't see myself buying the latter anytime soon, but you know... if one were to fall into my lap, I'd probably use it and enjoy the hell out of it.) Anyway, not owning one of these devices, I'm more interested in HandBrake as a way to make high-quality compressed archives of my DVD movies that I can watch on the HDTV in the living room. There's a problem, though; HandBrake scales the picture by default as it transcodes it.

Not anymore, it doesn't. Now it has support for (optionally) embedding the anamorphic pixel ratio into the output file, and can preserve the original DVD video frames. Which means, with x264 at least, a reasonable performance increase of about 15%. Not too shabby!

Unfortunately, the only GUIs for HandBrake are on Mac OS X and BeOS. Now, I love BeOS. Haven't used it in years, though, and I don't even think it'll run on my hardware; Haiku still isn't quite there yet, either, but I'm keeping tabs on it. What I really wanted is a Linux UI for HandBrake.

I've been playing with ATA over Ethernet on my home network and I have to say, it is pretty damn sweet.

In fact, it would be absolutely perfect if I could use AOE to share drives to my media center, and then use ZFS on that machine. Unfortunately, Linux doesn't have ZFS, and OpenSolaris doesn't seem to have AOE yet. (The Coraid site has a Solaris driver, and they claim it works on Solaris 7+, but there is no source and I don't happen to have an OpenSolaris machine to test it on at the moment.)

But - the ability to pool together all of my disparate disks into one gigantic volume is awesome. It's like Voltron, but with hard drives instead of robots.

I was lucky enough to get a ticket to attend WWDC this year, and I've been looking over the session schedule to see what the sessions are, when I ran across this interesting little blurb:

DTrace, an open source project which provides insight into the interaction between your code and the OS kernel, is now available as part of Leopard. This session will explain how kernel developers can both take advantage of, and extend, DTrace's functionality to help debug and optimize low-level code.

airlied: I'd be a lot less annoyed with companies like ATI if they shipped drivers (even proprietary ones!) that actually supported their latest cards.

The R5xx-series cards have been out for MONTHS now and there's still no acceleration, 2D or 3D, Open Source or proprietary. Good job, ATI!

Anyway. I'm excited about the way that things are headed, and I'm really glad that other people are getting excited, too.

To the people who were wondering - the "AI" in "AIGLX" stands for Accelerated Indirect - it's basically required to do a lot of neat things like using the local card to render OpenGL from a remote application. It also enables all sorts of kick-ass effects like the new bling in metacity and compiz (which doesn't work yet, but it's only a matter of time).

I was playing with a CVS checkout and noticed a large chunk of one of the source files was commented out with #if 0; so, this piqued my curiosity and I decided to figure out how many blocks of code are commented out with #if 0 in the server, driver, and lib trees.

The current count, in CVS HEAD, as of about five minutes ago:

module

blocks of #if 0 code

libs

56

server

408

drivers

648

All combined, that's 1112 blocks of code completely disabled at compile time just sitting there in the tree.

Haven't bothered checking any of the other modules; I'm sure there's more in apps but I don't really think it matters for docs or fonts. Still. That's a lot of useless crap.

I've been playing with it, and it seems to be a really cool device, barring a few issues. It feels very solid, and I like that. What I dislike is the software.

Don't get me wrong - I love PalmOS, but PalmOS 5 is trying to do things it's just not capable of and Graffiti 2 makes me want to throw my shiny new toy into a wall. For example, the hack that the PalmOS guys are using for showing focus selection? It breaks with at least half of the color themes that they ship on the device, because it doesn't draw the halo properly on the buttons. And the fact that I can't create my *own* color theme annoys me, too.

I need to figure out some way to get Graffiti 1 working on this thing. I'm using a demo version of TealScript for now but it's a little on the slow side and I don't really like the idea of paying $30 for it, especially since it's *not* a faithful reproduction.

Sync works great over Bluetooth to my Mac mini, which is pleasing. The pilot-xfer command-line utilities on Linux seem to work very well too, which is good; I haven't tried any other utilities yet, but I will soon.

I decided that I was sick of paying too much money for my cell phone and so I've initiated a transfer of my cell phone number from Sprint/Nextel to Vonage.

Vonage assigned me a temporary number in the meanwhile, which is cool, and I've been playing with the service.

I have to say that I'm really pleased with it so far.

Installation was literally a snap - I unpacked the router they sent me (the Linksys RTP300), plugged in the power, and scratched my head over what I should do next. I figured that I'd probably have to do some port forwarding magic or something if I wanted it to work from behind the router, so I punted on that and went to Target to pick up a handset since I haven't ever owned a "real" phone.

Bought a $9 handset at Target, a GE "Slimline" thing that has call waiting, caller ID, three-way calling, and other things that are insane for a $9 phone. Anyway. I brought it back home, plugged it (and the ethernet cable) into my RTP300, and then mentally prepared myself for the frustration of having to do magic to get my main router to let the new toy do its thing.

I was a little disappointed, actually.

It just worked. No port forwarding, no iptables hackery, no headaches, no frustration - the lights flickered in a few weird patterns for a minute or so, and then I picked up the handset and I got a dial tone. I dialed my phone number and it asked me to log in to my voicemail.

Consider me impressed. Not to mention that the web-based UI for managing the Vonage account is really really sweet - I have it set to send me email when I get a new voicemail, and you can check your voicemails from the web (they show up as WAV files), plus it's dead simple to set up call forwarding and configure the different timeouts for voicemail/call forwarding/etc.

So, I don't know about the other routers - I've read lots of nightmare story reports from people using other hardware and things - or other phones or other VoIP providers, but so far I'm pretty damned impressed with Vonage. Oh, and for $25/month, I get unlimited calls to anywhere in North America, including Canada, and their international rates are pretty good, too. I called daniels up the other day and the conversation - which lasted for almost an hour - cost less than a combo meal at Burger King.

For those of you who are syndicated on Planet KDE and also care about your bandwidth: Please pay attention to this message.

By default, Planet KDE will now show any images that you include in your blog. If you do not wish for images from your blog to show up on the Planet (which I can understand, since we do use up quite a bit of bandwidth), now you just have to do:

<img class="hidefromplanet" src="foo.png" />

The old class="showonplanet" is still around, but it's irrelevant now and may be removed in the future.

Today is a pretty cool day for me because a project I've been working on at work is finally released.

dogtail is a framework written in Python which makes it easy to write scripts to automate graphical applications. It uses AT-SPI which means that (for now) it doesn't work with KDE, but I fought the good fight to make sure that it has no GNOME dependencies so that hopefully there will be a chance of KDE adopting it in the future. Now that we've finally gotten the release out the door, I plan to track KDE svn and write scripts for KDE4 apps. Ideally, we'll have KDE4 support before KDE4 is actually released.

(I know that there's a tool from KDAB which allows one to automate KDE apps, but it's not Open Source and it only works with KDE; dogtail supports anything that we can see through AT-SPI, which includes OpenOffice.org and Mozilla-based applications as well as, hopefully, KDE4.)

Fab: NetworkManager actually has a pretty well-designed separation between the front-end and the back-end; the only problem stalling us from being able to do cool things with it right now is that we have no working DBUS bindings for KDE3 (so nobody can easily write a Kicker applet to interface with NetworkManager to use on their desktop today), and KDE4 doesn't actually have anything usable at this point, whatsoever.

I brought this up at aKademy - aseigo and I were basically ready to go ahead with it but we got sidetracked with window icon previews in the window list on the desktop pager hover tooltip. (Try saying that five times fast.)

In theory, somebody could write the applet using the DBUS API from C, but the current Qt bindings in the DBUS tree are pretty much worthless, so it's not going to be pretty either way.

Wade: No, I don't have a robot answering my email. My robots are busy preparing for the ... I mean, uh, what robots? I don't have any robots.

I do have three totally awesome computers now, though (not including my work laptop). The first one is my Mac mini, which rules, but it's not the focus of this entry.

Over the past week or so, I'd run into some really odd stability issues with my AMD64 box. I decided to go to CompUSA and pick up a new motherboard, since the last issue I had with an AMD64 machine was also the mobo. Bring the new mobo back home. Remove the old one, move parts over to new one, hook up power connectors, flip the switch, and ... nothing.

The damned thing didn't even POST.

Somewhat frustrated, I decided to work on assembling my other new system. I've had a spare CPU, some extra RAM, and a slew of video cards laying around for a while now, so the only thing I really needed to pick up was a new case and a motherboard for this box. It's an "old" AthlonXP 1700+ - I figure it's probably worth me keeping a system around that can do AGP and run fast enough to prevent me from throwing it out the window.

The assembly on my new system went pretty well, until the part where I attempted to attach the power cable. The power supply I was using was a 24-pin, designed for the power requirements of the newer AMD64 systems. Normally, it wouldn't be too hard to plug in a 24-pin cable into the 20-pin socket on the motherboard, except that the mobo I picked up happens to have the IDE pins right next to the ATX pins.

And there was much frustration.

I was about to give up, but for some reason I decided to read the manual for the power supply in the new case that showed up, and if you look at page 3 in the manual, you should see the picture that made my night.

The other power supply can break off the extra four pins so that I can use it on the motherboard.

I returned to CompUSA and got a replacement for the busted motherboard, and brought it home and set it up, and this one actually works, so now I've got both systems up and running beautifully.

Adam: I have a tax-free holiday every day of the week; it's called "Living in New Hampshire."

(There's no sales tax in this state, for the readers out there who are confused.)

Work on the tdfx EXA support is still ongoing; I have the framebuffer addresses properly set up now, but my blit and solid fill routines are completely hosed. At least I have an idea of how things are *supposed* to work now.

First off, most recently, I started hacking on EXA support for the tdfx driver - it doesn't do much yet, except for display things wrong and crash, but hopefully I'm not too far from it working properly.

Second, I finally coerced a graphic designer friend of mine into coming up with a new layout for my site. It's not live yet, because I'm not quite happy with it, but it's pretty close to ready (I think) - take a look and let me know what you think. (Yeah, I know, it's slow. It's using multiple layers of translucent PNGs, some of which are position: fixed. I prefer to think of it as "an opportunity for KHTML optimization.")

Third, I have been hacking on the Qt4 BitTorrent client from Andreas, and it's really cool. There's a very small, slow memory leak in it, though, which I have to find and destroy.

Other than that, not too much going on. I'm excited about aKademy - only a couple of weeks away!

Every time I hear the word 'stroke' from now on, I'm going to hear keithp purr. That disturbs me to no end.

In other news, the DDC at OLS has been a lot of fun. I'm going to have to disagree with chouimat about a few things - namely, I think that Xgl is extremely sexy, and has a hell of a future, and while it's true that the vast majority of the talks here are GNOME-related or have a GNOME bias... it's because we are vastly outnumbered on this side of the pond, and you can count the number of KDE developers at this conference on one hand.

George Staikos was here for a couple of hours, I've been here for the DDC but not OLS, chouimat was here (but let's face it, you haven't been active in KDE lately, chouimat, and neither have I), and Alexander Dymo is here and gave a talk about KDevelop. We're not exactly taking over here. We need more of a presence at these shows, people. It's important.

Theyweren'tkidding. This game is hard. Holy shit, this game is hard. I don't think I've ever played a game where it took me four hours to get to the THIRD STAGE before. This game rules.

I don't think I'll be sleeping this weekend.

(oh, and props to mpyne, who kicks *major* ass for dropping Ikaruga to me in the mail. The note he placed in the case reads "Let me know how Level 3 is. I only ever made it to the boss of Level 2." Holy shit this game is hard.)

Ok, to be slightly less cryptic: Wireless devices won't ever really replace their wired counterparts until they no longer require battery replacement to run. Batteries that recharge by gyroscopic motion? Ok, cool. Batteries that recharge by quantum phase induction? Hey, even if I just made it up, it sounds cool, and as long as it means that I don't have to put new batteries in when the current ones die, I'm all over it.

The main reason I don't have any wireless peripherals right now is the battery issue. I've almost talked myself into getting one of the Logitech mice that recharges on the base station - that's pretty close to my ideal scenario. It takes the whole "there's a battery inside" detail and makes it completely irrelevant.

We had a discussion in #kde-devel earlier about what KDE's requirements for a build system are. What are the current problems we have with autoconf/automake/libtool? What features do they provide that we really care about? How hard would it be to replace any/all of them with things that suck less?

I took notes of the discussion. They're below; I'd like to get more feedback on this.

(One of the first points that I'm sure someone will make is "auto* is cross-platform! We need to support KDE on platforms that aren't Linux!" etc. Look, we realize this. However, auto* provides lots of problems for us on platforms we do care about, including MacOS X and Windows. (Ask RangerRick or js about them on IRC, or email them.)

Just because we're using auto* and friends doesn't mean that our code works; as a matter of fact, RangerRick noted that so far, all of his issues with the Mac port of the work-in-progress KDE4 have been build issues, and none of them have been code-related yet.

This is clearly a problem and since KDE4 is an aggressive new major release, we should solve it in the KDE4 timeframe. We don't want to have to wait until KDE5 for a build system that doesn't suck, do we?

Without further ado, the notes from the discussion.

Must support:

generating binaries (duh)

generating shared libs (on all ELF platforms + MacOS X; Windows?)

icon installation

uic, moc, KConfigXT, etc

GCC visibility

automatic dependency resolution

manual hints for dependency resolution

flex/bison

non-recursive (flat) builds

--enable-final

builddir != srcdir

simple to the point of being learnable within 5 minutes

kdeinit support (?)

multiple build targets (libfoo, libbar, libbaz) in one file

--compile-slots, like in unsermake

pkg-config support

support rpath sanely

ability to link & run uninstalled binaries

easily integrated into KDevelop

'admin' needs to be shipped in KDE instead of in src of each app (if we keep the 'admin' dir, that is)

* clee kicks ajax[clee] dammit, man. I really want a usable Expose feature. Like, yesterday would have been good.[ajax] oh yeah, totally my fault * clee blames you.[ajax] why yesterday?[clee] ajax: well, yesterday would have been good. today would have been acceptable. but if it gets here tomorrow, that's not soon enough. * clee sighs[ajax] i was thinking maybe there was some event yesterday[clee] hahaha[clee] no.[ajax] like you were trying to show off X to some hottie in the coffee shop or something[clee] hahahaha[daniels] haha[clee] and she whips out a Mac and she's like "Let's see your network-transparent windowing system do THIS!" and hits F9?[ajax] but then she's all "shit boy, five year old acceleration architectures ain't gonna get you any poon"[clee] yeah, happens to me all the time[ajax] *smack*

Out of the box, no current Windows version, including Windows Server 2003, supports SATA drives.

My best guess is that the BIOS enables some sort of PATA emulation that Windows can use to find that drive. That's the only thing that makes sense.

And I was a little hard on VMware, to be honest. I mean, I was using a feature that they specifically warn against most people using, while running 32-bit VMware on a 64-bit (unsupported variant of a) host OS. I'm reminded of a quote here...

Red Hat, my employer, has a site license for VMware. (Well, either a site license, or an assload of Workstation licenses, I'm not really sure what the details are.)

I decided "Hey, why not play with the new release? You've got new hardware. Maybe VMware will run acceptably fast on it!"

Man, what a fucking brilliant idea that was.

Backstory: I haven't booted Windows in a few months, not since Doom3 came out and wasn't available initially on Linux. However, I have some shiny new devices in the new box, including a SATA DVD burner, which so far doesn't seem to work with Linux very well. Ubuntu's kernel enables SATA ATAPI support, which Jeff Garzik tells me is a bad naughty thing of them to do since it's not ready yet. Which results in my ability to *see* the drive on /dev/scd0, if the planets align properly, but I can't actually use it for much.

This machine doesn't have a floppy drive, since I'm a cheap bastard, and I happen to agree with Apple on this one. Fuck floppies. They should have died a long time ago. I also refuse to run Windows XP - I bought and paid for Windows 2000, a long time ago in a galaxy far far away, and it's the last release of Windows that I really plan on ever using. Windows 2000, being rather old, has some deficiencies, however. Like not having SATA support in the installer (unless you load a driver from a floppy, which I don't have).

I think to myself, "Hey! VMware! Raw disk support! It used to work pretty well, why not try doing an installation from a virtual machine into a physical disk? You can use the VM to download drivers, then create a new hardware profile, reboot into it, and maybe that'll work."

HAHAHAHAA

Let's just say that this was probably the worst idea I've had all night, even worse than eating that third slice of pizza. My partition table on /dev/hda now looks like this, thanks to VMware:

(For those of you wondering why I wanted to play with Windows in the first place - SATA DVD burner. I know that I can install Win2K drivers for the SATA chipset, and I know that the DVD burner will *probably* work there.)

That's one Lian-Li PC-60, one Chaintech VNF4/Ultra motherboard, and one Athlon64 3000+ CPU.

This machine is officially fast enough to scare me. I can play Doom3 at my monitor's native resolution (1680x1050) and the frame rate doesn't drop below 60fps even with baddies on the screen.

The only other goodies I need to complete this box are a couple of 400G SATA drives. The Hitachi model is only $275 on NewEgg, which means that it's now possible to put over 1TB of storage into a box for under $1000.

Next, yet another method of reversing/iterating backwards over a list has been suggested in multiple places, one which I didn't know about.

foo = ['one', 'two', 'three']bar = foo[::-1]

The only thing I can possibly say to that is... but the ternary operator is too obscure? C'mon, give me a break. This provides the ability to have tons of random line noise and make your code just as unreadable.

And, Seth: Since I couldn't catch you on IRC earlier, I'll just reply here.

Multiple issues to respond to, so let me break it down.

You seem to be confused as to what I was complaining about with list.reverse(). It's not that I want a copy of the list, exactly, but I want the return value of list.reverse() to be sane, which in my exceedingly humble opinion, it is nowhere near.

I'm not upset, mind you, just mildly annoyed, by the iteritems()/enumerate()/xrange() issue. And the reason that it's annoying to me is because it's inconsistent. Some of the iterator methods are global and some of them are not. Inconsistency is lame. End of topic.

Ternary operators seem to be quite the polarizing issue so I'll just leave my stance exactly where it is. I think they're useful, and I'd like to have them, but obviously I can work around the language not having them...

Especially since Python doesn't have sane scoping, either; the method-local and class-local scoping rules provide the opportunity for way too many obscure and annoying bugs. I note that you didn't respond to my issue with scoping at all.

Oh, also, a friend of mine has offered to send you a copy of the Smalltalk book, where he says that they solved the problem of doing lambdas and maps efficiently.

I'll kindly ignore your not-so-subtle digs at my programming ability (or perceived lack thereof) and refuse to insult you for liking Python. Mind you, I still think it's a useful language, but I'm just annoyed at the inconsistencies and some pet features (like ternary operators, or sane scoping) that I wish it had.

(This is a pretty geeky entry, so if you're not a geek, consider yourself warned.)I have a lot of little tiny annoyances with python, since I've been using it for a while now to hack on some stuff. Here's a collection of the ones that are floating on top of my brain.

::sniff::

I miss my ternary operator.

In C, and C++, and Perl, and Ruby, and PHP, and pretty much any language that I've ever written in (hell, I think even JavaScript supports this, though I could be wrong about that one since I haven't written any JavaScript code in years), you can use a very terse syntax for if (foo) { return bar; } else { return baz; } using what is referred to as the ternary operator.

The shortened syntax is more like:

(foo ? bar : baz)

Yeah, it's kinda weird. And yeah, if you don't understand it, it's not very intuitive. However, it makes for much shorter and clearer code (to those who grok ternary operators). Python doesn't support this. At all. There was a proposal to include it and it got smacked down, so that they could include such other genius ideas as reversed() instead. Speaking of which...

backwards

Reversing an array is done like:

foo = ['one', 'two', 'three']foo.reverse()

This does not return a reversed copy of the array, but it does reverse the array in-place and return 'None' which is quite confusing. Especially if you're used to sensible languages which return a reversed copy. So this code doesn't work.

However, this is a python-2.4-specific feature, so it's useless if you care about older python releases. Also, it doesn't create a reversed array, just hands you a pointer to a reversed list iterator. So you can't do:

Because bar is actually not a list, or array, or what-have-you, but it's a listreverseiterator object. Whatever the hell that's supposed to mean. What it translates into is basically "Surprise! We hate you."

So, you have to do:

foo = ['one', 'two', 'three']foo.reverse()for i in foo: print i

Which, granted, ok, isn't the end of the world, but it's pretty ugly and it doesn't work at all the way I had expected it to, which to me is the sign of a language that sucks.

For reference, the following code in ruby does work exactly how I expected it to. And because ruby and python share a decent amount of syntactical sugar, I keep on getting annoyed when things that I expect to be working in python simply aren't.

Ruby's list iterators are weird, sure. But actually, that's a good way to bring up my next complaint.

iterators in general

Why the hell do you have multiple types of list iterator methods in python? I shouldn't have to remember a different type of iterator method for every different type of container, nor should I have to remember whether it's a global iterator method or a per-container one. That's just annoying, and pointless.

for i, n in enumerate(foo): print i, n # Prints the index and the member

Although I have no idea why you'd want to. (You can always just do xrange(foo) and then 'foo[i]' since they give you the same thing. But ternary operators would be too confusing.)

But, if you have a dict instead of a list, all of a sudden...

foo = { 'a':1, 'b':2, 'c':3 }for i, n in foo.iteritems(): print i, n

Using enumerate() gives you the index of the 'a', 'b', and 'c' keys. Also, note that enumerate() is a global, like reversed(), but iteritems() is a member of the dict class type. This is the kind of inconsistency in a language that kills me.

white space

Surprisingly, I don't mind the whitespace thing. It just doesn't bother me that much. (Ok, so that's not really a complaint. Still, enough other people complain that I figured it was worth noting that it just doesn't irk me.)

scoping

Scoping is weird in python. Let me explain.In regular languages, a variable declared inside of a block of code only lives until the end of that block; this is the 'scope' of the variable. So if you have:

The other day, I was on Dell's website. They had the 2005FPW for 25% off, and I thought to myself, "Self, that's a damned good deal."

However, I didn't have $561.75 free on any of my accounts, and the deal expired in a few days. Then I saw the "Apply now" link. "Hmm, instant loan. Nah, you already have too much credit."

Wait, though. If you apply for credit and you get rejected, at least in the US, you're automatically entitled to a free credit report. What the hell, why not? I can always use a free copy of my credit report.

About three minutes later, the Dell website comes back with the result. "Congratulations! You qualify for a $1500 line of credit."

Shit.

Needless to say, now I have a sweet 20" widescreen LCD. It's gorgeous. I liked it so much that I bragged to pretty much everyone that would listen. And I even convinced ajax to buy one, but he went and bought three instead. Crazy bastard.

I'd post pics, but I don't have a digital camera. Mostly because when I buy one, I want it to kick ass, and the ones that I want are still over $1000.

[@ajax] so working on DRI for i128, i turned off XAA[@ajax] in the spirit of experimentation, i ran xcompmgr -a[@ajax] it feels _much_ faster now[@ajax] like, firefox doesn't tear when scrolling[@ajax] it's kinda weird[@daniels] hmm[@daniels] maybe we should rename it to XDA :P[@ajax] totally unaccelerated, but just fast enough to feel useful[@ajax] the only unpleasant part is switching desktops

One of the things I keep thinking about with KDE's much-vaunted CVS->SVN migration is... why don't we just leave the CVS server up as it is, and screw the whole "import the entire history of our repository into SVN" idea?

Think about it.

The cvs2svn script is good. Don't get me wrong - it's pretty impressive. But we've done some evil to our CVS repository - manually moved files, etc, and cvs2svn is not perfect; why don't we just leave the CVS server up and running read-only and import a snapshot (say, 3.4) into SVN without trying to drag all of the history along?

People who want to pull absolutely 100% accurate checkouts of a given revision can do it with the old tools and we can evaluate subversion without having to deal with any possible issues brought up by weirdness caused by cvs2svn.

I personally think this may be the smartest way to move forward, but I'm sure that others have differing opinions. Care to share them with me?

Somehow managed to get the ThinkPad apart, and dropped in the new card, and connected the antennae, and turned it on, and was greeted rather rudely by two beeps and the infamous Error 1802.

I was prepared for this though. I expected to spend the rest of the day hacking around IBM's evil authorized-miniPCI-card whitelist and being otherwise 1337 just like mjg59. But instead, I found the source for a neat little hack that resets part of the nvram to a magic value and disables the whitelist check.

All this means for those of you who don't speak Geek is that I overrode some IBM stupidity and made my hardware work the way it should. Which should have been much easier, but hey, this is Linux, and we like things like lseek(fd, 0x5c, SEEK_SET) just fine.

I spent most of this week at LinuxWorld in Boston (and the very beginning of the week at the XDevConf, which ajax took notes of) so my legs are killing me. But last night, Google sponsored this amazingly kick-ass dinner for a few dozen of us free software hacker types, and it was completely badass.

They had some issues with their food distribution algorithms though. Hopefully next year, if they roll out Google Dinner 2.0, they'll have that algorithm sorted out. (It took an inordinate amount of time to get our food since everyone had to wait in a huge line to get served - there's definitely room for optimization there, I think.)

I talked Dave Jones into coming along and we had an awesome time. As soon as we walked in, we were accosted by Google folks who made us fill out some registration cards. One of the fields on the card said "Desired position" so I asked the woman (who had an amazingly kick-ass Google shirt, one with a female symbol on one of the 'o's in Google, but I digress) "What does this 'desired position' field mean?"

"We want to know, if you were to work for us, what position would you want to have?"

This stunned me. What an amazingly smart way of getting people interested. So davej and I filled in "spaceman" and "Batman" respectively. I mean, if Google is going to be hiring someone to be Batman, I certainly hope that they'd consider me for the position, because I think I could do really well in that role.

Got to meet some cool people there, including Mako who apparently wanted to meet me because he knew who I was. Finding out that other people know who I am and want to meet me.... that's kinda freaky. I mean, granted, we're not talking about Havoc Pennington-style rockstar status.

I attempted to hunt down a copy of World of Warcraft a few weeks ago, in vain.

My searches were fruitless. I went to several Wal-Marts, Targets, and Gamestops. All were completely devoid of World of Warcraft loving. This made me sad.

I ended up going to go visit Tony (who I'll be dropping by to see again on the sixth for the Chinese New Year) and I crashed at his place after he, Rob, and I stayed up until way too late watching Battlestar Galactica at Rob's place. The following morning, we got up and I talked Tony into going to the Apple store. It wasn't that hard to convince him, actually. I just said "We're going to the Apple Store," and he complied. Once there, I had the instant flash of realization that the wonderful bastards at Blizzard put the Mac and PC versions of their games on the same CDs. Those crazy fools. I searched for the gem and - lo and behold - there were FIVE copies of WoW. I picked mine up, made sure it wasn't some book or gift card (like Target had. For shame, Target! For shame.) and I carried it to the line at the register and bought it.

The game is incredible. It's seriously just amazing. If only I had a decent video card, one that didn't overheat when I played it... And dealing with Windows is shitty.

Which is why I've bought a dedicated World of Warcraft box. It hasn't arrived yet, which irks me. But it should be here "on or before" the seventeenth of February, according to Apple. Huzzah for that.

That's about all that's new in the past few weeks. I'll attempt to blog more frequently - hey, I should dump my .plan on here sometime and see what people think - but it'd probably be easier if I had my blogging app working again. Sounds like a fun project for tonight!

Apparently nobody has bothered building anything from the xlibs or xserver trees on an AMD64 system yet.

These modules contain such gems as:# if defined(__AMD64__) || defined(AMD64)

Which doesn't actually *work* on these machines, as gcc defines __amd64__ and not AMD64. (Yeah, kids, case matters.)

Daniel added me back to the xlibs and xserver groups, so I should be able to commit some fixes for this stuff; however, there are still a lot of other issues on AMD64 that haven't been fixed yet. ::sigh::

So mpyne had implemented a somewhat working SPC plugin for GStreamer which was pretty limited and somewhat useless. (As he admitted :)

His version had a hardcoded path to the SPC file, didn't work as a filter - just as a src - and was performing quite strangely on his system for some reason. I've since rewritten it (from scratch) as a filter and not a src. It works on my system, kind of. I haven't gotten the typefind implementation done yet, and it's pretty fragile at the moment - I haven't figured out exactly why, but somehow removing a printf from the spc_setup function causes the plugin to segfault (I think LoadSPCFile may be doing something strange, but I'm not sure...)

Michael Pyne, brilliant guy that he is, was trying really hard to get this SNESAPU code working on his system. I couldn't even get the crap to compile, let alone to run and dump a bunch of zeroes like he was getting.

I had mpyne tar up his work and send it my way to see if I could find anything new. About forty-five minutes later, after we'd both looked in a lot of unrelated areas, I found the missing link: A call to ResetAPU. Added that in, and all of a sudden, it works!

Now, that wasn't enough. Since I finally have this library compiling, and running, I don't want to simply dump the first five seconds of every SPC to a wave file named output.wav. I want to play them to my speakers!

Having no prior experience with libao, but remembering somewhat vaguely that the API didn't look too disgusting, I decided to try to get SPC->libao output working. And now, just under an hour later, I have it working. And I even cleaned up the code a little bit so it's not quite as embarrassing.

This code probably won't do most of you any good, but this is mostly for mpyne's benefit as I'm not convinced I'll still be conscious when he gets back. However, if you are interested in playing with it, you can grab the tarball from my site. You'll need g++ and nasm to build the stuff, and since most of it's in assembly, you'll need to be on x86.

Well, ok, no chainsaw hands, but I got my replacement laptop from work today. It's an X31 - smaller and sexier than my old T41, which was stolen from my car while I slept.

Don't think I'll be leaving this one in the car. Ever.

But yeah, I'm excited. FC3 actually isn't as bad as previous releases, so I'm keeping it on there... I'm probably going to see about taking over those KDE specfiles so I can have less-shitty KDE packages on Fedora, but we'll see. Don't want to go around making promises and disappointing people.

I should really do a TODO one of these days and list out the stuff I need to take care of. Like that pyblosxom plugin. Damn.

I finally relented. People have been asking me for weeks to add/change the current class name for images which will show up in blog entries on Planet KDE, and I've finally made it possible for those of you who do want to have images show here without using the word "rape" in your image classes.

(Man, people get upset over the strangest things.)

So, if you want to embed an image and have it also show on the Planet you can still add 'class="rapemewithachainsawthanks"' but you can also add the less-risque and more boring 'class="showonplanet"' tag as well. Your choice.

For the general readership out there, this makes absolutely no difference whatsoever, incidentally. Images will continue to show or not show depending on whether or not the blog authors decide to put the images here.

The machine which was previously hosting c133.org (my domain) was compromised recently. So I set about finding new hosting, and I did thanks to Warren Togami (a coworker of mine at Red Hat) so you are now seeing c133.org on a brand-new box.

One interesting side effect of this is that my weblog is now statically generated instead of dynamically so. I haven't really changed the layout or anything, or even the design, but the filesystem paths have been played with a bit and the configuration has been gently tweaked. So now my blog should be even faster.

Oh, and planet KDE has a new home as well. Thanks to Stephen Depooter, it's now on a separate machine from c133.org and very unscientific cursory testing shows to me that it's even more well-connected than it was before. So, despite the fact that the breakin shut down the sites, I think that they're both better off now. And my mail seems to have mostly caught up with itself. Which is good.

now that I've been forced to get off my ass and actually look over the files on the site, I've done a little tiny bit of maintenance and cleaned up a few things that were previously still around. I may even get around to doing the aforementioned redesign at some point! But I don't want to make any promises, so I won't.

I've been using Gossip as my Jabber client for a while. Which has been working out fairly well, since the UI is nice and clean. But there's been this slight annoyance with it - every time that I close a chatwindow in Gossip, it forgets how big the window was. Just completely forgets it.

This behavior finally got annoying enough that I put some gloves on, dug down deep, closed my eyes, and massaged some GNOME code.

The good news is, I lived. I have survived to tell the tale.

The bad news is, it was scary. And I feel sort of dirty.

It took a few hours to work out exactly what needed to go where, but overall it wasn't quite as terrifying as I had thought it would be. My underscore key did get quite a workout though. And I got to determine a few more reasons why I'm definitely glad to be a KDE developer. (Namespaces. Classes. God, I never thought I'd be so happy to look at classes again.)

So geiseri hosted a hackfest at his place in PA last weekend. I showed up and brought manyoso with me; Nadeem Hasan came down, as did Mirko Boehm. Zack Rusin was already there, and it was fairly awesome. My only regret is that, despite the awesome time I had, I didn't get any hacking done since I don't have a laptop anymore.

Oh, yeah.

Somebody broke into my car a couple of weeks ago. Shattered the quarter glass behind the passenger window, and stole my IBM Thinkpad T41 out of the back seat. (Well, the footspace behind the passenger seat. Close enough.) I have no idea where the laptop is, and, while the police have been informed, they haven't really proven to be that useful.

End result: I have no laptop. So I was fairly useless at the hackfest as far as actual hacking goes. And my workstation at home is set up in a rather decidedly non-ergonomic fashion, which means that I can't really use the computer for extended periods of time without standing up and stretching out my knees.

I do have plans for stuff to hack on and plenty of things to keep me busy though. So don't worry about that, guys. Just need my replacement laptop to come in from work, and maybe I can pick up a computer desk with my next paycheck somehow.

Realized that I haven't blogged in a while, so these entries are a bit longer than the usual length. I doubt anybody will really care that much, but yeah. Maybe I can kick myself into blogging more frequently once I get some Tack hacking done again.

mpyne has called me out and made it public that I have Grand Plans for a pyblosxom plugin which will read (via XML-RPC) a chunk of text and then throw it on the blog if it likes it.

The trick is getting the plugin to like it.

My idea currently is to make the chunk of text a valid GPG-signed message. Have the server plugin read it in, decode it, check the signature against the configured key ID from the pyblosxom config file, and then if all of the criteria match, post it on the blog.

Have a few small issues to work out, but it looks like a lot of the hard work has been done for me. daniels wrote a Perl script that sort of does this if you filter email into it, but I hate Perl and the setup for that is annoying. Editing pyblosxom's config files is easy; I doubt that I'm going to end up losing data that way. If I somehow misconfigure a mail server, such that everything for my email ends up at blog@c133.org or something, I'll be fucked.

And I don't like that. So, I guess this is the part where I formally announce that I have intentions to actually finish this module (since I have a half-aborted attempt at it from a while back), clean up the code so that my key ID and stuff are no longer hardcoded into it, and then there might actually be a public release.

(Of course, once it's out, a KDE app which will be able to post to it, probably by using DCOP to communicate with KGPG, will be forthcoming.)

I blogged earlier about KDE potentially moving our repositories from the ancient and archaic CVS system to the new hotness known as Subversion.

This time around, I've got more ammunition for discussion and a lot of thoughts about the relative strengths and weaknesses of each system as they apply to KDE. Hopefully other KDE developers will read these notes and at least take them into consideration when discussing our eventual move away from CVS.

So - first off, a few words about CVS. CVS has served KDE faithfully for years, and has been (for us) fairly stable and reliable. It doesn't change much. And, believe it or not, CVS does have some strengths.

CVS

Strengths

Weaknesses

Ubiquitous (practically every operating system on every platform can run CVS)

Relatively light on resource usage

Comparitively light on disk usage

It actually works

Branching is painful

Lacking in certain very basic features

Lack of atomicity with commits; no transactions

Not very well-optimized for low-bandwidth

Difficulty handling binary files properly

Now, Subversion fixes a few of these issues, but at the core Subversion's goal is to be a better CVS than CVS. It doesn't implement wire compatibility, nor can it natively use the old CVS repository format; instead, it maintains the same ideas as CVS (namely the same centralized development model), as well as a compatible command-set except for areas where changes are needed to deal with Subversion having features that CVS doesn't.

Disk usage is significantly higher than CVS for a converted repository

Subversion seems slower than CVS, quite a bit so in some cases

Not nearly as ubiquitous as CVS (yet)

Resource usage is relatively higher than CVS

And, just for good measure (basically, because I like it) I'll throw in a little bit about Arch, also known as 'tla'.

Arch

Strengths

Weaknesses

Super intelligent merging support

GPG signing support

Seamless inter-archive branching support

Very easy on server-side resources

Offline commits

Relatively high learning curve

Nowhere near as ubiquitous as even Subversion

Rather difficult and verbose user-interface

Disk usage is also higher than CVS

Speed is not very impressive

What does this mean for KDE?

I think that Subversion is a much more natural fit for KDE than Arch. We have a very centralized development model; however, the disk usage issue is depressing to think about. I ran a test conversion of our kdelibs repository from CVS to Subversion, once using the Berkeley database backend and once using the new fsfs backend; the bdb backend takes up 1194M of space, and the fsfs backend takes 1130M of space on my system. In comparison, the CVS repository takes up 281M of space for the same revisions. Some of the Subversion developers have offered me a few hints, but I cringe to think about how difficult the migration will be for a large module such as kde-i18n.

So there's some pretty heavy discussion on the kde-core-devel list about migrating from CVS to Subversion for the entire KDE project.

All I can say is, the sooner, the better.

Of course, I'm very much of the mind that tla > svn > cvs, but as long as we're moving up the stack, even if marginally, it's still progress. Plus, svn has the feature that it is much more like tla than CVS is, and the cvs2svn guys have already written an impressive script to convert the ancient RCS files into changesets. And since both Subversion and Arch are changeset-oriented... I'm very excited. In my mind at least, it shouldn't be too insanely difficult to migrate from svn to tla in the future...

HDTV service was installed and turned on yesterday. Still feeling a little sick and not so hot, but I'm going in to work today.

The new Smallville season looks good so far. I love that show. I have to admit, I didn't really like Lois at first but her personality has already started growing on me. I just wish that Comcast offered the WB in HD up here.

mattr just asked me on IRC why exactly it is that I want to write YAIMC (Yet Another Instant Messenger Client) and this is my response, for those of you who aren't really paying attention.

09:55 [mattr] clee: then why don't you spend time to either suggest improvements or improve the other existing ones?09:55 [clee] mattr: Because the kinds of "improvements" that I'm going to suggest for kopete and for gaim and for every other client out there will get A) Laughed at or B) Ignored09:55 [mattr] clee: and you know this how?09:55 [clee] mattr: Ok, let's see your reaction to these suggestions.09:56 [clee] 1) Drop every protocol except OSCAR.09:56 [clee] 2) Strip out most of the 'plugin-based' API for everything.09:56 [clee] 3) Redesign the UI to not suck.09:56 [ShawnLaptop] clee: what kind of IM protocols will it support than?09:56 [clee] ShawnLaptop: ICQ and AIM.09:56 [clee] Which are the only ones that I give a flying fuck about.09:56 [ShawnLaptop] MSN, Jabber, Yahoo?09:56 [clee] Fucke'm.09:57 [clee] er, Fuck'em.

There was a lull while mattr went to go get lunch, and then the discussion started back up again.

10:36 [mattr] clee: you better hope your IM client isn't any good, because then people will want you to have plugins, and support other protocols. :P10:36 [clee] mattr: Oh, it won't be.10:36 [clee] mattr: As a matter of fact, I'm going to hardcode my username and password into it.10:37 [clee] mattr: There will be zero preferences, because all behavior will be hardcoded to exactly the way that *I* like it10:37 [clee] mattr: And if anybody doesn't like it, they can go fuck themselves and/or fork it themselves10:37 [mattr] heh10:38 * mattr notes that he neither laughed nor ignored clee's suggestions. :P10:38 [clee] mattr: But you won't implement them.10:38 [clee] mattr: And if you did, you'd ruin Kopete.10:38 [clee] so it's ok.

To be honest, I may not even release the code to the rest of the world. What with my username and password being hardcoded into it. But we'll see.

My evil plot to subvert GNOME is slowly taking shape. Todd Berman is talking about having me help him with some C# bindings for libgaim. Not only will this rock because I may have a decent API to model my own IM client's after once the C# bindings are working, but it has the benefit of letting me learn a lot more about C# and Mono.

So many things I need to take care of tech-wise... still have to actually run a power cord to the quad PPro in the closet, have to set up LDAP accounts on it and Kerberos with some sort of filesharing for the home directories and then get the client computers here to work properly with that. Want to set up Ubuntu on one of my machines here since it seems to be pretty cool and I'm all about Debian without the brain damage. Need to figure out whether or not to leave the Radeon 9600 in my desktop or put back in the Radeon 8500 (or the GeForce4MX since the nvidia driver is the only one that actually gives reasonable performance with Composite right now...)

Not to mention work stuff. Oy. Not enough hours in the day. And where the hell are my clones, dammit? I'm kinda under-staffed here.

Got another new keyboard. The Logitech one that I was happy with before ended up not being nearly as rockalicious as I had initially thought. Programmable keys, yada yada, USB blah blah, shitty. No, caillon was cool enough to buy me a Model M keyboard. CLICKETY FOR LIFE!

And since I have had this one in my hands, I have realized just how much faster and more accurately I type on these keyboards. I missed that feeling. If only someone would make a USB-native Model M... (Oh, and I ordered another one from eBay which was apparently delivered to my apartment's office building this morning but I wasn't here.)

Seriously. These keyboards totally rule.

Incidentally, the one that caillon purchased was in fact not an original Model M but remade by the Keepers of the One True Keyboard, those saints at PC Keyboard. These guys rule. I have no relation to them save that of the delighted recipient of one of their fine products.

Sat down with Ed and Zack yesterday and basically did a mind-meld; we had an hour-plus-long braindump session where I let loose all of the ideas, concerns, and issues that I've been thinking about as far as desktop QA goes here at Red Hat.

John Flanagan dropped in towards the end of it, and he seems to be quite open to a lot of our ideas, which is awesome. Hopefully we can get the budget/machines allocated to implement the desktop testing lab that we want to set up; that would be perfect.

Talked to Scott James Remnant today, and asked him about the bug with atom.xml parsing and <br/> elements; he pointed me at his arch tree and told me to update from there, which I've done.

Net effect, a tiny bump and all of a sudden atom.xml feeds are looking dead sexy. Anybody who's currently blogging on blogspot - your feeds should no longer look like crap! There was a small bug for a minute with the old template, where the (feed) links in the sidebar on the right were all pointing back to planetKDE.org instead of pointing to the actual RSS feed from the developer. That's been fixed.

So Maksim (aka SadEagle) did some awesome hacking on my crazy widget style and fixed a few of the bugs that I've been too lazy (or too stupid) to fix myself lately. This has kickstarted me into looking at some more of my code, and I've actually been hacking on things lately.

I also have an evil plan regarding kdelibs... How much would everyone hate me if I split out the sub-libraries within the kdelibs package into smaller individual packages and ported them to use pkg-config instead of the voodoo that is our admin/ build system?

Daniel and I drove up with Chris Blizzard for OLS, and we've been here since Sunday. The conference is kicking *major* ass, and I've gotten to meet tons of awesome people.

The bourbon that Bdale and Keith picked up completely knocked me on my ass though. I was completely out of commission on Tuesday, and barely managed to recover for Wednesday's activities.

Canada. What more can I really say? Like home, but just different enough to fuck with me. It's cool here, though; the wifi from the balcony is sort of spotty, but otherwise the room is awesome. More alcohol than I thought could be consumed has been.

Trying to convince Steph to start blogging. No luck as of yet.

Daniel is cramming hard for some deadlines. Which sucks for him. I feel kind of weird, being alone out here on the balcony, knowing that everyone else is asleep already. Good time to blog, though.

Kind of missing home, oddly enough. Never been homesick like this, not since the parents moved me to Arizona. Also, my mind keeps wandering back to Libby.

::sigh::

Overall, though - surprising quantities of ass-kickery have shown up in my life lately, and I'm still frankly quite shocked at it. If only life could be this badass all the time.

So I've taken the time out of my day to gimp up a picture of myself to use as a hackergotchi head. It's not a particularly great pic, but I figured it had the most potential for hackergotchi status.

I like the way it turned out. Any other guys here on Planet KDE, if you take the time out to do this, send me the PNG file and I'll upload it and get it set for you so that you too can have a floating disembodied head.

If you do decide to gimp yourself up then please note that the image should be about 64 pixels wide to fit properly. Anything from 60 to 80 pixels tall will work for the height, but let's try not to make the images _too_ large.

In response to Roberto's query: If you have a blog with a working RSS feed (e.g., one that includes the <pubDate> tags) send an email to clee@kde.org with your name, what you hack on, and the URL of your RSS feed, and I'll add you to the blogroll here.

Hopefully Ian will fix up kdedevelopers.org soon so that I can start pulling those blog entries too.

With the advent of planet KDE, we need a decent blog posting utility for KDE. This isn't it, but it might become that utility if enough people send patches to me (or hey, you can always fork it!)

Ladies and gentlemen, without further ado, I present to you:

Tack 0.0, the most minimalist and feature-starved blog posting utility KDE has ever seen. It needs loving, lots of it, and as I'm going to be on an airplane later on today I can't give it the loving it so deserves.

So download it, marvel at its simplicity and lack of functionality, and then hack on it and send me patches so that it stops sucking so much.

I was discussing how addictive Planet GNOME and Planet Debian are on #kde-devel with a few KDE developers and we lamented the lack of a Planet KDE. However, unlike them, I actually decided to get up and do something about it.

Yes. It's ugly. It's also fairly empty. Until Ian fixes up kdedevelopers.org (see how messed up the feeds are?) so that it includes <pubDate> tags so that the blog entries get sorted correctly, we're pretty lonely over here.

The good news is, if you're a KDE developer with a blog on your own site, mail me the URL of your properly-formed RSS feed, tell me what you do in KDE, and I'll add you to the blogroll as soon as possible.

I spent about twenty minutes autotooling the 'nv' driver from the old monolithic X server tree, and convinced it to build under Daniel's Xizzle/Xorg tree.

After a bit more hacking around with the build system (to get it to properly generate the Makefiles in the nv dir, and to get the new NV driver module loaded into the libdrivers.a), it actually worked!

It loads the driver, and it sets the proper resolution, and everything!

Now the only thing missing is composite support. Which is a little out of my league, but I have faith that the guys at Sun working on it (yeah, I'm looking at you, Stu and Deron) will pull it off.

I've had this domain for a while; I personally thought it was cute, and kind of a good tongue-in-cheek joke amongst my friends and myself, but it's about to expire, and so I'm in the process of transferring the domain registry to another registrar. (Rick at dns.vanrein.org is really cool, but I don't have e-gold, and his rates aren't the lowest... so since I'm rather strapped for cash these days, I had to find someone cheaper. Of course, I can't afford to lose any email, either...)

in other news, I've been trying to grok a lot more design knowledge from a few guys with some really good taste. Namely, the Design Fab Five. Good stuff from them, and I like a lot of their ideas. Except for Flash - which I'm not diametrically opposed to, but I just have no use for. So my site really is getting a redesign; I'm not sure exactly what it'll end up looking like, but I'll leave the option for everyone to continue to use this particular design if they really like it. This one is a hybrid of a couple designs I saw on OSWD, plus a few custom modifications that I made myself.

Published Asteroid on looky today. Should be interesting to see what kinds of responses I get to it. I'm sure that nobody will ilsten to my "If you don't like it don't use it and don't bitch" disclaimer, but oh well. Such is life.

In other news, I should be able to hack on my dotNET config page Sometime Soon (TM) so hopefully I can finally get that uploaded into CVS. I know I've promised it before, but honest - it's coming!

And other stuff is on the horizon. I love KDE development. Also, the guys from Sun's Project Looking Glass team kick ass. (I met them at the xdevconf last week.)

Picked up a new toy yesterday, a Logitech USB 200 headset. Hooray for USB audio! I'm amazed at how nice it is. I'm not an audiophile by any means, but this headset is a lot better than I was expecting. And it works great under Linux, as well as OS X. I hear it even works nicely under Windows...

I love this stuff. Had fun trying to get everything to play to the headphones, but it wasn't too difficult. Highly recommended.

I've been looking at a few laptops lately. Apparently the model I've been ogling - the hp nx7010 - is very much similar to the Compaq X1000 (which shouldn't be a surprise to anyone). I have decided that the specs that I want are:

Centrino. Pentium M or bust, I say. (It's the only way I'm likely to get any decent battery life out of a laptop these days.

Wide-screen 8:5 aspect ratio. I suspect that 1280x800 may be too small; 1440x900 seems about right, but I will probably love 1680x1050 as well, but the important thing is that it's wide-screen.

I would really prefer it without an OS but the other two specs have so far made this look extremely unlikely, as the only manufacturers I've seen happen to be stuck with nasty evil agreements with Microsoft. (see previous rant.)

Oh, also. I need at least half a gig of RAM, a 40 gig hard drive, a mobility Radeon would be nice (since it seems like the mobile GeForce chips aren't that prevalent in the Centrino machines...), a DVD/CDRW combo drive, Firewire, and gigabit ethernet.

Yeah, it sounds like what I want is basically a Powerbook, I know. Except that since I'm going to be working at redhat, I get the feeling that an Apple laptop would be sort of ... bad karma.

I called up HP/Compaq, Dell, and IBM today. I can't get a notebook/laptop computer from any one of these manufacturers without paying for a Windows license.

That's right. I can't even get any of these systems blank, sans operating system. I explained to the guys over the phone - and especially the HP rep seemed sympathetic - but the problem is that Microsoft has strongarmed these manufacturers such that they can't ship any laptops without a Microsoft OS.

This is complete and utter bullshit. I'm just going to wipe the hard drive and put Linux on it anyway; I'd rather that the hard drive just came blank, as I don't expect any of the hardware guys to install Linux on it for me.

Ugh. I was hoping that one of these guys might be able to set themselves apart from the rest by satisfying this one wish. Looks like I was wrong.

I wrote a new style from scratch a long time ago called Asteroid. It was done half as a gag, and half because I was bored. I also decided to implement it from scratch (instead of following my usual method of hacking on the dotNET code) so that I could provide a better platform for others to build their styles on. (As an aside, I also took out all of the Asteroid-specific code and put it into a Skeleton style, which is BSD-licensed and available on my site).

However, being that I'm lazy and Asteroid got Good Enough TM for me to use without being too annoyed with it, Asteroid was put on hold at version 0.2. Until today, that is. I got an email from David Chester, with the Munjoy Linux distribution, and he has implemented much more of the widget style code, and submitted his changes back to me. (As an aside, Munjoy looks quite nifty, and I'm going to have to try it out. KDE + Debian = Righteous.)

So, yeah. I started something neat, and somebody else picked it up and ran with it. Open Source code rocks.

I feel like the Russian hacker from Goldeneye. I AM INVINCIBLE! Over the course of one day, managed to wrangle IE into actually rendering my site halfway decently (which it should've done in the first place), and also finally figured out a solution to an annoying problem with Apache and customized header/footer templates for automatic indexing. If that doesn't make sense to you, good.

Other random things of coolness: Xcode has amazingly well-integrated CVS support. Apple kicks ass. Also, Safari kicks ass. I like Apple's implementation of the CSS2 text-shadow property in KHTML. I'm also thinking about redesigning my site once more since I've had the current design up for over a year now, and I'm bored with it. It's a pain in the arse, especially for cross-browser compatibility, and I'm itching to try out a few other look'n'feel combinations. DanielS has suggested that I should try to become a DD. I find this amusing, mostly because of how many discussions I've had with DanielS where I have ranted about how much I hate Debian. Good times.

update: check out the customized output that I struggled for hours to achieve! Marvel at how much less cool it is than it should be!

I hate Internet Explorer. If you happen to be unfortunate enough to be using it, please, consider either upgrading to Firefox or convincing the people in charge over in IT to give it a shot. Firefox actually supports web standards - those neat things that make it possible for people to write all sorts of really neat web pages, without having to resort to evil nasty hacks.

I have no idea what this page looks like under IE5. My closest guess would be that it looks like a plate full of ass, and if it does, then too bad. There are at least a half dozen other web browsers you can use that will render this site properly, and if all else fails you could always upgrade to IE6 since that works for now.

In the future, my "compatibility" with IE is going to consist of hiding things that the browser doesn't understand, instead of trying to get it to work.

I love MacOS X. I don't mince words about it; the UI is gorgeous, simple, to-the-point, and I love it. I love Linux as well, but mainly because it's usually a challenge to get working right. After getting particularly bored the other day, and I thought to myself "You know, self, this iMac works entirely too well." Seven hours later, Gentoo is up and (mostly) running.

Major props out to the guys who wrote parted, the guy who wrote the patches to parted to let it resize HFS+ filesystems without destroying data (if I ever meet you, I owe you a beer), and whoever wrote the driver for reading HFS+ volumes under Linux. All of this stuff makes using Linux on a Mac a much more pleasant experience.

Back in OS X land, though, the guys who I'm the most impressed with are the team behind Colloquy which is hands-down, the single coolest Open Source application I've seen on OS X yet. I've seen a few other apps that I consider to have great user interfaces, but Colloquy is the only Open Source one. These guys are seriously awesome.

I'm on IRC the other day and my pal Daniel asks me if I'd be interested in taking care of a sysadmin task for him on the freedesktop.org box (pdx). I wasn't doing anything so I said "Sure, what is it?" and he tells me he needs a script to:

Copy over the entire CVS tree from the CVSROOT

Check out the latest code from each module in each CVS tree, and package it up

Also, pants

I wrote it. It's neat. Hadn't done any shell scripting in a while, but this was relaxing and it gave me a chance to exercise some of my skills, which is always good.

I went to Boston on Wednesday last week for an interview that I had at a community health center in the city. I got a call the same day from Red Hat asking if I wanted to come in for an interview the next day, so I told them "Of course!"

the interview went great! I had the most fun I've ever had interviewing. I got to meet a bunch of cool guys and I had a blast chatting with them, about all sorts of stuff. they had me show up at 10AM and I was supposed to be done by 3, but they kept me until a little after 4. which hopefully is a good sign, but I don't want to get my hopes _too_ far up.

the hospital was basically a dead end, though. they don't have any positions for the IS department, but they swore that they would call me as soon as they do. they did seem to be pretty impressed though, so I think it went well even if nothing comes of it. it's experience, anyway. which is always good.

so now that I have a local kerberos server, and it hands out tickets like a champ, and life is good, the next (logical) step is to want to have single-sign-on for things like (say) my email.

KDE has a custom ground-up SASL implementation that supports LOGIN, PLAIN, CRAM-MD5 and DIGEST-MD5, but not GSSAPI (which is a layer on top of Kerberos). I took a look at it and decided that I could implement a GSSAPI function for the KDE SASL implementation. I had no idea that it'd be so damned frustrating. why is GSSAPI so complicated, and poorly-designed to boot?

if you think I'm joking, or complaining about nothing - the main function, gss_init_sec_context, takes THIRTEEN parameters. that's a lot of margin-for-error. one would think they might use custom data structures, ones more complicated than the standard struct with a void pointer and an int to indicate the length of the data, but no. of course not.

oh well. when I'm done, KDE will have a GSSAPI implementation, meaning that it should Just Work (TM) with any Kerberized service that uses SASL. Namely, this means IMAP servers and probably a few SMTP servers - having single-sign-on for these services will be great.

so I finished setting up a working LDAP server here at home. with Kerberos, for that single-sign-on goodness. I can see why people dig this. I can also see why people fucking hate it. awesome features, complete and total pain in the ass to set up. honestly, I think I probably would rather have installed openBSD, and that's saying a lot.

got an email from ceebx tonight - this guy rules. not only is Plastik the single most visually attractive style I've used (well, aside from the ones I've written, of course ;) but he sends me suggestions for problems that he comes across.

now, the current suggestion he sent me doesn't seem to be working just yet, but I'm sure I'll get it to. I hate QTabWidgets.

I got an email from a Linux distributor today asking me if I would mind going into some detail on my widget style experience. Hopefully my reply will make a good impression, since I've done a pretty decent amount of work in this field; I think it'd rock if I were hired as a consultant or contracted out to for development work.

Life can be funny. I never expected that my after-school hobby might eventually open up so many doors for me. It's not quite the same as being a rock star, but life could definitely be much worse.

So I got a 200G hard drive today. My dad decided to buy it for me as payment for all of the work I've been doing trying to get his printer working exactly the way he wants it.

Mmmmm. New hardware. I've completed the move of my /home over to the new drive, and now it's just a matter of wiping the 20G drive with my operating systems on it and using the 40G drive that previously held /home as my new OS drive. (I can fit more operating systems in 40G than I can in 20G! WOOOHOOO!)

Also, having the laser printer connected to the Mac works seamlessly with KDE over the network. I just pointed a KDE app at the Mac's IP, and it automatically grokked the print queue and even showed me both printers that have been connected to the Mac - nifty stuff. I love open source software.

(still have to make progress on some sort of a KDE-pyblosxom client. moving that to the top of the TODO, once I'm done screwing with the hard drives.)

so pyblosxom is neat software. I like the whole filesystem-to-blog mapping.

I really should have gone to sleep a long time ago. I'll need to talk to DanielS about nifty things like blogging via email (which it sounds like he has working with his, and that's just neat) and I'll probably get working on a KDE blogging client too.