Archive for the 'Programming' Category

20
Apr
09

TBBle Scarry’s Busy, Busy Weekend

Often my weekends start out with grandiose plans of what I might try and get done.

This weekend (and the preceding evenings I guess) saw me produce a Wine patch I was only playing with out of interest but which turns out to affect Warhammer Online, although I didn’t know it until after I implemented the patch, and a WIne patch I’ve been meaning to prototype for a while using XInput 2 to fix a long-standing Wine bug which also affects Warhammer Online.

I also got back to watching Life On Mars, although I’ve only managed one episode and a bit. It’s pretty damned good.

I also decided to make gyoza, as I have fond, alcohol-supported memories of the last time I made them.

I managed to lazy my cooking even more than usual. I’m using a recipe I picked up last time I made them off a site called The Food Palate by Deborah Rodrigo, whom Google has since informed me is from Sydney but both that site and her personal blog appear to have fallen off the Internet, sadly. However, I distilled (with the help of Kirky at work) the ingredients down to this:

Ginger, chives, chili flakes, coriander, garlic, sesame seed oil, soy sauce for dumplings, and gyoza skins

Ginger, chives, chili flakes, coriander, garlic, sesame seed oil, soy sauce for dumplings, and gyoza skins

Adding half a kilo of lean pork mince, and about a half-hour, you get:

30 gyoza, freezer-bound

So not as bad as the ugly cake I made recently, but still not spectacular. And unlike the cake, I don’t yet know if these turn out to be poison or not.

I expect that they’ll be delicious, and not even slightly poisonous. And unlike my cake, I’m not going to try to share them with anyone. ^_^

It could be worse, at least I seem to have not managed to poison my housemate’s lizards, Prime and Grimlock, whom I’ve been feeding while he’s away this weekend. I’m not sure how I could get “put grasshoppers into the box” wrong, but I don’t think I did. I think they’re pretty neat names for lizards, reflecting Mick’s inner geek, and his outer geek, although Prime seems to be larger than Grimlock which is to the best of my knowledge the wrong way ’round.

I was going to try and leverage in a rant about characters in children’s books with alliterative names at this point, and observe that one of my favorite authors as a young child, Richard Scarry happened to avoid that, but upon actually looking him up, I realise the characters whose names I’d forgotten quite often had alliterative names. The characters I remembered still had non-alliterative names, so it’s not as bad as some authors I can’t be bothered remembering, but I’ll chalk that one up as being disappointed by a childhood memory.

A less disappointing childhood memory turns out to be Piers Anthony‘s Incarnations of Immortality series. I read the series when I was quite young, and I’m only re-reading the first one at the moment, but it reminds me how good a writer he is, and why I loved his books so much as a child. Also because he’s alphabetically early on the shelves. I don’t know why I seem to do that. I think when I’m picking a new series, I start at the beginning and go until I’ve chosen one. So that favours the alphabetically early.

I’ve managed to get a whole bunch of reading done recently, which is good. Sadly, Borders now wants me to pay $7 on a $14 book to order it in from overseas, and it turns out most of the series I’m following keenly enough to actually order books are on that list, so I may end up having to do an Amazon order. Which is annoying, because I’m also looking for some DS games: Ace Attorney: Trials and Tribulations appears to be discontinued in Australia and the US, and Impossible Mission never seems to have been released here at all. Along with wanting Race on DVD, I have a fair bit of overseas shopping to do, and the local financial climate is not exactly conducive to that. -_-

Anyway, the above is my documentation supporting why I should not be left alone for days at a time. ^_^

Edit: Fix images after changing hosting.

21
Mar
09

GLUTton for wxPynishment

A followup to last year’s foray into Python and OpenGL.

I noticed today that wxPython includes a GLCanvas class which uses PyOpenGL. However, as of 2.8.9.2, wxPython’s demo crashes due to wxWidgets bug 10203 which is fixed in 2.8 wxWidgets post 2.8.9, and in 2.10.

