If you're running your own e-mail server using Postfix, you might find these anti-spam rules useful. (Note that some lines may be word-wrapped since this blog has width requirements that are more restrictive than a Postfix config file which can be as wide as you need it to be.)
I set these up and updated SpamAssassin to version 3, and it's really taken a bite out of the incoming spam, and has reduced the load on my mail server. The Postfix rules look at the sending mail server and the address on the message and deny messages that way. SpamAssassin looks at incoming messages much more thoroughly and applies all sorts of content-based rules, as well as some header-based rules. The obvious spam gets trashed and the marginal stuff goes into my mail reader's Spam folder for periodic manual examination. I almost never see false negatives (spam in my inbox) but sometimes I do see false positives (valid mail in my Spam folder).
At work I've been doing some large-scale source code cleanup.
One task, called "the Great Renaming" involved mass source code file rearrangement, and all of the source code and config file tweaks required to make the app keep working after doing this, and all the version control commands needed to keep the file history continuous across the renaming. It took about a day and a half, from the time I started a "find" command to list all the source code files to the time I merged the version-control branch I had be working in into the trunk, making my changes part of the official latest source code for the app. Key tools included Eclipse (warning: horribly organized web site in great need of redesign), Excel, Emacs, and a couple of Perl scripts I wrote for this task, called rename.pl and fixup-struts.pl. The first step was to decide what the new names for each file should be - that part I did in Excel and shared with the team for feedback. Then I used that and Eclipse to move the files around because it's smart enough to take care of all the changes inside of the source code, pretty much. The manual cleanup I had to do was just fixing visibility problems - if class A and class B used to be in the same package, and class A has a member that is package-visible which B uses, and then they are separated into two different packages, class B will break (won't compile). So, in a couple of cases I had to manually mess with member visibility to make that code work again, which is something I wouldn't really want an IDE guessing how to fix anyway. (Maybe it could make a recommendation and ask me if it can just mark that member as public to solve the problem, but the "problems" pane of the IDE explaining that the member isn't visible and identifying the line referencing it was pretty darn close.) Following that, I had to use rename.pl to tell Subversion where the files had gone. Ideally, the IDE would be integrated with the version control system so that the IDE would use the VC software to move the file, then changing the contents of various files to reflect the new filename. Sadly, Subclipse only works on Windows right now, so rename.pl generates appropriate "mv" and "svn mv" commands to preserve the new data while telling Subversion to move the file. After doing that I checked in my work to a branch and kept going.
Next I had to go through the text files in the project (config files, etc.) and do the renaming edits; Eclipse can do this during refactoring but I decided to be paranoid and do it manually. Most of the edits were trivial, except for the Struts configuration files which refer to dozens and dozens of classes. For that I wrote fixup-struts.pl. The Excel spreadsheet (which was just a list of old name -> new name pairs) made that pretty straightforward; I dumped the spreadsheet to CSV and that drove the script's actions. Search for a bunch of strings, replacing each one with a different string, for each line in the file. It worked on the first try and the test suite almost passed 100%. There was a problem with a part of the test suite that resets the database to a known state (fresh test data) between tests, that was revealed by the reordering of the tests (they run in alphabetical order, which changed during the renaming). I fixed that and the test suite passed. Woo hoo! I merged it into the trunk and resolved a couple of changes that my co-workers had made to the trunk while I was doing all this renaming stuff, and the test suite passed again so I checked it in. Boo yaa!
The second task was a bit harder. I wanted to clean up the indentation of a bunch of files that had been cut and pasted, edited with different IDEs over the course of the past 18 months or so, and generally were hard to read. Again Eclipse helped, but it did something annoying: it indents blank lines. If you have a couple of source code lines indented by 8 spaces, and a blank line in between them, Eclipse puts eight spaces on that blank line. I didn't want that (what's the point?) so I used a quick Perl hack to make it go away:
find . -iname \*.java | xargs perl -p -i -e 's/^ +(\s)$/$1/g'
That says: find all the .java files, and for each line in each file, if it's a blank line with just spaces, preserve the last character (the newline) and kill the spaces. (Now that I look at this, I think it might miss lines ending in \n\r but I think that Perl might fudge this into matching a single \s, or maybe all our source code ends in either \n or \r anyway. It's not important enough to fix at this point.) Anyway, the point is that perl -p -i -e rocks (mmm, pie). See here for more details. I didn't use a backup file extension (-i.bak or something similar) because I'm using version control and it already keeps a backup file locally in the .svn/ directory.
In other news: Internet casino buys monkey naming rights, U.S. Military's Elite Hacker Crew (glad we have one), Adobe buys Macromedia (wow, big news for us web nerds, though I don't really use any Macromedia tools anymore), Too much email rots your brain (from Faisal), 110,000 volt Taser Cannon (one can only wonder about his home defense system), and Luke and Obi-Wan get a message from the dark side (2.8MB MPEG, Not Safe For Work!).
Kim and I have been laughing about this one for a couple of weeks now: Why women shouldn't vote: Reason 345 & 346. Yeah, Norway is going overboard with this legislation, but hey, any neoconservative wingnut knows that Europeans are all dirty socialist hippie girly-men whose womenfolk push them around and don't shave their armpits, right? So why is this guy flying off the handle about this? I wonder if his response to affirmative action is that it just goes to show why non-whites shouldn't vote? The comments are even better: one part caveman, one part overgeneralizing, one part fundamentalist family roles, and most notably, not a shred of research or education on the subject. Claims like "Far too many women are fascists at heart" dodge important questions like exactly how many women are fascists, and how many fascists is too many, and where these missing numbers would come from. It's a bold statement that he makes: the country would be more free for everyone if only men could vote, because they'd be less prone to fascism, and would let men and women fit neatly into their preordained roles and personalities. It's the old racist argument that we can't give them freedom or else they'd screw it up; they're better off letting us control them. If that isn't a fucked up mobius strip of logic that eats its own premise, I don't know what is. See, if they were free to vote, they'd use that to demand equality, and that would be bad because they would use that to infringe upon our rights to boss them around. How unfair. The guy claims to be a libertarian, as if that justifies his argument that freedom is only there for some people. Then in the comments his supporters decry the use of the race card, as if there were no parallel there to be considered.
Now, I disagree with affirmative action and quotas in general because it leads to a sort of Special Olympics "everybody wins" mediocracy. As I learned in high school government class, our country is based on equality of opportunity, not equality of results, and I support that. Penalizing people for not hiring enough [fill in the blank] because that group fails to meet objective standards leads to lowered standards and coddling, which is reverse discrimination. The solution is to attack discrimination at its source, not at its eventual result. Why are poor racial minorities not getting an education equivalent to middle class white kids? Why aren't there more women in executive positions, high technology, etc.? Putting people in positions they are not qualified for only magnifies stereotypes. Letting people fail can help them understand what they need to improve. Example: on one occasion early in my technical career I was turned down for two jobs in a row because I was underqualified. Not surprisingly, my response was to study the things I didn't know that kept me from getting those jobs. I'm better off for it. I ended up getting a different job with far less pay but much more learning potential (free training, and kind co-workers who were tolerant of my incessant questions), and that led to much better opportunities than the ones I had originally been unqualified for.
During my professional development, I've also had to learn that fairness in hiring is more important than pity, and as a result, I've had to learn how to hire people fairly. As a technically senior employee at most of the companies I've worked for in the last 10 years, I've been expected to give the "grilling" interview to figure out how knowledgeable a candidate really is. Co-workers universally seem to expect me to be more technical than the candidate and therefore to be negatively biased toward every candidate ("aw, she isn't so smart, she doesn't know jack about SSL" or something like that, I guess). In two instances I was too lenient in interviews of entry-level employees who talked a good game about ambition and diligence, but when it came time to learn new skills, ask for help with problems, and care about the quality of the work they did, they didn't have it. Floundering in cluelessness and then handing over crap is just not acceptable. Blowing deadlines with no warning and then making excuses is not acceptable. I tried hard to mentor them and ended up recommending that they be terminated, and all the while told them that they weren't doing well and what they had to do to improve. They didn't. They were both terminated. They were both female, and I hired both of them based on reverse discrimination. I wanted to give them an extra chance because they were female. That turned out to be a bad decision both times and cost my employers a lot of money in wasted salary.
After that I decided to favor fairness over mercy, and I developed two tools to help me with this. The first is the Troll method. If I were interviewing an equally professionally dressed, equally well groomed but homely little asexual troll, would I hire it? I pretend the person I see is just an illusion. The second tool is the written hard-skills quiz. This is not something I came up with as a gender-discrimination equalizer but it has proven to be very helpful. I come up with a set of about 20 easy questions from different areas of expertise for the job, where each question has one correct answer, or *maybe* two. An example for a personal income tax preparer would be "What's the standard deduction for a married couple filing jointly?" If you can't come up with that, you're either the worst personal income tax preparer ever, or a big fat liar. Neither is good if you want a job as a personal income tax preparer. Individually, these questions won't separate the rock stars from the merely-competent folks, but you at least know whether this person is full of it or not, and if they get 20 out of 20 and know all sorts of extra details, you have a clue that this person might be awesome. Better, since the questions are broad, you can tell what their specialties and areas of experience are. I've refined the quiz several times (usually by using a control group of current and former co-workers) and created different quizzes for different positions. Some jobs are more slanted toward soft skills than others - for example, a project manager needs lots and lots of situational judgement, but also needs to bring a personal methodology with them, and probably needs to know how to use a few tools as well. Questions don't have to be technical; they can be any old fill-in-the-blank answers. For an IT support quiz I created a bunch of theoretical situations (several based on recent experiences) and asked them how they'd handle them. I had a list of important things they needed to mention, and let them answer in free form.
These have proven to be very successful. The first use of the quiz identified a rock star candidate who is probably still the pillar of that development team. His skills were deep and broad, but his work ethic was really a surprise - he turned out to be capable of coming in, coding solidly for 8 or 9 hours, and then leaving, every day. An IT candidate who also turned out to be a rock star was so into her job that she had a home network that was more complete and flexible than any corporate IT testing lab I've seen. Another IT candidate turned out to be skilled but also very well versed in the procedural aspects of IT that are far too rare in my opinion (things like planning, communicating, testing stuff before rolling it out, and using a trouble ticket system even though he was a solo contractor). All of these people blew the doors off the quiz, and many other candidates before them had talked the talk but crumpled under basic job-related questions. One IT candidate turned out to be 17 years old, had no experience in an office, had never had a job of any kind before, and hadn't used most of the technologies he listed on his resume. He just made most of it up and said he was familiar with them because he knew what the products did. A family member of a friend was referred and had almost no relevant skills, despite a resume that claimed otherwise. The quiz has saved my bacon several times, and somehow has the ability to turn what I would think would be a field of evenly distributed candidates into a few excellent candidates and a whole lot of folks who really don't have a grasp of the basics of the skills they claim to have been using for years and years.
This brings me back to the topic of quotas and stereotypes. My quiz takes place at the point where quotas interfere. My quiz doesn't care why there are fewer women than men in high technology. I care, so I made a fair quiz that doesn't take points off for candidate gender. Studies show that women are actively discouraged from pursuing careers in science and technology by classmates, advisors, and educators. Reasons vary, but include social stigma (no proper woman would want to smash atoms for a living!) and unfounded physiological claims (girlie brains are made of sugar and spice and therefore can't grasp vector calculus!). There's your problem. Men and women are different, and we can measure this. We can also measure ways in which men and women are not different, and we can measure the results of individual people with varying traits who are given equal opportunities. If teachers are making racist or sexist slurs to their own students, discipline them. They're educators. They have a professional responsibility to know what they're talking about. If they tell female students with an SAT 800 Math score and a 5 on the Calculus AP exam that girls can't do math and should stick to nursing, require them to prove it using actual scientific studies. If they can't, discipline them. Making stuff up isn't acceptable behavior, especially from an educator. Don't reinforce the stereotype by forcing companies to hire unqualified people and universities to admit unqualified students. You're just giving ammunition to the people who caused this problem in the first place, like the jerks who see boardroom hiring and housework quotas and take that as proof that women are fascists and shouldn't be allowed to vote or run companies, nor to marry if they dare to expect their husbands to help with housework.
James Surowiecki appears to have stumbled upon a new strategy for boosting the U.S. economy: get Europeans to buy our overvalued real estate while the dollar is weak. Then, not only will the bubble last longer so we can all sell our holdings, but it'll be their economy that tanks at the end. We end up plateauing at the place we sold. Of course, there are three things wrong with that: (1) their currency is strong but they don't really have the gobs of savings lying around that would be needed to buy up all the houses in the U.S., (2) they probably aren't nearly that dumb, and (3) failure to cash out and sit on the sidelines during a bubble is why bubbles happen in the first place. The same folks who buy a house that cost $400K 5 years ago for $1.7M today and expect to sell it for $3M in a few years wouldn't be able to help themselves. People are just desperate to be the next-to-last guy holding the bag, because there's that extra bit of upward momentum that they might have made money on.
Hilarious: Life in Post-Science America.
Finally there's actual information, and the rabid Mac discussion board crowd will have to foam about something else: Mac OS X 10.4 "Tiger" will be available on 4/29 according to Apple.
91% of people arrested during the Republican Convention in New York City found innocent. It's interesting to me that false arrest, fasle testimony by police officers, and falsification of evidence, doesn't seem to be something that the city is pursuing, and this is disturbing. If I were a law-abiding NYC citizen, or a hardworking NYC cop, I'd want to see the bad guys prosecuted, be they protesters or cops. Hiding thugs and liars within the police department among geniuinely honest and lawful officers doesn't help the department's image. Smearing innocent people with claims of attacking police or resisting arrest makes people less willing to believe the department when it comes time to prosecute someone who's actually guilty. *cough*OJ*cough* This is just basic law enforcement: you can't arrest random people, make up stories about things they did, doctor evidence, and then say "whoops, shit happens" when you get caught. Or, I guess in NYC you can.
Life in the Castro can be interesting, um, almost all of the time. Seen on a T-shirt worn by a 30-something black guy by the subway: Da Bullshit Is Nuttin Cause Um Lifetime Hustlin. Right. Overheard in Tully's, part 1: "Who's got the quad latte?" "Right here." Wow, 4 shots of espresso? Hard core. But not as hard core as Overheard (barely) in Tully's, part 2: "(blah blah blah mumble chatter) gloryholing (blah blah blah)". I missed the rest of that conversation but that one word, spoken by a 50-ish looking guy to two companions, really stood out. They verbed gloryhole! I guess creativity can be found in the sleaziest of places (not Tully's, I meant at a gloryhole).
Let the fleecing of the fundies begin, or maybe continue, I guess.
Fox taxes psychic scamster John Edward seriously. Aren't they convinced that, like, psychics are witches or something? I thought that was the right-wing wacko position: if you're not an evangelical fascist, you're with Osama or the devil or something. I guess if you're a new age huckster who happens to agree with them on one topic, they'll give you airtime. His bio says that he "was deemed 'special' by many in his family." Even Mr. Rogers wrote a song telling him how there was no one quite like him!
IBM buys Ascential. OK whatever, boring yawn, sure. But what a poor company name, "Ascential". It looks cool in writing, but try pronouncing it in such a way as to make it clear how it's spelled, without making eavesdroppers think you're talking about something being done an a very wrong way. Ass ential? Essential? UH-scential? Ass kential? Don't these companies pay somebody to check for these things in multiple languages? This name doesn't even work in English. It's like Viant (former employer) - is it Vy ent, or Vee Ahnt, or Vee ant? I have to say, if I had to choose between a name that people could spell as soon as they heard it (which is important in the age of the internet) and pronounce as soon as they saw it, and a name that failed those tests but was a slick mash-up of two positive words, I'd take the former.
Worse, there are already several software and high tech companies named Essential something. So they picked a homonym of a name that was already used. "Yes, I work for Ebeigh. No not eBay, Ebeigh."
My computer's mouse started freaking out a few weeks ago. It'd get a little jumpy, and when I unplugged it and plugged it back in the problem would go away. Recently it got to be even more annoying but I had gotten so trained to fix and ignore it by that time that it really didn't click with me that the thing was really starting to go haywire. The wake-up call came this week: three days in a row, my PowerBook had a kernel panic. Ugly. It's the Unix (and Mac) equivalent of a BSOD. That ain't right. It previously happened every 6 months or so. Daily kernel panics are a cause for, um, panic. I finally looked in the Console log and it mentioned a USB somethingorother right before the last line in the log before the restart message. Oh yeah! I have defective hardware, and have had for weeks, and it's freaking out more every day. Duh. Of course that's the most likely problem. *head slap*
So, I biked to Central Computer which is my favorite computer store EVAR, and got a new mouse. I had to look past about 30 different models of shitty infrared or RF wireless mice with all sorts of stupid single-purpose buttons. Yes please let me spent $60 on what really is worth $20 just so that I can have a "browser forward" button under my pinkie finger, and so that I can have to put batteries in yet another gizmo. There were also a few impossibly small travel mice, which aren't a lot of fun to use either. Normal mice are apparently passe, but the cool thing about Central Computer is that this means they're in plastic baggies (no box, no CD, no manual) known as OEM packaging, cheap as they're gonna get. $19 for a Microsoft optical scroll wheel mouse, just like the one I paid $60ish for a few years ago, except this one is black, like I care. I was thinking about getting a trendy cool Starck mouse but what the hell, I just want 2 buttons, a scroll wheel with a button under it, and optical tracking. I don't care what it looks like that much because it's gonna be under my hand, operated by feel anyway. OK, it can't have a goatse pic on it, but short of that, I don't really care. Plus, I botched the "order the new one while the old one is not quite dead yet" bit, so I couldn't wait for it to ship. So, I took advantage of the fact that I knew one place that absolutely would have a decent mouse for sale dirt cheap. The headwind going uphill on 17th Street toward Castro and Market was, as usual, a pain, but I paced myself and didn't stop until several blocks after I reached the top of that hill.
I felt pretty dorky with the bookbag, helmet, and running tights on. Biking in jeans kinda sucks. Denim and exercise don't mix. So, I have tights. They look decent, though a bit speed-skaterish. I just needed some workout pants that would let me go out in cold weather and sweat without turning into a soggy cotton mess. They do that. But, combine them with a big bike helmet and a bookbag with lots of busy straps and zippers, and it's dork city, though. On the way back I caught up with another cyclist who had no helmet, fashionable clothes, and a shoulder bag. All more trendy, all really dumb. Shoulder bags hurt when loaded and don't hold much. Jeans chafe. No helmet, well that's just stupid. Yeah, helmets look dorky. Brain damage is worse. I'm secure in my dorkitude, I guess is what I'm sayin'.
Galactica: Best Sci-Fi TV Ever. That's bold, but it's a damn good show, and one of those hypercritical nerdy types that finds flaws in everything. Loved the season finale. If you haven't watched it yet, and you like science fiction, I strongly encourage you to watch reruns, or watch the first episode (after the pilot) online (Real Player 10 required - I tried 9 and playback froze several times; 10 works fine). If you want to download the .rm file and stream it in the standalone Real player, download this (84 byte RealMedia file). Seek to a random spot in the episode and watch it for 30 seconds. You'll be hooked. :)