October, 2002

Untitled

Submitted by reeses on Thu, 2002-10-31 21:03.

I think lamb korma/kurma/curma/corma/etc. can rightly be called Indian Love On Rice. I went to my "normal" (for working in this office in NY) indian food place and ordered a bit to go.

And waited. And waited. And waited. Every time I go to this place, I order takeaway, and sit around for ten to thirty minutes for my food to be prepared. Every time, I leave thinking,"I really need to call ahead next time." Every time, I forget. I go just often enough, about every four weeks, for the lesson to be lost.

But lamb korma is worth it. The only word I understand is "lamb", but I think the rest means,"in a nummy, tasty, sauce that makes me want to lie down and have a pleasant nap." It's a total gut bomb, compounded by the serving size being tuned to two healthy appetites. I think a couple shots of espresso or turkish coffee is required to make it through the day.

There's a perverse inverse relationship between how edible indian dishes look and how good they taste. If you can identify everything on the plate, it's not going to taste good. If you can identify classes of foodstuff, such as "meat", "vegetable", "gloopy sauce", then it's going to be pretty good. If you have no idea what you're putting your body around, it's going to curl your hair, baby, or straighten it if it's already curly.

Untitled

Submitted by reeses on Thu, 2002-10-31 07:53.

While away from my desk tonight, I got a call from my mom. I didn't call her back while at work, but waited until I got home. One of the good things about being on the opposite coast is that I can call them after midnight my time without being rude. My mom answered, and then very quickly turned me over to my dad. Usually, she really likes chatting and asks about the cats, etc., so I was immediately worried.

It turns out that the latest round of biopsies on my father's esophagus revealed 12 "negative" and one "cancer cannot be ruled out" samples.

Of course, using the C-word is like using one of those other C-words -- it's not done lightly. Even if they mean that "half a cell looks possibly cancerous, but this is inconsistent with every other cell in any of the samples", your attention is very immediately focused on the C-word.

So, they're flying to Rochester, MN, to have a 2cmx2cm chunk of his esophagus removed. On the frickin' day we're launching this project. I wish I was on the other major project my company is working on right now, as it's in Minneapolis, not too far from Rochester. Well, nearer than NY is, anyway.

He's been watching this for years, and after a remarkable remission in high dysplasia, this is the first real worry. Even more ironic, he got news of this the day he went in for an endoscope and was told he's starting to have diverticulitis. I'm so not looking forward to aging.

Stress, stress.

Untitled

Submitted by reeses on Thu, 2002-10-31 07:53.

I wanted the ability to compose log entries offline, and then have a tool post them when my computer is back online. I thought about doing something clever with my email, and writing a mail->blog filter (which I will probably end up doing anyway) that sits in procmail and looks for a formatted message. As it was, I stumbled upon this post when searching for "ruby blogger".

So, I wrote the following script to take all unposted files *.np from c:\posts (hey, my laptop runs win2k), suck them into a string, spit it over xmlrpc to the blogger server, and then touch a file *.xx to indicate that it has been submitted. The reason I did the stamp instead of renaming the file is that File#rename seemed to behave strangely on this machine, and I'm too tired to suss it out.

The script is below. You'll need to change the blogId, username, and password, unless you happen to have those equal to the bogus values.

#!/usr/local/bin/ruby

require "xmlrpc/client"

server = XMLRPC::Client.new( "plant.blogger.com", "/api/RPC2" )
blogger = server.proxy( "blogger" )
appKey = "EFC73821AFC4CBEE72B07D4F12D5469C445AD923EF00"
blogId =
username =
password =

Dir["C:/posts/*.np"].sort! { | a, b | File.new(a).mtime <=> File.new(b).mtime }.each {
| f |
stamp = f.sub(/.np$/, ".xx")
unless FileTest.exist?(stamp) then
contents = IO.readlines(f)
post = contents.join
puts "Posting article
" + post + "-----------"
blogger.newPost( appKey, blogId, username, password, post, true )
`touch #{stamp}`
end
}

