Saturday, July 30, 2005

Defeat - Computer's Last Stand

Okay so my server situation did not work out. I had pieced together a clunker and intended to install Windows 98 SE as the operating system. It refused to boot from CD-ROM at first so I hunted down a boot disk. The setup program very accurately (and frustratingly) depicted the estimated time left (about 30 minutes). While that was going on, there were strange visual artifacts appearing in various places on the screen, my T.V. I wasn't sure if the disk was fubar or the T.V. just couldn't display 640x480x16 (that's 16 colors not 16 million). In the end it didn't matter, because Windows operated fine.

Well, fine relative to the rest of the problems.

The CD-ROM tended to lock up Windows when auto-play is struggling to burp up. Mouse clicks kept registering strangely so that it thought the button was held down (maybe an accessibility thing?). The keyboard's control key did not want to do anything. I had to practically use all my physical prowess to get CTRL+ESC to work. Sheesh. I could not find the right driver for the Number Nine Revolution 4 video card in there and that ended up killing it for me. After trying several drivers and having Windows lock up consistently on shut down (booting was always fine) I decided this was not for me.

Then I also realized Windows 98 probably didn't have an Event Log, which I am already coding for. Oops.

So I'm back to XP, but I don't mind so much. I need to find a replacement computer and make up for the 3+ hours I wasted.

alfred, let's go shopping

What Name Do You Go By?

Believe it or not, I've spent the last few hours just working out a name for this whole project. There's two high-level distinctions that I identified: the service itself, and the product which is used. Thus I found the current moniker, List Server, to be inadequate because it blended them together. The work I've been doing is more like coming up with a brand, or theme as Cowherd needed to for his game. Sure I've got the code and the concept, but what exactly am I giving people?

If you want to send email to a bunch of people, just fork it! I was surprised that this domain name ( was available ( is not). So the concept is you can fork your email, but creating a fork list (got too, ha!).

I had come up with a huge brainstormed list of names which couldn't fit in the survey thing I had found to take votes. So I stepped back and spent a lot of time playing out words with as my reference. Here's the names that were left on my brainstorm list (I removed a bunch):

NeatPost (got
ForkEmail (got

NeatList (got
ForkList (got
DivvyList might not've been the best in everyone's mind, but I took to it immediately and it filled me with a charge of inspiration. Suddenly it was fork this and fork that, and god dammit I just want this forking thing to work. It sticks to my ideals. Corporate creeps might not like it, but it'll fit for the tight-nit groups of friends and customers. It's short, easy to remember, and doesn't twist your tongue to say. The one thing it doesn't have is a link to Otechski, but that's alright with me.

You'll notice I almost used NeatPost and NeatList, and I actually bought the domain names. I liked those names too (short, sweet, and neat), but they weren't self-describing in the least. You could use either of those for a huge range of products, not just email. I have them both for a year, maybe something will happen with them, or someone else wants them!

there are some who call me ... tim

Wind Tunnel

Being in my makeshift office reminds me of being in the labs back at Microsoft. There is a perpetual rushing sound from thousands of fans in hundreds of computers. The temperature is perfect for me, but too cold for everyone else. And despite the movement you can sense in the air, there is no true breeze. When you listen to music here it has to be either really loud, or you have to be wearing isolating head phones.

I'm not actually in a lab, or even another office building. My ass is firmly planted in our round chair (I forget the name of these things) which I have transplanted to the bedroom. Here we have a mobile air condition (read: a big lump with small wheels at the bottom), a ceiling fan, and an oscillating floor fan on high. To be fair, you can't hear the ceiling fan unless the other devices are off and the streets are empty of vehicles (midnight to 5:00am).

Okay so none of this has any bearing on the List Server, I just wanted a nice setup. You see, it is very hot outside ... to me. That means there are people with their shirts off or in skimpy clothes out wandering around and enjoying what they consider to be "good weather". I enjoy the sun, but when I get too hot (and sweat) just by standing still then it is too hot in my book. That book, incidentally, is looking for a lucrative publishing deal if you are interested.

I spent way too much time today looking for my copy of Windows 98 Second Edition, only to find I couldn't find it. Yah, ha ha, very funny. I could've spent that time plunging into MSDN's subscriber downloads, which is what I resorted to. That reminds me, I need to complain about their stupid navigation tree. I can't believe the ISO was 640mb! That's crazy; I mean Windows 95 you could fully install in under 50mb. What the hell happened with Win98 SE?!

Suffice to say it was not instant gratification with MSDN. Even at a rate of 150k a second, the flitty "Time Remaining" indicated I'd be waiting for quite some time, maybe even an hour! I say maybe, because it changed its mind every 200 milliseconds or so. That's the best denomination I could come up with. What programmer thought it'd be a good idea to update a value representing expectation that fast? "Sorry honey, we can't leave until I know if this is going to take 40 minutes or an hour 5. It just keeps changing." Damn man, just leave it at the high end of the curve and let me be pleasantly surprised if it finishes early.

Anyway (can you tell I haven't gotten any real work done yet?), I decided to wander over to Staples to look for a little laptop lock like Cowherd has so I could work in a public place and use the restroom. My portable catheter+bedpan needs cleaning you see. They had nothing of this sort except a combination lock and it's all I need to remember some other password so I passed. They did however have the most beautiful hard-bound notebook I have ever seen. Clean, smooth, sturdy 150 physical pages (300 total, front and back) with razor sharp page numbering in the far left corners. It was one of those "Record" books for accounting, but I imagined plotting so much more than money in it. I must've picked it up and put it down half a dozen times. My finger prints are smudged all over it and I can only hope it's never involved in some kind of crime. Logic and frugality finally won out when I decided it was too bulky to be carried everywhere and at $35, it wouldn't be used to the full extent of its potential (here I shed a tear).

I did buy a neat stencil with shapes I told myself I'd use for flow charting (ha ha ha ha), a flip-top notebook with tear-out pages and standard binder holes, and finally a couple of twin-pocket portfolios with binder clasps to store all of these random papers I have floating around about the List Server.

I went to Starbucks there, a crowded little building in the middle of the pavement inferno.

I sat for a while and pondered my next move. Where the heck could I work from?

Finally, I came back here and created this office for myself. Hmm, cave more like it, but it suits me.

Now maybe I can actually get some work done. I'm comfortably tempered, I have music, WiFi, all the water I can drink, and the ability to piss myself silly without worrying about my equipment (my laptop you sicko, not the other equipment).

this one you can blame on the dog

Friday, July 29, 2005

More Sleep, Please.

I have got to stop fooling myself into thinking that I can still get up at 4:30 when I don't go to bed until 3:00. It just doesn't work. I think that from this point on if I don't end up sleeping until late, I will not plan on getting up in an unreasonably short period of time. In this case, I will try to report my intentions with a blog entry before bed.

I still joined the fellowship this morning, but much later.

Thursday, July 28, 2005

Sight seeing in Silicon Valley

After dinner while on a business trip to Silicon Valley, Kopp and I were trying to think of something to do. Most things were closed at 9:00 PM. We had this wacky idea to get a cheap disposable camera and take pictures of ourselves next to all the high-tech companies within 10 miles of our hotel. Since there were so many, we have to narrow it down to just the ones we thought were cool.

Some companies we visited but are not pictured: Borland, Symantec, Mcafee. Our efforts to find Adobe were hilarious. I'm going to let Kopp tell that story though.

The Non-Spec

I have mentioned before that I really dislike creating a spec for a project. I feel like it slows me down and drains my creative drive. The main reason I see to create a spec in a one person project is to have a plan. That is, to remove the surprises so that you don't end up with those "doh!" moments you get from coding yourself into a corner. I have not often experienced the corner thing, but I do understand the need for a clear plan.

Last week I decided to take a new approach with the spec process. It is my own abbreviated version of a spec that is not really a spec at all, but tackles the problem of having a clear path.

First, let me explain that I like to come up with my own designs of very specialized search trees, hash tables, linked lists, etc tailored to be highly efficient for the task at hand. This is a large part of what drives me and means that typically the applications or services that I write have very complex structures and algorithms. It is the structures I am pointing out here.

In order to quickly lay out my path while keeping as much drive as I could, I decided to start with a new angle to my coding instead. I created all of my memory structures, enumerations, defines and function definitions first. I guess stepping back, you could say that I almost completely flushed out my headers before starting in on the .cpp files.

How well did it work? It seemed to work fantastically. I feel like I have cut my development time in almost half, while only having to go back and correct a structure once.

Why? This is my perception: Normally, I define my structures as needed, and add the required members when I run across them. I think that most of the increased speed has come from the fact that I was not doing so much context switching. That is, I was not leaving my code to go over and add the newly created variable to a appropriate structure every few minutes. Every time I do this, I believe that I lose some time coming back to my code and figuring out where I was. It's not that it takes is much time to figure this out, but simply finding where you left off typing takes more time than if you never left.

Perhaps I'm just a bonehead and the only one that had not considered taking this direction. In any case, I have seen a marked improvement in both speed and organization. I plan on continuing to experiment in this area.

Wednesday, July 27, 2005

Boiled Onions

I'm spending more time narrowing the focus and documenting than I ever have. It is no wonder I never finished things before. When you try to write about things which don't have immediate bearing on the target audience's tasks, they quickly make themselves apparent. It suddenly becomes a burden to try and chain these things in which you thought made so much sense before. If they're hard to explain, they'll probably be hard to understand, and maybe they have no place on your plate.

Yes, I know I've talked about this before. Today I'm speaking from the experience of working on the technical specification for the List Server, or SimpList or whatever I end up calling it. I used to have four processes, well I boiled one away and now there are three. It makes so much more sense now I don't know how I ever ended up with four (for the purposes they're intended to address). The process which is gone was called the "Processor". Yeah, having such a generic name is a red flag alone. Then I tried to explain it and differentiate it from the "Deliverer". Hmm, and how is that different again? Maybe it will bite me in the ass later, who knows. After chucking it, though, the road block was removed and I started grinding out the spec.

Keeping to my little schedule, even though some items can be thrown off now, I added 2 (two hours) next to time spent on the technical specification. It took me all of 30 seconds to open the laptop, open the schedule, change the numbers, save the file, and double-click the "build list server" short-cut. If it doesn't help in the long run at least it won't be taking any of my time either.

It's actually been well nigh an entire week since I last sat down at Starbucks. I didn't think I'd be able to get into the zone, but I did, even if it was only for two hours. That's two hours of progress, so it's all good.

Bright and early

OK, back to it... bright and early. I'm tired and sunburned (a little) but ready to get back to it.

Monday, July 25, 2005

Hobby Vacation

It seems we've all taken a vacation from the Fellowship. I missed last Thursday, last Friday, and today due to lack of sleep, pre-scheduled late-night activities, and family being in town. All in all, I think those were pretty good excuses. Suffice to say (doesn't that sound cool?), I haven't done any work on the List Server except talk about it with my potential target audience and think about names. Cowherd came up with SimpList, which I think sounds awesome, but the domain name is already taken.

one, two, three steps back and so many left to go

Thursday, July 21, 2005

Target Seeking

So yesterday I didn't post my results because they were rediculously buggy. I'll go ahead and post it here so you can see how bad it is. Its a mess.

The correct behavior is for the fat guy to target the nearest sandwich and go after it. He obviously doesn't do that. One of the problems is that the code is a mess and hard to debug. Hence my earlier post about starting a framework.

Today I worked on my framework and got the key parts finished. It's not perfect but it does perform the seeking behavior fairly well. Below is a movie I created to test the framework.

All you do is click the mouse to set a target and the little thingys will seek out the target. They will pass through the target and try to turn around to continually seek it out. Like flies that never land. :)

Each unit has a velocity, calculated in real time based on forces applied. They also have a rotational velocity. I basically calculate the angle between the units rotation (the direction its facing) and the target. I then set the rotational velocity to this angle clamped by the maximum rotational velocity.

This has the effect of rotating the unit toward the target. Then I calculate the velocity based on the distance to the target and the angle the unit is facing. This makes it behave like it can only move in the direction is facing forcing it to turn around.
Fairly basic but critical for getting this thing to work.

Wednesday, July 20, 2005

Do as I say...not as I do

I argued this morning that I was not going to write a spec on the game but immediately after leaving Starbucks I conceded to myself that I need to write one. Neil is right as usual and if you read this blog at all, he is admireably the Joel poster child. Well, he's the closest to it of the three of us.

The way I see it, developing a video game taps into the creative side of your brain which has no trouble producing wonderful ideas. You could say this of any development project but I would say more so for games. Video games are a form of virtual reality; where there are no bounds placed on you so you are free to put whatever you want into it. This leaves many doors wide open and without some kind of game design spec to close some of those doors off and create some order, you are probably doomed to never finish.

I suffered from this fate early on. Call it a personal disapline problem which is partially why the Fellowship was formed. I made many grand plans with lots of ideas and sketches but if I would have spec'd it out from the beginning it would be obvious it would have taken too long to develop right away. I figured this out pretty late in the game when I decided to scale back.

So why write a spec now? Well, I might still argue that I don't need one but then I ask myself, if it's so clear in my head, it should not take any effort to produce the spec, right?

I like that NeilO came to the realization that he will miss his date if he keeps his feature set. I need to know this as well.

Also, I'm planning on writing another game following this one. Of course it will be even more ambitious and I really want to do it right.

Raz Ahl Schedule

I wrote out the schedule for the List Server today, based on what I need to do from what I've got done thus far. Every little thing that needs to be done and put in, or designed and put in, is on the schedule. I specified things by the number of hours, typically in 3-hour blocks since that's the average amount of time I have available each morning.

Well, *ahem*, it was fairly surprising. Sure, I estimated on the conservative side, but I've also been dropping features like crazy. I got 132 hours of work to do, or 8.8 weeks if I am only doing 3 hours a day for 5 days a week (the current Starbucks way). By this schedule I could have something ready to use publicly by September 21st which is past my original thought of September 5th.

Ouch, that hurts

Tuesday, July 19, 2005


Where are my priorities? I actually did employee work at Starbucks this morning instead of my own project. I was trying to make a spec for someone to be following and it really needed to be done today. I've been directing this person to learn and read up on certain things for the past week at least and I promised I'd have the master plan today, so I did, I got it done.

can't have more than 200 friends. must discard a friend. kmart sucks.

What a Dump!

First and foremost, I wrote the Weekends blog entry this morning.

I spent the remaining 1.5 hours working on a way to dump ISAPI callback information. There are two reasons I need to dump the information:

  1. In an ISAPI filter, you are able to register for twelve different types of callbacks. With each of these, you have access to different information and different callback functions. In using Weblock, you will be able to set rules based on any of these. Since I currently don't know 100% what you have access to at what stages, a way to dump all of the information is ideal.

  2. ISAPI filters are a little bit of a pain to debug. If IIS is using the filter, you have to restart the iisadmin service before you can rebuild, then you have to find and attach to the correct process. Not really that bad, but when you have to do it time and time again, it can slow you down. In my experience, this can cause a drain on your mental process as it is monotonous. So, by having something that is constantly dumping this information to the debug stream I will be able to cut out some of the monotony.

As it turns out running this at work for just a few minutes has solved a problem that I was working on for many hours yesterday. It promises be a great help in the future.

Monday, July 18, 2005

Short n' Sweet

I'm still working on documentation which is five projects: User Guide, Advanced User Reference, Functional Specification, Technical Specification, and Schedule. I am still cutting and re-arranging features. My high-level schedule is now like so:

This Week (07/18 - 07/22): Finish Schedule and User Guide
Next Week (07/25 - 07/29): Finished Advanced User Reference and Functional Specification
August (08/01 - 09/02): Develop and Test
First Monday of September (09/05): Release Public Trial

I won't really know the specifics of the development, until I write the schedule this week. It's going to be tough, because schedules are easier assumed than done.

Simple Settings

I have been working on a settings class that will allow me to very easily and simply load and save settings for a project. This is part of the library of helper routines that I am building. I figured this was a good component, as I'm trying to build my components for reuse. Nearly any application has a need for settings to be kept somewhere. I have felt for some time that it would be nice to be able to store and retrieve them without thinking about it.

A goal in the construction of most of the code I intend to reuse has been to make it as simple as possible to consume. If I don't have to think about using it at all, I am much more likely to use it. With that idea in mind, I cut out a lot of the functionality that I was considering. On wrapping up the class, you had the ability to make only a few function calls: Get(), Set(), Load(), Save() That seems easy enough. I allowed for the ability to specify a hierarchical path in the calls to Get() and Set(). This should give the ability to have a little organization.

At this point, I have a very simple way of dealing with settings. You don't even have to worry about the file path for the settings file. It is something that I will most likely use in many of my future projects. I have realized, unfortunately, that the weblock project will need something that I chose to leave out of this class. That is the ability to enumerate settings. I don't really want to start adding things and spoil the simplicity. Perhaps I will follow Neil's suggestion and make a complex version, then derive a simple one from that.

What could I have done to avoid realizing this upon completion? Perhaps a detailed and formalized written spec would have done that. I tend to avoid them because I feel they squash my creativity on a project. For me, the creativity is a major driving force that I'm not quite ready to give up. :)

Foiled Again!

To any casual observer (and some not so casual) I am quite sure that it appears I am not actually interested in meeting with the fellowship in the mornings. I assure you that this is not the case. Now I may not be thrilled about the time we agreed to meet, but I have come to enjoy the meetings and really do want to participate.

So why didn't I show up this morning? I don't know why the alarm didn't go off. I've been using it for weeks now. I don't think I did anything wrong in setting it. *shrug* In any case I was not awakened by it at 4:30, but rather the sound of an alarm clock coming from the building across the street at 8:00.

Say what I will, the observers will only be convinced by action. I don't blame it at all.

Sunday, July 17, 2005

I really had no idea..

I am nerdier than 94% of all people. Are you nerdier? Click here to find out!

I guess all those years my sister had it right.

I'm a Nerd Wannabe

I am nerdier than 37% of all people. Are you nerdier? Click here to find out!

What's with all the math stuff? I feel I'm nerdy, but math ... isn't that a little prejudiced?

Saturday, July 16, 2005

Friday, July 15, 2005

A Dash of Game Engine

I am getting to the point where I have a lot of code that is getting repeated, so I have been refactoring it down into separate functions. We had a conversation early on about how when you were learning to program you would just bang it out and not worry about framework etc. That was one of the key reasons that you actually finished things when you were just getting started. By not getting bogged down in details of framework and class hierarchy, you were able to keep coding with a clear mind.

What I have done so far follows that pattern and it has been very successful in getting a lot of stuff out as you have seen here on the site. What I have identified, though, are a very clear set of classes I can go ahead and create to wrap some stuff up in a neater package.

I am going to fight the urge to build out a game whole framework. I am only going to make the classes for the code I have already written. Believe me, I came up with a million ideas on how to continue to embellish the classes with future functionality but I am going to keep it to its most basic form putting only what's necessary for this game.

Thursday, July 14, 2005

X Control Crash

Doesn't that sound cool? I forgot to mention in my earlier entry that I borrowed one of Cowherd's laptops this morning. Normally I play World of Warcraft at night and leave the laptop plugged in so it is charged by morning. I had forgotten to do that and I was nearly out of power, so I had to take the loaner.

After copying files over to a directory in explorer, I had to hit refresh to see them, hit refresh to see a folder I created, and hit refresh to see the files disappear after I had moved them into that folder. One of those annoying bugs, but Cowherd had never seen it. Damn I'm a good tester and I don't even have to do anything weird.

I mainly worked with TextPad and WordPad since I had the code opened in the former and my specs opened in the latter. At one point I moved to one spec and hit CTRL+X to cut some text. A message box popped up that said "Access denied" and before I could click "OK", I got a blue screen of death. BSOD! BSOD! The laptop quickly restarted itself as if changing clothes after vomiting all over them. I love their thinking that we don't want to see error messages anymore, so if one happens just restart. Reminds me of the old Macs which would simply LOCK and die. No error, just lock and die.

Again, I am a good tester and I don't have to do anything abnormal. Beware the X Control Crash sequence!

A Spec of the Cheater

I have no excuse for not writing in here yesterday or some previous times. Work has been stressful, but this isn't hard to do once you've actually cracked open the window. I even got Missy to start a blog here.

The last two days I've just worked on the specs for the List Server. There's two specs that I'm going between: Functional and Technical. I'm writing the Functional as if it were end user documentation whereas the Technical will have all of the under carriage exposed. Both of them are equally tough and I'm no stellar writer, despite any reputation I might've earned from fluffy emails.

Joel on Software has some good things to say about writing functional specifications, but he doesn't cover the darkest areas of it. For example, getting started is the most difficult part and creating each new section is just like learning to ride your bike all over again. Oh sure, it's probably fine after you've written your umpteenth one, but on your first few its pulling teeth. The decision on how to lay it out, when do you describe what, just making it linear is very difficult. I think you shouldn't bother with making it consumable until you have something semi-organized. Otherwise you write yourself into a corner.

What helped me really get started, and maybe this will help others, is to start in with some general Scenarios, Nongoals (Future Features), and then a Terms section. The Scenarios expose the parts of your features which people will be interested in and you can narrow down your focus by adding things that pop into your head to the Nongoals. Finally, you've got this jumbled storm cloud in your mind of how it all works based on all the features you cut out. Now, start writing out Terms. I thought there'd only be a few with the List Server, and I'm up to over 20.

For each Term you want to give it a short description and an example. I wouldn't really care which order these came in, but I'm starting with the description. Even mundane things, someone will get confused about if you don't explain it. If your explanation is more than a sentence, it might be too long. Usually even the most complex ones can be heaved into a light sentence and then followed with an example sentence that clicks it into place for anyone reading it. As Joel has mentioned, keep the messy details elsewhere.

For myself, I want the user documentation to be readable by my Mom. The ultra non-computer-user. She will use a computer for the bare basics and has no interest in learning anything more about it. She does use email and so if I can communicate my project to her, then I can pretty much explain it to anyone. My initial target audience is for fun (the ol' gamers list) and I want any non-technical person with basic email skills to be able to use it.

And here come the creeps

I created the first of the creeps for the game. I call him the fat man and he's after your sandwiches. You need to get the sandwiches before he does. At least that's the goal.

There are some bugs obviously but NeilO says I should post it anyway! So here it is.

Change Log:

- Created the first creep: the fat man. A random number of them are generated (will be flexible by level) and they currently pick a random direction and walk that way.

- Consolidated duplicated movement code


- Fat man wanders to the wall and stops or continues beyond the border.

- Fat man does not always face the same direction as he is walking.

- Firing is now broken

- Fat man does not consume sandwiches

- Fat man needs to locate nearest sandwich and head that direction

- Occasionally, player down movement stops responding

Wednesday, July 13, 2005

Warcraft First Aid Distraction

Arrived at 5:00AM sharp today. As I stepped from my car I did my usual look through the Starbucks window to see who's here and !!! someone was sitting in my chair! I think the girls behind the counter forgot to let folks know that the chair on the north side is my chair. I proceeded to have a seat in the south chair that Critter-Tigger usually sits in. It's not quite as comfortable but it's also close to the outlet. I rearrange the pillows, pounded them into shape and managed to get comfortable. Maybe I'll sit here from now on!

[OT] *sigh* I'm big enough to admit it. NeilO and I were chatting about World of Warcraft for about 20 minutes before we started. I really wanted to get my first aid at least up to 225. I didn't think it would take too long. Here was the plan: A flight from Stonard to Booty Bay, how a quick boat ride to Ratchet, run to Crossroads and a quick flight to Duskwallow Marsh. Throw in another flight to Orgrimmar (my silk was in the bank) and 2 hours later, I have 225 first aid. What a time-killer that game is. I'm swearing off WoW when I'm at Starbucks. OK you can laugh now. [/OT]

I got about an hours worth of solid work on the game. I did a lot of clean up and polishing. All things considered, I'm pretty happy with today's result.

Change Log:

  • Fixed the NaN score problem
  • Created animated score when sandwich is picked up
  • Levels increment and reset properly
  • Made some color changes for a more retro look

Tuesday, July 12, 2005

Something happened to the blog ?!?

I had to go back through all my posts where I embedded a Flash movie and fix up the links because the were dead. The paths were all stripped off.

Typically you have an embed tag with a src= just like an image. I have all the swf files on my ftp server at but that path was stripped off all of them. I put it back on and now its all working again.

Just weird.

Bouncing Sub-Sandwiches

Once I nailed down what I'm doing, (big weakness here) I banged this out in about 3 hours. Flaming Weenie doesn't want all those sub sandwiches to go to waste. Tomorrow I plan on putting some cars in there. If they run over a sandwich, its one less for the FW to eat. The goal is to eat as many subs as possible without getting run over.

Move FW with the W,S,A and D keys.

You can also click and move the mouse around to shoot in the direction of the mouse. When you get a sandwich, your score will go from zero to NaN. I have a bug.

I want the game to have a retro feel so it is very blocky. It also frees me from concentrating on detailed artwork :) No wonder retro is so cool.

Note: you may have to click inside the movie so it will capture your keyboard presses.

Monday, July 11, 2005

Spec Appeal

I actually wrote some useful spec stuff this morning. My brain was too dead tired to do any coding and all I've got left in order to get the List Server really functioning is hardcore niblets. This past Saturday I came in for an hour and a half or so and finished the rest of the high level code. It's pretty, but it's not smart ... it just does stuff. However, it is fairly complete for what it is and that makes me happy.

Joel says you must have source control and a one-step build process, so I also killed both of those on Saturday. After complaining, as I am wont to do, about the lack of decent software in this area Cowherd joked, "I just zip everything up each day, that's my source control!" Really, he's right. The organization of my source tree would only serve as an additional mole hill and we can upload the ZIP's to our web server for central, safe keeping. The minimal amount of software and thought required to create daily archives make them ideal for our one-man-in-the-boat crews. So, I made a nifty little CMD script which I run to create a dated ZIP ( with an increment minor build number (BB) that goes up to 20. Another small tid bit of progress to make me happy.

Anyway, getting back to today, I went through some user scenarios in writing. Then I started thinking about simply how one would go about starting a list, assuming you wanted to use this product. So, I ran through a website wizard in a doc to create the flow of setup and it helped to nail down the feature set in general. If you can't explain the jist of the product's capabilities when a user is configuring them for the first time, maybe they're best left "advanced" and pushed off to a later release. This is exactly what I ended up doing.

It's very sad to see so many features go. You believe the product you're making to be a very simple thing, and its full of small demons. As you're going along you realize that in order to fulfill its destiny in a timely manner, you really need to cut down to the bone. That said, I need to make the skeleton fit in its closet before I attach any more flesh. And if I want to make this thing extremely fit and self-preserving, then any extra feature is going to be that many more things to make sure are kept under control.

How do I end up writing so much about so little?

Caught up, mostly.

I spent most of the morning catching up on the blog for the past two weekends. I have all of the text written and posted. I do still need to pull the pictures for them off of the camera for processing. I need to post the galleries for the previous three weeks as well. :S

On to the weblock project. Part of the reason I have been working on the helper libraries is that I have been putting something off. I need to clearly define *exactly* where I plan to be by the end of the summer and map it all out. I've been trying to give a little thought to the feature set and goals while working on things that I know I'll need. I think that as soon as I am able to wrap up this section, that is my next task.

I'm not convinced that I 'll be able to make much progress in the next 35 minutes before we need to leave, but we'll see what happens.

Saturday, July 09, 2005

Ahhh... Getting Better

I'm really pleased with my results today. I found that it is really effective if you sketch out your character on paper and scan it in, then illustrate it. It's much easier to get the basic forms down on paper. Last night I sketched out the character at a few angles to develop the overall shape then scanned them in so I would have them this morning when I got to Starbucks.

I arrived at Starbucks at 6:03 AM and quickly went to work illustrating. I carefully crafted each piece so that they could be separate symbols which makes for easier animation. The first Flash movie below shows the results. It's a little big (450K) so you may have to wait for it. The goofy things at the left are shoes I was experimenting with. You can see the scanned sketch in the background.

When I got home I started on the walk cycle you see below. By using all the parts, I could re-assemble the FW in different positions easily. I looked up a tutorial for the classic walk cycle because as you have seen, I just can't get it right from memory. This one looks much better and is very usable after adding a couple more in-between frames to smooth it out. The second movie below is the resulting walk cycle with some scenery thrown in.

Friday, July 08, 2005

My lazy bum

Well, this week is pretty well shot for development for one reason or another. There was the 4th, when nobody even thought about meeting, then the 5th, when we were recovering from the 4th. On the 6th, I was laptopless. Today I was trying out a new alarm clock program, which didn't wake me. I called Cowherd when I woke AFTER 8, but didn't get an answer.

Yesterday I got some work done, but I got hung up on a stupid problem for far longer than I should have. By moving some object statically to the class level, they were being created before COM was initialized, which happens in the constructor. Stupid mistake. What makes it stupid is that I have made it before.

I am currently working on a helper class for storing settings in an xml file. It uses the msxml object to do the parsing, but basically makes it much quicker and easier to deal with in C++.

I feel still need to spend a couple of days on my helper functions before I cut myself off. Basically since I've barely spent time on them.

Top Pot Weenie

I arrived at 5:22 AM. I thought Kopp would already be here but I don't think he's going to show. Neil already said ahead of time that he would not be here because of work.

Have you ever noticed how those Top Pot doughnuts stare at you when you order a coffee at Starbucks? How rude! I tried one today so I can ignore them from now on. Ugh! I feel like a pig. It was really tasty though. I bet Starbucks owns them.

I worked on keyboard control today. I had more trouble than I expected. This seems to be a common occurrence for me. I think it would be wise for me to just plan on having trouble and if I don't, well, that's a bonus.

I had also whipped up some cheesy flaming weenie animations to test out the control. I realized that I need to put some character into my character :) I wanted to explore what personality I wanted my main character to have so for the last 10 or 15 minutes I did a character sketch on some graph paper (of course) then scanned it in and drew it up in Flash. NeilO told me today that Flaming Weenie is definitely open to interpretation. I would like your comments.

Thursday, July 07, 2005

Ghost Racers

I sat down at Starbucks at 5:15am, not bad. I've been setting my alarm for 4:50am now and I will continue to push that so long as I don't fall over dead. Today I finished the Processor and a basic delivery queue, the latter of which still uses the simple XML I've come up with. One cool function I made is getNextFile() which will recursively find the next file in a date-based hierachy of folders (or really any hierachy of folders, so long as they sort ascending properly).

The next step is the Deliverer task itself, but I won't be getting to that tomorrow. I've got some serious deadlines creeping down my neck at my job job, and it's been tough distracting myself long enough to work on the List Server in the mornings. So I will be getting up rather early, but I'm going to go to my place of employment and try to get some things under control so I can sleep easier and relax enough to spend some mental power on the List Server.

Even getting this far into our projects has been kinda tough. I mentioned my professional employment intruding itself, but there are many distractions. One of them I encounter a lot is the need for a simple, decent tool will present itself and I will scamper off to try and "do it really quick and get back". Well, this is where I become the Hare and a Tortoise manages to beat me to the finish line, because I'm dilly dallying all about.

For instance, I've just been writing my bugs to a WordPad (RTF) document and started to think about developing a "very simple" bug tracker. Or, the need for synchronizing files with our FTP server (which was already a project). Or the need for a decent source control application. No, I have to steer clear of these little things. Kopp finds the same irritation in helper libraries which he can gleefully and endlessly battle without ever really getting back to a core project.

Perfectionism is another distraction. You'll see an existing project which does the same thing and you'll use that as your bar for quality. Instead of simply meeting your own bar, you will try to exceed theirs and be disappointed when it begins to drag out, and eventually give up. This is where you need your own ghost racer, like in Mario Kart. You need to finish your project based on your intentions. Once you've finished, you've set a bar you know you can meet, because you established it. Then you just keep beating your ghost to make progress and reach the level of quality required for heavy duty competition.

I always liked racing with Bowser, but I think I'm actually more like Toad. I get easily excited and up to speed on something, but I tend to turn too sharply and fall off or even get bumped off by other people.

I thought it was a fun name for a game company...thoughts?

Just call me a code whimp

It really pisses me off when I can't get simple things I've done before to work. All I wanted to do was to get this guy to look at the mouse but if his head reaches 90 degrees, turn the body to allow the head to follow the mouse. He's even supposed to chase the mouse but I didn't get that far.

Following the mouse is pretty easy:

rotation = Math.atan2(_ymouse - mc._y, _xmouse - mc._x) * 180 / Math.PI;

The problem is I was doing it with a nested movie clip and got all hung up on local / global coordinates. I won't go into details but let it be known I was pretty irritated with myself for not getting as far as I expected.

As you can see, it does not behave as I have described. I wasted too much time just getting the rotation correct. Oh well.

Wednesday, July 06, 2005

Potty Guards

I sat down at Starbucks, with my coffee, at 5:20am. Still, I didn't get any coding done. Kopp came in around 5:40am and we ended up talking until about 7:00am. He didn't have a laptop so he couldn't actually do anything there. We discussed the List Server, or rather he asked questions and I answered them. Sure, it maybe helped to make the ideas more solid, but I still got no coding done.

After he left I reviewed my code, but then spent a bunch of time answering his questions in a written document for reference. I might've gotten to coding after that, but I had to pee.

Here's a big part of multiple people meeting that you might never think about. If someone has to use the restroom, you can simply watch their stuff while they do it. If you're alone, and in a public place like this, you have no other choice besides packing up and taking all your stuff in there. When you come out you can unpack and try to continue where you left off, but you've really chopped the head off of any momentum you'd built up.

So, when I came out of the bathroom with my backpack on my back, I simply left. I told myself I'd write in the blog and then look for some more source/version control software and perhaps install VSS on my laptop. Upon arriving at the office, however, I made the mistake of checking my mail (which was left open) and answering an item. Soon I was knee deep in migration muck and other management issues. Dear friggin' god, it's now almost 9:00am and I didn't do crap on my own thing this morning. How lame is that?

I tried My Screen Recorder on my laptop which worked well besides the fact that it generated a massive AVI file. You can have it use other compressors, but I'm thinking DivX might suck up the battery pretty quick. It was fun to use and I'll probably use it going forward to have visual documentation of my progressive (which is much more interesting than reading these posts), despite the fact the trial leaves a huge message on every frame. I can live with that so I don't have to pay 30 bucks!

Tuesday, July 05, 2005

Missing Work

I'm making this post the night before, I won't be coming in to Starbucks tomorrow morning. Technically it is the morning, but I'm talking about the kind you have after some sleep. On the bright side I had an entertaining 4th of July and put together the hardware for the List Server machine.

Monday, July 04, 2005

I left things..

I have taken several days off from our morning meetings and work in general on my project. There is some personal business that I have needed to (and still need to) attend to. I will be back and meeting again tomorrow morning.

When I left things I was working on a library of helper functions for working with ISAPI filters. I need to be careful in doing this, as it is very easy to spend more time on the support functions than the actual project. I think that I have done exceptionally well in the past year with making the decisions on where to draw the line, and actually reusing the libraries I spend time on. I will probably make at least one more ISAPI filter within the next year, so I feel justified in at least a little time on this.

The place I need to be careful is in my optimizations. I tend to get so very focused on the way that memory is used or designing the perfect algorithm that I lose steam on the main project. I guess that I have high standards for myself. I like to be proud of my work and know that it was done with the highest level of craftsmanship I could provide. In the end, I still need to have some fruit come from my labor.

I have decided that I will spend three more days on this helper library before forcing myself to move on. If this means that I have to do some things the hard way then so be it. I will at least be working on them.

Weekly Results

It's Monday, July 4th, and this is a 3-day weekend. It didn't even register with me that this was Monday and I didn't even ponder going in to Starbucks for a second until last night around midnight when Missy asked me. Doh! Anyway, if I didn't go in this morning, I might as well write the entry I should've written on Friday.

My goal for this last week was to finish a working prototype which would download and distribute mail to subscribers, the very basics. I did not meet this. I got the Downloader and Filer processes complete, but not the Processor or Deliverer. I did, however, complete a file/xml-based data system decent enough to proceed. In fact, I will probably use this system for the finished product as well, pending no horrid limitations.

Next week is four days and enough time to finish this prototype and install it on some server by Friday. I have a lot of computer parts floating around to build a lackluster server, but something to get the job done. So the coming Friday I plan on staying home to build the server and install the operating system ... Windows 98. The CPU I will be using is a 300mhz Pentium II, there is 128mb of memory, and a small hard drive. I just don't believe Windows XP will squeeze onto that. Besides, the machine merely needs to have scheduled tasks and run JScript 5.5.

We still have not found a decent source control (or version control depending on which terminology you prefer) system. Myself, I am looking for a particularly simple one which is accessed via the web (or even email) so I don't have to maintain a server. What it does need is a decent interface, side-by-side diff's, capability to download/archive an entire project, and multiple users. Cowherd is looking into Visual SourceSafe 2005 or, at the very least, VSS 6.0 with a web interface installed. I started signing up for SourceForge, but all projects there are available to the public via your choice of Open Source license.

The List Server will not be Open Source at release. If I do release the source, it will be as id did with Wolfenstein 3D and Doom: I'll open up previous stable versions while keeping the newest ones closed down.

Happy 4th everyone!

Friday, July 01, 2005