The Boston Diaries

The ongoing saga of a programmer who doesn't live in Boston, nor does he even like Boston, but yet named his weblog/journal “The Boston Diaries.”

Go figure.

Monday, May 01, 2000

“I know, let's make the same mistake!”

One of the mailing lists I'm on mentioned that the company that makes the Web Surfer made the same mistake as the Netpliance and neglected to make the purchase of the device conditional on the purchase of Internet service.

It's cheaper than the IOpener, but it lacks the LCD display that made the IOpener such a deal, but at US$50 it wasn't a bad deal.

So Mark, Kelly (who had taken the day off) and I (who consults so I don't have an office to go to per say) headed off to CompUSA to see if we could procure some WebSurfers.

The CompUSA near had no units left. We asked at the customer desk to check some other stores and we found another store that had eight units left. Half an hour and 20 miles later we arrived at the other CompUSA.

I wish I had checked Slashdot first, because it seems that the Internet service may or may not be enforced and it depends upon the store. The store we went to I think might have enforced the service. So we are WebSurfless.


“I've got the code. You've got the server. Let's make lots of money.”

Hanging out with Mark and Kelly we started discussing ways to make money on the web, or more specifically, with www.conman.org.

Mark and I are both programmers but with the upswell of the Open Source movement, it's getting hard to actually sell software. The only way to really make money in Open Source is service. Both Mark and I write software, and even make it available. But since we give the software away, how to we make money from it? Well, hire us to install, or adapt the code for your particular project. Sure, if you have the time or the expertise you don't have to hire us, but with a shortage of time or expertise, we're available.

Or by making this available I can become a well known webcelebrity and get asked for talks and seminars (yea, right).

But making money off a website isn't straightforward, nor easy. And I'm not expecting to make money (at least, directly) off this site. Indirectly, yes. But not directly.

Tuesday, May 02, 2000

“These are not the devices you are looking for.”

It's always interesting talking about programming with Mark. Somehow we got into a discussion about device drivers and how they should be named.

I had the notion of physical device drivers, and virtual device drivers. A physical device driver is a driver that drives a physical device, like a UART (Universal Asynchronous Receiver/Transmitter), while a virtual device driver would be something like a PPP (Point-to-Point Protocol) driver or a NULL device. So, the PPP device driver would be associated with a serial device driver.

Mark descimated that view.

There are no such thing as virtual devices (although the concept of a NULL device didn't come up actually). Only physical devices. Things I would consider a virtual device would be handlers pushed onto a physical device, much like the SysV Streams concept (although just because SysV has a bad implementation doesn't mean the idea is bad). So you open a physical device, then request a particular behavior, like a serial device with PPP.

I couldn't wrap my brain around that, since it smacks too much like the way UNIX serial drivers always contain TTY discipline code, but that's a problem I have (mantra: because a system does it poorly doesn't make it a poor idea).

Because as Mark pointed out, there might be a serial device that has PPP built into hardware. It seems that there are network cards with portions of TCP/IP built in, but, for instance, Linux can't take advantage of such hardware assistance because the way the networking stacks work.

It gets even worse—there are devices that the main CPU can't even talk with. They exist, but you can't program them or even write a device driver, but you can detect their presence. He even gave examples. So my assertion that all devices can be written to/read from is false.

The other concept is letting “things” or “objects” talk with each other and not caring. Like letting a network device “talk” with a serial device. The problem I have with that is how do these “objects” “talk?” This all smacks of automagic to me, much like the Tunes people talk about—no implementation details, it just happens. Like with COM or DCOM or CORBA implementations. No real talk about how it works. Lots of talk about this talking with that, but how?

But much of what Mark works on works like that. Even device drivers.

It's not so much a conversation as it is a discovery process of capabilities between two objects.

Like I said, talking with Mark is interesting.

And I hate it when he's right.


“Smile!”

I was given an older color Connectix webcam to use. The software compiled and worked without incident, although the first image was rather interesting.

The Connectix webcam was easy to take apart (since someone else already did that). The electronics in the unit are on two small boards and it looked like the two boards were being pressed together too close. A small piece of paper folded up provided a good spacer and the subsequent images were recognizable, although way out of focus.

It is easier to focus this one than my other one. But without sufficient light, the pictures appear very muddy and dark.

I'm torn. I like that this doesn't use batteries, but the image quality isn't quite as good. Oh well.


X-Files

So I exit out of X, then restart it.

“Now that's odd,” I thought, watching the screen awash in a non-synced image. “It worked a few seconds ago.”

Playing around with the settings didn't fix it. My monitor just suddenly stopped supporting 1024x768. Which sucks. I'm now stuck back at 800x600. I think it may be time to get a new monitor.

Sigh.

Wednesday, May 03, 2000

The JenniShow

I installed Real Video on my roommate's computer so I could see The JenniShow, staring Jennifer Ringly. Lord knows my computer can't handle the player. And Real Video runs just fine on my roommate's Linux system. It's nice to see something available for something other than Windows.

And I was curious. I wanted to see what the show was like, and it seems like it might be fun to do something like that.

Thursday, May 04, 2000

OD on RV

I've ODed on RealVideo all day today. Checked out what's available at TheSync and once I exhausted that, I found ShortBuzz, a collection of short films in RealVideo format.

I was particularly impressed with After Class, which is filmed in a sitcom format (and from the website I think that's the intention) but unlike most sitcoms found today, was well done and quite refreshing (the scene with the one roommate eating dinner with his date in the kitchen interspaced with shots of his two roommates eating dinner of toast in the living room was hilarious).

Other notable shorts are Guy Planet, a film about dating, Mike Feeny's Secrets of Success, a sendup of infomercials and File `F' for Bill Mickcloud, an action short.

I wouldn't recomend Roswell unless you turn the sound down. The visuals are stunning, but the narration … the narration weighs you down like large blue jeans that get wet when you jump into the lake so you can't swim and you try to shout out for help but the water goes down the wrong way and gasping for your last breath, you drown, wondering why you even wore the blue jeans in the first place.


What a force …

The path to the Dark Side is said to be easier than the Jedi way, closer to adult thought patterns and the everyday world. Sith masters don't have the luxury of stealing Force-talented children from their families—the Sith spent centuries one step ahead of the Jedi, and caring for a baby would be a severe impediment on the run.

Although the idea of Darth Sidious with a baby Darth Maul on his back has a certain bizarre charm, it probably didn't happen that way.

Did the Jedi Have It Coming?

The more I read about this stuff (especially stuff like Jar Jar, Hidden Jedi?) the more I have to ask just how deep is George Lucas? Or is there too much being read into his series?

Monday, May 08, 2000

The Platypus Effect.

“You have your `isa' hierarchy all thought out - let's say you have a “mammals” class and a “reptiles” class and so on - and you start to implement it, and along comes a platypus, a fur-bearing, egg-laying, duck-billed creature, which doesn't appear to fit in any of the classifications you've created. So what you often end up having to do is rethink your entire hierarchy, refactoring into a different set of basic categories, or maintaining several categorizations along different axes. A lot of your thinking ends up getting thrown out, as well as any implementation you've done up to that point.”

Via RobotWisdom, Encapsulation, Inheritance and the Platypus effect.


The Jury Lottery

I often go several days between checking my snail mail so the mail tends to accumulate a bit. And imagine my surprise when I checked it today.

I've been selected for jury duty!

They seem to keep decent records because you can be excused if you've been selected within the past twelve months because it's been some 18 months since I was last called.

And it's not like the first time I was called. Had I not used an excuse (“Hey! I'm a student at a university! I can't serve!”) I would have had to drive down to Miami every Monday for months until I was either selected for a Federal case, or dismissed after serving the full N-month term.

No, it'll probably be more like the second time I served 18 months ago—I arrive at this ungodly hour of 8:00 am at the Ft. Lauderdale Court House, sit around for most of the day, get called to a court room just prior to everyone being sent home for the day, spend a few hours being questioned by both lawyers and not get selected, and have the pleasure of driving home in rush hour traffic.

If it weren't for the 8:00 am arrival time, it wouldn't be that bad.

Friday, May 12, 2000

I wonder if this is as easy under Windows

Mark and I went to help John, the paper millionaire of a dotcom, set up his home network. He has a cable modem and no static IP addresses so it's a matter of configuring a Linux box to act as a firewall and IP masquerading.

John, being a paper millionaire of a dotcom, can afford to buy insanely high end PC equipment and his primary box, dookey is an insanely high end PC. I don't remember the details off the top of my head, but it's this large box the size of a small refriderator you'd find in a college dorm room. And it's running Linux.

The installation went fine. The only problem we encountered was a problem in getting an IP address via DHCP from his cable provider. The problem ended up being his currently assigned IP address was bound to a MAC address from his Windows system, so we swapped the ethercards (not wanting to wait for the timeout period) and instantly we had a good connection.

Three commands later and we had IP masquerading working on Linux.


Interesting data that flows through the network

So after Mark and I helped John the paper millionaire of a dotcom get connected, I downloaded a network monitor I wrote and installed it on his system (some problems due to some changes in the way dlopen() works internally that I was relying on).

It was interesting to see some of the network activity he gets at his end of the connection. It seems his cable provider uses private IP addresses for something. I'm not sure all of what was flowing through since the monitor only shows packet headers and not the data, but it would be interesting to find out.

Saturday, May 13, 2000

Battlefield Earth

Some friends and I went to the early showing of Battlefield Earth. All three of us were not expecting a good film, and in that we were not disapointed.

The small details were very well done. When the movie focused in on the human point of view, the aliens spoke in their own uncomprehensible language. And yet, when the focus shifted, the aliens then spoke “English” and the humans were then uncomprehensible, sounding like animals, which was understandable, considering that the aliens thought of humans as animals.

Another small detail were the breathing tubes. The aliens used them outside their dome, and the Humans used them inside the alien dome. Nice detail, as the two races didn't breath exactly the same atmosphere.

Yet another one: the humans breaking into a weapsons storage closet, stealing guns and when they try to use them, find they have no ammunition. “Silly humans,” goes the evil alien, “Do you honestly think we'd store the guns loaded?”

Small details like that. Good details.

It was the large details that they missed. Big time. Plot holes large enough to drive a planet through (just what are the odds that a thousand year old flight simulator will still work? Or that aliens as incompetent as those weren't wiped out sooner?)

This almost made the “It was so bad it was well worth the six bucks” list, but not quite.

Sunday, May 14, 2000

MONitoring the NETwork

I should be working on mod_blog but instead I spent the day working on monnet, my network monitor. I have problems compiling it for the latest RedHat releases, due to changes to dlopen() (more specifically, the man page states that upon opening the shared library, if you have defined _init() with external linkage it'll be called automatically by dlopen() but that doesn't seem to be the case. I'll have to explicitely call it now).

I also want to add some functionality to the program, like accumulating statistics about the number of packets and the amount of traffic. I also like its ability to view the traffic live, and in a format that easier (for me) to read then tcpdump.

Monday, May 15, 2000

More MONitoring of the NETwork

comment on monnet—odd stuff you see watching the network So I'm still working on monnet. I basically started over from scratch, reworking the code although the basic structure is the same from the old version. The output from the program looks like:

0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.72.81   TCP     25945    80  A    
00C07B4D7D81 0040332E103C IPv4        205.229.72.81   208.26.72.3     TCP        80 25945  AP   
00C07B4D7D81 0040332E103C IPv4        205.229.72.81   208.26.72.3     TCP        80 25945  AP  F
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.72.81   TCP     25945    80  A    
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.191  TCP     25944    80  A   F
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80     S 
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.72.81   TCP     25945    80  A   F
00C07B4D7D81 0040332E103C IPv4        205.229.74.218  208.26.72.3     TCP        80 25944    R  
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  A  S 
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80  A    
00C07B4D7D81 0040332E103C IPv4        205.229.72.81   208.26.72.3     TCP        80 25945  A    
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80  AP   
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  A    
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  AP   
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80  A    
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  AP   
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  A   F
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80  A    
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     25950    80  A   F
00C07B4D7D81 0040332E103C IPv4        205.229.74.190  208.26.72.3     TCP        80 25950  A    
0040332E103C 00C07B4D7D81 IPv4        208.26.72.3     205.229.74.190  TCP     26000    80     S 
02608CD87517 00C07B4D7D81 ARP         A:request ETH:IPv4 208.26.72.2     208.26.72.1    
00C07B4D7D81 02608CD87517 ARP         A:reply   ETH:IPv4 208.26.72.1     208.26.72.2    
0040332E103C 00C07B4D7D81 ARP         A:request ETH:IPv4 208.26.72.3     208.26.72.1    
00C07B4D7D81 0040332E103C ARP         A:reply   ETH:IPv4 208.26.72.1     208.26.72.3    
00C07B4D7D81 0040332E103C IPv4        208.26.72.1     208.26.72.3     ICMP    redirect host             208.26.72.4    

And the report it can generate:


Total:                                                         64,813   13.45M
    IPv4                                                       64,017   12.55M
        ICMP                                                      245   16.34K
            echo reply                                             18    1.23K
            error                                                 147   10.15K
                host unreachable                                    4     436 
                port unreachable                                  142    9.68K
                comm prohibited by filters                          1      46 
            redirect                                                8     368 
                host                                                8     368 
            echo request                                           18    1.21K
            TTL                                                    54    2.43K
                > 0 during transit                                 54    2.43K
        TCP                                                    58,998   11.66M
        UDP                                                     4,774  516.03K
    ARP                                                           796   33.38K
        A:request                                                 425   17.35K
        A:reply                                                   371   16.03K

Generating that report while the program is running was tricky. I didn't want to loose any packets so creating a thread or process (I am doing this under Unix) to handle that should minimize the number of packets lost. I'll skip threads since personally I don't like the way pthreads works (I think the API sucks but that's me and I really can't quantify it more than that) and that leaves fork() (at least under Unix).

But I don't feel that good about the code, since I'm now dealing with signals, and the semantics of signals under Unix is … well … it sucks. I'm sure I have race conditions in there.


Stripping strips from a website

I started reading a new on-line strip, Player Versus Player. Seems promising but I'd like to read the archive, of which it reaches back to May of 1998, making it two full years of archives to go through.

It's a simple enough matter to write a program that downloads the entire archive of strips:


while(1)
{
  sprintf(filename,"%d%02d%02d.gif",year,month,day);
  sprintf(url,"http://www.pvponline.com/archive/%d/pvp%s",year,filename);
  sprintf(cmd,"lynx -source %s >%s",url,filename);
  system(cmd);
  sleep(10);		/* be nice on their server */
  day ++;
  if (day > daysinmonth(year,month))
  {
    day = 1;
    month++;
    if (month > 12)
    {
      month = 1;
      year ++;
      if (isthistoday(year,month,day)) break;
    }
  }
}

I feel somewhat odd about doing that though, seeing how they get their revenue through advertising (not that I agree that's the best way to make money, but that's beside the point). Well, that and if they check their logs and see a bunch of requests for just the strips, every 10 seconds, well, in case I do end up liking the strip I don't want to be banned from their server.


Elapsed time is …

Okay, in monnet I'm keeping track of how long the program runs so when the report is printed, you can see how much time has elapsed since the program started. I want the display to look something like:


10d 14h 13m 33s

Make it easier to read than something like


915213s

Under ANSI C, you have the various functions under time.h and the “official” way to calculate elapsed time is to call difftime() (as you portably can't assume that time_t is in sections, or even a integral type). That returns, as a double, the number of seconds between the two time values.

The problem is, you can't really take that result, stick it into a struct tm and call mktime() to renormalize it, as the value could overflow an int (which is what each field is defined as in struct tm). An int is defined as a minimum of 16 bits, which isn't even enough to record the number of seconds in a day. Sure, on modern systems ints are probably 32 bits in size, but that only leaves you some 68 years before the seconds overflow (it should be fun in 2038).

So it's more portable to do the math directly.

So, I thought I'd be cute and try to do the minimal amount of math possible, and in looking over math.h I saw modf(), which splits a double into its integral portion and fractional portion. So, I tried:


  diff = difftime(end,start);

  diff /= 60.0;
  tmp   = modf(diff,&diff);
  sec   = tmp * 60.0;

  diff /= 60.0;
  tmp   = modf(diff,&diff);
  min   = tmp * 60.0;

  diff /= 24.0;
  tmp   = modf(diff,&diff);
  hour  = tmp * 24.0;

  diff /= 365.0;
  tmp   = modf(diff,&diff);
  day   = tmp * 365.0;

  year  = diff;

only to have it fail miserably. Even several variations on that didn't work. So I bit the bullet and did it the old fasion way:


#define SECSMIN         (60.0)
#define SECSHOUR        (60.0 * 60.0)
#define SECSDAY         (60.0 * 60.0 * 24.0)
#define SECSYEAR        (60.0 * 60.0 * 24.0 * 365.2422)

  diff = difftime(end,start);

  year = (int)(diff / SECSYEAR);
  diff -= ((double)year) * SECSYEAR;

  day = (int)(diff / SECSDAY);
  diff -= ((double)day) * SECSDAY;

  hour = (int)(diff / SECSHOUR);
  diff -= ((double)hour) * SECSHOUR;

  min = (int)(diff / SECSMIN);
  diff -= ((double)min) * SECSMIN;

  sec = (int)(diff);

Wednesday, May 17, 2000

It's off to the Races

I was right, there were race conditions in monnet. Mark helped me in locating them and my only comment on the whole thing is: Unix signal semantics suck. Although Mark assures me that any form synchronization is nasty, although I still don't see why it has to be so difficult.

To be portable, the only thing you can do in a signal handler is do a simple assignment to a variable declared as volatile sig_atomic_t. Anything else could lead to problems. So, in monnet I now have:


volatile sig_atomic_t g_sigint  = 0;
volatile sig_atomic_t g_sighup  = 0;
volatile sig_atomic_t g_sigchld = 0;

static void handler_int()
{
  g_sigint = 1;
}

static void handler_hup()
{
  g_sighup = 1;
}

static void handler_chld()
{
  int status;

  g_sigchld = 1;
  wait(&status);
}

Granted, that isn't proper ANSI C function headers, but there is no real consensus as to what signal handlers take (on some systems, a single integer parameter, others, no parameters, others several parameters) so that's about the best you can do. I am taking a risk with handler_chld() in doing the wait() but POSIX lists wait() as being callable via a signal handler so hey, why not live on the edge here. Now, elsewhere, the main code:


while(1)
{
  while(1)
  {
    s = read( /* ... */ )
    if (s <= 0) break;
    /* ... */
  }

  if (g_sighup)
  {
    g_sighup = 0;
    generate_report();
  }

  if (g_sigchld)
  {
    g_sigchld = 0;
    g_child   = 0;
  }

  if (g_sigint)
    break;
}

/* ... */

static void generate_report(void)
{
  if (g_child != 0)
    return;

  g_child = fork();

  if (g_child > 0)		/* parent resumes	*/
    return;
  else if (g_child < 0)		/* error?  just resume	*/
  {
    g_child = 0;
    return;
  }

  /* ... */
}

SIGINT just breaks out of the main loop and terminates the program (with some cleanup). SIGHUP generates a call to generate_report() which creates a new process (if one hasn't already been created) to generate the actual report.

If I didn't handle SIGCHLD, I would end up with zombie processes (lovely in that even if I don't care about the child, I still have to wait() for it). Now, it is conceivable that a SIGHUP sent at the right time would fail to create a report file, but would only happen if a previous SIGHUP had been given to generate a report file and was just finishing up. But I can live with that.


Mmmmmmmmmmmmm … roasted ants …

I smelled something burning in the Computer Room. That is not a good sign. So I start investigating when I remember I had this same problem last year about this time.

Sure enough, I check the halogen lamp and there are dozens of dead roasted flying ants in the lamp. It's ant mating season again in South Florida and somehow a bunch always manage to get into the house and get roasted by the halogen lamp.

Sigh.

Thursday, May 18, 2000

Connan the Domain

I want to test my network monitor on a rather busy server colocated at Atlantic Internet. There's interesting traffic there and I want to make sure I'm properly decoding the traffic to monitor it.

So I try to transfer it from my home box via FTP. Only I get a connection refused. “What the?” I think. Then I look carefully at where I'm trying to transfer the file from: linus.slab.connan.org. Connan.

Hmmmmmm …

Check out the web page. Don't bother—it's a domain name auction site if you can believe it. Only it's not other people auctioning off domains they own—it's the auction company itself auctioning off the domains. And it looks like they've wildcarded the domain. Both “www” and “linus.slab” come up with the same web page.

I wonder if I bid for “www.connan.org” and have a friend bid for “linus.slab.connan.org” who would win? Or would we both win our respective “domains?”


“Take my ticket. Please … ”

I checked snail mail again today. Yes, I don't check it often, something like a few times a month, when I remember.

Anyway, I got spammed!

Well of course everybody gets junk snail mail, but I just love the fact when the DMV releases information about speeding tickets. Since I last checked my mail, I received seventeen (that's 17) postcards and brochures from ticket clinics, lawyers, traffic schools and one comedy club traffic school (I kid you not).

Seventeen!


It was 20 years ago today that Helen blew her top.

This is the 20th anniversary of Mount Saint Helen's first eruption.

Twenty years. I remember watching this on the news. Man it's scary how time flies.


RAID problems

Hi. My name is Agent Conner. This is my partner, Agent Grosberg. This is our story. (insert Dragnet Theme here)

At 2130 we recieved the call from John the paper millionaire of a dotcom. He has a problem. A computer problem. A major computer problem and he's calling in the experts. That's us.

It seems that there is a problem with his RAID system (Mark, I need details on the RAID system). Upon investigation it seems that the hardware is fine. It's the software that is a problem. Or rather, the operating system has a problem that leads to a corrupt file system.

Rule 1. Just because you have RAID doesn't mean your data can't get lost or corrupted.

The operating system in question is Microsoft Windows NT 4.0 Service Pack 3. There's a reason he's at Service Pack 3—it works with his RAID system, and that was hard enough to get running. His entire dotcom runs under NT. All his data, his critical data, relies upon Microsoft Windows NT to be stable.

Rule 2. No Fortune 100 Company uses Microsoft Windows NT for financial or critical applications. None.

Corollary 2: Microsoft is a Fortune 100 Company.

From our investigation we were able to asertain that Microsoft Windows NT has a problem with filesystems that contain over four million files. John the paper millionaire of a dotcom has a filesystem with over four million files. John's data is slowly being corrupted.

Rule 3. See Rule 2.

John the paper millionaire of a dotcom now knows the difficulty of using Microsoft Windows NT for a critical application. But that still doesn't help him.

Any attempt to delete, copy, move or rename the file fails with a modal dialog box popping up informing the user that the operating system cannot delete, copy, move or rename said file. You have to click “OK” to make it go away.

Rule 4. Any software that requires user intervention can't be used in a server capacity.

The backup program John uses has failed multiple times in face of said files. Therefore it is proving difficult to get a reliable backup of the four million plus files that John needs to run his business. Microsoft does have a patch available for said bug, but the time frame required to run CHKDISK is unacceptable, possibly taking up to four days to run.

Rule 5. Any backup software that cannot run in the face of errors (even if told to ignore said file and carry on) should not be used in a server capacity.

We did manage to test the GNU tar program under Microsoft Windows NT and it carried on, ignoring the corrupt files. But there doesn't seem to be a way to actually reference the tape backup unit from the command line, and there is not enough free space to backup onto disk. And the number of corrupt files seems to be relatively few, about a hundred.

But since you can't delete, move, copy or rename the files, it's hard to work around them. Another method would be to put the RAID system into read-only mode, make a backup of the RAID system (by swapping drives in and out of the hot-swappable RAID system to build a backup set of drives with the data on it, set up a separate system with said RAID backup, and go from there) but we have to see what John's bosses say to that (John became a paper millionaire of a dotcom by having his dotcom being bought out).

The case is still open …

Friday, May 19, 2000

Whiffle Golf Balls of the Rich

After doing as much as we could with John the paper millionaire of a dotcom's RAID system, Mark and I went over to John's house.

John had bought a set of whiffle golf balls and a floating pool green. You practice pitching golf balls from the side of the pool onto the floating pool green and there the three of us were, pitching whiffle golf balls into the pool and onto the floating pool green and it's 12:30 at night.


World Class Software

But how much work the software does is not what makes it remarkable. What makes it remarkable is how well the software works. This software never crashes. It never needs to be re-booted. This software is bug-free. It is perfect, as perfect as human beings have achieved. Consider these stats: the last three versions of the program – each 420,000 lines long-had just one error each. The last 11 versions of this software had a total of 17 errors. Commercial programs of equivalent complexity would have 5,000 errors.

. . .

Software may power the post-industrial world, but the creation of software remains a pre-industrial trade. According to SEI's studies, nearly 70% of software organizations are stuck in the first two levels of SEI's scale of sophistication: chaos, and slightly better than chaos. The situation is so severe, a few software pioneers from companies such as Microsoft have broken away to teach the art of software creation ( see “Drop and Code me Twenty!” )

. . .

In this software morass, the on-board shuttle group stands out as an exception. Ten years ago the shuttle group was considered world-class. Since then, it has cut its own error rate by 90%.

Via Slashdot, They Write the Right Stuff.

I love stuff like this.

Saturday, May 20, 2000

Associations are Eeeeeeeeeeeeeeeeeeeevil

Every Saturday there's a group of us that meet at my friend Bob's house for a gaming session. Bob has been doing this for at least ten years (I only joined a few years ago). Well, for the past month or so he's been rennovating his house so we've been using the clubhouse in his development for our weekly gaming sessions.

So we were at our gaming session this evening when two women enter and state that we are not allowed to be there unless he's rented the clubhouse. Bob perries that as a resident, he's allowed to be there as long as he doesn't claim exclusivity and invites the two women to join in the session.

They decline the invitation and threaten to take the matter to the rest of the Board. They then leave.

Some twenty minutes later they come back, armed with the Rules and Regulations of said Association. The Rule (#2? I don't recall) specifically states that any Member of the Board can request residents to leave the “Common Areas” and said residents have to comply. There is nothing in the Rules that govern who can and can't use the clubhouse. There are rules to rent the clubhouse (a minimum of 26 people, maximum of 75, $75 rental fee plus a $250 returnable deposit, among other things).

So we left.

Associations are eeeeeeeeeeeeeeeeevil I tell ya. Eeeeeeeeeeeeeeeeevil.

Sunday, May 21, 2000

Croquette of the Rich

So it's a Sunday. At 11:30 pm. So what? I show up at John the paper millionaire of a dotcom's house along with Kelly, Jeff and Mark to play Croquette.

I missed the first game, but I showed up in time for the next one. John is wearing a headband with light attachted to it, while a flash light is being passed around the rest of us.

I think I mentined it being 11:30 pm. Okay, good.

Anyway, the game proceeds with John winning easily, Kelly making a strong comback to win second, myself narrowly beating out Mark for third with Jeff coming in last.

We then went down to the lake to play with John's radio controlled motor boat for a bit. Then we all pretty much left afterwards, as most of us have to work the next morning.

I wonder what his neighbors think of all this?

Monday, May 22, 2000

Scary revelation

I had a rather horrifying revelation today. For some reason I started thinking about my high school German teacher, Frau Humphreys (cool teacher—she used to send students on donut runs) and how she took off a year or two to have her child.

The revelation I had is that her child is now old enough to attend high school.

Man, I'm getting old.


Application of a cluestick

From my Internet spy division:


[spc]linus:/home/spc>telnet www.linux-supportgroup.com 80
Trying 208.55.66.116...
Connected to www.linux-supportgroup.com.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.linux-supportgroup.com
Connection: close

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 22 May 2000 20:29:35 GMT
Connection: close
Content-Type: text/html
Set-Cookie: ASPSESSIONIDQQQQQZEZ=LMILFHIANBCGKAHKJGHHCKKC; path=/
Cache-control: private
Transfer-Encoding: chunked

0

Connection closed by foreign host.
[spc]linus:/home/spc>

Someone needs a cluestick I think.

Tuesday, May 23, 2000

“We want your money, but not over the phone.”

The information I have about paying the ticket includes a day to pay by phone. Dial this number, seven days a week, MasterCard, Visa, American Express and debit cards accepted (and I have a debit card).

Cool! I think. So I pick up the phone and dial.

Busy. Only I get a recording from the ever so helpful phone company that for 75c I can have the phone company try the number for up to half an hour and ring me back. I hang up.

By the fourth try, I figure I'll take the callback option.

A few minutes later the phone rings. I pick it up, and the other phone is ringing. And ringing. And ringing. And ringing.

After 30 rings I'm beginning to think I punched in the wrong number and I wasted 75c. So I hang up, and try again, this time with the area code.

“You do not need to dial the area code when making this call. Please hang—”

Okay, dial without the area code, making sure I get the number correct.

Busy.

Try. Busy. Try. Busy. Try. Busy. Try. Ring. Whoops, don't hang up so fast. Ring. Ring. Ring. Ring. Ring. Ring.

So much for paying this ticket by phone.


Yet another free alternate operating system

Via kuro5hin is a link to AtheOS, another home brewed operating system that unlike most, actually runs and is serving up its own website. Seems promising although I haven't looked at the sources yes (multimegabyte downloads).

Wednesday, May 24, 2000

“No one expects the Spanish Inquisition!”

Oh, now that just sucks.

I'm trying to get some software I wrote released under the GPL. The software in question, developed under and for Unix, is owned by a company that no longer uses said software, being that they switched completely over from Unix to Windows NT. I've been slowly working on this for several months now. Not continuously, but as I remember to do so.

The code has an interesting history. It's a library of code I developed over a period of several years working with Armigeron Information Services, Inc. It became part of the property the above company bought when they bought us out a few years ago, but since we left, the above company has since changed to NT and the library has pretty much languished in obscurity ever since.

I was working with a friend of mine at the company who was in charge of the IT department there. He was willing to sign off on the code, but my friend Chuck, who sold the code in the first place, wants the president of said company to sign off on it.

Last week we sent a letter to the president outlining what I want to do and asking them to assign the rights back to me (or at least allow me to GPL the code and release it). I haven't heard back from them and just now decided to call my friend to see what's going on.

<RANT>

Not remembering the number of the company, I decide to check their website. What do I see?

[USEMAP:————.gif]

(Oh, did I mention I'm using Lynx? It's faster than loading up Netscape). Fine. I click the link.

[USEMAP:————.gif]

MAP: http://www.————.com/#imagemap

1. http://www.————.com/index1.html
2. http://www.macromedia.com/shockwave/download/alternates/index.html

Fine. I click on the first link, knowing that Macromedia does NOT make a plug-in for Lynx.

[EMBED]

That's it. Completely useless. All I'm trying to do is find their @#$@#$@# phone number and there is NO way to navigate that site without the proper plug-in.

In-BLOODY-sane.

So I find the number the old fasioned way, I looked it up in the phone book.

</RANT>

“Hello, the Such-n-Such Corporation. How may I help you?” inquires the receptionist.

“Yes, may I speak to So-n-So please?”

“I'm sorry, but So-n-So no longer works here,” said the receptionist. “Is there someone else that can help you?”

“ … ” I was without speech. Granted this is someone I don't normally hang out with on a day-to-day or even a month-to-month basis, but I wasn't expecting this at all.

“Sir?”

“Ahhhh … oh … ummm … no, that's quite alright. Thank you,” and I hung up.

Great. Now what?

Thursday, May 25, 2000

“And then a week later … ”

This is the 20th anniversary of the second eruption of Mount St. Helen's.

Captain Napalm vs. the Databases

I had written a rather long and involved rant on why I hate databases. Upon re-reading it I came across sounding whiny. Way to whiny so I'm scrapping it and doing a recap here.

I hate databases. Primarily because I just don't understand the mindset behind them. It seems that the concept of “dumping” a database (extracting the data in a format suitable to put into another database) is not a concept that the database boys have. My friend Mark looked at me funny when I even mention doing such a thing.

“Just question it,” he kept going. “Tell it what data you want.”

“All the data,” I kept saying.

“You don't want all the data,” he said.

“That's precisely what [the developer of the database package I was using] kept saying. ALL I WANTED WAS THE @#$!#$ DATA! What's so wrong with that?”

“Because you don't want or need all the data,” Mark kept saying. Our friend Kelly agreed with Mark. “You need to let go this silly notion of having to know the exact layout and contents of everything.”

Like I said, it's totally alien to me. They also kept asking me what package was used to create the database and that I could use SQL to obtain the data. I had no clue as to what library or package was used to create the database—all I was told was get the data. Why can't I just get the data?

Why is that so difficult for database weenies to comprehend?

This is one reason why I hate the damned things.


Captain Napalm vs. the Databases, II

To be fair, Mark did make several good arguments for databases, which is more than I got from a certain professor I had at college, or from fellow cow-orkers at various jobs, or even the devloper of a database package I had to extract data from.

But it just bugs me that most of this crap is taken “on faith” with no real explanation behind it. Something like Unix weenies when they smugly say “Unix is obviously better than everything out. Here's a nickel kid, buy yourself a real computer.”

Gee, thanks. Why, exactly, is Unix better? Certainly it's not just because modems are soooooooooooooo easy to install, right?

Better stop now before I start to sound whiny again.


Mark vs. the Evil Empire

My friend Mark hates Microsoft.

No, I mean more than most people in our industry.

Perhaps it would be best to have Mark tell you how much he hates Microsoft in his own words:

I am trying VERY hard not to tell them just how I really feel and that I would be happy to fly over to Redmond and fuck Bill Gates in the eyesocket.

I guess you could say he pretty much hates Microsoft.

Friday, May 26, 2000

email relaying

Rob, my roommate, just found a hole in sendmail. It's not an exploit that allows one to gain access to the machine, but it would potentially allow someone to use a system running sendmail as an open relay.

It's not that easy to exploit (thankfully) but theoretically it is.


Mark vs. the Redmond Behemoth

Mark, as you may know by now, hates Microsoft, yet his job requires him to program under Windows NT.

Now, why does he hate Microsoft, and Windows NT? Because it isn't reliable for what he's doing (past project—a phone switch under NT and if that doesn't make you shudder then perhaps you won't mind much if you can't dial 911) yet his job, which he has relunctantly accepted, is to make it reliable.

Towards that end he found a race condition in the NT kernel.

Huge surprise, I know.

Over the course of three hours he was able to work his way up the tech support ladder at Microsoft (“No, it's not my code you moron! I don't write in VB! It's VC++ and no, I know it's not in my code! It's in NTblahblah.DLL now transfer me to someone who can help me!”) and ended up talking to the developer of that particular piece of the NT kernel.

“Yup,” said the developer. “That's a bug in our code all right.”

“I'm not arguing that with you. I know it's your bug, but can you fix the bug?”

“Yup, that's a bug.”

“I'm not arguing that with you. I know it's your bug, but can you fix the bug?”

“Hmmmm …. nope. That would require a design change and we [Microsoft] no longer support Windows NT. I can be fixed for Windows 2000 though.”

“We can't use Windows 2000,” Mark said. “Our code requires NT.”

“Sorry, can't fix it then.”

It's nice to know that Microsoft stands behind their quality software.

Saturday, May 27, 2000

An Easy Way to Update your Webpage

I suppose I should work on the paying project but instead I am working on a fun personal project.

One of the things I want for this weblog/journal is an easy way to update it and to that end, I'm planning on writing code such that I can send in entries via email, as well as enter them on a web page.

Well, a friend of mine, Spring Dew recently lamented about the difficulties she has to endure to update her online journal.

Well, I thought. That's easy enough to fix.

So I spent an hour or two writing an email to webpage gateway for her use. I figure I can recycle the code later when I start using it for this but in the meantime I can get some feedback and experience in doing this.

Sunday, May 28, 2000

Mission Impossible II

Now balletic violence is John Woo's thing, and I'll admit there's a fluidity (if no actual realism) to the fight scenes. But there's a fluidity to sewers, too, and that doesn't make them any nicer to watch for minutes at a time. The final fight sequence was especially tedious.

Bernard Kelly in a user submitted review to The IMDB

Saw Mission Impossible II today with some friends and for a John Woo film, it was pretty dull. I kept wishing I could fast forward through parts. The action sequences were well done, but the constant slow motion effects got tiresome after awhile, and I felt like I was watching a second rate James Bond rip-off than a Mission Impossible mind-bending caper.

And like Battlefield Earth, the small details were good, like one of the heros seeing the reflection of the obligatory LED countdown from a bomb underneath the van reflected off a puddle into a rear view mirror, or the line Anthony Hopkins says to Tom Cruise: “This isn't Mission Difficult, Mr. Hunt. It's Mission Impossible.”

But the big details … totally missed.


Quaking in the office

After the movie and dinner, we headed over to my friend Greg's office and played Quake for way too many hours.

Way too many hours.

Monday, May 29, 2000

Easy day off

I spent Memorial Day at John the paper millionaire of a dotcom's house, along with Mark, Kelly and Jeff K.

Hamburgers, hotdogs, organic soda (John's wife is very big on organic food stuff) and chips, along with horse shoes, swimming and hanging out in the jacuzzi.

Wednesday, May 31, 2000

Captain Napalm Goes To Court

So today's the day I go off to the county courthouse to sit around a large room waiting to be called for a trial.

Yup, I've been called to jury duty.

I arrived a few minutes past 8:00 am and rush into the Jury Assembly Room to a video tape describing the process of jury selection and trial. I find a seat and watch. It was an okay video of the instructional type but towards the end it got rather annoying—disolves to the US Flag with “God Bless America” playing in the background and a rambling narration informing us citizens that it is our God-Given duty to enjoy jury duty for there is nothing better than upholding our Judicial System, the one with a Jury of Our PeersTM.

Only, if you bother to read the Constuitution:

The trial of all crimes, except in cases of impeachment, shall be by jury; and such trial shall be held in the state where the said crimes shall have been committed; but when not committed within any state, the trial shall be at such place or places as the Congress may by law have directed.

The U. S. Constitution, Article III, Section 2.

Nothing at all about having a jury of our peers. Nice to know some myths about our government are propagated by our government.

Anyway, I sat in the Jury Assembly Room, reading R. Buckminster Fuller's Synergentics and Synergetics II and waited for my number to be called. Around 10:30 am it was, which then meant I had to wait around for the judge to call us to his court room.

At 11:30 am we were informed that the judge who we were selected for didn't need us (case being settled out of court) and thus we were thrown back into the Jury Pool, but we could take the next hour or so off for lunch. Just be back by 1:15 pm.

I ate at the Burger King across the hall (yes, there was a Burger King in the court house). I went back to the Jury Assembly Room and napped for a bit.

Now, we were informed that if we were not selected for a case by 3:30 or 4 pm, we could then go home having served our obligations and it was with an hour left that I got called for another judge.

It seems that the jury for this judge selected earlier in the morning were all dismissed due to some legal mumbo jumbo and another jury was being selected, about 30 in all. Ten of the jurors had been selected earlier that morning (I wasn't one of them—this being a different judge than the one I had been called for) and when the judge was informed, he immediately dissmissed them before even heading down to the court room. They had difficulty finding enough remaining jurors not selected and the judge only ended up with 23 or so jurors to interview.

By 3:00 we were in the court room, sitting down and the charges of the defendant being read. Afterwards, the judge asked if anyone might be biased towards the defendant due to the charges and immediately seven people were dismissed (but not after the judge expressed some concern that the defendant might not get a trial because of insufficient jurors).

Eighteen left and over the next hour an a half we were interviewed by both sides. I was asked a question and immediately after answering it I knew, I just knew I would be selected (and I could understand why it might be difficult to select a jury for this particular trial—involving underage children).

Sure enough, after a few minutes deliberation where we potential jurors were milling about outside the court room, we were called back in and I was one of seven jurors picked. The rest were dismissed and we seven were then sworn in, and given instructions to be back at the court house on Friday at 10:00 am.

We were given official Jury PinsTM and shown where to show up on Friday.

Great. Another early morning.

Obligatory Picture

[Don't hate me for my sock monkey headphones.]

Obligatory Links

Obligatory Miscellaneous

You have my permission to link freely to any entry here. Go ahead, I won't bite. I promise.

The dates are the permanent links to that day's entries (or entry, if there is only one entry). The titles are the permanent links to that entry only. The format for the links are simple: Start with the base link for this site: http://boston.conman.org/, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

http://boston.conman.org/2000/08/01

You can also specify the entire month by leaving off the day portion. You can even select an arbitrary portion of time.

You may also note subtle shading of the links and that's intentional: the “closer” the link is (relative to the page) the “brighter” it appears. It's an experiment in using color shading to denote the distance a link is from here. If you don't notice it, don't worry; it's not all that important.

It is assumed that every brand name, slogan, corporate name, symbol, design element, et cetera mentioned in these pages is a protected and/or trademarked entity, the sole property of its owner(s), and acknowledgement of this status is implied.

Copyright © 1999-2017 by Sean Conner. All Rights Reserved.