Untitled

Submitted by reeses on Thu, 2002-10-31 04:09.

Wow.

Sometimes, I'm really amazed how I just can't understand someone's point of view on something. That is, I can understand the motivating factors, but they just seem somehow...ignorant, misinformed, or just confused. Especially for things that appear eminently obvious to the most casual observer.

Kat went to a seminar, presentation, or somesuch on "The New Glass Ceiling". Basically, female attorneys who choose to have children are somewhat penalised by their inability to spend much more than 50 hours at work per week. Because of this, they don't get the best cases, they don't get the best salaries, and they don't get on the partner track.

I think I made some comment along the lines of,"That makes sense. If a person's quality of work remains the same, but their capacity for work is diminished, they shouldn't receive the same compensation."

Boom! Just as I couldn't understand (at an internal level) a viewpoint contrary to the one just stated, she could not accept mine. She ranted about how it wasn't right, that our country has misprioritised family and work, etc. etc.

So, I tried to reframe my perspective. "OK, let me say this another way -- if I work 100 hours per week, all else being equal, I should receive greater compensation than someone working 50 hours per week." You have a function of three parameters: quality of work, quantity of work, and value of work, resulting in compensation. C = f(q, Q, v). If q and v are constant, C will vary with Q. For my function, you increase Q, you increase C. It should hold true for any commodity -- quality times quantity times value equals price. (factoring a discount for bulk purchases) Who can disagree with that?

Boom! Guess who??? :-)

Anyway, at this point, she told me not to talk to her about it because she had very strong opinions on the matter. But that didn't keep her from making...one...last...point. I told her to stop talking about it, and tried to talk about the weather. Also apparently the wrong thing to say.

"I have work to do. Bye."

Sheesh. Of course, I just realised it's PMS week. Not that it's the only reason for the outburst, but it puts us at a disadvantage anyway, because she gets particularly quarrelsome around that time.

I'll just leave it at this -- communism is evil and stupid, even if it's your sweetie espousing it. It actually greatly concerns me that she's nearing 30 and coming back to that way of thinking. It must be frightening for a woman who wants a family, looking forward to a legal career where she has to make certain hard choices. Again, I think it's necessary for her to reframe her perspective and her expectations. There's no way she's going to excel in a major law firm if she has children and chooses not to work more than 40 hours per week, especially if she does it early in her career. But there are so many assumptions inherent in that sentence: excel, major, law firm, 40 hours per week. All of them are subject to redefinition or substitution.

Heck, she doesn't want to work in a big law firm anyway!

Untitled

Submitted by reeses on Tue, 2002-10-29 06:15.

So, last week, performance was _godawful_. Everything took about three years longer than it should. Viewing a single page took anywhere from a minute to twenty minutes, when of course, all should take less than n seconds, where n is your human factors interval of choice. PM throws a hissy fit, gets worked up, demands another senior architect on the project to help with the performance problems. All without discussing it with me. When she finally does, my lack of concern apparently proves to her that I'm an idiot. We had over two weeks to launch, and I could make steamed duck farts scale in that amount of time.

Since we're working on a weird environment (MSSQL and NT), I availed myself of the glorious NT performance counters, and noticed that our tps rate was exactly the same as our logins-per-second rate. Suspicious, if you're using JDBC connection pooling, yes?

So, in talking to the company rep, it turns out that we're the only people using the real XA data source. That is, the provider bundles a fake transactional jdbc driver that sits on top of a vendor-specific database driver and makes it appear to do rollbacks, commits, etc. The documentation and configuration all say,"Use the fake one only if your vendor does not provide a true XA data source."

OK, our vendor provides a true XA data source, so we'll use that.

