News: 2006 -

Happiness is a warm particle vortex cannon

12/13/2006 - I encountered a frequent crash in cvs 1.11.22 which appeared to be fixed in cvs 1.12.13a. A very boring version 1.11 of my MinGW Distro has therefore been released. I also updated the MSVC library pack; instead of separate build scripts, it now has a single Makefile.

12/3/2006 - In a stunning burst of productivity, I am 84% done with the libnuwen rewrite. As usual, I measure code in kilobytes: 238 KB rewritten, 47 KB remaining. libnuwen was only 246 KB, so the new version will end up being significantly larger. Although I've been tightening up some code (e.g. text coloring on GNU/Linux was being done in an unnecessarily verbose manner) and simply nuking other code (e.g. the old server socket implementation), I've also been adding yummy new functionality and making the tests much more thorough.

Only six headers are left, and none of them are particularly scary (well, I guess my Huffman deterministic finite automata are scary, but they don't need an extensive rewrite). Mostly, I'm dreading having to write an exhaustively complete changelog entry; "rewrote all files" is accurate but not particularly helpful. I expect to finish the rewrite this month, although updating the documentation might take a little longer.

12/1/2006 - libpng 1.2.14 has been released, so I updated my MinGW Distro. According to my understanding, this new release of libpng wasn't for vulnerability fixes, but I figured that I may as well grab it. I also patched libjpeg 6b in order to remove yet another obnoxious typedef and two macros, which were conflicting with system headers. I updated the library pack for MSVC 8.0 accordingly.

11/20/2006 - My MinGW Distro has been updated to version 1.9. It contains libpng 1.2.13, which fixes several vulnerabilities. Accordingly, I rebuilt pngcrush and pngrewrite. While I was at it, I added jpegtran, the utility from libjpeg that I used to crunch my JPEGs down. (This includes a patch that allows lossless cropping.) Finally, I updated the essential components of the distro, but no one should care about that.

11/12/2006 - I finished reading Halo: Ghosts Of Onyx and World War Z. Both were fantastic. Also, I fixed a couple of broken links on my Links page.

libnuwen is 73% done. How much progress have you made with your personal library of modern C++ lately?

11/1/2006 - I've finished 5 new cover scans; I bought new copies of The Peace War, Marooned In Realtime, and Tatja Grimm's World and decided that my used copies of The Witling and Robots And Empire were in decent enough shape to be scanned. Also, I bought a paperback copy of Star Wars: Episode III: Revenge Of The Sith to get a better scan. My hardcover copy has a particularly obnoxious shiny cover that looks quite impressive except when viewed in a scanner; not only does white become silver, but dust and scratches become extremely visible. The paperback is not shiny (except for the Star Wars logo), making it much more friendly to scanners.

The only SF novels which I haven't yet scanned are Walden Two and the Empire novels; my used copies are hideous and I wasn't able to get new copies at Borders.

I removed a busted and irrelevant link on my Origami Polyhedra page.

10/22/2006 - I have slightly altered the layout of my SF Reviews to work around an IE7 regression. Sigh. Also, I've added 38 more cover scans. I don't have good copies of the remaining books, so I'll have to buy better ones before I can scan them.

10/18/2006 - IE7 has been released! In celebration, I have removed the PNG hack from Death to old, busted code!

10/16/2006 - A new library pack for MSVC 8.0 is available, incongruously, on my MinGW Distro page. It includes libjpeg-6b; nothing else has changed.

10/15/2006 - is now 11.2 MB smaller!

I didn't simply delete a bunch of files. Nor did I lossily recompress images, throwing away quality to save some space. Indeed, most of my images are lossless PNGs, and I've used pngrewrite (when applicable) and pngcrush -brute -rem alla on them already.

However, some of my images are high-quality JPEGs. I discovered that Adobe Photoshop's Save As command (as opposed to Save For Web, which I use for 8-bit PNGs only) stashes tons of useless information in the JPEGs that it saves. For a 1x1 image, it'll create a 12.4 KB file filled with XML, of all things. I couldn't bear the thought of scanning all of my SF books again.

So, I applied jpegtran -copy none -optimize -progressive to every JPEG on This losslessly removed the useless information, as well as applying other lossless optimizations. Every single file processed in this manner became smaller.

My SF book cover scans experienced the biggest space savings. All of the large scans used to be 36.0 MB; they are now 31.9 MB. Even better, all of the small scans (which are displayed directly on the page, and hence contribute to its loading time) used to be 5.2 MB; they are now 1.8 MB. That's an awesome improvement; I was starting to worry about the total size of that page.

10/12/2006 - I fixed a broken link on my Links page. Also, libnuwen is 70% complete.

10/8/2006 - I have scanned 40 more covers. Just 50 more to go!

10/7/2006 - 30 more scanned covers have been added to my SF Reviews page. My scanning project is 57% complete.

10/3/2006 - There was an error in my last news post. Can you spot it?

I claimed that switching from having a vector in every node (roughly N nodes, 12 bytes per vector) to having a hand-rolled singly linked list in every node (roughly 2 N edges, 4 bytes per next-edge pointer) saved 4 N. However, every node has to contain a pointer to the head of the list (roughly N nodes, 4 bytes per head pointer), changing the calculated space savings to a depressing 0 N. The other two tricks definitely work exactly as I described them, and the total space savings is observably real, so where do the hand-rolled singly linked lists save 4 N?

The answer is that every vector, beyond the size of the vector object itself, incurs a hidden space overhead. Each vector performs a dynamic allocation (without exception, every explicitly stored node has children), and this dynamic allocation happens to consume roughly 4 N in some secret place. (It's likely a count of elements, stored just before the allocated space itself, although that's just my guess.) The hand-rolled singly linked lists have no hidden overheads, and that's why they save 4 N.

I put an old tracing of mine (in fact, the very first one that I did with Photoshop) on the Image Hacking page.

After having been asked about it, I have added an explanation of why my MinGW Distro uses GCC 3.4.2, when GCC 3.4.5 is available from and GCC 4.1.1 is available from

Finally, I added three quotes to my oldest page, which is in desperate need of a rewrite.

9/24/2006 - I am 69% done with libnuwen My linear-time Burrows-Wheeler Transformation has been significantly improved!

I run tests on my home computer Reason with the text file suall10.txt, and I measure space usage in multiples of the input file size (excluding the input and output files themselves).

With GCC 3.4.2, space usage has improved from 40 N to 23.4 N and speed has improved from 405 KB/s to 526 KB/s. (That's a significant 30% speedup. I chose to decrease the space usage as much as possible, even at the cost of some speed.)

With MSVC 8.0, space usage has improved from 49.6 N to 33.5 N and speed has improved from 360 KB/s to 429 KB/s.

I achieved this 16 N savings through three tricks. First, I was generating the lengths of the sorted suffixes of a string, and then I used those lengths to generate the final BWTed output. Upon looking at this code again, I realized that I was generating and consuming the lengths in order, so I didn't need to store them separately. By generating and consuming them simultaneously, I saved 4 N. Second, every node of my suffix tree contained a vector of edges. This was convenient, but consumed 12 N (as a vector must store its internal pointer, its size, and its capacity, and there are roughly N nodes). I got rid of those vectors, and stored edges in hand-rolled singly linked lists. This saved another 4 N (there are roughly 2 N edges, so the next-edge pointers consume 8 N). Third, after some thought, I realized that edges to leaf nodes are especially boring. They all have the same right index (infinity) and the same child node pointer (null). Through exceedingly clever trickery, I avoided explicitly storing the right index and child node pointer of leaf edges, which saved 8 N (there are roughly N leaf edges).

Interestingly, this last improvement relies on a portable use of reinterpret_cast . I never thought I'd see the day.

9/20/2006 - To be even more friendly to tabbed browsing, I have changed the titles of my pages from " - Whatever" to "Whatever -".

I am currently rewriting my Burrows-Wheeler Transformation code for libnuwen Currently, I have decreased its space usage from 40 N to 32 N and increased its speed by 51%. And I still have another idea which might make things even better.

9/16/2006 - I have scanned 23 more covers.

9/13/2006 - libnuwen is 61% done, woot. That's 163 KB rewritten, 104 KB remaining. Throw in the 45 KB of OpenGL code that I've been working on, and it's clear that I'm writing a lot more code now than in recent months (or years).

I scanned 7 more covers; 64 of the 207 books on my Science Fiction Reviews page now have scans, much less reviews. Sigh.

9/7/2006 - There are now 16 more scanned covers on my Science Fiction Reviews page.

The next version of libnuwen will be If rewriting every single file didn't count as a major version change, I wouldn't need four-part version numbers.

9/2/2006 - Full-alpha PNGs rock. Unlike most websites, uses them extensively. Of course, IE has never handled them properly, so I have had to use a certain hack to make them work in IE6. The hack clutters up my source, makes loading pages with lots of full-alpha PNGs obnoxiously slow, and sometimes takes a while to take effect, so it's not an optimal solution.

What's cool is that IE7 natively supports full-alpha PNGs, making my hack unnecessary. I've been using IE7 RC1 at work, and it's really quite nice. I like seeing my pages load smoothly and rapidly. A while back, when it was announced that IE7 would contain this fix, I constrained my hack to trigger for IE6 only. Firefox, IE7, and other browsers use their native support. So, you can enjoy this right now. As soon as the final version of IE7 is released and I have installed it on my home computer Reason, I will remove the hack from Death to old, busted code.

Anyways, IE7 contains other fixes too. It's got tabbed browsing, yes, but it also has fixed support for favicons. IE6's favicon support was buggy, causing them to not be displayed the vast majority of the time. They work on IE7 all the time, and they're used to make tabs stand out.

A long time ago, I created a favicon for my website. It was a silly little design involving my initials, which I am not obsessed with in the slightest. I had mostly forgotten about this, because of IE6's tendency to not even display it. Now it appears all over the place in IE7, and it's got to change. After wracking my brain for an appropriate design - the cool stuff on my Image Hacking page would be unrecognizable at 16x16 - it occurred to me that I already have a recognizable motif. My automatically colored tables use "nuwen colors" and they have the clean lines that I like so much.

Therefore, behold! My old favicon Old Favicon has been replaced by my new favicon New Favicon. It's so pretty.

libnuwen is 54% done. I know that there are like only two users of libnuwen (including, uh, me), but this is an important step towards my project which must not be named.

Speaking of which!

Project Which Must Not Be Named
Project Which Must Not Be Named

8/18/2006 - More scanned covers have been added to my Science Fiction Reviews.

8/17/2006 - Did I say tomorrow? I meant, tomorrow modulo Dead Rising.

I've finally gotten around to adding a bunch of links and quotes that I've been gathering up for a while. There's one new webcomic (The Order Of The Stick) and ten new links (scattered around). I dumped the new quotes at the bottom of the Verified Unsorted section, beginning with the Hofstadter quote.

8/8/2006 - Version 1.8 of my MinGW Distro is now available. I've added one library, libjpeg 6b. I used to provide one package of the distro that included stdc++.h.gch. I never used that package myself, and I don't think anyone else did either; therefore, I have removed it, which simplifies things. At some point in the future, I'll change my GCC build script to nuke those precompiled headers so that they don't take up space in the components package. (I haven't done that yet, because doing that kind of rebuilding is tedious.)

I received my replacement Xbox 360 a while ago; happily, I haven't had any trouble with it. I've managed to get all of the single-player Marble Blast Ultra achievements, as well as all of the Geometry Wars achievements except for Survived 1,000,000. It's interesting how those games have no characters, no story, and no persistence aside from high scores and achievements, and yet they've left me a lot happier than World Of Warcraft did.

I've also been recovering from the speed bump mishap. I've got a new Segway i180 (with wonderful lithium-ion batteries) and a modular motorcycle helmet. Now I'll have to find new and exciting ways to injure myself.

I'm on vacation until 8/21/2006. That's a vacation from Microsoft work, mind you, not website work. In fact, I'm going to keep myself busy with various website-related projects (including libnuwen, now 52% done). More on that tomorrow.

7/4/2006 - Ugh. Friday (6/30/2006) was not a good day for me. As I was leaving my apartment complex to go to work, I was distracted by some worker running a machine that was blowing a ton of dust across my path. As I tried to evade the dust and be aware of a nearby SUV, I rammed my Segway at a good fraction of full speed into a jet black speed bump. The company that recently acquired my apartment complex was repaving the parking lot, and the fuckers did it wrong. They roped off half of the lot and repaved it. Once it dried, they allowed traffic to go through it again. During this period of time, the offending speed bump (formerly warning yellow) was the same color as the freshly paved asphalt surface. What they should have done is kept it roped off until the asphalt solidified, painted the speed bump, let the paint dry, and then allowed traffic to go through. Thanks to their blinding incompetence, the additional distraction, and my unfamiliarity with going up the left side, I hit the pavement pretty hard.

The left side of my face was pretty badly scraped and bruised. As the damaged capillaries leaked blood, I got a tremendous black eye and my eyelids became almost completely swollen shut. I got a nice subconjunctival hemorrhage too. (My eye is fine, but it looks scary.) My Segway, which did its best to keep me safe but couldn't defy the laws of physics, had its left fender shattered, handlebar cracked, and control cuff completely snapped off. I must have hit the speed bump at a very slight angle, and I tipped over to the left. Unlike April 2005, I didn't lose consciousness this time.

Of course, I had never gotten around to purchasing a motorcycle helmet, and I never got insurance for my Segway either (I did try repeatedly, but my fucking agent at Farmers never called me back.)

Still, I'll be able to make a full recovery. The frames of my glasses, which are awesome and no longer available, weren't damaged. My left lens was deeply scratched. That would ordinarily be a nightmare, but for once I was lucky - I had a replacement lens coming to me for free anyways. I picked up my Round III lenses yesterday, and they're perfect.

libnuwen is 48% done. At least that part of my life is monotonically nondecreasing.

6/28/2006 - Version 1.7 of my MinGW Distro has been released. It upgrades SDL to version 1.2.11; there are no other changes.

Unfortunately, SDL_GL_SWAP_CONTROL still doesn't work for me.

6/26/2006 - Look! It's something that's not entirely unlike a real site update!

I both love and hate Boost.Date_Time. I love it, because it's so much better than the pathetic time manipulation functions in the C Standard Library. I hate it, because it is utterly ignorant of leap seconds. Many people treat UTC as some sort of wonderful standard, when it's nothing of the sort. Because it attempts to stay synchronized with the irregular rotation of the Earth, UTC is discontinuous. Leap seconds are inserted here and there. This means that given two UTC times, you can't figure out how many seconds elapsed between them without consulting a table of historical leap seconds. And you can't say anything about UTC times in the future with certainty, because no one yet knows when future leap seconds will occur. It gets worse - between 1961 and 1972, UTC didn't even tick at one UTC second per SI second (which is the real deal). That is to say, they had an even more complicated and more arbitrary system before the present system of leap seconds. I care about this stuff because libnuwen abstracts all of this crud away - it talks in terms of Qeng Ho time, which is counted in terms of the number of seconds since Neil Armstrong first set foot on the moon. Ignoring relativity, this is a particularly nice time standard to work with, as it is completely continuous and regular arbitrarily far into the past and the future. It can also be serialized in a simple manner. The problem is that deriving Qeng Ho time from UTC involves subtracting a certain UTC time in 1969 from the present UTC time. That involves stepping over a bunch of leap seconds, and indeed goes back into the murky days when UTC sucked even more than it does now. I spent a lot of time getting this exactly right in libnuwen, which now includes a table of leap seconds and does all the right voodoo that Boost.Date_Time doesn't do.

If they ever insert a negative leap second, I'm going to go thermonuclear.

I'm decidedly back into programming for fun again. This is definitely a good thing, since it'll eventually lead to all sorts of wonderful stuff on It's got some downsides, though. Even when I'm working on a library or program as fast as possible, it still takes longer than working on a random site update. Programming is, after all, inherently hard. It's somewhat frustrating to be working flat out on a project and have nothing to show for it for months on end. Still, progress is wonderful, even if no one sees the intermediate stages.

Recently, all sorts of tedious things have been sapping away my time and energy. My Segway's NiMH batteries are increasingly unhappy; while I can still use them, I need to think about replacing them soon. Upgrading to Li-Ion will be a lot of work, as my old-school i167 requires a software update in order to be able to charge the new batteries. So, I'll have to send my Segway back to the factory. If I'm lucky, the NiMH batteries will last another month and I can have the upgrade performed while I'm on vacation; otherwise, I'll be walking to work for a couple of weeks. And I hate the heat.

It gets better - my Xbox 360 failed with three red lights, indicating a hardware failure. I had to send it back for repair (they actually play a special game where as soon as they receive your old and busted console, they immediately send you another console, which may be new or refurbished and will hopefully work). The repair process is somewhat more convenient than for the original Xbox (my Launch Day Xbox failed with a busted DVD drive, and the replacement also failed - in the end, I bought another Xbox for $180 and it has worked to this day). The real nice thing is the removable HD, which means that I don't lose all my data on the Xbox 360 like I did on my Launch Day Xbox. I'll be picking up my replacement 360 tomorrow; hopefully, I can go back to playing Marble Blast Ultra.

Best of all, I haven't been able to see properly for the last month. Back in the middle of May, I got a new prescription for my glasses. I had been swearing up and down that my glasses were off by a half-diopter, but the nurse or technician who did my eye exam got only a quarter-diopter difference. Finally, my ophthalmologist redid the exam and got a half-diopter, just like I thought. I was a little concerned that the axis on the new prescription (7) was different from the axis on my original prescription (179, or as I like to think of it, -1). The doctor thought that the new axis might be clearer, and in any event my old axis wasn't written in stone, so I got lenses made at the end of May. I kept my wonderful titanium frames and merely had them swap out the lenses.

Yep, the axis was wrong. I'd never had a busted prescription before, and let me tell you: it is so not fun. Because my new lens had an axis that was too high, its astigmatism correction differed in angle from the refraction error in my eye. Result: everything was just a little blurry, in a way that couldn't be compensated for by looking at closer objects. This was about as annoying as being a half-diopter off, but a different kind of annoying. I suffered with the busted axis for weeks until I was able to see my ophthalmologist again. (And because I requested the next available appointment, I had to go to Seattle, which was an epic journey in and of itself.) I'm confident that the lens was made correctly and the exam was done correctly, but because I have only one god damned eye, I had my head tilted ever so slightly clockwise. Other people don't have that problem because they can see out of both eyes and align their head properly in the kathinger. So I got a new prescription, with an axis of 1, and ordered a new lens. Yesterday, I picked it up.

Yep, the lens was scratched to hell. Fortunately not in the central vision area, but there were huge circular scratches in one corner, an irregular scratch closer to the center, and some crazing on the edges. So I had to order yet another lens, which I'll have to go back for in about a week, and spend yet another hour unable to do anything but listen to music while they put the lens into my frames.

At least the lens that I currently have is of the right prescription, so I can actually see things without them being blurry. The busted prescription wasn't really anyone's fault - there was a collective failure of imagination as to how I might be able to screw up the exam in such a way as to produce a too-high axis. The scratched lens I can kind of blame LensCrafters for, but they haven't charged me for any of the replacements. (If your prescription changes within 90 days, you can get new lenses for free, and if they fuck up, they replace the lenses for free as well.)

What's really frustrating is that these new lenses are made out of a wonderful material - now, if only I could get an unscratched lens of the right prescription! LensCrafters has this new material that's better than polycarbonate (which my original lens constructed in 2003 was made of - I've used that material for over a decade). This "high index plastic", their most expensive stuff, has a higher index of refraction than polycarbonate, making it thinner and lighter. It exhibits less chromatic aberration. They also put this wonderful coating on it that's anti-reflective and resists scratches, dirt, and water. The anti-reflective property is really nice, since it drastically cuts down on internal reflections that made my polycarb lenses so hard to see out of at the edges. (They also look better to external observers.) The coating feels like buttered silk when I clean the lenses with a wet cotton washcloth - the water hardly streaks at all, preferring to bead up. I'm never going back to polycarb again. I'd love these lenses, if only they could get everything right. We'll see.

Oh, very well. Those who have survived my ranting will be granted a preview of something that I've been working on in the last week or so.

Alpha Transparency For The Win
Alpha Transparency For The Win

This is a screenshot of a program that I've been writing in order to learn OpenGL. It also serves as the prototype for something else. Here you can see a fully opaque red, green, and blue triangle in the back. On top of it is a 50% transparent red, fully opaque green, and 75% transparent blue triangle. On top of both of them is an arc that goes from 50% transparent blue to 75% transparent red. They all spin around and look really cool doing so.

This is actually powered by a completely rewritten version of the Parrises Squares engine. I really had absolutely no idea what I was doing with OpenGL back then, but it served as a useful starting point. I had already figured out most of the initialization machinery, as well as how to link the blasted thing, and I had a reasonable way of dealing with input. (I was rendering the alpha sprite textures in a completely busted manner, but oh well.) Now that I'm smarter, I can use the full power of modern C++ to build a decent 2D engine on top of the basic functionality provided by OpenGL.

6/22/2006 - My MinGW Distro has been updated to version 1.6. I was waiting for Boost 1.34.0 and MinGW GCC 4.1.x to be released, but I don't think that that's going to happen any time soon.

6/19/2006 - libnuwen is 46% done. Hopefully, the most significant rewrites are done, so the rest will go faster. Unlike virtually every other software project, I can state with absolute confidence how complete this rewrite is, since every part of the library is exhaustively tested as I go along. It just takes a while to write perfect code.

Several components of my MinGW distro are now out of date. I'll have to release a new one soon.

I'm now 23 years old, and is 6 years old. Time sure does fly, and I get busier and busier every year. Fortunately, I also get smarter and smarter every year. Unfortunately, that forces me to rewrite and redo things periodically.

That real site update is still in the works.

5/29/2006 - I'm currently working on libnuwen, which is 34% done (if you're the byte-counting type, which I am). I'll kick out a real site update when I get a chance.

4/17/2006 - So much has been going on in STL-land recently. In between working on the distro and libnuwen, I bought an Xbox 360. It arrived on 4/6/2006 and I've been playing a bunch of games since then. DOA4 definitely brings back the old DOA3 magic. Aside from that, the Xbox Live Arcade games Hexic HD, Geometry Wars, and Bejeweled 2 are insanely addictive. Everything looks awesome at 720p.

I spent a lot of time hunting down the soundtracks to Hexic HD and Bejeweled 2. I eventually emerged victorious! My Links page now points to them, as well as to the Precursors. Other things that I've been meaning to link to for quite some time now have been added as well, including Berkshire Hathaway, Digital Photography Review, WinBoard, FICS, HubbleSite, and XMPlay.

4/9/2006 - libnuwen has been released. I finally got around to installing Microsoft Visual Studio 2005 (also known as MSVC 8.0). libnuwen now builds cleanly with MSVC 8.0 and no longer supports MSVC 7.1. Death to old compilers!

I also cleaned up the Makefile machinery. libnuwen used to contain two Makefiles: one for GCC and one for MSVC. They have now been unified into a single Makefile. libnuwen's documentation explains how to build the test cases with MSVC. As libnuwen uses other libraries such as bzip2, Boost, and zlib, the documentation also points to headers and library files for those libraries which I built for MSVC 8.0. (When I installed MSVC 7.1 on Northy, I built the necessary libraries by hand, and of course I forgot how I did that. Now I have build scripts, just as I made build scripts for my MinGW distro.)

Compressing test case executables didn't make any sense, so the Makefile no longer invokes UPX. Of course, UPX is still appropriate for standalone projects, but it's a waste of time for libnuwen.

Interestingly, GCC 3.4.2 is just as fast as compiling libnuwen as MSVC 8.0 is. On Reason with full optimizations, GCC takes 99 seconds, while MSVC takes 96 seconds. With no optimizations, GCC takes 69 seconds, while MSVC takes 66 seconds.

3/12/2006 - Version 1.5 of my MinGW Distro has been released. Also, libnuwen has been released.

2/13/2006 - The scanner rampage continues! My Image Hacking page now contains a scan of the poster that was included with One Must Fall 2097. The poster depicts a Nova pounding the bolts out of a Shredder and is next level awesome.

The bwtzip page now contains Ukkonen's and McCreight's suffix tree papers. No decent online copies were available, so I scanned in the photocopies that I made when I was at Caltech.

Reading McCreight's paper, which was published in 1976, is a little weird because it talks about the nodes of a tree as sons, fathers, and brothers. Ordinarily, nodes are referred to as children, parents, and siblings.

2/7/2006 - I have scanned more book covers for my Science Fiction Reviews.

I have updated my Links. In addition to fixing a couple of links, the C and C++ Standards now cost $30 instead of $18. I have also added links to my favorite GNU/Linux text editor nano and the games Weird Worlds and The Ur-Quan Masters. Go play them now!

Metapad 3.51 has been released, as foretold by the dark prophecy.

Some very interesting things have recently appeared at, including Vinge's Rainbows End (5/2/2006), as well as Stross's The Clan Corporate (5/16/2006) and Glasshouse (6/27/2006). Oh hell yes.

I finally upgraded my Sony CPD-G520P monitors (21" CRTs capable of 1600x1200@100) to HP L2335 monitors (23" LCDs capable of 1920x1200). They are awesome, and most importantly, they are 8-bit.

Happiness is a warm particle vortex cannon.

1/26/2006 - Awesome wallpapers of the Orion Nebula are now available on my Image Hacking page.

1/22/2006 - It took me three months, but I have finally finished a total rewrite of my personal page. It's now known as Stephan T. Lavavej. Whoo hoo!

The method that I use to update doesn't work so well with massive rewrites that take a long time to complete. I work on a local copy of, which allows me to make an arbitrary number of arbitrarily extensive modifications simultaneously. Unfortunately, this also means that I have to upload all of the modifications simultaneously. If one change takes forever to finish, it blocks me from uploading any other changes, even if they're already finished.

In the future, I'll perform massive rewrites in a different manner, which will allow me to continue making smaller changes to as I work on larger changes. When rewriting a page, I'll simply copy it to a different directory and work on it there. When I'm done, I'll overwrite the old version of the page with the new version.

I purchased a flatbed scanner, an HP Scanjet 4850. I can scan images directly into Photoshop CS, which is wonderful. My Science Fiction Reviews now include a scan of each book's cover.

libnuwen has been released. I have improved the Makefile's OS detection. (updated 5/23/2007)
Stephan T. Lavavej
This is my personal website. I work for Microsoft, but I don't speak for them.