gtkdoc for trac, FINALLY!

This has been on my todo list forever, and I started tinkering with it the other day. But after a mega hackathon tonight, I have a pretty functional gtkdoc plugin from trac.

The idea of the plugin is to integrate gtkdoc books into trac's interface. This is accomplished, currently, by and iframe displaying the actual htlm output of gtkdoc, as well as integrating into the search engine in trac.

There's two new user permissions in this plugin, GTKDOC_VIEW and GTKDOC_ADMIN. GTKDOC_VIEW is obviously to view the api and well as search it, where admin allows the addition and removal of books.

As mentioned above the admin interface provides an interface for adding and removing books. Books are keyed on a name given to them at the time they're added, as well as an absolute path on the local filesystem of where the book actually is. This way, you can update the documentation and not have to touch a thing in trac.

At any rate, it's still pretty rough around the edges and lacking a ton of error checking. But feel free to grab it from our extras repo (hg clone and tinker with it. It's in trac/gtkdoc, use the normal "python bdist_egg" to build it.

green eggs and spam

so it looks like this blog got spammed to hell today. Not certain since some of the posts actually look real, but whatever... If I've killed your comment as spam incorrectly, my bad...

Anyways, will be back up and functioning correctly SOON, I don't know exactly when myself ;)

gplate 0.0.2 has been released

GPlate is a template engine written in C using glib and the GObject system.

It was started due to the inability to find a template engine that was GPL
compatible and callable from C. Since these requirements couldn't be met, I
(Gary Kramlich), decided to write my own that was easier to use in applications
that are already using glib.

The idea behind gplate is to be extendable by the applications using it so that
it can fit whatever you needs may arise.

Changes in version 0.0.2
* Fixed the bug where a default tag that didn't start with a word rendered
an empty string
* Added a working directory property to GPlateTemplate that is currently
only used for GPlateIncludeFunction. This allows includes to work
correctly without needing to hard code the path in the including template.
* Changed the GPlateIterator->next to return a GPlateVariable rather than
a char *.
* Added GPlateFileVariable that exports the results of stat(filename) as a
* Added GPlateDirectoryVariable that is a collection of GPlateFileVariables.

Downloads can be found at

Dear Anonymous

So I imported my development blog into Something I've been meaning to do for awhile, but just kept forgetting to do. This blog has been syndicated on for years now, way back when Christian first started it.

Anyways, planet decided it was going to import three of my posts. No big deal right...

Tell that to the "spam victims", one of the posts, sure wasn't really development related, I can somewhat understand that. The other was me annoucing the release of a new project, *I*, a *pidgin developer*, had written. Both of which we're met by "stop spamming planet pidgin". Which I found completely ironic since these posts and more have, as I mentioned earlier, been syndicated on for quite awhile now.

Still, I find it exceedling hilarous what people consider "spam" these days. Apparently a developer's blog, where he blogs about things he's developing and sometimes non-development things to try and get and see responses from a wider audience, isn't filtered down enough. The whole thing reminds me a lot about the on going complaints of pidgin launchpad on our support mailing list as being spam amoung others.

The point I'm trying to get at here, is that when you sign up for a mailing list or read an aggrated feed, that unless you're an admin, you can *NOT* control what gets posted. Ironically, when you complain verbally about supposed spam, all you do is create more "spam".

This spam, that the verbal crowd then creates, of course fills things like our support mailing list with junk that really isn't support related, and thus offtopic making it harder for those looking for a solution in the archives, and last but not least makes us, the developers/admin look insensitive, when if the verbal people just ignored the "spam" in the first place we'd all be better off.

mtn usage...

It's been brought up by certain people, that they "know" how pidgin developers use monotone, and that monotone is an inferrior tool. Thus I decided to take the time to document how *I* use monotone. Keep in mind, I use monotone for everything nowadays. The only time I use a different (D)VCS is when I'm working on a project that I didn't start.

At any rate, I'd be extremely curious to see the usage/flow of the same actions (working on an existing branch, branching a branch, starting a new project/branch, working on a new (to you) project/branch, merging branches, and serving a new project/branch) in other (D)VCS's as well.

Below is the fruit for said labor (click it for the full sized version, it's about 400KB though...). The digrams were created with dot from the graphviz package. The source of the diagrams can be found over here.

the graph

the key


This is a long drawn out post about my experience with trying to get things you really want for the WII. If the WII or the lack of ability of the WII and it's games don't interest you, I suggest you skip this post :) I'm posting this mostly as just a record of the absurtity that Nintendo lack of supply presents to the general consumer.

So back in Feburary, I won a WII on ebay. Paid a bit more for it (about 350 USD after shipping), mainly because I was tired of calling around and looking for one.

Now fast forward two months and Mario Kart WII is released. I've always been a big Mario Kart fan, since the SNES, and I've owned every version, including Double Dash which I just happened to finally buy. So anyways, I see it in stores, and go "meh, I'll grab it later".

Fast forward four more months and I can't find Mario Kart WII anywhere. Calling stores like made, watching ebay, watching craigs list, etc.