Until a wxPython release comes out based on either of those, there is a workaround. The script update_manifest.py, which wxPython includes to change the manifest in your python.exe and pythonw.exe to use the Windows XP comctl32.dll, also fixes this problem, so even though I’ve been aware of this bug for ages, I’ve only learned about this workaround tonight by reading the wxpython mailing list archive.

Now that I’ve got that patched, and PyOpenGL installed, the GLCanvas demo in wxPython runs, and the cube demo works. The cone demo however comes back with this:

OpenGL.error.NullFunctionError: Attempt to call an undefined function __glutInitWithExit, check for bool(__glutInitWithExit) before calling

This turns out to not be a surprise, as I don’t have GLUT (glut32.dll) installed. Sadly, the wxPython demo code doesn’t test the result of the OpenGL.GLUT.glutInit method in PyOpenGL, so this exception is simply output without causing the cone window to abort.

Since the draw code for the cone calls glPushMatrix before any of its glut calls, and the glut calls throw an exception so you never call glPopMatrix, you end up filling your matrix stack, and getting a lot of error spam in your output window, where the later errors can easily push the older errors out the top of your scrollback buffer.

I turned out to be too lazy to build my own glut (it’s anecdotaly possible) but a lucky hit with Google informed me that Nvidia’s Cg Toolkit includes both a win32 and x64 version of glut32.dll. You wouldn’t be able to distribute it as there’s no license indication for glut apart from the license for the whole Cg Toolkit. The glut.h file included however is the one from normal Glut (or so it appears) so I doubt it’s anything except the win32 version of upstream glut.

On this point, it’s not obvious to me if freeglut is supposed to be a drop-in replacement for glut32.dll, or a souped-up alternative. It doesn’t help that the freeglut configure file includes an option to switch that mode on or off (producing libglut.so or libfreeglut.so) while the .mak file (for NMake) only produces freeglut.dll not glut32.dll. So I guess it’s intended to be both. The next step would be to see if freeglut can build from configure using mingw64 and produce a drop-in glut32.dll.

However, I don’t care that much. I only wanted to see the wxPython GLCanvas demo run. I won’t be using GLUT (or event GLCanvas, to be honest) myself so this has had plenty of time devoted to it anway.

I guess I hope that the main benefit of this blog posting is to allow those very occasional forum posters who go looking for glut32.dll for Vista x64 or XP x64, or even Vista 32-bit, to find it in the NVidia Cg Toolkit. So far I’ve seen several such questions when searching Google for a copy myself, but no one ever finds one for 64-bit. (There’s a 32-bit one in the bullet physics SVN repository, if you don’t want NVidia’s one.)

And for those same forum posters, a quick note. The x64 build of glut32.dll goes in %WINDIR%\system32 on x64 machines. The win32 build of glut32.dll goes in %WINDIR%\SysWOW64. If you get this wrong, you’ll get the same error messages as not having the file present at all. It’s prolly both easier and a better idea to actually drop the glut32.dll next to the program you’re running, unless you have both 32-bit and x64 versions in the same directory for some reason…

04
Oct
08

Grinding code in Warhammer Online

My original plan was to only use the Windows XP 64 installed on my laptop for video games (and then only when necessary due to a Wine disfeature) and Linux for everything else. My World Of Warcraft days actually worked quite well for this, as it played very nicely under Wine. However, as interesting things (ala my previous blog post) sometimes crop up while I’m in Windows, and also as I’m now playing games that aren’t so nice under Linux, I’ve ended up being in Windows more than Linux. And now I’ve found myself distracted from games playing by, of all things, MMO UI Addon programming, keeping me in Windows even more.

You’d think with my strong awareness of the commercial nature of grind, I’d prolly be trying to get all the playtime I can out of my monthly subscription to Warhammer Online. Instead, I seem to be burrowing my head down into some UI programming in Lua. Like WoW, WAR (or WHO as a friend of mine calls it) uses LUA to implement its user interface and provides a way of adding modules in to modify, adjust or just plain futz with the interface. The big site for WAR addons (like WoW addons, in fact) is Curse Gaming and they even provide a Sourceforge-like site for addon development called CurseForge.