It looks as if the steaming heap of poop (did I mention you can't do "where foo is not null" in a query without it throwing a SQLException?) logs in to use session-based transactions. For every interaction with the server!

Anyway, I had our environments guy fix it, and performance improved rather dramatically. However, with two to ten simultaneous users on staging (roughly 1/4 the size of production) pageviews still take just over a second. Now, the PM is relaxed and happy, and I have to explain that it's actually the point at which we should start paying attention to performance. She likes thrashing people around on different tasks, which drives me mad. I have no idea what's going on because she can't let things sit for a day.

PMs should be kicked off projects as soon as they enter QA. They should be chained to their desks, and only allowed to talk to one or two other people. Especially non-technical ones that argue technical strategy.

Untitled

Submitted by reeses on Tue, 2002-10-29 05:52.

We've been using Bugzilla yet again for a quick bug tracking tool on projects, since clients don't have to pay for it. But as you may know, the querying interface is pretty rough. I wrote a quick script to do some useful stats and email them out to the team. Of course, it's MySQL-based, so the range of analytics you can do in atomic statements is pretty limited. I would have killed for subselects for trending and some post-processing. I'm too lazy to use Perl, and ruby isn't installed on that box.

Anyway, in case you don't know SQL, here are a few quickies:

Open/non-resolved bugs since 14 Oct 2002:

select count(*) 'open bugs (bugs not closed)' from bugs where bug_status <> 'CLOSED' and creation_ts > '2002-10-14' and bug_status <> 'RESOLVED';

Bugs filed per day since 14 Oct 2002:

select count(*) 'bugs filed per day', date_format(creation_ts, '%Y-%b-%d') 'Date' from bugs where creation_ts > '2002-10-14' group by year(creation_ts) desc, month(creation_ts) desc, dayofmonth(creation_ts) desc;

Bugs closed per day since 14 Oct 2002:

select count(*)'bugs closed per day', date_format(bug_when, '%Y-%b-%d') 'Date' from bugs_activity, bugs where bugs.bug_id = bugs_activity.bug_id and bugs.resolution <> 'DUPLICATE' and added = 'CLOSED' and creation_ts > '2002-10-14' group by year(bug_when) desc, month(bug_when) desc, dayofmonth(bug_when) desc;

Open bugs by user:

select login_name, count(*) 'open bugs' from bugs, profiles where assigned_to = userid and bug_status not in ('RESOLVED', 'CLOSED') and creation_ts > '2002-10-14' group by login_name order by login_name;

Open bugs by severity:

select count(*) 'bugs by severity', bug_severity from bugs where bug_status <> 'CLOSED' and creation_ts > '2002-10-01' and bug_status <> 'RESOLVED' group by bug_severity;

Untitled

Submitted by reeses on Tue, 2002-10-29 05:46.

I'm sorry, Uppie, but "I like the fact that you can get back out onto the field and relive the glory a little bit"??? There was glory in being a band geek? There I was, playing hockey and hitting people with sticks and taking ears off for glory and school, when I could have spared my teeth and muscles. :-)

Untitled

Submitted by reeses on Thu, 2002-10-24 04:05.

Cute start.

Some punk recently put into my head the idea that I should look at the current state of emulation of '80s software technology. I started with the brilliant looking Amiga emulator Amiga Forever, and made my way to the Atari STE emulator STEEM. I didn't pay for Amiga Forever yet, but I think I will soon.

I have to say, having a 1024x768 full-screen GEM environment up on my laptop was pretty disconcerting. I'll have to leave it like that around the office and see who notices.

I think writing emulators for the ST is probably easier than for the Amiga. There are certainly more of them, like STonX, STew, WinSTon, and lots of other words with "ST" in them. There's even a Java ST emu. I guess it's the lack of four thousand different special-purpose CPUs that makes the ST easier to emulate.

The bad part of this is what happens next...for three days, I have fun, play old games, etc. Then it occurs to me that ST systems are available for a pittance on ebay. I buy one, wait for it to arrive, and end up buying an Amiga, an Atari 800xl, and by the time they arrive, I have ten square feet of dusty computer systems that are booted once, played with for half an hour until everything works, and then put away. I can never remember the various DOS commands, either, so I can't even do anything useful. "Wow, the disk drive lit up -- it works! Umm, how do I get stuff off of this disk?"

Untitled

Submitted by reeses on Sun, 2002-10-20 06:52.

Heard outside:

Her: I love you!

Him: I know.

Her: Hey, do it right.

Him, embarrassed: OK. I love you too.

Blah blah blah

Submitted by reeses on Sat, 2002-10-19 04:23. |

My mom is here to visit. Her flight arrived this morning, and her genius cab driver took her through the Holland Tunnel, so her 8:20am arrival got her here at 11:30am. I had just enough time to show her where things were in the apartment, show her where she could take a nap, hand her a map with my apartment indicated, and bolt out the door for work.

A friend of mine got married last Saturday. His company announced that they were laying off 25% of their staff this week, while he was on his honeymoon. None of us have heard from him yet, to see if he was tapped, and I think I'm not alone in hoping he was one of the 75%, and if he wasn't, that he didn't check the news, check his voicemail, or try to log into his work email from Wyoming or Montana.

Untitled

Submitted by reeses on Wed, 2002-10-16 03:15.

The greatest thing about the Internet is that, no matter how obscure your fetish, there's someone already pandering to it.

Untitled

Submitted by reeses on Tue, 2002-10-15 00:01.

> Paying for 10 Java developers when one Tcl developer could accomplish

> the same end result doesn't sound like good professional practice, to

> me.

[egb> ] A project with all the IP locked up in the mind of one person has a

truck number of one (from Cope: a measure of the number of trucks necessary

to wipe out your development team) which may or may not be an acceptable

risk to the organization.

I love Grady Booch. :-)

