Bye bye work week!

Finally finished with a nutty schedule, this week is a bit more free, although I’m still working on the weekends. Things have been erratic lately, I’m not sure if that’s a good thing or a bad thing. Honestly, I like it when things are shaken up a bit, although routine does help with planning events around working hours!

My dreams have been a rather nasty torrent lately, mixing interesting possibilities with programming, and more moribund territory. On the first, I’ll skip journaling, to the second, it’s mostly revolving around C and OpenGL, I’m even dreaming of coding these days o/, and as to the third, somethings are too grisly to be worth recollection.

I’ve managed to get everything done today, and still find about an hour or so to take a much needed ‘break’, haven’t had one of those in a coon’s age. For now, I’ll probably take in a quick game of Quake or some Raven Shield. Later tonight, I need to mull over some more of the OpenGL issues and such. Oy, scratch that, dinners on the roll. It seems, one thing that never does end, is my ability to think 8=).

All in all, I’m looking foreward to Monday—I’m off work :-D.

*sigh*

There’s nothing todo, other then pass time and work across open projects :-/. Normally I would be working today, but the snow and ice has pushed into into Saturday, which is probably good fortunate since I’m scheduled for working most of the weekend anyway o/.

I’ve all but been going stir crazy for the last couple of days, although on the productive side, I’ve had some time to study OpenGL in greater depth. Ahh, joy. Can’t even blog in peace…  hours go by through interruptions.

QOTD and a personal favorite

After stress-testing my last post on a fellow [SAS] member, he asked me if I always thought like a program, or did I used to think like a human. To which I immediately thought of a remark for first Corinthians, and adapted it to suit.

“When I was a human I spoke as a human, I understood as a human, I thought as a human; but when I became a program I put away humanish thing.”

I really don’t like to quote myself, even if it’s a rip off of something St. Paul is credited with, but I really liked that target of opportunity, lol. It was just tooo good to miss!

How he does it – Trees!

Yesterday, I was explaining to a less experienced player how I so easily knew where the hostages he missed where located, after the young Element Leader exclaimed that he was always missing hostages rather then suspects 8=). For those that don’t play with me a lot, I am that annoying-guy in the element, who can usually tell the Element Leader what rooms were cleared, which were missed, and so on. In fact, during one live op, I ended up guiding a younger EL around the huge map.

The way I accomplish this feat of meticulous memory, is to keep track of it in my brains equivalent of a data tree. By remembering where I am in the mental tree (I have an excellent sense of direction), I know what the neighbouring nodes are in the tree—and if I forget what is after those, by the time I reach the spot-after, I can compare what I see with a ‘snap shot’ stored in my head, to trigger my brain into remembering where we’ve been before. If we’ve never been there, then obviously, I append it, or if it is an unexplored door, mark it as such mentally.

 I’ve been thinking of putting up a diagram of it for some time now, so here goes, lol.

This is a diagram of a fairly simple building, it contains a starting room (1), a large room (2) with a hostage and two terrorists: three doors connecting to two other rooms (3 and 4), containing terrorists and a hostage. Those rooms (3 and 4) connect to a final room (7) by way of hallways (5 and 6, respectively), and contains a hostage.

It is a very simple diagram, so I doubt anyone will have problems understanding that, because if you do, there is a problem with your map reading skills ^_^.

The way I navigate in side a building like that depicted in the above diagram, is storing each element as a “Leaf” or node in a tree, itself being a tree in my minds eye. Each node is a reference in my brain, telling me what door( node)s connect it to other rooms, and what was found in it (in this case, hostages and terrorists). Those in turn, point to other nodes or leaves of the tree, creating an organised pattern, shown below:

Here you can see the nodes are again labelled, matching to their “Room number” from above. I don’t mentally record room numbers, rather room names, but for sake of examples, I find numbers simpler to explain.