Anyway, why am I doing this, given I managed to avoid WoW addon programming for my entire playing time? Apart from external reasons I’m not going to post here, WAR being brand new is missing a fair few addons. None I can’t live without, but one it does lack is DrDamage, which enhances your ability tooltips with the actual effective values of the ability once gear and stats are taken into account.

Part of the issue is that WAR’s combat calculations are not fully understood yet. An excellent primer is available at Disquette’s Weblog and Warhammer Alliance has a Mechanic Analysis forum as well. I’ve posted some comments at the former, but the latter requires you to be a “WAR Soldier” before you can post, and I seem to still be a “WAR Recruit”, which means I haven’t contributed enough to the Warhammer Alliance forums. Ah well.

So anyway, my addon. LibCombatCalcs is my first MMO addon, basically supposed to encapsulate the various combat number mechanics of WAR so that I or someone else can write tools like DrDamage (or RatingsBuster) which magically continue working when they change the mechanics, and which don’t need large hard-coded tables of information duplicated across each addon.

It also intends to tie together the seperate sources of combat information into a single coherent stream for other addons to listen to.

Anyway, we’re not there yet. What it does do right now is record hits against monsters, and give you a little window with /lcc mobinfo which shows the calculated toughness of the monster (from an unambigous non critical autoattack) and the calculated values for all the subsequent abilities you used, letting you see if my calculations (and therefore my transcriptions of the community’s understanding) are correct, and/or where things need tweaks. I’ll be using this (and I hope others do too, I don’t want to build a level 40 of each class to do this…) to identify the sources of DPS that contribute to each ability.

Anyway, there it is. I’d love to hear feedback about it, preferably at Curse/CurseForge but here is fine too if you hate those sort of sites. You can clone the git repo from CurseForge, and it currently autopackages every commit I push so you can also grab and install the zips.

By the by, this is my first time using mysgit although I did contribute some work to a different msys git effort, and it combined with Console and an updated Vim with some nice colour schemes (I’m using xterm16 at home and work now) makes me a much happier Windows programmer on my laptop.

On other fronts, I’ve recently been playing with Python-Ogre, hoping to knock out a 3D physics-based tech demo of some kind with it in the middle-term future. (May end up being a Christmas break project…). After my disappointments with 64-bit Python and Pyglet under Windows, I may end up doing it under Linux. Ideally it’s cross-platform of course. I’ve also done some more serious work on my book cataloging software using Elixir, SQLAlchemy and SQLite to turn my collection of text files into a real database. However, there’s not a particularly good way of dealing with schema changes that I can wrap my head around, so I’ve put that on hold while I think about how the data’s going to have to look in the long run. And then I got distracted, so it’s on the Christmas break pile too.

24
Jan
08

Things that happen when my brain gets full

I recently was linked to CCG Workshop which is a site where you can play collectable card games (CCGs) online. It’s interesting because they have this gatlingEngine software, which apparently runs the game for you using a set of rules in a gatlingML file.

I thought this would be a wonderful chance to document the rules for the Love Hina CCG, which I never finished translating as you can see, but the gatlingDevKit and all the developer documentation requires that you sign an NDA and suchlike.

Discussions on the forum (the developers talk openly on the public forum, so I have an idea what’s not under NDA ^_^) indicated the gatlingML files were XML, but when I got one while trying to play a game, it was quite clearly binary.

The first four bytes are !HZL which I thought looked really familiar, but it took a fair while before I clicked that that was “LZH!” backwards, LZH being the compression algorithm used in the LHA family of archivers. Of course, research indicated that none of the LHA family of archivers actually wrote a file with !HZL at the front.