Untitled

Submitted by reeses on Mon, 2002-10-14 06:56.

I love scaring little kids at weddings.

Untitled

Submitted by reeses on Mon, 2002-10-14 05:51.

By the way, Goosey got married yesterday, and somehow managed to post today.

Freeqe. Congrats, anyway. You can always remember your anniversary, since it's the same day as my mother's birthday.

Untitled

Submitted by reeses on Mon, 2002-10-14 05:47.

Linkspew time...

Comparative syntax of programming languages

xdoclet

A Critique of Software Defect Prediction Models

Naked Objects

Biological Framings of Problems in Computing

compo-music

Memory Hierarchies and Program Locality

Test flexibly with AspectJ and mock objects

Bah...that's lots of work. I'll just zip them up and scp them off my work machine. ;> Not that I'm visualising any need to move personal data off of here...

Untitled

Submitted by reeses on Sun, 2002-10-13 05:28.

I think I'm going to change the name of this log to reesesWhining or reesesWhinging depending on your locale settings. I'm at it again...

What is it with New Yorkers and rain? I'm starting to realise that, in fact, people in Seattle do deal well with the rain. They only slow down 25%, not the 50-75% that people here do. And I understand now the moisture machismo of not using an umbrella in mild misty rain. (Isn't 'Misty Rain' the name of a porn "actress"? What's the proper descriptive term for them, anyway? "Porn Star" is most common, I think, but it's just overreporting of a different type. "Porn Slut" can't be said in most company, so I'm left with "Porn quote actress unquote.") People in New York are vicious with their umbrellae. I've had my eyes poked out three times, and had to go scrambling around on the wet sidewalks to find them before some undersized dog snatched them up. I'd hate for a midget dog to choke on my eyeball -- though it would be interesting and not a little vertiginous to watch the trip on the way down.

The other thing that riled me a little (but not enough to do anything about it at first) was this dingus in the taxi line behind me at Penn Station. We'd move up a few feet, he'd move up, and every time, he crowded behind me so he pushed my umbrella forward. Come on, buddy, you should be tuned in enough to know that A) you're bumping someone and B) they probably don't want you to. Finally, he tilted his umbrella forward, dousing me with the runoff, that I had to turn around and say,"Jesus, can you control your umbrella?"