The first node (1) references a single child node (2), which as you can see, contains two terrorists and hostage, and references three door( node)s leading to the adjoining rooms—exactly as in the floor plan I drew earlier. To make it more obvious, I wrote X->Y on the nodes representing the doors, denoting where they lead to. The door( node) 2->4 takes you into room 4, from room 2. Just like in the floor plan, room four contains a terrorist and a door to a hallway (6), The two door nodes, 2->3, lead into room 3 from 2, where room 3 contains two terrorists and a hostage, again exactly in the floor plan diagrammed previously. The hallway( node)s (5 and 6) connect rooms 3 and 4 to room 7 (respectively), and room 7 contains a hostage.

This is actually a simplification of how my mind works, a since my mind notes doors, hostages, terrorists, downed team mates, objectives, important events, etc, as the children of a tree leaf, and the doors reference the next leaves. That however, is only of importance to another programmer :-o.

Since my head keeps a running track of where I am, and I know easily if I started in room 1, walked into the next room (2), and took the single door into another room, that I must be in room 4, and the door ahead leads to the hallway (6) connecting with room 7. The data tree (i.e. second diagram), is mental abstraction, showing (very roughly) how my mind views the relationships between elements of a map (e.g. the first diagram). So in essence, navigating inside a building, is a simple matter of scanning the tree in memory, and vola, I know exactly how to get to X from Y, lol.

This is how I navigate in doors, and it works damn well, certainly works better then asking a terrorist for directions! Because my working conditions place me inside buildings quite a lot, it has been necessary for my senses of navigation and deductive reasoning to adapt accordingly. I almost never get lost, just don’t ask where you left the swiffer duster. Even navigating outside, my roads-view isn’t street sign or land mark based, but closer to watching a overhead view on a HUD map from some video game…. I blame it on so many years behind a controller.

Lacking the knowledge of how the human mind operates, I’ve always found it easier to explain things in relation to a how a computer does its stuff…. because honestly, my mind functions eerily similar to a computer as it is… but hey, I am a computer geek!

