Thursday, December 31, 2009

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.

Monday, December 28, 2009

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:\DevFiles\MSYS\1.0\msys.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 = {
    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,

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

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. */
    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.

Sunday, December 27, 2009

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!

Friday, December 25, 2009

Local time is reading 01:40R, so it seems that I've survived another Christmas on this rock. Much of the day, has really been spent trying to avoid the holiday altogether, for all practical intents and purposes. At least I got plenty of C code written for my games :-/.

The only real good thing out of the day, was a the ecard a friend sent—my one smile of the day.

Thursday, December 24, 2009

Yipee-Kai-Yay Terminus font now avail. on Windows !

As some no, after spending a night of debugging only to learn that I had typed structobj,member instead of structojb.member, after a 6-8 hour coding run, I went in search of a new font. The font I found, was Terminus, and ever since I have _absolutely fucking loved it_ in fact, I can't even look at my terminal in another font without missing it.

When filing a bug report to the libmng folks, I left a comment in the bug entry about using a font where O != 0; then went in search of my dear terminus, and then found this and just had to install them :-D.

Terminus is my favourite font, but my only compliant has been needing X to actually enjoy it.... now that's solved!

Here's my notes from installing JPEG-7 on Windows

Take note: I install libraries into C:\DevFiles\Libraries\What\; with compiler specific files dumped under sub folders, e.g. C:\DevFiles\Libraries\zlib\msvc\zdll.lib and C:\DevFiles\Libraries\zlib\mingw\libzdll.a. Like wise, I leave a README.TXT file in the root, noting anything I will need to remember when it comes to using the library.

# build for Visual C++ 2008 / 9.0
> unzip "path\to\"
# I want it in jpeg\src for safe keeping
> mkdir jpeg
> move jpeg-7 jpeg\src
# use the corresponding .vcX files for version
> copy makeasln.vc9 apps.sln
> copy makejsln.vc9 jpeg.sln
> copy makewvcp.vc9 wrjpgcom.vcproj
> copy maketvcp.vc9 jpegtran.vcproj
> copy makervcp.vc9 rdjpgcom.vcproj
> copy makedvcp.vc9 djpeg.vcproj
> copy makecvcp.vc9 cjpeg.vcproj
> copy makejvcp.vc9 jpeg.vcproj
> copy jconfig.h
# I'm using vcbuild, since I read .vcproj files in vim; you may want the IDE
> vcbuild /nologo jpeg.sln "Release|Win32"
> vcbuild /nologo apps.sln "Release|Win32"
# I put compiler specific files in a suitable folder
> mkdir ..\msvc
> copy Release\jpeg.lib ..\msvc
# jconfig.h is compiler specific, so we dump it in our compiler directory
> copy jconfig.h ..\msvc\
> del jconfig.h

# build for MinGW/MSys
$ pushd /C/DevFiles/Libraries/jpeg/ 
$ pushd src
# works for most packages
$ ./configure  --prefix=/C/DevFiles/Libraries/jpeg/ --exec-prefix=/C/DevFiles/L
$ make
$ make install
# move jconfig out of independent include and into compiler specific dir
$ mv ../include/jconfig.h 

Now copy jerror.h, jinclude.h, jmorecfg.h, jpegint.h, and jpeglib.h into ../include/. Those are the portable headers, that won't very based on compiler (MinGW/MSVC).

and here's my notes file:

MinGW -> static link as normal
MinGW -> Use import library libjpeg.dll.a for dynamic linking with libjpeg-7.dll
MinGW -> Last build JPEG-7 on 2009-12-24

MSVC -> Can only static link agaisnt jpeg.lib; must use /MD
MSVC -> also add msvc/ to include path, for jconfig.h
MSVC -> Last build JPEG-7 on 2009-12-23

In all cases, add include + compiler folders to your include path.
Although my original plan for the day, was to spend it working on Stargella, I've not found time for it, and I've to much of a headache now to worry about it.

I got in some good SWAT action then set to work on dependency compiling and evaluation, getting the freetype and jpeg libraries built. It was excellent to see that the freetype folks know how to use autotools, something a lot of projects fail at; and that jpeg has an gone through insane hoops to make their package easily built, on virtually anything lol. Tomorrow is moving on to other libs that may be useful. Since the handling of model and map information, will likely be done through XML files, I also need to start evaluating XML parsers again; something I have absolutely no love for. Also, because of that, there's no point in taking a few moments to write a simple config file parser, when the application requires an XML parser :-S.

Code wise, the main focus for the day was to be working on implementing a simple drop down console, but I haven't had time to focus on it, due to the time and effort it takes to compile software in a Windows environment. Which is approximately 200% more trouble then a unix environment, or 90% higher if it's a Linux application written by assholes who knew less about what they're doing then the puts who wrote the tools 8=).

I'm interested in seeing what SDL_ttf can do for rendering the textual part of the console, but that requires freetype, lol. Freetype however is a very painless thing to setup under Windows, at least using MinGW and MSVC. Whether or not SDL_ttf will be so hunky dory, remains to be seen.

Also spent some time in evaluating the concept of using JavaScript as an embedded scripting language. Mozillas Spidermonkey seems to be the only engine that fits the bill: written in C. It's also fairly portable and has one hell of a nice (JS)API , with out a doubt it's gotta be a lovely way of embedding a language into your program. The only problem, the build system issues. I will explore it's compilation under Windows but expect it to be a wash out. The comments about autotools alone, virtually make Spidermonkey something you can rule out of any sane programmers toolkit.  I've already learned about Python extension modules, but have never had time to look closely into embedding the interp into an application, but will do that also in time. Another thing to consider, is embedding Lua, a language I've never had an excuse to study, lol.

On the embedding a language thing, my thoughts are focused around in game scripting, more so then implementing the game in it. Although with the JSAPI, it wouldn't be to tricky to do the entire game in JavaScript, as absurd as that might sound to the uninformed. For Stargella, the scripting needs can actually be integrated into the map data, in a fairly simple manor as firing positional events off to the game code. However the underlying code is meant to be (largely) shared across several games, and some (the tactical fps for example) will need much more useful scripting capabilities. Using shared objects written in C would be possible, but then maps would become non-platform independent, and I don't want that. Quakes solution, was inventing their own C based language, and to a lesser extent the Q3VM, but ahem, I'm not quite going to do that :-P.

Some how, the idea of scripting the game system using JavaScript is still an attractive idea.... but do I really want to live with compiling Spidermonkey in order to do it?

Wednesday, December 23, 2009

The principal concept of any build tool, is building stuff. In my opinion, make has the perfect idea for it: just tell it what you want, then tell you want done about it.Then exploit that what you want done, can usually be guessed or written once, hehe.

At it's heart, tmk is still a `make`, and perhaps barrows the most from classic make and from Qts project file sytax. Personally, I feel tmk makes things more simple, I'll not repeat here what I'm loading into the Wiki on Source Forge however.

Tuesday, December 22, 2009

Well, at long last: my own build tool

In dealing yet again with compiling dependencies under Win32, and yet again having to deal with a yucky mixture of GNU Autotools, CMake, and IDE-x project files.... I've come back to thinking about an idea from several months ago, for a project called `yet another build system`; which led me to learning CMake.

The original (yabs) idea, was centred around the concept of XML descriptions of build tools, most namely the Visual C++ and GNU compilers. Which would have been mated with a simple `make` like list of rules, basically on par with the inference rules everyone knows, and loves (or hates).

For tmk however, the horizon has expanded and the XML is dropped lol. tmk is meant to be very much, a more portable make with interesting tuning options. Conceptually, it's the same, but, eh fixed you could say. If you don't understand that, just think back to using Makefiles and having to support 20 different build environments! Yeah, that kind of fixing.

The main point, is abstracting away the shoe honing measures. Make is perfect for the environment it was created for, building software on UNIX. However unix has diversified and fragmented sufficiently, that the average programmer is a useless stick in the mud for writing portable sh, supporting other environments like Windows, generally requires a separate set of Makefiles or carting along the (superior) unix environment with you, which is a terrible way of doing things. Fixing that problem is simple, it's been done.

A novel feature, tmk will aim to complete builds as quickly as possible: by inferring from the rules how to build modules in parallel, which also provides me an excuse to write some code I've been meaning to write for EPI ;). This part is also easy.

The interesting part, will be handling dependencies properly. The real royal fuck-baked irk of most 'later day make' solutions, such as CMake or VCBuild, are that can't handle dependencies worth a shit: and it makes building software off the original work station (windows) or operating system group (unix) a bitch and a half.

That's the personal itch tmk has to fix ;-)

Sunday, December 20, 2009

Having a bit of time free, I've elected to work on my games resource sub system. Overall, the whole game is a lot like Id Tech 3 in architecture, because it's exactly the kind of architecture I want, even if I don't want to put up with the engine that powered Quake III: Arena so excellently.

For the resource loading, what I want is for a configuration file to define what packages should be loaded, kind of like a PATH for zip files. When something needs to be loaded, it'll be be found at a path, like— telling the sub system to locate in the game or user data directory, then return a handle to the /what/file.ext stored inside of it. As opposed to the more Id approach, where file naming, e.g. pak0.pk3, pak1.pk3, ... controls the loading order, I want my game to use a config file to handle that. Because personally, I think having to remember which machine friendly name a resource resides at, is a pain in the arse for making maps and mods >_>.

Because I'm running things very light on dependencies, mostly because compiling stuff on Windows is a bitch (stupid programmers) and many useful items are not easily available on FreeBSD. So things will probably be built on top of zlib, using contrib/minizip as an example of using zlib with the ZIP format.
It has been a some what hectic day, logged off around 0400R last night and couldn't sleep, by the time I finally started to doze off, ma started shouting and jarred me awake again :-(.

Fast forward to like 0815 this morning and she does the same damn thing, I've had about 3 hours sleep, tops. Getting back to sleep is unbearable, improbable, and time passes slowly. Fast forward again, to about 1045R, and I'm thusly awoke again. In fact, by this point, I've had sooo little sleep, that I didn't even realise that I was having a dream, until I was woken up! Went back to bed and finally got up sometime after 1200R, to be used yet again as a cheap slave.... I'm tired of being nothing more then an asset.

The only positive things so far, is I've had time (~1 hour) to play with my file server with only a half dozen interruptions or so. For me, that's a blessing.

No idea what I'm going to do for the rest of the day, I'm not really in a good mood.... and there's nothing much that I can get done right now, that is not going to result in headaches later. I fucking hate my life here.

Thoughts drift to backup technology

As has been on my todo list for a while, is setting up cron jobs for running dump on my file server, as an "Extra" safe guard to the fact, that my data is mirrored across three different computers already, hehe. (I also do periodic backups to a separate cold storage partition, and priority files to CD-R every year or two.)

My main concern there of course being, how to do it without compromising disk space to much, after all we're talking about a lot of crap lol. In writing my test script, I've also experimented with piping dump into lzma for compression, but at least with Vectra's scarce resources, is a bit toooo much for the box to handle the data sets involved. Then I started to think, gee, wouldn't it be cool to just keep a SQLite database that stores logs of changes (cron'd from a script), and then periodically run ZIP on the target, excluding unchanged files since the last backup. Effectively creating a smart form of dump, that functions at a different file system layer (e.g. like tar or cpio).

Then I started to think, well, the best existing solution that I've ever bumped into my travels, is a program called Bacula, but I've never had to to explore it. With a little poking around, it seems that Bacula is very much the kind of system that I would like to have.

Which poses three questions:
  1. How well does it work with OpenBSD?
  2. How well does it handle disk space/compression tasks?
  3. When will I have time to read all the excellent documentation?

So, sadly it will probably be some time after the new year has come and gone, that I'll have time to return to this loop; my RTM updated accordingly. On the upside, if three hard disks in separate locations of the building, and with very controlled data replication patterns, some how fails before then.... the entire building will likely have collapsed, so it would be the least of my worries lol.

Saturday, December 19, 2009

I just had some fun :-D

Was walking to the mail box, and on the way back an older man asked if I was cold—like normal, I'm out in sandals, shorts, and T-shirt and it's freezing cold out.

"Wow, you must be part escamo or something"
"I was born in Flordia, so I love it: beats 90 degrees!"

Been in/out all morning, but finally woke up around 11:15R, from a dream best described as interesting but alarming :-S. Less then ten minutes passed before the aggravatory pouncing began, and it was less then 15 minutes before I was officially enlisted for slave duty again :-(.

It's like everyones a big bird with radar...

On the upside, I've managed to transfer all the Live Journal entries from January 2009 into Blogger. Really, I hope to have everything transferred before 2010, lol, but we'll just have to wait and see. I've made about 36 posts on Blogger since the beginning, not counting the moved posting. Live Journal says I've made 1537 entries (counting that one), and blogger gives my grand total here as 1,076 posts. So, there is about 498 posts to transfer over, Feb-Oct 2009 and part of Nov. 2009.

After that, the new roost will be ready for a party, muahuhauaha!

Friday, December 18, 2009

Pour me a stiff drink

Managed to get through work, a further reminder that freezing wind and plenty of rain don't mix very nicely, my hands were almost numb by the time I got inside :-/.

Spent most of my day thinking over the changes for Stargellas input system, but for the most part was thinking about the client/server aspects of the engine, resource loading, and the issue of dealing with cheaters. After taking a very detailed line of thinking about methods to prevent cheating: I've decided that it is impossible to crate a PC game that forbids cheating, or it must take the next Albert Einstein to figure out.

Obviously the moment any thing leaves the trusted server, it becomes untrusted information: no data from the client can be trusted what so ever. Most of the more "Industrial" advice about cheat prevention is a totally load of bullshit; more often then not, worse then bullshit. The only way you can stop a cheater, is to close the system down: run your own hosting servers and the clients, in LAN fashion. Then put up the `eyes in the sky` like a casino to make sure no one jacks your hardware. Anything less then that, is basically a lost cause lol. You can raise the ante but you can't mark all the cards. As soon as tools to disassemble the code or view/change the programs memory enter the picture, the battle is lost: so absolutely nothing on the clients computer can be trusted, even the operating system. Of course, one could easily state in the ELUA that any unauthorized software assisted means of interacting with the software is illegal, which rules out everything save butterflies, but there's no enforceable method to deal with that. Even attempting to  abort program if cracker program X is running or installed, is a wasted endevour: you'd be on the wrong side of the arms race. Whether the game itself is open source or closed source makes no real difference, because obfuscation doesn't work outside of movies.

Because it's impossible to prevent cheating outside of your own private arcade (at best), the only viable solution to preventing cheating in an online game, is to give the community the tools to deal with them.

Requiring an authenticated account and having the servers verify this with your own systems before allowing the player to join—and implementing the means for admins to properly ban that account from their servers. Like wise, a global blacklist for any account banned from more then X servers is a good idea, hehe. That being said, of course there is no reliable way to keep the person from coming back: even if they needed another account name, e-mail address, IP address, and computer hardware. It does however, "Level the playing field" by giving the community the means to regulate itself.

The downside of course being, unless your companies game supports a generic peer to peer (unauthenticated) multiplayer mode, the game becomes a paper weight as soon as you shut down the servers. If those login servers and such are not going to remain in steady operation for at least 10-15 years or so, you're cheating the customers. (Especially those that coughed up $50 on day one and a pre order.) Even worse are games like Battlefield 2, where you can't do squat unless you login, because once the server is shutdown, it's unplayable without hacks. At best, you could hope the company puts all the important server addresses in config files instead of the game exe/dll files, as it makes switching to a community provided replacement a bit less complicated for granny.

In the case of my games, well there's none of that. The only anti cheat measures to be taken, are those that raise the `barrier to cheating` to knowing how to cheat. Unless I become the next Mark Shuttleworth or something. But then again, my games are being developed for my own enjoyment: allowing others to play them, will just be a side effect of (some day) finishing the projects.

Thursday, December 17, 2009

It's been an easier day then expected: ma wasn't feeling up to working, so instead I ended up in the super market >_>. On the upside, financial woes aside, I got to spend more time focused on programming :-D.

Lately I've been working on the computer games I want to build, and finally came to a working title for `StarfighterGame` --> Stargella. With a sub title of vengeance or revenge, which is a perfect title for allowing sequals and expansion packs to be made ^_^. The concept is much like the classic arcade games: simple mindless action. I remember Galaxian and Galaga most fondly, as games that I played in front of Pizza hut as a child. The best free "Clone" that I've seen is xgalaga, but it leaves a lot to be desired. What I want, is the kind of game you sit there and play for hours, and suddenly realise you've been sitting in front of a computer for the last 6 weeks with a long beard and a torn house coat lol.

The story is simple, also like the great classics: you've returned home to the beautiful world of Freyja to discover it is being ravaged by the evil Viekasiekian Empire. Realising that you are the last able bodied star fighter pilot on Freyja, you dive into battle: pushing the Viekasiekian forces back off into space for the final showdown against Emperor Zurick.Game play obviously being in the overhead shooter style of Galaxian and Centipede, but unlike the classics, I want the ship to have full range of movement with the mouse cursor, instead of being constrained to say, left and right, ala space invaders.

Calling the planet Freyja, is meant to encourage the concept that the planet is a beautiful paradise. Like wise, the name of the lead baddy is named in hnour of the graveyard scene from Shakepeare's Hamlet—Alas poor Yorick, I knew him well! The intention here, being to thoughts of death and such. After all the Viekasikians are meant to be evil ;). Geeze, try to say that three times fast without twisting your tongue in a loop!

Portability concerns have caused me to have to largely 'drop' python from the mixture, along with all high level solutions for general rendering and game development tasks. FreeBSD is a horrible platform for developing a video game on, IMHO, unless you like the low level stuff. So, I'm using a common denominator of fairly ANSI C / ISO C89 compliant code, with SDL as the principal backends for graphics and input handling.

It's also kind of hilarious, trying to maintain a code base that supports both the GNU C++ and Microsoft Visual C++ compilers, using a *subset* of common C++, is actually painful. However using a fairly common dialect of standard'ish C in GCC/Visual C++ is quite less painful. This is principally because MSVCs concept of C programming is more or less 20 years behind the rest of the world 8=).

and if anyone else dares to fucking interrupt me while writing this post, you're going to be flung out a damn fucking window!


Haven't been updating my journal here lately, been to busy with work.... still 2 or 3 days of labour to deal with to boot.

Router has been giving me grief for at least two days, and previously was a power outage; I'm starting to think that the outage my have damaged the router somehow. If that's the case, I am really fucked—because I can't afford to replace the S.O.B.

Even worse, on top of that, I got up to cycle the router again and my finger hit my laptops power button while a port was upgrading, what a fsckin' night!

Monday, December 14, 2009

One cheerful moment in a dreary day

The world abounds in aphorisms that convey wisdom to the young, although that advice is usually ignored. Many aphorisms are by unknown authors: "A stitch in time saves nine" (although anyone who has repaired a sail knows that one stitch can actually save 9,000). "People who live in glass houses shouldn't throw stones." And many witty people have contributed their own, like this gem from Mae West: "Lead me not into temptation; I can find the way myself."


Saturday, December 12, 2009

If only I could ...

My original plans for the night, was to be working on my games and setting up a test suite for the SAS project I've got on the side burner. However, since  being informed  Thursday that my Saturday was being taken *away*, I've been tasked with not staying up all night tonight: fat freaking chance of that. So instead of being up until 7 am working on code, I played a few hours of Quake Live, lol.

I expect that tomorrow is going to be a living hell anyway it's sliced.... have to be used as a navcom so we can get to work, it's likely to be to be on par with the worst job I ever had, and is in effect, a continuation of the second or third most utterly-exhausting-fml job I've ever had.... the kind you feel like you were dead when you get off work, instead of feeling like you're dying. On the upside, I ought to get to see a few dogs that I haven't seen in a while; which reminds me of a pair of sad memories[1][2].

One way or another, tomorrow is likely to be a wash out, of torture and getting nothing done. I'm already wishing it was Sunday...... !

Don't feel like going to sleep, but if I don't start snoring in the next 15 minutes, I'm not likely to be up tomorrow; would rather be having a snack. I know my body, and in all probability, I'm probably going to be awake for 2 or 3 more hours :-( :-( :-(.

Quake + Sleep != good mix

Been playing QL again, won two matches and placed in a third before taking one extra for the effort.It was kind of hilarious in it's own sick sadistic way... I won because of applied tactics. The matches were free for alls, and on maps where shotgun, plasma, lighting, and rocket weapons are the most common upgrades to your starter kit: machinegun and gauntlet (buzz saw).

After so many years in [SAS], it's a triviality for me to be able to calculate the most 'ideal' target to engage first with whatever weapons stock I've got available.... heard of baddies, shove explosives or paint'em blue with plasma. Even use of the virtually useless machine gun can be useful in a pinch: to pepper the loosing half of a brawl or as a hair cutting follow up to a couple crippling rockets or a plasma flourish, which can sometimes be more expedient then scoring another good splash with the rocket launcher before the enemy manages to kill you lol.

Having always prided myself on piloting skills Mech Warrior, coupled with a heavy knowledge of tactical movement from life in [SAS], it's also possible to calculate more ideal movement patterns for giving myself a small edge. Once you get used to the games controls, you either master movement quickly or die a noobs eternal death.

Combine all that with effective area / equipment denial techniques (king of the kill!) at the choke points, makes for scoring huge numbers of frags quickly unless the swarms of enemies manage to frag you fast... the key is not dying.

Good clean manoeuvring - always being aware of enemy positions, power ups, and obstacles, while taking care to evade enemy fire as you set up a lethal volly. On the first match I won, it was surprising no one accused me of using an aim bot or some kind of crystal ball for the efficiency with which I nailed enemies while snatch power ups, like a maniac on steroids >_>.

Simple bits of psychology, instinctive/near mathematically determined engagement patterns,  mental timers, and ever increasing ease of manoeuvring through the game environments multi tasking nature.... and volia, you rack up frags until someone out does you.

In a way, Quake is probably the most addictive action game since the original DooM was released! I've never really cared much for Q3A or UT style gladiatorial games, but a few games of Quake are much better at cleansing stress then playing Raven Shield. Experience as shown me, never play RvS when pissed, or you will have a vein popping out of your head lol.

Friday, December 11, 2009

I've just posted a call for title/story ideas on [SAS], in the hopes of moving foreward with the TacFPSGame project and my toolkit for working on the Starfighter game.

Today I was reading an arcticle off /. and started to think.... gee, wouldn't it be an interesting game idea: it started me to thinkin' and combined with all the Quake Live I've been playing lately, get's me back in the mood to work on game development lol. I really want the FPS to reflect my style of things: it should be fairly realistic in nature, but still a fun action game. Perhaps the original Rainbow Six or SWAT 3 are my strongest inspirations for the tactical elements, while Quake III and Urban Terror remind me of how much fun "Crazy off the wall" can get ;).

When it comes to the general game design and architecture, I know what I want both inside and out. It's just the issue of having time to work on it. My primary loops at the moment, are working on EPI and some stuff for [SAS], but once that's done, I'll have plenty of time, in so far as my available coding time goes that is lol.

I've also elected, to start testing a conversion from C++ to Python. I originally elected C++ because it was the lowest common denominator for getting the best tools, and well, I can care less about having to deal with manual memory management. My reasons for contemplating the switch over, is because Python has largely become my standard utility language for cross platform stuff—and I would like to be able to play my games on my FreeBSD laptop!!! 90% of all heartaches have been due to differences between GNU Compiler Collection and Microsoft Visual C++. The most pissy problems being how they implement templates >_>. Ah, sweet, sweet C++, all your best features are also your biggest liabilities.

Most of what I'm interested in, is doing the game logic and stuff, I'm not willing to spend 6 months to 2 years writing a fourth rate rendering system when there is plenty of good open source code to draw upon. Yet, I'm not interested in being limited by most existing engines, like updated Id Tech 3 (Quake III: Arena), Blender-stuff, or the snazzy Unreal Engine 3 that was recently released. You could say, I don't want an engine, I want a frame work :-/.

I was originally planning to integrate python for AI and level scripting tasks anyway, so big deal... it would become less problem to do it if everythings in Python anyway hehe.

Wednesday, December 9, 2009

Why I ****ing hate my life here

I don't know what it is about coming home from work, that gives me a feeling of doing nothing: probably an intimate knowledge of how many interruptions I'll have if I do work on anything :-S.

A lot of thoughts have been on my mind lately. Hasn't been a very nice couple of days. Much of my time has been spent contemplating large portions of my life, and the future outlook. Really, it is probably a good thing that I can't update my journal from work, other wise I might actually survive to get things off my chest. When I'm at work, I've always managed to have the most focused thoughts: it's just that time of day, but alas, by the time I get home, there's too much to worry about to retain most of them for long, until they're lost to the interrupt storms.

I've been thinking about the dynamics of life here and how to describe it, I managed to think of, what would be equal to several type set pages :-/. Too blasted tired to pour over that again but it would vindicate what I feel. The only concise description that I can think of, is emotional torture; I'm not sure if there is actually a definition of that, but it's what things feel like here, a subtle form of torture. There's no better way I seem to be able to describe it then emotional torture and people who don't care, nor are capable of understanding the things done. Any other way of explaining it, I think would require treading incredibly more painful grounds then that, and I'm already well aware of the differences between my and my families definitions of most concepts 8=). I operate on my own, more "English language and logic driven" definitions of things.

From thinking back through the ages,  I can recall a time where I was actually happy in life: the only worry in the world being that my brother would pop the final cork and our mother would leave us holding the bag. Spanning ~90% of the range of memory I have been searching through, hell, I can even remember a time when my family was borderline on becoming homeless, and being far better off on the inside. Since, I guess the mid '90s, things have been increasingly bad. The price of progressing from being a pawn in their games, to being an appetizing target to punt around the line of fire.

No one has dared lay a finger on me in years, at least a lustrum or more. The only place I fall under assault is where nothing can ever show through but my eyes in the dark. Last time anyone tried getting violent with me, my mother ended up with sore wrists for a few days: because I had locked her hands together until she finally "Chilled out". All I had down was bump into something in the hallway and it sparked firsts flying. I have no problems with disciplinary action when I do wrong, but ahem, just being pissed enough to try pounding at me doesn't cut it ;). Under normal circumstances my reactionary back then (cica 2003-2004), as it would be today if someone started up like that, would be my old triple combo followed up by a point-decommissioner to put them flat out on the deck before they could counter, but I only restrained her from doing harm. I spent enough years of my childhood, hearing my mother going on and on about how her first husband beat her, that I am incapable of ever striking a woman: my mother included. So obviously no intent of harm was in my heart, only a forceful deescalation. Looking back at the past, it is ironic, because the impetus for developing my combative-knowledge was to protect my family in the event of emergency, not to protect myself from them lol. It's been almost that long, if not longer since I've been involved in any brawls, but the muscle memory is always sharper then the muscle.

After that incident in the early-mid 2000s, I think is when my family figured out that I had learned much to much about fighting, to be vulnerable to any blow they could dream of landing without my permission. Since then, at least in my mothers case, she knows how to dig in by other means. It's like being ripped apart without taking a blow.

Perhaps it's probability that my families crazy sign-of-weakness thing, would likely making me a target the likes of a bleeding fish in a shark tank, or that *hammering* just what this shit does to me through anyones head, would be much more painful then dying inside... but all the same: I rarely make an issue of it. I've learned through experience at trying, that it does no good, save to give more ammunition to hit me with again. Life here has allowed me to develop one hell of a poker face, because any sign of cracking would likely be like putting blood in the water, and that means being dug into deeper. Whatever I feel on the inside, you won't see it cross my face unless I put it there, or I'm ready to keel, and it takes a lot of hurting to get me there.

I believe that you can try to build people up or ripe them down, through your words and actions. For the most part, I believe in building people up instead. Because I know all to well how it feels to be ripped down and torn apart by the wolves. The only time I do widdle away at people around me, it's in jest to cause a chuckle, and my friends know it's a joke: other wise I wouldn't say any of the negative remarks I do make. That's how I am, I don't believe in inflicting the same pain upon others arbitrarily. My mother on the other hand, is a master of making me feel miserable.... an absolute master compared to anyone else. Never underestimate how your treatment of another person, can impact them, that's the one thing I've learned from my family.

Over the past couple days, I've looked at a very large portion of my life. The only thing I can say, is that they don't care as long as their agenda is archived... because I don't know if I can emotionally tolerate another explanation. It's impossible to hit me but it's easy to strike me in the heart, that's what they do. Nailing until it hurts inside, and any attempt at making that known, is just going to see things get worse.

The other day a friend asked me if I was ok, I told her I would probably be fine in a couple days; I was at a bit of a loss for words. In the past decade'ish, my family has pushed me hard enough. Three times in my life, I've come close to a nervous break down and bounced back from it. Once contemplated suicide and never will again, period. I've also had several depressive episodes (IMHO anyway) and enough periods of "bleeding out" from this place. These fucks will never kill me.  It even shows in my call sign... like a spider, if you want to crush me, you really have your work cut out for you.

Today I was remembering a song I used to sing to myself silently as a child, whenever my family managed to hurt me where the sun doesn't shine. In thinking about it, it feels more like an slaves song, something no one else in my generation is likely to comprehend (the history majors aside). How much has really changed since then? They still do it, only more often and with greater skill.

All I can say, is my D-Day is coming....

Tuesday, December 8, 2009

Old regexese mastery revisted

For keeping my mind off things, and passing time while more up to date ports compile, I've spent some time working on neo (a replacement for my private; itself a replacement for portmaster/portupgrade). When I had last left off, I was trying to integrate code lifted fro NPMs pkg_info wrapper, used for splitting canonical package names into the packages name and version numbers; when I noticed comically that the old kludge didn't quite hold water. Kind of ironic, considering it was one of the most throughly tested snippets of code I have ever written lol. The principal problem was making it deal with names like libsigc++, pcre++, and libxml++—which contain regex meta characters (the +'s) and dealing with (\)escapes breaking the algorithm.

So I just sat down and rewrote it, *properly* this time around, and it works like a blasted charm, in half the amount of code and a fraction of the execution time to boot. The only downside is between development and testing, I've spent several hours on it, and I've got to get up for work early tomorrow :-(. But hey, it's not like I could have gotten a decent nights sleep anyway.... and I would rather have something like this catch my focus, then leave my train of thought to it's usual ends.

neo is basically meant to replace, but at the moment, I'm focused on replacing portversion—to make it worth using. Basically, I gave up on portupgrade and portmaster, and wrote a shell script that is more to my taste ( some months ago. Using it is a simple thing:

# portversion -o | grep '<' | awk '{ print $1 }' > /tmp/pu && vi /tmp/pu
# /home/Terry/ /tmp/pu

leaving me to manually select and sort the list before starting the upgrade. Now I could easily insert filters to handle that kind of stuff in a highly flexible way, but if we're gonna do that.... may as well ditch the portversion dependency, and that means ditching /bin/sh :'(. Making the current dilemma, converting the wacko zacko formats of version numbers, into something comparable in order to tell if it's up to date or not. Technically, a straight compare could be done, since it obviously isn't up to date unless it matches the version saved in the INDEX, but that precludes handling common edge cases.

Monday, December 7, 2009

That was a freaky moment... was sitting here writing a post to a mailing list over ggrps when the light/tv started to fade in and out. Did a quick ^A^C in the hopes that I might get the text copied to qlipboards file store, and flushed to disk before the system could fail.... no such look, an hours of typing gone: and I'm not rewriting it.

The strange thing, is it wasn't a normal power outage, but more of a fluctuation. Part of the building went dead but part remained, on extremely low power, and I'm talking like a lamp making like it's been given a 10 watt bulb lol. The best way I can describe it, is that it is as if the available power was tuned down waaaayyy low, and anything not able to compete for enough power started to shut off.

What is this, Republic of Turkey or something?

EPI rolls on

It's been a bit of a busy hectic, if slowly progressing day :-S. Most of my time has been a juggle between being driven crackers, and trying to actually get stuff done. I've made about 9 commits to EPI and created more wiki content, so at least it's been a viable use of time.

Since I'm more familiar with git then any of my colleagues, I've been focusing on the git side of wiki content for now. Source code management / version control technology is pretty simple to use, and although I can't speak for the early days, modern git (1.5+) is down right easy lol. Well, it sure makes me happier then Subversion ever did >_>. Most of my experience with git, has been as sole developer, and should we say, without having to worry about patches, so I'm more intent on having this kind of stuff documented in our wiki then I normally would be about such a matter.

Also did experiments in writing the program documentation in DocBook XML. So far so good, the manual page outputs from docbook-xsl is pretty damn good, and the HTML will do perfectly enough I think, when mated to a little CSS, hehe. I'm not sure what we will be using for writing our documentation  beyond the Wikiverse, but the best options are DocBook, Plain Old Documentation, and GNU TexInfo. Personally I prefer POD but DocBook and TexInfo are more appropriate. I shared the DocBook manual I did this afternoon, along with links to the documentation for the GNU Compiler Collection, to serve as examples of what the two systems look like. If we need any custom XSL files, I can probably whip them up; already have rudimentary stylesheets to convert a book to forum and blog posts ;).

For the most part, I've been rather melancholy mood of late, so being able to focus on EPI has helped me a lot today. I'm usually happier when I'm able to 'geek out' then when I'm assaulted and bored...

Saturday, December 5, 2009

A little $HOME, NPM, and EPI fun

Been cleaning up my home directory a bit, particularly ~/Projects and the dumping ground in ~/2besorted lol. I've managed to find a lot of old notes, even have imported a couple saved items into While I've mostly dropped all my bookmarks, there are still a few files with old bookmarks in them. I merged them, using the old `cat files | sort | uniq > newfile` method ;). Sometime I've gotta shift through them and see what's worth keeping. Since ma.gnolia's great lossage, I've still have been maintaining the habbit of using Google and my brains limited RAM as a substitute for bookmarking >_>.

I've also taken some time to sort out the change over from Subversion to Git on NPMs source forge page. Last night, I started work in converting my to Python... figured to dub it 'neo' and incorporate it as part of NPM. Hey, I've always wanted to remove portupgrade from the picture... lol. The neo script is basically meant to be comparable to portmaster or portupgrade, and whatever century time brings me back to Neo Ports Manager, will likely serve as the backend. However, I must admit, unlike NPM, this part is somewhat of a selfish agenda at heart: it will be able to do more then my can without help.

Finally found the time to add a few pages to the wiki being setup with the Encapsulated Package Installer project. The stuff there is still mostly bare, because I've been focused else where's the past couple of days. Mostly the content added was centred around development tasks, going to have to settle down and plan out what changes need to be made. All in all, things have been moving foreward. When it comes to my personal projects, EPI has the lead seat, and the rest are enqueued, in terms of programming.

That being said, of course I have my strokes of working on other things when shorter periods of time are free: the odds and ends, hehe.

Friday, December 4, 2009

This Journal Moved To Blogger

Well, I've still got a years worth of posts to transfer (groan!) but since I've been updating my journal at blogger consistently since the last post here on LJ, and half the people that follow my journal periodically, have probably updated themselves... lol.

This is the official transferring post!

I have moved to and will be updated my journal there, leaving this Live Journal setup to be as a matter of posterity. LJ has a policy of leaving inactive accounts lay, so I expect this page will survive longer then most references to it. All future updates are going to my page on Blogger. If anyone actually tracks me through bookmarks or Atom/RSS feeds, time to update.

Few people if anyone read my blog, so it's not much trouble, beyond updating my forum signatures lol.

Ahh, a good day...

Spent most of the work time, thinking about todays tasks. I really did not expect the new continuation training sessions to go over very well, just an inkling. Almost had a full server, but lost a few due to connectivity issues and ~20 minutes delay in trying to get as many bodies as possible. But hey, if we had started on time, there would only have been two participants to scare off  >_>.

Things went pretty well, tried to keep the live fire exercises fairly easy since it was the first session. Ezbassr and company proved to be more then up to it, much to my relief lol. The purpose of continuation training, is to give you a rough and tumble environment to practice your skills. It's not a piece of cake, you've gotta be sharp, or you'll fall flat on your face. Ah, the joys of [SAS] training :-D. We train harder so we can fight Eazy ;).

Thursday, December 3, 2009

Highway 20 ride

I ride east every other Friday
But if I had it my way
A day would not be wasted on this drive
And I want so bad to hold you
Son, there’s things I haven't told you
Your mom and me couldn't get along

So I drive and I think about my life
And wonder why that I slowly die inside
Every time I turn that truck around
Right at the Georgia line
And I count the days
And the miles back home to you
On that Highway 20 ride

A day might come you'll realize
That if you see through my eyes
There was no other way to work it out
And a part of you might hate me
But son, please don’t mistake me
For a man that didn’t care at all

And I drive and I think about my life
And wonder why that I slowly die inside
Every time I turn that truck around
Right at the Georgia line
And I count the days
And the miles back home to you
On that Highway 20 ride

So when you drive
And the years go flying by
I hope you smile
If I ever cross your mind
It was the pleasure of my life
And I cherished every time
And my whole world
It begins and ends with you
On that Highway 20 ride....
-- Highway 20 Ride, Zac Brown Band

Tuesday, December 1, 2009

Oh how I love git, let me count the ways!

Initially I kept separate repositories for each portion, most notably the EPI core and build system. Since Trac was selected for part of our web stack for getting stuff done, and it can be a tad pissy about multiple repositories, I've opted to create a "Merged" repository from the others. Essentially the Trac will require multiple Trac environments or a singular repository; while my we take the time to decide which to use, I just whip up a solution out of my hat like a good little geek &(^_^)&.

The trees were located in dixie:~/Projects/EPI/repo/ and still are. After backing up the repositories, I created a new 'work' tree to become the home of this merger, threw them together, and did some clean up. First I tried using git filter-branch and git format-patch together with a few other mungies to get the history retained how I wanted it, then I decided to screw it and just make branches reflect the history—even better then what I wanted.

I then used git format-patch to create patch sets, placing them in temporary directories. Rather then change the patch sets to reflect the merge (good task for perl scripting), I decided to rely on git mv for something more full proof then hacking patch files by hashed out automata.

Creating a new 'work' repository, I made an initial commit with a stub file, then created suitable branches for each in my original repos, which is a task easily automated in sh or Perl, for people with lots of branches. A little bit of git checkout and git am, then slurped up the patch sets bringing each repository (and it's associated branches) under one roof.

Creating the new merged 'master' was a simple octopus merge.

$ git checkout master
$ git merge repo1 repo2 ...
$ git mv ...
$ git commit -a

Job done, good night!

Note also, I wanted the trees merged, so conflicts were not even present, hehe.

Monday, November 30, 2009

Spent mos of the day working on the [SAS] Dept. of Agriculture map... been in a terrible mood all day. That's just the way things have been rolling here of late :-(.

Sorted out the details at the outside spawn point, adjusted the fire escapes accordingly, but had to remove both the window frames and glass in order to move through it. After shooting out the planes of glass, there's to much stuff left, and it blocks you from climbing through lol.

Got a brain fart, and added extra rooms/doors connecting that spawn poin to the basement garage; just need to sort out the nodes properly before that is finished.

Began work on redoing the central office upstairs, only to find out that I can't look up the same brick wall paper used all over the blasted map, so I've had to substitute a more fierce kind of brick. Gonna sort out that office space and rebuild the bombed out bathrooms below, then the structural changes will mostly be complete.

I have to do the AI related work and tidy up the marketing office area, but otherwise the map is basically done, it'll be ready for a little testing soon, hehe.

Full throttle

So far so good, managed to burst through my weekend todo's hehe. Completed my work for [SAS], got time to play a couple games, did the setup for ticket and documentation management needs on a personal project. Plus I've been aggressively moving ahead with the [SAS] Dept. of Agriculture map for SWAT 4.

All this while upgrading my laptop >_>.

Remaining to do with The DoA, is setting up the access from the outside spawn on level 1, to the window breaching point up on level 3. I've completed the relighting and half the general cleanup of the building, so the only big task: redoing the AI. I plan on setting up an interesting little "Scenario", hehe. If I could, pushable barricades would be a nice touch but I've yet to figure that out in SwatEd.

Most of my time has been spent on the Encapsulated Package Installer (EPI) project. We now have a forum, issue tracker, and wiki system going. Things are not moving as quickly as I would like with EPI, but the past two weeks have advanced rapidly on infrastructural issues. When our new systems are more established, I'll likely make references to it here.

Overall, the highlight of my weekend, has been (at long last) getting my invitation request to Google Wave accepted. So far it seems to be coming along well, but I have almost no one to wave with at the moment lol. The ability to invite 8 others came along with it; most of which I've mentally reserved for a few close friends and a couple for good uses. The main downside of Wave, is simply that e-mail and traditional IM systems have been around a really fraking long time; so it's an uphill battle. One that I expect the world is not quite ready for yet, although it is very much a technology in the direction of our Internet future.

I've even found the time to migrate most of my gaming related pictures on to the WWW! The old home directory is getting thinner ^_^. Another thing I've gotten down, is transferring Live Journal entries from November 2008 to this Blog. I really need to pick up the pace on that. As much bother as it is, one thing I really do like about this migration procedure, is it gives me the ability to organise my old entries using lables; walks me down memory lane, and helps me to find 'useful' posts that were forgotten.

Life is busy, the serious issue is advancing forward quick enough for my tastes... rather then being bogged down and omni-tasked to death. My family is good at doing that.

Sunday, November 29, 2009

Haven't been keeping pace with my Journal for the last couple days, let's just say I don't want to talk about the Holidays.

Dixie spent about 2 days solid compiling ports, nearly 240 of mine and well over 800 when dependencies are included. That's finally finished, so my beloved laptop is again ready for getting stuff done :-D.

Here's the list I fed through


Friday, November 27, 2009

FreeBSD 8.0 day 2.0: upgrading ports

Since I have accumulated a lot of stuff since 7.0 was released, I have elected to do a clean slate -- nuke it all and rebuild. The perfect chance to get rid of any stale leaves hehe.

# cd /var/db/pkg && pkg_delete -f *

As Mal.exe reminded me, this is equalivulent to pkg_delete -a; I forgot about that hahahaha!!!

while all the ports are being put under the hbomb, I set to work in an already running session of vim (since it depends on plenty of ports with my builds!) and wrote a list.

Every time I update my laptops ports, I use a customised "" script, which does exactly what I want. The portmaster and portupgrade systems are only used when needed for an expedient coverage of issues marked /usr/ports/UPDATING. It was just smoother to write my own small script around the ports tree, then live with the qirks in portmaster and portupgrade: mine does just what I want and without the hub bub.

My is programmed to parse a file, expecting input lines in the format of category/portname, which tell it what ports need upgrading. In my experience, it works better then portmaster and without that need for constantly asking "Are you still running?" that portupgrade has... is in the middle of fetching ~230 distfiles, and setting any stray build options. So that everything will be ready op for compiling all this junk. At least I can go play SWAT while things compile, but need all the stuff fetched and recursively configured before I can have fun hehe.

Will post the input list later.

The first FreeBSD upgrade to ever piss me off

I built world, two kernels: (my custom) VIPER, and GENERIC. I took about 2 hours using make -j6 on my lowly Sempron.

Fetched updates to the ports tree via portsnap while waiting for the install kernel to finish; I noticed that the boot into single user mode for mergemaster'ing was blazingly fast. Everything went well until the first multi user boot.

The blasted wireless card stopped working. Changing in the ath manual and the release notes info about Atheros support made me expect there might be problems. Plugged in a spare (broken) Ethernet cable and did a search on the FreeBSD forums where a thread mentioned cloning the wireless interface to a generic wlan0.... it worked.

ifconfig wlan0 create wlandev ath0

and volia!

So, just how did this creep up on me, and why wasn't it in the release notes... (that anyone I know seems to have noticed)???

The manual for rc.conf explains this under network_interface:

If a wlans_ variable is set, an wlan(4) interface
will be created for each item in the list with the wlandev
argument set to interface. Further wlan cloning arguments
may be passed to the ifconfig(8) create command by setting
the create_args_ variable. One or more wlan(4)
devices must be created for each wireless devices as of
FreeBSD 8.0. Debugging flags for wlan(4) devices as set by
wlandebug(8) may be specified with an wlandebug_
variable. The contents of this variable will be passed
directly to wlandebug(8).

which makes the fix in rc.conf, adding wlans_interfacename="wlan0" into the mixture:

ifconfig_wlan="self censored :-P"

In order to find some backstory in /usr/src/UPDATING, I had to GREP for it:

The 802.11 wireless support was redone to enable multi-bss
operation on devices that are capable. The underlying device
is no longer used directly but instead wlanX devices are
cloned with ifconfig. This requires changes to rc.conf files.
For example, change:
ifconfig_ath0="WPA DHCP"
ifconfig_wlan0="WPA DHCP"
see rc.conf(5) for more details. In addition, mergemaster of
/etc/rc.d is highly recommended. Simultaneous update of userland
and kernel wouldn't hurt either.

As part of the multi-bss changes the wlan_scan_ap and wlan_scan_sta
modules were merged into the base wlan module. All references
to these modules (e.g. in kernel config files) must be removed.

If changing from FreeBSDs natural to wlan for that makes one damn lick of sense what so ever (eth0 lovers aside), I will leave it to someone who knows to comment.... because I don't know, and I don't really give a fart.

The release notes in provides two helpful sentences: wlan pseudo devices are now used and check out the ifconfig manual.

Other then wasting an two hours of my time over a change that probably isn't even the bloody handbook yet, everything went smoothly.

Thursday, November 26, 2009

Wow, either Internet Malware is getting worse then ever or Firefox 3 just sucks worse then ever >_>. Javascript just took over Firefox, tried to convince me to install an Antivirus program -- loaded "Explorer"'s my computer page (in Firefox), obviouly faked scanning files and finding a few thousand bits of malware, before trying to redirect me back to their "Antivirus program" -- and setting a Windows XP like pop up right in the middle of the Explorer-replicating page, that's so obviously not a pop up window but a web hack. The irony of this? I'm running FreeBSD, and the most damage the account being used can do is write data to /dev/null (a black hole file). Are Windows lusers really stupid enough to fall for that trick? Wait, don't answer that question.

Tuesday, November 24, 2009

Dential update

Things went fairly well, saw the dentist on the 23rd and he proclaimed the problem after a short inspection, proclaimed it an abscessed tooth and infection causing the face to swell. He proscribed a choice of antibiotics, a heating pad, some pain killers, and a referral to a suitable dental surgeon.

According to Doctor Maddux, I should be fine in the short term as long as the swelling doesn't interfere with my breathing (that was actually a comforting thought), but it can get serious enough that I could end up down the road at the hospital. Considering that my mothers bills over routine stuff totalled around $20,000—I have little interest in being admitted to a hospital, ready to keel the flug over! Our orders were to try and get the infection in check with the antibiotics and setup an appointment with the other office; and do so A.S.A.P. if things didn't improve within a day or two.

Since I can sooner die in the middle of the street then see a $100 prescription filled for the heavy duty stuff, we went with the less effective but much more affordable antibiotics, which when subbed for the generics at the supermarket pharmacy, became 500mg tablets of Penicillin VK, of all things Penicillin lol. The last time I can remember hearing of Penicillin since WWII, was a pharmacist my mother once worked for long before I was born, who, or so she had told me years ago, used to give out pills of it to poor coloured in the hopes of curbing syphilis; although I'm not quite sure if that was even legal back then >_>. But hey, when the price difference in what the Dentist is prescribing is like $90~$100+ atomic bomb versus a $0 gamble that it might work... it's worth a shot, isn't it?

Borrowed a heating pad, but didn't put it to much use. Willow trying to climb on top of it, and pushing a heating coil into my face made it clear that it would be a bad idea; reverted back to a wash cloth, and for the first time in my life was glad the kitchen sink can output burning hot water liquidy split. Either way, I found the heat on my left cheek very soothing.

For good measure, the Dentist proscribed a small supply of mild pain killers for use `as needed`, which when filled in for by generics, is a smidge of Hydrocodone and a hefty shot of acetaminophen/paracetamol (better known to most of us in the USA, generically as Tylenol, even though that's actually a brand name not a substance lol). I'm not like the average American, who takes a pill for anything. For me to even take two Tylenol over a headache or toothache, means I'm probably ready to smash my head through a wall because of the pain. Throw the other crap in the mix and yeah, I'm not inclined to take it unless absolutely necessary. Life's given me a nice threshold against pain anyway... so as long as I'm able to sleep, usually not much to worry about.

Spent a about 20-30 minutes walking around the supermarket while the prescriptions were being filled, my tooth was agonising and the left side of my jaw looked like I had cotton balls stuffed between my choppers and cheek. But on the upside, by the time we got to the checkout most of the pain subsided for a couple hours. Took the first dose of antibiotics in the car and noted that the pharmacists directions said that this Penicillin is better absorbed on an empty stomach—perfect for me.

Refused my mothers attempts to push food my way at every opportunity; hopped on the computer to check in with a friend on AIM, then hit the Proving Grounds for a couple. Soon gave up on playing SWAT 4, and laid down with the heating pad. I just crashed on the bed for a few hours, ended up napping with my head at the foot of the bed, cover drapped over me, and the dog near my feet.

Seems that the Penicillins only adverse effects on me have been causing me to feel cold, chilly at times I guess; but that is basically it. Woke up around 1800-something and had a bowl of soup with some cold meatloaf for dunkin' for dinner; the hot broth was just what I needed. Having *officially* declared war on this S.O.B. of a tooth and infection, I inspected the problematic tooth with a tooth pick eariler, and flossed / brushed my teeth after dinner, plus rinsed out with mouthwash before bed.

After finishing my meal and brushing with a militaristic determination (lol, don't ask), I settled down on the couch for a good nap: and focused every fibre in me towards kicking this thing to the curb. Woke up in time for the second dose of antibiotics and another short nap. By the time I got up to go to bed, I no longer had a toothach—much appreciated.

By morning most of the swelling went down, but if I place my hand to my face, I can still feel the buldge on the left. So far, so good, and I've not had any serious pain since before the second Penicillin pill. Managed to get to work this morning feeling pretty normal.

Have the appointment for next Tuesday programmed into my Calendar, and hopefully will be rid of this damaged, deranged, bastard of a tooth as soon as we can figure out how to pay for it... and hopefully any part of this infection will be K.I.A. by then.

Monday, November 23, 2009

Ma finally woke up a little past 0800 local, so I briefed her on the problemo—helps to be well prepared. She had me bite down on a tea-bag, which IMHO increased the swelling :-(. Ma called the CMC which directed her to a pharmacy, at which point I bet the $5 remaining to my name that any pharmacist we could ask, would likely say get a dentist. So she called the nurse we worked for, who agreed with me: this is a job for a professional. Have an appointment at 1900Z with a dentist that came recommended.

Tried to lay down and get some sleep, but it still feels like someones standing on my face with a work boot... Got up  and took a shower, but skipped ditching the whiskers, don't want to put that much pressure on that spot. Headache is a bit better but the teeth/gums are worse.

I'm not sure what to expect, last time I saw a dentist, it ended in a futile sortie and being made to feel worse then the scum of the earth over the shape of my teeth. Today can't go much worse, assuming I actually get to see the DDS

Inspecting an old decrepit mouth

I took "Stock" of my teeth tonight: it's been a long while since I've inspected them closely, because their just simply hopeless lol.

The top two front centre teeth, what I call "Rabbit teeth" for the obvious cartoon reasons; are notes in the history book. The right centre top is long gone years ago, just the empty socket there, and consequentially it never bothers me lol. The left centre top, is broken with the back of the tooth still protruding a wee bit out of the gum line. Other then parts of what looks like tooth-interior visible at the edges of the damage (or tarter from hell), it doesn't look that bad.

To their immediate flanks, the teeth next to them are ones that suck. To the right it's a broken tooth, that protrudes further (about half normal length) then the left top centre. The principal difference being this one looks black while the other is mostly white. On the left, is a spot from the base to about half way down to the top of the tooth, that looks like a poster board for tooth decay :-(.

On the bottom, the front centres are in good shape as ever, although (as have been for many years) I can see part of the teeth quite a distance down, where the other teeth I would see gums, I see the teeth; I'm not quite sure what significance that is. The way my teeth are settled, is probably a good example of what happens if you don't have braces (as my brother did in his youth), but hey, I would probably have to flash back to my 5th birthday or something, if I wanted a nice looking smile lol. The teeth directly adjacent the bottom centre pair, are in much better shape then their mates on the top; the only thing going against them is thick tarter build up.

It would take a closer inspection then I can do without tools, to tell more details but most of the other teeth on the top or bottom look fairly good, just highly unaligned. The hot spots are on the right, third bottom tooth from the back: there's just a wee bit of tooth visible toward the outer edge of the socket, other wise it's a KIA; I can remember spitting out chunks of it a couple years back. On the left, about second from the back, the tooth is missing about a third of its visible mass, on the inner (tongue) side. That's the area where I usually get a toothache every now and then. I would bet an x-ray of that tooth would make a dental person upset. On the upper right, while I don't see anything, there's a hard spot in the gums, that I would guess is probably part of the teeth or something protruding from the gums.

My gums don't bleed often, so I hope that's a good thing; although they did when I first started brushing them on a semi-regularly basis, that was ages ago. The only time they bleed, usually is when eating certain kinds of food, like a sandwich; then there's usually a bit fo blood from where the top front portion of my gums would've met the bread.

The reason for my fresh interest in my teeth, is because last night I noticed a dull throb to my lower left side of the jaw (around that one tooth), and this morning I noted the gums on the lower left are swollen. While I don't think anyone else noticed, I can both  feel the bulge and see it in the mirror. Took a nap for maybe 45 minutes and the swelling seems to have gone a little bit, but it's still feels like an Everlasting Gobstopper is sticking out of my jaw. Before logging on, I flossed and brushed teeth as usual, and tried rinsing my mouth out with saltwater for good measure.

This is what I call the "Folly of youth". Unlike a few other avenues in my life where things are miserable, this one is purely of my own causeing: because out of the 7,800 or so days I've been alive, the number of times I've brushed my teeth in the past 21 years, are probably closer to 1,000 times or less. Some years ago I started brushing my teeth and using mouth wash at a dentists orders, although that was of course a lost cause; it was even on the news last year, that the medial stuff we were on back then, weren't covering anything worth a fart for dental and people were shouting about it. After that fiasco ended, I tossed the brush back to it's corner and gave up, until some months back when I "Restarted" after a killer toothache—reequipping myself with floss, brush, and paste about the time I left doctor Cook with a bandaged toe. Since then, well let's just say I've only started the second tube tonight... lol. My routine is generally a nightly floss & brush, since mornings are just disasters anyway...

I have a bit of aheadache now, and still a throbbing  where the gums are swollen. Then again, I've had a headache most of the damn day, between these gums and a parakeet screeching my ears off all freaking day. Going to skip most of the tasks I have for the computer tonight, and just try and get some sleep, after a wee bit of snack.

These teeth are what I get for being a stupid ass.

Saturday, November 21, 2009

DINNER OUT, best live op I've had in years

Today was the go date for [SAS]_Trp_Walkers Live Op, DINNER OUT. The first one he's made actually, and doubtlessly, one of the best I've gotten to participate in, in quite a while lol. It really was a good LO.

When I saw the floor plans he attached today, I remembered a note I had scribbled down last year from [SAS]_SSM_Medic. He used it for some SNCO duties, and I got to thinkin', what if it supported loading external images into it? Well sure enough, it did :-D. Spent a while playing with our `new'ish` toy, Walker and DUKE helping with the testing. It also fell on my head to lead the live operation, since Walker delegated it to the highest head on the totem poll.

After the call for the LO came up, I got everyone into the briefing software, and conducted a mission briefing. The plan was quite simple, Alpha and Bravo would link up on the top floor, Alpha providing support fire for the entry, and Bravo silently securing the flank—then taking position for a hard entry. After the "CHEESE GO" signal was to be given, we would've launched our raid: Bravo doing a breach bang entry while Alpha supported with tear gas and marksmen fire. That was the plan anyway, and we would've setup a similar assault in the next choke point on "PIZZA GO".

What really happened, in manoeuvring Bravo into position, we came to a rather sticky set of situations. The areas we had to clear were surrounded with grated catwalks overhead; we took care of the first entry like clock work, but it was the second area... our rally point for after cheese. There was two doors leading into the RP, the right one with an X-Ray having his buttocks planted firmly to the doorway, and a buddy standing on the stairs next to him. The right door, had spotty obstacles and another X-Ray within arms reach of the door. I made the call to maintain the stealth, and informed [SAS]_Sgt_Duke comming Alpha, that we may be compromised within the next 15 secs; he was ready. We stacked on the left door, aiming to drop the sentry without much alarm; we did that and took care of the guys on the other side, before moving into the freezer behind our way point: a double door to be wedged before the take down on cheese. When we got there, the door was open and we took a lot of flak, [SAS]_Trp_COT going down almost on the spot... a hostage was shot in the distance before we could get the situation locked down—Alpha went GREEN and took out the shooters. Once I got bravo to our final assaulting position, commu with Duke showed we should have little resistance, so I signalled our entry with just a quick bang clear. While working around a bullet proof cage to kill a remaining shooter, I got quick draw mcgrawed out of the action without a chance to fire lol. In a couple minutes, Bravo was down to [SAS]_Trp_ESCRT while [SAS]_Sgt_Duke and [SAS]_LCpl_DeCapi took charge of the clearing effort. Soon after that, ESCRT went down leaving just Duke & DeCapi, when DC crashed, it left Duke to save the day on his own lol.

In retrospect, I should have changed the plan on the spot, split my Bravo team into RED and BLUE on each door: breach bang entries and push on, having Alpha engage cheese while that was happening. Instead, I aimed to keep things on the hush & hush, rather then take the gamble on hostages getting off'ed.

I chose Duke to lead Alpha team, because I wanted my best man ready in case things blew up in my face... and I knew his level head could cope with the pressure up there in the OP lol. While it would be easier for me to manage the assault team (Bravo) if I was up front where the action was. It was watching Duke and DeCapi clearing the map together, that really impressed me, for the first time in quite a while. Watching them in action was like looking at the epitome of [SAS] teamwork and tactics in action. Two [SAS] members knee deep in trouble with no real shortage of OPFOR to shoot at, and Duke brought order to chaos in the end.

A little bit ago, I sent an exaltational e-mail up the CoC, recommending them both for medals in the new awards matrix. There display of how we work together, and Dukes actions during the LO was that good - I generally don't send recommendations for such things lol. But I think, after all the Live Opeartions I've been in, Duke deserves a citation for his effort, and DeCapi is also worthy of commendation. There virtual battlefield action really was awesome. Since our refined awards matrix is more focused towards live ops and trainers, Duke just made my first two cents for our equivalents of battle field commendations.

In [SAS], the only people I've ever felt worthy of serious recognition for their contribution to the team, are [SAS]_Maj_WIZ and [SAS]_CO_Random, because I know they've given more to [SAS] then most of us combined. WIZ in particular, I've been around to see better then most, how much he's put into this group. Those that know me, I don't do so highly very lightly lol.

Without a doubt, best live op I've had in ages!!!

Thursday, November 19, 2009

A little fun with git: publically exporting your local repositories

One of the great things about git, is it's distributed nature; in my humble opinion, being able to tell your partners to pull your latest code is a useful stop gap for code review (without better tools... for now, lol), then having to e-mail the flubber as a tarball.

In my case, I maintain my working tree on Dixie, usually stored under ~/Projects/ some where. To prevent freak data loss, I also push things out to bare repositories stored on Vectra, under /srv/git. Those repo's on Vectra are my "Centrals", which will usually get pushed out somewhere else (e.g. SourceForge) if the projects public. The fact that my home directory on Dixie is also backed up is also a bonus hehe.

In order to setup a suitable means for people to clone, fetch, and pull from my git repositories, I edited my Routers configuration, and set up a NAT (Network Address Translation) to forward a suitable port to Vectra. In Vectra's pf rulesets, I unblocked said port.

For write access, I use SSH and public key authentication to manage the repositories: and no one is permitted SSH access to any of my machines, unless they manage to break into my home wireless (or penetrate and suitably spoof my workstation), discover my username and hostname mappings, and brute force their way through the key pair before the internal firewalls tell you to F-off for good ;). In which case, good job monsieur or mademoiselle psychic!

Public read-only access may be setup with the humble git-daemon. Read-only access with controls, well is a task for something else ^_^.

The git daemon can be a fairly strict prickly pare about what it does export, so I feel reasonably comfortable with it. I created a simple whitelist file, called /srv/git/exports that describes what repositories may be exported: the file format is a simple line indicating the path to the repository to export publically, blank lines and those starting with a # comment being ignored.

I wrote a simple /etc/rc.git-daemon script that I can call from /etc/rc.local when OpenBSD starts, like so:

Terry@vectra$ cat /etc/rc.git-daemon                                            

if [ "$1" = stop ]; then 
        logger -t GIT stopping git daemon
        kill -9 $(cat /srv/git/ && rm /srv/git/ && logger -t GIT git daemon stopped
        logger -t GIT starting git daemon
        echo "$(cat /srv/git/exports | grep -E -v '^$|^#' /srv/git/exports )" | xargs git daemon --user=nobody --group=git --pid-file=/srv/git/ --verbose --detach --export-all --syslog --base-path=/srv/git  && logger -t GIT git daemon started

        echo -n ' git-daemon'

After this is executed, it's possible to:

$ git clone git://

as an extra bonus, since /srv/git uses my 'git' group for permissions but my umask by default tells everyone to screw off, I have to manually set permissions on repositories I wish to export, before someone can access them through the git-daemon.

Ok, so I'm nuts.

Wednesday, November 18, 2009

Thoughts about photo/image hosting services

Over the years, the only services that I've used are ImageShack and Photobucket; the former for one shots and the latter for more permanent storage. One of my best friends had opted into using Photobucket instead of IS, and quite naturally, I followed suite, although many years later... lol.

In parsing of Wikipedia, I noticed that the article noted a sequence of resource drops. Photobucket has dropped free accounts drastically, and without a functional digital camera, I simply don't generate enough image files to warrant a "Pro account", even if I had the financial resources for upgrading.

So I expect, in the near future to likely be moving on to something else in the future: and leave Photobucket as a relational memory. The only other services that I'm aware of, being Picasa and Flickr, which now have connections to Google and Yahoo!, respectively.

Flickr seems to offer the best content model in terms of resources, however other stuff indicated in their help/FAQ pages, I find rather discouraging for free accounts. So I seriously doubt that Flickr will replace my usage of Photobucket.

Picasa, integrates with Blogger which is nice, and would work well with purchasing extra data storage from Google. The down side however, is it is 'yet another' Google supported web system :-/. I have enough already, the only reason I've opted into Blogger for my exdous from LiveJournal, is it was LJs 'runner up', and I have little interest in revisiting that research. Blogger also serves my needs well enough, that I'm not amending that either.

When I had originally researched the 'whole blogging thing' back in mid 2006, it had included a study of services, ranging from Blogspot, LiveJournal, TypePad, Xenga, and others. LJ however won out at the time. It is also a known fact, that I would sooner stick me privates in madame guillotine, then use MySpace :-P.

Other sources that I have for storing images, include LiveJournals "Scrapbook" feature and a rather fascinating data model provided by the micro-blogging services I use; some of my friends ought to be able to guess what that is easily. While I maintain my journal (aka a blog) in public, the micro-blogging system I keep under much more private-levels. Any one may read my blog, but only those closer to me have access to the micro-blogging stream.

Since I'm shifting from Live Journal to Blogger, I don't feel it ethically appropriate to rely on LJs scrap book functionality. As to the micro-blogging solution, the main thing that concerns me is the measure of privacy afforded; one thing that always irked me about Photobucket is it's fairly poor privacy controls. Sharing links to images stored on Photobucket is not exactly a secure thing IMHO, and is one reason I rarely use it. My research (using help docs and friends albums) has lead me to conclude that links through the microblogging system do maintain a measure of privacy; abit at the cost of revealing the service used (acceptable enough). Some might find it odd that I prefer noting it as 'microblog' rather then by it's service name, but hey, it keeps every Tom, Dick, and Harry from trying to add me over there, and it's less public them my instant messengering details >_>.

In all probability, I'll probably end up using that system or picasa in place of Photobucket for future affairs; perhaps another service, if I find something of appropriate interest. Of course, if I had my own website, it would be a fairly moot point, but that is not in my financial near-future. SAS does give me a small bit of webspace, which I do use for occasional odds and ends, but my personal code of conduct forbade me from abusing it lol. And actually come to think of it, I should probably host my forum signature off the site: so changing my forum sig on SAS becomes an encrypted file transfer, rather then editing my profile.