Sunday night, I place a bid on a new copy on ebay. At the same time, I search through craigs list and find a used copy. I end up winning the copy on ebay (for way more than it's worth, especially since it had a tricky title and descripion). I tell the guy on craigs list I'm going with the one on ebay since I have to. Also the one on craigs list is used.

I then decide I should go and pick up some of the necessities, two more wiimotes and four wii wheels. I end up hitting target since bestbuy is already closed. Target doesn't have any of the official wii wheels, but they do have the wiimotes. Score. I return home with half the job done and decide to persue the rest on monday on my way home from work.

So here's where the real fun begins...

grim's quest for four wii wheels

So I leave from work (A) at about 4:00PM.

I head to the nearest bestbuy (B). What do you know, they have Mario Kart WII. I say screw it, I've been trying like hell to find this, I found it, I'm getting it. The one I have coming from ebay with either go back up on ebay or be a present to my niece. Unfortunately, this bestbuy doesn't have any official wii wheels.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 1 WII Wheel.

Theres a Game Stop close (C), so I head there. Guess what, no official WII Wheels. An employee (who is/was by far the most helpful Game Stop employee I've ever dealt with), offers to call a nearby EB Games and see if they have any. They have one, they're going to hold it. Awesome.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 1 WII Wheel.

So I head to EB Games (D). Pick up the WII Wheel. Score.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 2 WII Wheels.

Since I'm right by a mall which has another Game Stop (E), I decide to head there. They as well, have one WII Wheel. Grab it.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 3 WII Wheels.

I decide that I can't go home when all I need is one more WII Wheel, so I head to the next closest Best Buy (F). What do you know, they're useless and don't have any.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 3 WII Wheels.

Since I'm right by another mall which has another Game Stop (G), I decided to head there. Get inside, find the WII accessories, shit they have three on the damn shelf. It's a locking hook, so I ask the guy at the counter for one, and he sends another guy to get one out of the back. So I get my fourth WII Wheel and head home.

Current progress: 1 copy of Mario Kart WII, 4 wiimotes, 4 WII Wheels.

I finally get home around 6:00PM. Tear everything open and finally get to enjoy the damn game.

So what have we learned here? For some reason, Nintendo seems to have a *VERY* difficult time meeting demand. For the consoles I can understand, something can go wrong in production of a chip, pcb, etc. But a game disc?! Come on, it's freaking pressed, they should be chruning the games out. I mean the wheel could take some time to produce, but think about it, it's plastic that is created from a mold...

Anyways, long story short, back order WII stuff online and be patient, or waste time (about 2 hours), gas (about a gallon or so, gotta love good gas milleage), and extra money (I still have a over paid copy coming from ebay) by being impatient.

GPlate 0.0.1 is^H^Hwas released!

So on March 1st, I released the first version of GPlate.

GPlate is a template engine written in C, using GObjects. You can find out more info on the above link!

Of course, there hasn't been any activity since due to the lack of me making a public announcement until now ;)

Anyways, if you have a use, feel free to let me know, the code is far from completely, but does have some pretty good basic functionality right now.

check; check minus; check plus;

I've been using check for unit testing in just about everything lately, and I've been spending a lot of time working on a little side project named GPlate (more on this at a later date).

During the development of GPlate I've change the API quite a few times and broken it horribly in the process. Fortunately, check has been there to help me find the issues. Unfortunately, the output from check tends to be a very cluttered terminal.

To combat the clutter, I threw together a style sheet to transform the xml output of check to something a bit more eye pleasing.

The style sheet is released under the GPL and the icons are stock GTK+ icons which are also GPL. Anyways, a bz2 ball of the stylesheet and the images can be found here.

The style sheet accepts a few parameters. Namely project, arch, and version. Which are the project name, the architecture that it was tested on, and the version of the project.

I've been transforming with the following:

xsltproc --nonet --stringparam project GPlate --stringparam arch `uname -m` --stringparam version 0.0.1mtn -o results.html check.xsl gplate-tests.xml

You can of course dump this in a Makefile rule too, and let it fill everthing in :)

Feel free to hit me up with any questions or comments.

quick monotone hack

I've been plagued by having multiple keys in monotone and doing a merge without specifying one. Well those days are over, drop this in ~/.monotone/monotonerc and edit accordingly:

function get_branch_key (branch)
d = { ["im.pidgin"]="",

for k, v in pairs(d) do
if (k == branch) then
return v

I'll probably extend this at some point to check my keystore, and do the maintenance for me, but this works for now ;)

awesomes maximus

If a picture is worth a thousand words, does that mean that a movie is 1000 * FrameRate * Duration?

While you're pondering that, take a gander at this.

It doesn't look like much, but theres a lot going on in the backend. I start by running guifications-daemon. Then I go on to launch guifications-gtk and open up the feeds window. Finally I start pidgin with a profile directory that loads purple-guifications by default.

What you see, is that the feed is automagically added to the gf-gtk feeds window. Now most of you will go, big deal, you're just using a D-Bus signal. And to that end, you're partially right.

In guifications3 communication is abstracted and everything must interact at a gobject level. What does this mean? The server and cients can't touch dbus directly.

So what you are really seeing is purple-guifications talking to gfd via a remote object (which just happens to be connected through D-Bus). The object in the gfd then emits a glib signal saying that a feed was added. Then there is a proxy object inside of gflib-dbus that is connected to the feed-added signal, and transmits it over D-Bus as a D-Bus signal. Then theres a proxy on the client side that listens for the D-Bus signal, and re-emits it as a glib signal.

Needless to say, this movie is worth a lot more than 1000 words, since it is, in fact, a major breakthrough for one of the outstanding issues I've been having with guifications3.