The last couple of days have only been marginally productive :-(. The infrastructure for Stargellas console is virtually complete, except for the prerequisite renderer code. Soon it’s time to move on with the usual loop, progressing to [SAS] related projects, then cycling to EPI, and back again to my usual loops.

My dreams have been someone erratic lately, but so far, have remained quite consistently the opposite of whatever I’m thinking about when I drift off to sleep. I’m not sure if that’s a good thing or not. It seems no matter what, it’s virtually impossible to sleep without thinking, short of working myself to exhaustion. While maintaining a deep holmesian focus seems to be great for pushing everything out of mind, keeping that up for more then a few weeks is staggering :-/.

One good thing to come of today in particular, was scoring a 95% on the driver’s practice exams on the relevant state website. I can’t help but wonder, if some of the multiple-choice answers were intended for evaluating brain damage, but hey, maybe I’ll pass it. I’ve also found out that out here at least, being in my current age group, I could forgo the learners permit and skip straight to an exam for a full driver’s license, but rather would prefer the proper chance for learners-time. Although, I still expect family to fsck me in the end o/.

A fairly full work week is starting off tomorrow (the one luxury of being off Mondays, is work begins Tuesday). If it wasn’t passing 02:22 local time, I think I would grab a snack and read the a few standards cos, but alas, time to hit the hay, eh, pillow.

Ahh, Stargella moves foreward

I’ve just made a forum posting, starting an open query for any artistic talents interesting in helping to contact me. My main concern at the moment is working out the games design bible while finishing off the Georgia drivers guide >_>.

Most of the code for Stargella is going to be reused for the later first person shooter and ‘mech projects (which may just get released years before the new MechWarrior lol). While the shooter is going to be a 3D affair, and the ‘mech combat game is undecided, the star fighter game (Stargella) is fairly straight forward: 2D is the only way to go. At least without getting sued for recreating Star Fox, if I dared try it in 3D lol. At its heart, Stargella is about having fun, the kind of fun that existed before the move into 3D games. I largely missed the big classics like Battlezone and Asteroids, only getting to play them in later years, but Galaga was a game I did play as a child. Its always been something I’ve found missing, no modern incarnation I’ve had access to just itches the right spot, that’s where Stargella comes in: it’s gotta be fast and furious, like an nail biting round of Centipede. Yet it’s got to something you can actually play and survive with some mastery, like Asteroids (one of my great favourites btw). Most of the games I played growing up, were side scrollers like Super Mario Brothers and Sonic the Hedgehog, so I remember the mechanics quite easily.

Graphics are my achilles heel however, because while I can code what I want, making it ‘look’ that the way I want, is limited by the models that can be created for the game to display. In fact, I’m actually thinking of drawing most of the ships for Stargella, and scanning them into the computer. Really it has been a long time since I’ve done free hand drawing, it feels more natural to me then the computer: I can work FASTER!!!

For Stargella, I very much know what kind of look I want, the question is can I get graphics that match it without the whole thing looking like the early arcade games, lol. I reckon that I could always hash things out in a modelling program and get a head start on code needed for the 3D titles, but I feel that is just over kill for a game like Stargella.

Much of the last few days has been spent in toying with data structures, and testing a few dozen hash functions for use with a simple hash table module. It’s actually the first time I’ve ever had to implement a hash table myself, lol. It’s a fairly simple creation built on top of chaining.

The perfect hungry mans analogy for those that know squat about data structures: let’s say you want to find a recipe for peanut butter cookies in a cook book. You could thumb through every couple pages of the book, looking for cookie recipes, or even flip over to the index in back, and depending on the quality of the index, hunt down by looking down the index and systematically checking all cookie references; linked lists and arrays more or less work similar. A hash table is more like a table of contents: you flip open the book, go to the ToC, and find the section with the cookie recipes, then flip to that page and start flipin’ every few pages until you find the one you want.

Hash tables work essentially the same way, you feed in the key (peanut butter cookies, yum), hash it down to an index to where you can find the target. Although hash functions that don’t collide (often enough to care) are possible, when you have to bind the generated index within a given size, the odds of several different keys sharing the same index skyrockets. So instead of a direct 1 to 1 mapping, you have a needle to which haystack mapping.

My implementation uses a dynamic array of bucket lists that are allocated with HashTableCreate(), each element is a list: every key is hashed then squashed down to the size. When a new key:value is inserted, it gets added to the bucket list. On look up, the key is hashed back to the same value in order to find the correct list, in which to hunt down the correct entry.

One reason I chose separate chaining, other then it fits with how my brain works; many schemes for open addressing (the alternative), feels more like something I would think up, in order to skip writing a hash table >_>. Although, I must admit the possibilities of  open addressing combined with quadratic probing are interesting; I’m more in favour of the chains. While I doubt my implementation is memory efficient—since the only two design goals were to be faster then a (pure) linear search and quick to hash out the code, it undoubtedly has it’s flaws. For the sake of testing how it effects the intended usage, I may try augment/replace the current behavior of prepending new entries to the lists with moving last requested keys to the head, or switch to using red-black trees in place of a linked list.

I spent several hours testing different hash functions, using a small input set of words and a larger system dictionary file for testing. HashTableCreate() allows one to specify which hash function should be used, and it’s possible to override with a user supplied one. In testing, I’ve found using hash functions created by people with a background in mathematics, works significantly better then my own, as duly expected lol. Other then dealing with hash function issues, the rest was a cake walk.

Building SpiderMonkey 1.8.0 rc1 on Windows XP with Visual C++ 2008 / 9.0

Finding this note in SpiderMonkies documentation was a huge NO NO for me, because a dependency on Autoconf 2.13 is *worse* then a dependency on Autotools in general.

As I said I would, I investigated Windows/MSVC builds with SpiderMonkey before completing and utterly refusing to ever use the thing ^_^. This is a summery of my findings.

A lot of people are still using Visual C++ 7.1/2003.NET or 8.0/2005 versions, while I however use the Express Edition of Visual C++ 9.0/2008 for Windows builds, which generally means no pre-compiled libs binaries are available. That’s ok, since I prefer to evaluate the buildability of a dependency before I commit to using it…. hehe. One perk of doing most of my coding under FreeBSD, no need to buy a Professional Edition of Visual Studio :-D. I think this post should apply to most versions of Microsoft’s compiler, +/- differences in compiler flags.

The proper build requires MinGW, MSys, GNU Make, and a suitable copy of Visual C++.

MSys is required because of UNIX tools, such as uname, sed, and countless others are used by the build system; which also seems to depend on GNU Make.

Open the Visual Studio command prompt, or call  %VS90COMNTOOLS%vsvars32.bat from your current cmd session (VS90 = 2008 fyi; adapt as needed for older/newer versions). Then execute a MSys RXVT terminal from that. You do that by running the msys.bat script in the MSys root with the -rxvt argument, example:

+> C:DevFilesMSYS1.0msys.bat -rxvt

which will close the cmd session and open RXVT.

Change over to the js/src directory of where you extracted SpideryMonkey to, and run make on the projects makefile:

bash $ pushd /C/DevFiles/Libraries/SpiderMonkey/1.8.0rc1/js/src/
bash $ make BUILD_OPT=1 -f Makefile.ref

The BUILD_OPT causes an optimised release build to be made, default seems to be debug builds; read the Makefiles and Wiki for details on that.

Now for an example app to test, to see if more then js.exe works!

bash $ cat > test.c

#include "jsapi.h"

/* The class of the global object. */
static JSClass global_class = {
    "global", JSCLASS_GLOBAL_FLAGS,
    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
    JSCLASS_NO_OPTIONAL_MEMBERS
};

/* The error reporter callback. */
void reportError(JSContext *cx, const char *message, JSErrorReport *report)
{
    fprintf(stderr, "%s:%u:%sn",
            report->filename ? report->filename : "",
            (unsigned int) report->lineno,
            message);
}

int main(int argc, const char *argv[])
{
    /* JS variables. */
    JSRuntime *rt;
    JSContext *cx;
    JSObject  *global;

    /* Create a JS runtime. */
    rt = JS_NewRuntime(8L * 1024L * 1024L);
    if (rt == NULL)
        return 1;

    /* Create a context. */
    cx = JS_NewContext(rt, 8192);
    if (cx == NULL)
        return 1;
    JS_SetOptions(cx, JSOPTION_VAROBJFIX);
    JS_SetVersion(cx, JSVERSION_LATEST);
    JS_SetErrorReporter(cx, reportError);

    /* Create the global object. */
    global = JS_NewObject(cx, &global_class, NULL, NULL);
    if (global == NULL)
        return 1;

    /* Populate the global object with the standard globals,
       like Object and Array. */
    if (!JS_InitStandardClasses(cx, global))
        return 1;


    /* Your application code here. This may include JSAPI calls
       to create your own custom JS objects and run scripts. */

    /* Cleanup. */
    JS_DestroyContext(cx);
    JS_DestroyRuntime(rt);
    JS_ShutDown();
    return 0;
}


bash $ $ cl -nologo -DXP_WIN  -I.. -MD -Fetest test.c js32.lib
bash $ ./test.exe

footnote: that test.c is just the minimal app example from the user guide, here. Also note that using /dos style switches with cl under bash/rxvt, doesn’t seem to work (it’s converted to file names).

I’ll need to do some further testing but everything appears to be working fine.

Of geeks and logs

Took it ‘easy’ yesterday, played some games and the only work that got done, was fairly light debugging / library installing / feature adding. Originally I planned to setup expat, libxml2, and libxslt under MinGW/MSVC, but called it a night after expat. Found an interesting thread on Daemon Forums, which shows either I really need to get a life, or a good nights sleep.

Grabbed a trio of cookies, put on the simpsons, and went to bed early, around 0100R; the easier solution :-o.

Had a fair bit of trouble getting to sleep as always, but being winded helps. By a quarter to 0700R, I had already woken up three times :-/. It was a half past noon when I finally got out of bed, not being disturbed makes for an interesting opportunity to sleep like a log and enjoy crazy dreams lol.

For my p resent activities, I’ve merely worke don importing my Live Journal entries from February 2009, into Blogger. I don’t think I’ll make my goal of having it all done before 2010 arrives, but alas, it will get done eventually!