Not here three months and already I'm giving people the impression that New Yorkers are rude. It's like the notorious french rudeness -- there's a strict social contract required for coexistence in a very densely populated city. You walk quickly, you don't block escalators, subway doors, etc. If you do, you're breaking the contract, and are therefore not really a member of the society. Be thankful that you're reprimanded rather than shot, which is the way I'd have it sometimes. But I'm from the wild west, and we don't cotton that.

And we own guns, which goes a long way towards making it easy to shoot the varmints.

Untitled

Submitted by reeses on Fri, 2002-10-11 00:41.

The author of Zoe wrote me today to address some of the dull points in my last post. I think that makes him the third person to read this blog. ;>

I was pretty critical, but I'm going to explain it by the late hour. (1 AM, since I'm on the beast coast) He offered some good reality checks on my assumptions.

I was able to get Zoe to snarf messages by dumping my mbox tree in ~/Library and using the file import, as I was still unable to do the network-based import. After importing the last six weeks of personal messages (around 6k messages) the Zoe server became...very...sluggish. It took about twenty seconds to pull up an email message. This was on a pretty constrained box, though -- K6(3d)/333 with about half a gig of RAM and IDE disks. I tarred everything up and moved it to my laptop, and it was considerably faster, but I had issues with message rendering that I haven't eliminated yet. As it is, it's cool, but I think I'll keep waiting.

That aside, we hit alpha on Monday morning, and I think we're actually in good shape. Lots of long days and weekends, but I think my annoying policy of formal code reviews for all code hitting the mainline is going to pay off in reduced effort during QA. Cross fingers, knock on wood, etc. Other people feel the same way, so I'm not just deluding myself.

I fired off the first full catalog import when I was on my way out of the office tonight, and it just occurred to me that I should have had my server monitor do some data validation and let me know at the apartment. Now I'll have to live with the suspense instead of having a silly message pop up in Jabber saying,"Dude, it worked!" I have this nasty habit of capitalising the first word in quotes, so it would probably come across as "Dude, it Didn't worked!" I'm not too hung up on this whole grammar thing for personal stuff, as if one couldn't tell from reading this log.

Zoe

Submitted by reeses on Thu, 2002-10-10 05:04.

Goose writes blog entries of disturbing length. Disturbing, because I can never muster the effort to type that much, usually giving up and deleting the last paragraph or two. If I'm lucky, I used my rusty "inverted pyramid" skills from Jr High, and I made enough sense to stop at any time and still make sense when I reread my post three months later.

I made another effort at digging through the Zoe code, but it's slow going. I have a mountain of coding to do at work, yet somehow, teasing the yarn from this sweater is what I find myself doing. I'm really wondering what IDE was used to build this -- I have no idea how it compiled. There's a class that implements two of its inner interfaces. Now, it appears it has confused IDEA into a frozen loop. Tough stuff!

Untitled

Submitted by reeses on Thu, 2002-10-10 02:25.

My spanish is worse than my english, and even I can tell what the name of this boat means.

I played with Zoe a bit today, based on a fairly enthusiastic article I read about it. The promise is good, but I wasn't able to make it work on my machine for multiple reasons -- my work account doesn't permit IMAP connections from inside the network (!!), and Outlook doesn't like forwarding all outgoing mail across SMTP instead of MAPI. In addition, I couldn't use IMAP against my home account, because A) it requires IMAP/SSL, and B) the JavaMail API or the webform configuration in Zoe doesn't like non-alphanumerica characters in the password, which mine includes.

So, I tried digging into the code. Bad idea. It includes Apple-specific library files (from the WebObjects framework), and stranger still, all of the Java files are not properly stored in hierarchical directories mapping to the package structure, but all in one directory.