Poking about some more, I noticed that the gatlingEngine is written in Delphi (and is legacy code anyway) and went looking for Delphi compression libraries. Thankfully, the vast majority do PKZIP-compatible compression, and the first one I tried that supported LZH compression was Tlzrw1. (Apologies for the quality of the link, the 1998 link in the read file is dead, and the Wayback machine record for it indicates that the author’s page didn’t mention the library anyway) So I note that the library in question attributes its LZH code to LZHUF.C which Google duly turns up for me. I change the code a bit to stop assuming a 16-bit word, handle the header at the front, and suddenly I have a utility which can encode and decode files compressed with the LZH mode of Tlzrw1. (Which has been ported to C# and Delphi.NET, Google tells me.)

Now of course someone needs the interest, gumption and skills needed to produce an open-source program that can process gatlingML files and run games from them. ^_^

Oh, and a cool thing: progress bar for cp, courtesy of Chris Lamb via Planet Debian.

Edit: Missing quote put a whole whack of text inside an <a>-tag.

16
Jan
07

Things to do in Sydney while the wireless is dead

Well, now that I’m back on the ‘net fairly reliably, I can post on what I’ve been doing for the past few days.

Firstly, I was off the Internet because I was flat-out busy on Saturday, in transit on Sunday, and wireless did not arrive at International House until about 11pm Monday night. That time I did spend on the ‘net today, at the conference, was spent in a combination of processing CBIT emails since Friday, and wrestling with my wireless network card.

My local build of the d80211 version of the bcm43xx driver got signal, would even get traffic through, but when it tried to reassociate to a different AP (all the APs here are running on channel 11… Although I was sitting next to someone who saw one on channel 1, which I’m guessing was rouge… I also saw some IBSS networks on the same SSID….) it would corrupt something nasty, kick the screen brightness up to full and oops with slab errors in short order.

The 2.6.18 (2.6.18-3-powerpc Debian build) bcm43xx softmac driver didn’t crash or anything, but generally performed worse, and when the Debian miniconf’s theatre (Mathews A) was full, my connection suffered or would completely fail to dhcp. >_<

On the plus side, the presentations were great. AJ gave us a rundown of debian-devel (ie 12 months of flamewars) and other significant Debian going-ons. Keith Packard produced a whole bunch of neat X things slated for X.org 7.3 (input hotplugging, dynamic output selection and modesetting, which is exactly what I need to get the projectors I keep plugging into to work better than 640×480…). Russell Coker talked about the various security gaps still remaining in Linux.

In non-conference goings on, I was talking to someone on IRC who’s gotten Second Life Viewer building under Linux/PowerPC (a previously unsupported platform) and I’m going to see if we can get a .deb built. I’ve already created an ELFIO package, and have the OpenJPEG source to try packaging tomorrow. I’ve also sent off an email to the person who ITP’d secondlife-client for Debian already, to see if he wants to co-operate, or if I’m just tooling about.

Speaking of tooling about, I decided it’d be a good idea to upgrade my bcm43xx-d80211 build to something more recent than mid December, but it seems the 2.6.20 workqueue changes mean I can’t compile it against 2.6.19 anymore. The rt2x00 d80211 stack has backwards compatibility macros for the workqueue stuff, but I don’t really feel like hacking those into bcm43xx, it’s already a large and unsteady beast.

BTW, cogito’s update could handle resuming better. Although it happily detected it was resuming a failed update, it had to keep refetching the packs. I eventually realised it would eventually time-out a fetch if I didn’t ^c it and happily try again, presuming I had in the meantime walked outside or reloaded the driver.

Anyway, so I’ve decided tonight (while I was still off the wireless) that I’d finally bite the bullet and build myself a custom dscape.git kernel, to see if the pain I keep suffering from the bcm43xx-d80211 driver is just my cheap-ass backport. That was still building when the wireless came up, and then barfed because KConfig happily let me include both the PCI and SoC versions of the OHCI USB host driver, which provide the same symbols. I must remember to file a bug report about that, or at least check linus’s git tree in case it’s already fixed. (Both drivers recommended yes, but are patently incompatible as they require different endianness of the host interface). I’ve restarted the make-kpkg, hopefully that’ll build overnight and I can try it in the morning.

I also put some time into my Remembering the Kanji book. I was going to do an hour, but after about a half-hour (with a break to configure and fire the kernel build off) I was yawning, and figured I’d prolly left the imaginative-memory zone. I was going to watch some Gokusen but thought I’d take a last wander over to the IH whiteboard to see if the wireless was up. Bizarrely, it was.

So I wandered onto the ‘net, checked email, volunteered myself to package Thousand Parsec for Debian, added the Kanji I studied to Reviewing the Kanji (a web site for reviewing the stuff you learn in Remembering the Kanji) and updated my blog.

Which funnily enough, is where we came in

ごくせん Vol.1ごくせん Vol.2ごくせん Vol.3

12
Jan
07

Pledges of allegience to free software…

In good news, the pledge drive to raise $10 000 towards a reverse-engineered NVidia DRI-3D-accelerated driver has succeeded. Dave Nielsen, the instigator of the pledge, gave a canned history of the pledge drive on his blog, and handily demonstrated that the free software community are willing to put a little bit of extra cash towards a little bit of extra freedom.

In bad news, the Ryzom.org bid to purchase “The Saga Of Ryzom” from failed developer Nevrax has failed. They were outbid by Gameforge AG. A ray of sunshine is that the project looks like it will continue, and there has already been the suggestion that they instead consider Asheron’s Call 2 which closed in 2005 but was apparently quite good.

Co-incidentally, I was in one of the beta tests for Asheron’s Call (I don’t remember if it was 1 or 2), and today beta-testing applications opened for Tabula Rasa. I don’t remember signing up for the mailing list, but I do have a PlayNC account through having purchased Guild Wars, a model I still hold up as being an excellent way to structure a MMOG’s income, at least from a payer point of view. Of course, my job here at Micro Forté is as a programmer, not game producer, so my views aren’t exactly changing the world… but give it time. ^_^

Speaking of Micro Forté, the Gaming Miniconf at LCA2007 is having Paul Murphy from <a href='http://www.bigworldtech.com/index/index_en.php'BigWorld Tech (MF’s MMOG technology development subsidiary, based in Sydney) as a guest speaker. I’ll prolly have to sneak out of the Debian Miniconf to see that.

Poop. Paul Murphy’s talk clashes directly with Anthony Town’s “State of The Project” address. So there you go, first session of LCA2007 (barring keynotes, which don’t conflict…) and I’ve got a scheduling conflict. >_< Maybe this year the recording will all work…

Edit: Someone floated the open-source Asheron’s Call 2 idea the day it closed…

12
Jan
07

LCA 2007 Ho!

Well, it’s nearly LCA time again. This is just a quick post mainly to see if my syndication at Planet Linux.conf.au 2007 is working yet.

I’ve been working at MF (Milestones just seem to come at you faster than the calender would otherwise suggest) and particularly in the last couple of weeks getting a good vector-math workout.

I’ve also been working at picking off RC bugs to try and help Etch along a bit, since kind of hoped to be upgrading to it in the half of January that’s just passed.

I’ve also been looking for a CMS for the ANU Anime Society to try and resolve the fact that our web admins never seem to last as long as we’d like. At the moment, Joomla! is top of my list for trialling, as I’m familiar with PHP and looks to have the relevant modules (forum, calendar, eventing system that’ll need modification to work for screening scheduling). However, I’m open to other suggestions, and will see if anyone at LCA has any useful suggestions.

And of course, by adding Planet LCA 2007, I’ve had to read it. And I came across ThreatNet, which is a distributed compromised computer identification system. It’s actually really simple, you do something to identify a certain IP as a threat (the sample code scans postfix logs for “REJECT: noqueue” which usually comes from “no such user” although I noticed it also comes from greylister at CBIT) and sends that IP address to a nominated IRC channel. I dunno what’s next, actually. Presumably, sites can block that IP address as they see fit, and if the responsible parties for the machine become aware of it, they can take action. I’ll be adding this to my ever-growing list of things I need to consider implementation of at CBIT.

On the plus side, I recently installed Debian on a Slug with a 512MB USB flash stick, and I’m going to see how Nagios performs on it. If it’s up to scratch, I’ll prolly shoehorn in a wireless card and see if I can monitor two disparate networks effectively.