I'm lazy enough that if I wanted to reuse some of this, I'd print out the interesting bits, and rewrite the rest from scratch. I don't know if I'm that ambitious, though, when I know there'll be ten different versions with more features in a month after this gets popular. I'll just watch freshmeat.

Untitled

Submitted by reeses on Tue, 2002-10-08 01:56.

So, we use a particular app server for most of our projects at work. I won't name which one, but it's a steaming turd at times. The core is brilliant, but the services slapped on the side look to have been built by new grads or almost-grads. Anyway, the latest dropping came in the form of a component that hardcoded an optional parameter for an object into what should have been an optional calculation. Boom, NullPointerException, with no way to fix it via configuration. I love refaxx0ring some incompetent programmer's code via jad.

Oh, and don't order food from Lannan (L'Annan?) in NYC. Horrid noodles, and the guy didn't know what Pho was until someone intentionally mispronounced it for him.

Untitled

Submitted by reeses on Sat, 2002-10-05 04:49.

I'm so happy I now know how to get a rewarding job as a phone actor!

Untitled

Submitted by reeses on Fri, 2002-10-04 06:12.

I always thought this was common knowledge, but I guess it's news.

Untitled

Submitted by reeses on Fri, 2002-10-04 03:58.

On our projects, we typically have a few developers working on various portions of online stores, usually delineated by function. That is, we'll have a couple people working on interfaces to outside systems, one or two working on checkout, one working on catalog, one working on registration/accounts, etc. The front end people pound out JSPs, and in the last week or so before QA, we bring it all together and see how it integrates. We don't do pair programming, and we don't synchronise low-level design at the HTML level. So, there's a lot of redundancy.

I've been thinking about writing a program to do tree edit distance analysis of HTML documents to factor all of these pages into parameterised templates. We do that already for larger components -- we have a couple base layout templates, and each developer gets a region of screen real estate for their included content. That works pretty well, but having spent too many years doing OO (and being fantastically lazy besides), I don't like the idea of a thing existing in two places at the same time.

On the subway back to the apartment, I noodled over it a little bit. HTML lends itself rather well to tree modelling, as that's exactly what the documents are. Calculating subtrees, surtrees, and the common factors between trees alone is interesting, and would actually be easy to implement by flattening the trees and doing list comparisons. Taking it a step further, calculating the edit distance for labeled nodes (or tags, in this case) would enable us to find common structure, and would enable us to fuzzy match. If a developer tended to wrap text in bold tags, while another did not, but they both displayed data in tables of similar structure, the edit distance between subtrees would be small. Create a template that takes the text in, and boom -- less HTML, shorter files, more happiness.

I have the feeling this would be dog slow, however. Would there be a way to calculate a tree checksum that is a deterministic diminutive representation of the tree, for quick comparison with other trees? FFT?

Whenever I get one of these ideas, I have the nagging feeling that someone should have written it already, and I peruse freshmeat, google, citeseer, etc., and look for an implementation. Remember, I'm lazy. I've found a couple papers that will be helpful, and I have the nagging suspicion I could build something really easily with xpath, but no implementations yet. I'll get bored after the project ends and whip something up in Ruby one night.

Wish me luck. If you've seen anything, please let me know.

Untitled

Submitted by reeses on Thu, 2002-10-03 06:13.

A friend on IRC was pasting amusing comments from his company's code. I thought my team hated me. :-) (Yes, he's the "management" referred to by the idiot.)


// $HACK: HACK HACK HACK HACK HACK HACK HACK HACK
// $HACK: Stored Procedure support has not been thought out or
// $HACK: designed at all for the system, and is A VERY BAD IDEA.
// $HACK: Do NOT use stored procedures unless you are absolutely
// $HACK: ordered to by your management, and then only after
// $HACK: complaining profusely. Repeat: DO NOT USE THESE
// $HACK: FUNCTIONS. Soon we will review stored procedures usage
// $HACK: and redesign and hopefully eradicate stored procedures.
// $HACK: RDR 04-02-01