Tuesday September 17, 2002
01:02 PM
How to get spam without even trying.
Sometimes folks ask why I don't want to be forwarded jokes unless I'm on BCC. ...or they ask why I use such funny email addresses. I end up explaining this frequently, so I thought I would put it in the journal.
This was prompted by Matt's observation that many hotmail users complain about getting spam even though they never give out their email address.
If you truely never give the email addie out (ie: never use the account to send mail or give it to anyone any other way), then you probalby won't get spam unless your username can be guessed. (Brute force username guesses against SMTP hosts are on the rise.)
However, if you phone your girlfriend and give her the address the day it was assigned to you, then you might never log in to the account at all and find out when you do so for the first time a year later that it is full of spam.
Suppose your girlfriend sent you only one message once she had your address.
She sent this hillarious story about a kitten which she knew you would appreicate. She also include her co-worker in the recipient list.
That co-worker had a great laugh, and forwarded it to five friends who like to share 'funny stuff' via email. One of those friends is on a mailing list where folks exchange 'funny stuff'. That friend forwards the message to the list.
Now, if these folks all just hit the forward button, then all of the original recpients' addresses are included in this post to the mailing list.
That list may have an address harvester subscribed.
That list may be accessible via NNTP where havesters lurk in abundance.
That list may be archived on the web, where harvesters are probably more common than on usenet these days.
Subscribers to the list may re-foward, further increasing chances of exposure.
It is possible that by telling your girlfriend your email address, you allowed that address to be exposed to spammers. ...and once exposed, it's probably doomed. Spammers are an incestuous lot who constantly buy one anothers' lists, combine them and try to sell the new larger list for more money. I'm sure you've had plenty of spam trying to sell you email addresses, right? Once you get on one list, you have decent odds of being on oodles of lists.
If you use an address, it may get spam through no fault of your own. You can try to educate folks to use BCC when sending that kind of content (and don't send it yourself). ...but the problem is that you just don't have control.
The only certain solution is to never use or advertise your email address.
A decent second-best is to use an infinite number of addresses. Try to use addresses specific to each contact/occasion/date/etc so that if the address ever gets spam, you can route it to the big bit bucket.
An interesting example: I once sent mail to Simon Cozens which he forwarded to a perl list. That address started getting spam, and in addition related addresses started getting spam, revealing a bug in some common spam address-processing software I suppose:
m_to_simon_cozens@wickline.org
simon_cozens@wickline.org
mon_cozens@wickline.org
cozens@wickline.org
zens@wickline.org
This series came from part of a Message-ID header:
0.63e37fea@wickline.org
3e37fea@wickline.org
7fea@wickline.org
None of the above addresses will get to me... they all get auto-trashed because they've been tainted and now receive spam. I could claim that I never used that simon_cozens address but the truth is that I did use it. One time. Now it gets spam. (and so do some releated addresses!)
When hotmail users say they never give out their address, I bet that they've at least used it once.
-matt
Wednesday August 14, 2002
02:59 PM
horray for vacation!
Checking work email from home tomorrow, but not doing any real work... just kicking back and relaxing.
Friday will be some house cleaning so we can come back to a tidy nest (and so our friends won't see how we really live when they drop by to care for our cats ;) and packing.
Saturday we're flying to PDX, meeting up with friends who are also flying in, then driving up to spend some time with my mom, then further up to the Olympic National Forest.
Peace and friends and green and trees and sensible temperatures and no appreciable humidity and no work.
Horray!
-matt
Sunday August 11, 2002
07:35 PM
my second-least favorite experience on the 'net
...as long as I'm thinking about icky things...
Within a year of the sig-changing incident, some spammer used one of my addresses in the From header of their mail. The address was one of those 'free for life' ones and forwarded to my less-permanent school-provided address.
I won't mention the provider of that address, as they may have cleaned up their act since then.
I discovered a gazillion bounce messages in my inbox one day, some of which included the bounced message... which was spam. My address was in the From header. I also discovered a large volume of venomous hate mail from folks who had received the spam. While I felt bad for them, I was feeling worse for myself.
A few days later, I got a message directly to my school account from someone who had been unable to reach me at my 'permanent' address. It turns out that my account was closed. When I contacted support, they said that sending spam was in violation of the terms of use, and that they couldn't re-open the account. I provided them with instructions for the trivial From header forgery and they admitted that they hadn't done any investigation beyond looking at the From header... but they still wouldn't re-open the account.
At that point, I was happy to leave them. Sucky service sucks.
This was years ago. Hopefully they've invested in clues since then.
-matt
07:08 PM
my least favorite experience on the 'net
Until 1995 or 1996 (I forget the date, but I remember where I was living at the time) I had all sorts of information in my .sig file. The more useful info was name/phone/address.
I thought phone number and address (mailing address, that is) were useful because folks would have a convenient way to find my phone number if they needed to call me, or my address if they needed to mail me something. This was before everyone was carrying PDAs in their pockets, and the sig info had come in handy for folks in the past. ...and I didn't think it could do any harm.
I was wrong. :(
One afternoon I got a phone call from some woman about some conversation she thought we had had in a white supremacist irc channel the evening prior.
If there's a group for which I have a prejudiced and unreasoned hatred, it's bigots. That may well make me a bigot myself, but I am not a white supremacist.
I was too upset to remember the details of our brief conversation, but the gist was she was sure she had the right person because she had the right combination of name, phone number and address. I was just as sure she had the wrong person.
Minutes after our phone conversation, my .sig was void of any 'useful' information.
The Internet lost some of its charm for me on that day. I don't suppose it actually was any different, but I sure learned to look at it through less-rosy glasses. :/
-matt
Thursday August 08, 2002
09:46 PM
So what's this button do, I wonder?
Everyone loves mysterious switches, right?
If you scroll down to the bottom of this page, there's a Misc link. Click the link and you'll arrive at a Miscellaneous Options screen. That screen has a Save button.
Click the button and you'll be informed that "Option(s) Changed."
So, if you don't like the options life hands you, visit use.perl.org, eh?
Acutally, I didn't notice my options changing. Maybe I changed someone else's options? "Sorry" or "Your welcome", as appropriate.
-matt
Wednesday August 07, 2002
07:09 PM
Holy vanity, Batman!
Every several months or so, I type my name in a couple of variations
into google.
Why? Well, the first time I did it was after my natural father had found
me via the internet. I wanted to see just how easy it was to find me. I
wasn't trying to be hidden, or to be visible... I was just curious. So,
I typed in a handful of variations of my name in a few search engines.
This was in the pre-google days, and the altavista advanced search was
my favored search engine (back when altavista wasn't just another web
portal).
Every several months it occurs to me to repeat the excersize. I don't
really have any good reason for it. I'm not looking to see if I've been
keeping a low enough profile to be unobserved and I'm not looking to see
if I'm famous. I'm just wasting time basically. People do that at times,
ya know? I don't try all the search engines anymore, just google. ...but
I still try a few variations of my name. I've found that there are a few
folks with my first and last name who are somewhat famous. I'm not one
of them. There are also a few less famous folks with my name. I've had
email from three strangers asking if I was their long lost relative or
high school classmate. I'm not.
Today I googled for 'wickline'. It's my last name, and I'd expected to
see oodles of strangers and an occasional relative. I did *not* expect
to see something of mine in the #3 spot! ...but that's what I found!
As I type this,
http://google.com/search?q=wickline
has as the third hit
http://wickline.org/yapc/maps.html
Given the way google's page-rank system works, I'm interpreting that
result to indicate that this year's YAPC was more important than just
about anything wickline-related. YAPC beats out every wickline in the
world but two!
Bravo! Way to go YAPC! :)
On google images, there's a couple of nude women. I think you can
search for just about anything and find porn.
On google groups, strangers and relatives.
On google directory we find that use.perl.org is more important than
any wickline entry in dmoz.org (source data for google directory). My
name just happened to be on use.perl.org (because of that yapc post)
on the day it was last indexed by google, so as I type this, the u.p.o
page comes up on a search for wickline... and because u.p.o is better
ranked than any wickline-related page, it comes up first.
And if wasting time at google wasn't enough, I'm now wasting time here
talking about my waste of time.
What a waste of time. :) I think I need to get some sleep...
-matt
Tuesday August 06, 2002
10:19 AM
mozilla custom keyword queries on steriods
Do you use mozilla?
http://mozilla.org/
Do you use keywords?
http://www.mozilla.org/docs/end-user/internet-keywords.html
Do you use custom keyword queries?
http://www.mozilla.org/docs/end-user/keywords.html
Do you want your custom keyword queries to
- relace *all* instances of the token in your URI template?
- allow multiple arguments to be place in multiple places?
- allow some args to be url-encoded, but not others?
Then you want to take this perl code as a starting point for your own
CGI script or Apache module. Then set up a custom keyword to call that
script or module and you're home free (modulus one HTTP transaction per
call).
See also
http://use.perl.org/~miyagawa/journal/6929
http://use.perl.org/~miyagawa/journal/6930
This code predates the above, but miyagawa's posting reminded me
that other folks might find use for it...
http://bugzilla.mozilla.org/show_bug.cgi?id=124237
http://bugzilla.mozilla.org/attachment.cgi?id=69884&action=view
I'm m_mozilla, so feel free to copy/adapt/whatever this code to
your heart's desire.
WARNING:
Slash wraped the long URLs.
The tests won't work until you unwrap them.
-matt
#!/usr/bin/perl -w
$::verbose = 0; # turn on to enable verbose testing (to STDOUT)
use strict;
print "testing...\n";
&test_uri_template_code;
print "testing complete.\n";
sub build_uri ($$) { # Q=plain, q=encode
my( $uri_t, $query ) = @_;
return undef unless defined $uri_t;
return $uri_t unless $uri_t =~ m/%[qQ]\d*;/;
return &empty_tokens( $uri_t )
unless ( defined $query and $query =~ /\S/ );
$uri_t =~ s/%([qQ])0*(\d+);/%$1$2;/g;
$query =~ s/^\s+|\s+$//g;
my @terms = split( /\s+/, $query);
my @numeric_tokens = sort { $a <=> $b } ( keys %{{
map { $_ => 1 } ( $uri_t =~ m/%[qQ](\d+);/g )
}}); # <=> sorted uniq numbers from %[qQ](\d+); tokens
while ( @terms and @numeric_tokens ) {
my $term = shift @terms;
my $token = shift @numeric_tokens;
$uri_t =~ s{%([qQ])$token;}{ $1 eq 'Q'
? $term : &uri_encode( $term )
}ge;
} # now we're out of @terms and/or @numeric_tokens
return &empty_tokens( $uri_t ) unless @terms;
return $uri_t unless $uri_t =~ m/%[qQ]\d*;/;
$uri_t =~ s{%([qQ]);}{ $1 eq 'Q'
? join( '+', @terms )
: uri_encode( join( ' ', @terms ) )
}ge;
return $uri_t;
}
sub empty_tokens ($) {
local $_ = shift; s/%[qQ]\d*;//g; return $_;
}
sub uri_encode {
return undef unless $_[0];
my $txt = shift;
# use a real look-up table in mozilla; faster than this:
$txt =~ s/([^a-zA-Z0-9~._\-])/$1 eq' '?'+':sprintf("%%%02X",ord($1))/ge;
return $txt;
}
sub test_uri_template_code {
# keywords containing '_x_' have malformed URI templates, and
# the test results will need to not treat bad tokens as tokens
%::keywords2templates = qw{
a http://www.alldirect.com/
a_x_1 http://www.alldirect.com/%q
a_x_2 http://www.alldirect.com/%q1
a_x_3 http://www.alldirect.com/%qx
a_x_4 http://www.alldirect.com/%qx;
a_x_5 http://www.alldirect.com/%q0
a_x_6 http://www.alldirect.com/%q01
a_x_7 http://www.alldirect.com/%1;
a_x_8 http://www.alldirect.com/%20;
a_x_9 http://www.alldirect.com/%1$q
a_x_10 http://www.alldirect.com/^%1$q
a_x_11 http://www.alldirect.com/%qabout.asp
isbninfo http://www.amazon.com/exec/obidos/ASIN/%q1;
isbnbuy http://www.alldirect.com/book.asp?isbn=%q1;
isbnbuy_1 http://www.alldirect.com/book.asp?isbn=%q;
isbnbuy_2 http://www.alldirect.com/book.asp?isbn=%q01;
isbnbuy_3 http://www.alldirect.com/book.asp?isbn=%q001;
isbnbuy_4 http://www.alldirect.com/book.asp?isbn=%q000000001;
isbnbuy_5 http://www.alldirect.com/book.asp?isbn=%q0;
isbnbuy_6 http://www.alldirect.com/book.asp?isbn=%q00000000;
isbnbuy_7 http://www.alldirect.com/book.asp?isbn=%q00000700;
chart http://quote.fool.com/Chart/chart.asp?time=%q1;&symbols=%q2;
chart_1 http://quote.fool.com/Chart/chart.asp?time=%q7;&symbols=%q025;
chart_2 http://quote.fool.com/Chart/chart.asp?time=%q7;&symbols=%q;
chart_x_1 http://quote.fool.com/Chart/chart.asp?time=%qq;&symbols=%q;
chart_x_2 http://quote.fool.com/Chart/chart.asp?time=%;&symbols=%0q;
chart_reverse http://quote.fool.com/Chart/chart.asp?time=%q2;&symbols=%q1;
chart_reverse_1 http://quote.fool.com/Chart/chart.asp?time=%q001;&symbols=%q000;
chart_reverse_2 http://quote.fool.com/Chart/chart.asp?time=%q;&symbols=%q0;
bughunt http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&b ug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&va lue0-0-0=%q;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q;&field0-0-2= short_desc&type0-0-2=substring&value0-0-2=%q;&field0-0-3=status_whiteboard&type0 -0-3=substring&value0-0-3=%q;
bughunt_first_term_only http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&b ug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&va lue0-0-0=%q0;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q0;&field0-0- 2=short_desc&type0-0-2=substring&value0-0-2=%q0;&field0-0-3=status_whiteboard&ty pe0-0-3=substring&value0-0-3=%q0;
bughunt_ordered_terms http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&b ug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&va lue0-0-0=%q0;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q1;&field0-0- 2=short_desc&type0-0-2=substring&value0-0-2=%q2;&field0-0-3=status_whiteboard&ty pe0-0-3=substring&value0-0-3=%q3;
owner_a_bughunt_queryb http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bu g_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&val ue0-0-0=%q;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q;&field0-0-2=s hort_desc&type0-0-2=substring&value0-0-2=%q;&field0-0-3=status_whiteboard&type0- 0-3=substring&value0-0-3=%q;&email1=%q0;&emailtype1=exact&emailassigned_to1=1
reporter_a_bughunt_queryb http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&b ug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&va lue0-0-0=%q;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q;&field0-0-2= short_desc&type0-0-2=substring&value0-0-2=%q;&field0-0-3=status_whiteboard&type0 -0-3=substring&value0-0-3=%q;&email1=%q0;&emailtype1=exact&emailreporter1=1
anyemail_a_bughunt_queryb http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&b ug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&va lue0-0-0=%q;&field0-0-1=component&type0-0-1=substring&value0-0-1=%q;&field0-0-2= short_desc&type0-0-2=substring&value0-0-2=%q;&field0-0-3=status_whiteboard&type0 -0-3=substring&value0-0-3=%q;&email1=%q0;&emailtype1=exact&emailassigned_to1=1&e mailreporter1=1&emailqa_contact1=1&emailcc1=1&emaillongdesc1=1
val_mozilla_page http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2F%q;
val_mozilla_page_to_html_v http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2F%q1;&doctype=%q;
drivefromhome_to_a http://maps.yahoo.com/py/ddResults.py?newaddr=123+Home+Ave&newcsz=12345&taraddr= %Q1;&tarcsz=%q2;
drivefrom_a_to_b http://maps.yahoo.com/py/ddResults.py?newaddr=%Q1;&newcsz=%q2;&taraddr=%Q3;&tarc sz=%q4;
trans_parturl_a_from_b_2c http://fets3.freetranslation.com:5081/?Language=%q2;%2F%q3;&Url=%q1;&Sequence=c ore
trans_parturl_a_from_b_2c_1 http://fets3.freetranslation.com:5081/?Language=%q22;%2F%q33;&Url=%q11;&Sequence =core
trans_parturl_a_from_b_2c_2 http://fets3.freetranslation.com:5081/?Language=%q00022;%2F%q033;&Url=%q000011;& Sequence=core
trans_parturl_a_from_b_2c_3 http://fets3.freetranslation.com:5081/?Language=%q00022;%2F%q;&Url=%q0;&Sequence =core
trans_from_a_2b_parturl_c http://fets3.freetranslation.com:5081/?Language=%q1;%2F%q2;&Url=%q3;&Sequence=c ore
};
my %canonical_testcases = (
# for each testcase, [q{query string}, q{expected resuting URI}]
'a' => [
[ q{doesn't matter what args you put here, they should all be ignored},
q{http://www.alldirect.com/},
],
],
'isbninfo' => [
[ q{0596000529},
q{http://www.amazon.com/exec/obidos/ASIN/0596000529},
],[ q{0596000529 additional args ignored. Book title is Creating Applications with Mozilla},
q{http://www.amazon.com/exec/obidos/ASIN/0596000529},
],[ q{ 0596000529 initial whitespace also ignored},
q{http://www.amazon.com/exec/obidos/ASIN/0596000529},
],
],
'isbnbuy' => [
[ q{0764545884},
q{http://www.alldirect.com/book.asp?isbn=0764545884},
],[ q{0764545884 additional args ignored. Book title is Mozilla Source Code Guide with CDROM},
q{http://www.alldirect.com/book.asp?isbn=0764545884},
],
],
'chart' => [
[ q{1mo aapl},
q{http://quote.fool.com/Chart/chart.asp?time=1mo&symbols=aapl},
],[ q{3mo aapl},
q{http://quote.fool.com/Chart/chart.asp?time=3mo&symbols=aapl},
],[ q{ytd aapl},
q{http://quote.fool.com/Chart/chart.asp?time=ytd&symbols=aapl},
],[ q{2yr aapl},
q{http://quote.fool.com/Chart/chart.asp?time=2yr&symbols=aapl},
],[ q{all aapl},
q{http://quote.fool.com/Chart/chart.asp?time=all&symbols=aapl},
],[ q{ytd msft},
q{http://quote.fool.com/Chart/chart.asp?time=ytd&symbols=msft},
],[ q{ 1mo aapl whitespace and extra args ignored},
q{http://quote.fool.com/Chart/chart.asp?time=1mo&symbols=aapl},
],
],
'chart_reverse' => [
[ q{ aapl 1mo like above, but for those who prefer reversed syntax},
q{http://quote.fool.com/Chart/chart.asp?time=1mo&symbols=aapl},
],
],
'bughunt' => [ # bonus: bug 98749 gets fixed too!
[ q{custom keywords},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=custom+keywords&field0-0-1=component&type0-0-1=substring&value0-0-1=cu stom+keywords&field0-0-2=short_desc&type0-0-2=substring&value0-0-2=custom+keywor ds&field0-0-3=status_whiteboard&type0-0-3=substring&value0-0-3=custom+keywords},
],[ q{not suck},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=not+suck&field0-0-1=component&type0-0-1=substring&value0-0-1=not+suck& field0-0-2=short_desc&type0-0-2=substring&value0-0-2=not+suck&field0-0-3=status_ whiteboard&type0-0-3=substring&value0-0-3=not+suck},
],
],
'bughunt_first_term_only' => [
[ q{tabs and additional args are ignored},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=tabs&field0-0-1=component&type0-0-1=substring&value0-0-1=tabs&field0-0 -2=short_desc&type0-0-2=substring&value0-0-2=tabs&field0-0-3=status_whiteboard&t ype0-0-3=substring&value0-0-3=tabs},
]
],
'owner_a_bughunt_queryb' => [
[ q{ben@netscape.com custom keywords},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=custom+keywords&field0-0-1=component&type0-0-1=substring&value0-0-1=cu stom+keywords&field0-0-2=short_desc&type0-0-2=substring&value0-0-2=custom+keywor ds&field0-0-3=status_whiteboard&type0-0-3=substring&value0-0-3=custom+keywords&e mail1=ben%40netscape.com&emailtype1=exact&emailassigned_to1=1},
],[ q{peterv@netscape.com white-space: pre},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=white-space%3A+pre&field0-0-1=component&type0-0-1=substring&value0-0-1 =white-space%3A+pre&field0-0-2=short_desc&type0-0-2=substring&value0-0-2=white-s pace%3A+pre&field0-0-3=status_whiteboard&type0-0-3=substring&value0-0-3=white-sp ace%3A+pre&email1=peterv%40netscape.com&emailtype1=exact&emailassigned_to1=1},
],
],
'reporter_a_bughunt_queryb' => [
[ q{asa@mozilla.org crash causes},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=crash+causes&field0-0-1=component&type0-0-1=substring&value0-0-1=crash +causes&field0-0-2=short_desc&type0-0-2=substring&value0-0-2=crash+causes&field0 -0-3=status_whiteboard&type0-0-3=substring&value0-0-3=crash+causes&email1=asa%40 mozilla.org&emailtype1=exact&emailreporter1=1},
],
],
'anyemail_a_bughunt_queryb' => [
[ q{hewitt@netscape.com tooltip},
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=tooltip&field0-0-1=component&type0-0-1=substring&value0-0-1=tooltip&fi eld0-0-2=short_desc&type0-0-2=substring&value0-0-2=tooltip&field0-0-3=status_whi teboard&type0-0-3=substring&value0-0-3=tooltip&email1=hewitt%40netscape.com&emai ltype1=exact&emailassigned_to1=1&emailreporter1=1&emailqa_contact1=1&emailcc1=1& emaillongdesc1=1},
],[ q{bryner@netscape.com}, # leaves normal query part empty, makes bugzilla work for very long time :/
q{http://bugzilla.mozilla.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW& bug_status=ASSIGNED&bug_status=REOPENED&field0-0-0=product&type0-0-0=substring&v alue0-0-0=&field0-0-1=component&type0-0-1=substring&value0-0-1=&field0-0-2=short _desc&type0-0-2=substring&value0-0-2=&field0-0-3=status_whiteboard&type0-0-3=sub string&value0-0-3=&email1=bryner%40netscape.com&emailtype1=exact&emailassigned_t o1=1&emailreporter1=1&emailqa_contact1=1&emailcc1=1&emaillongdesc1=1},
],
],
'val_mozilla_page' => [
[ q{mozorg.html},
q{http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2Fmozorg.html},
],[ q{ports/fizzilla/Cocoazilla.html},
q{http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2Fports%2Ffizzilla% 2FCocoazilla.html},
],
],
'val_mozilla_page_to_html_v' => [
[ q{ports/fizzilla/Cocoazilla.html HTML 4.01 Strict},
q{http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2Fports%2Ffizzilla% 2FCocoazilla.html&doctype=HTML+4.01+Strict},
],[ q{ports/fizzilla/Cocoazilla.html XHTML 1.0 Transitional},
q{http://validator.w3.org/check?uri=http%3A%2F%2Fmozilla.org%2Fports%2Ffizzilla% 2FCocoazilla.html&doctype=XHTML+1.0+Transitional},
],
],
'drivefromhome_to_a' => [
[ q{999+EndHere+Ave 56789},
q{http://maps.yahoo.com/py/ddResults.py?newaddr=123+Home+Ave&newcsz=12345&taradd r=999+EndHere+Ave&tarcsz=56789},
],[ q{666+Brimstone+Ave 00666},
q{http://maps.yahoo.com/py/ddResults.py?newaddr=123+Home+Ave&newcsz=12345&taradd r=666+Brimstone+Ave&tarcsz=00666},
],
],
'drivefrom_a_to_b' => [
[ q{111+StartHere+Blvd 12345 999+EndHere+Ave 56789},
q{http://maps.yahoo.com/py/ddResults.py?newaddr=111+StartHere+Blvd&newcsz=12345& taraddr=999+EndHere+Ave&tarcsz=56789},
],[ q{111+StartHere+Blvd 12345 999+EndHere+Ave 56789 all other args ignored},
q{http://maps.yahoo.com/py/ddResults.py?newaddr=111+StartHere+Blvd&newcsz=12345& taraddr=999+EndHere+Ave&tarcsz=56789},
],
],
'trans_parturl_a_from_b_2c' => [
[ q{mozilla.org English Spanish},
q{http://fets3.freetranslation.com:5081/?Language=English%2FSpanish&Url=mozilla. org&Sequence=core},
],[ q{mozilla.org English French},
q{http://fets3.freetranslation.com:5081/?Language=English%2FFrench&Url=mozilla.o rg&Sequence=core},
],[ q{mozilla.org English German},
q{http://fets3.freetranslation.com:5081/?Language=English%2FGerman&Url=mozilla.o rg&Sequence=core},
],[ q{mozilla.org English Italian},
q{http://fets3.freetranslation.com:5081/?Language=English%2FItalian&Url=mozilla. org&Sequence=core},
],[ q{mozilla.org English Norwegian},
q{http://fets3.freetranslation.com:5081/?Language=English%2FNorwegian&Url=mozill a.org&Sequence=core},
],[ q{mozilla.org English Portuguese},
q{http://fets3.freetranslation.com:5081/?Language=English%2FPortuguese&Url=mozil la.org&Sequence=core},
],[ q{mx.yahoo.com Spanish English},
q{http://fets3.freetranslation.com:5081/?Language=Spanish%2FEnglish&Url=mx.yahoo .com&Sequence=core},
],[ q{de.yahoo.com German English},
q{http://fets3.freetranslation.com:5081/?Language=German%2FEnglish&Url=de.yahoo. com&Sequence=core},
],
],
'trans_from_a_2b_parturl_c' => [
[ q{German English de.yahoo.com},
q{http://fets3.freetranslation.com:5081/?Language=German%2FEnglish&Url=de.yahoo. com&Sequence=core},
],[ q{Spanish English mx.yahoo.com},
q{http://fets3.freetranslation.com:5081/?Language=Spanish%2FEnglish&Url=mx.yahoo .com&Sequence=core},
],[ q{English Italian mozilla.org},
q{http://fets3.freetranslation.com:5081/?Language=English%2FItalian&Url=mozilla. org&Sequence=core},
],[ q{English French mozilla.org},
q{http://fets3.freetranslation.com:5081/?Language=English%2FFrench&Url=mozilla.o rg&Sequence=core},
],
],
);
for my $keyword ( keys %canonical_testcases ) {
for my $pair ( @{$canonical_testcases{$keyword}} ) {
&report_on_keyword_with_input( $keyword, @$pair );
}
}
my %additional_testcases = (
# like above, but for catching bizarre bugs. As bugs come up,
# fix them and add a relevant test case or two in here.
);
for my $keyword ( keys %additional_testcases ) {
for my $pair ( @{$additional_testcases{$keyword}} ) {
&report_on_keyword_with_input( $keyword, @$pair );
}
}
}
sub report_on_keyword_with_input {
my( $keyword, $query, $expected ) = @_;
my $uri_t = $::keywords2templates{ $keyword };
my $result = &build_uri( $uri_t, $query );
if ( defined $result ) {
my $ok = $result eq $expected;
if ( $ok and $::verbose ) {
print "... Correct URI when expanding: $keyword $query\n";
} elsif ( !$ok ) {
print "!!! Unexpected URI when expanding: $keyword $query\n";
print " looking for: $expected\n";
print " but I found: $result\n";
}
} else {
print "!!! Undefined URI when expanding: $keyword $query\n";
}
}
Saturday August 03, 2002
12:21 PM
Editor holy war spills into unfamiliar terrain
http://barebones.com/products/bbedit.html
Sure, we're all sick of editor wars. We've got our favorite tools, and
we're so much more familiar with them that we're more efficient using
those tools than any others.
If you've recently purchased a T?iBook (and it sounds like a great many
of you have), then you may be finding that your favorite editor doesn't
work quite as handily in MacOS X as you'd like. It just doesn't fit in
with your newly-raised user-interface expectations and doesn't use the
strengths of the operating system to your advantage.
If you're feeling a wee bit dissatisfied, try BBEdit. It is IMHO (and
in many other folks' HOs) the best editor available on any platform,
and is only available for the Mac. It not only uses the MacOS to your
advantage (applescriptable, recordable, and attachable, quicktime
integration, services), but also integrates well with perl, python,
assorted shell scripting (and lets you set your default shell).
I don't get any kickback for convincing folks to use BBEdit. I just
think that it's so much better than the alternatives that those of
you who haven't tried it are really doing yourselves a disservice.
I had my employer buy me a mac so that I could use BBEdit. I told them
that they'd get more than their money back in my increased productivity
and I wasn't kidding.
A brief laundry list of some of the features:
World-class support. You contact them, and you get answers
back from the folks who actually write the program.
They also have very high quality mailing lists with
very active particpation from the developers.
best perl syntax coloring I've ever seen
(yes, I've seen vim and emacs)
also does a zillion other languages, but I don't care
so much about those
perl scripts and filters handily integrated
as well as pod-reading, perldoc lookup, syntax checking,
running the current file
PCRE find/replace including multi-file search/replace
with file filters to indicate which files to process
menu of your perl subs (menu does headers and named
anchors in HTML documents, similar handy things
in other languages)
user-configurable key bindings
convenient edit via ftp
also integrates well with other ftp clients
worksheets (hybrid of text document and unix shell)
find-differences and selectively apply changes in
either direction
handy DTD- and context-sensitive HTML markup tools
integration with ToolServer, SourceServer, CodeWarrior,
Dreamweaver Absoft Fortran, Mac OS X Developer Help,
your favorite shell, your favorite AppleScript editor,
your favorite everything.
So many useful features that every time I re-read the
manual, I find a new one which will benefit me.
If the above doesn't at least pique your curiosity, then maybe BBEdit isn't
for you. If you're interested, you can get a free 'crippleware' version of
the editor (BBEdit Lite) to get a little taste. The real thing is *so* much
better though.
http://barebones.com/products/bbedit_lite/bbedit_vs_bbedit_lite.html
-matt
Wednesday July 10, 2002
09:03 AM
dump of module version information
mako132 was looking for a way to get version info for
each module use'd by his script.
http://use.perl.org/~mako132/journal/6244
I replied with a ~20 line END block which should do the
trick. I thought I might find the code handy myself one
day, so I thought I'd stash it in my journal as well for
ease of finding. ((code at end of journal entry))
Maybe that's a use for this journal... post odd bits of
code that don't have any associated project, invite any
readers to critique/improve/ridicule said code, look at
code years in the future when I can better do the same
to it.
-matt
(still deciding what to do with this journal thing)
END { no strict 'refs';
for my $k ( sort keys %INC ) {
( my $module = $k ) =~ s{[:/\\]}{::}g;
$module =~ s{\.pm$}{};
my $version = ${"${module}::VERSION"};
if ( defined $version ) {
$version = "\$${module}::VERSION = $version\n";
} else { # maybe they didn't use ALLCAPS
my @found = (
map { defined ${"${module}::$_"}
? qq(\$${module}::$_ = ${"${module}::$_"}) : ()
}
grep { m/^version$/i }
keys %{"${module}::"}
);
$version = !@found
? "($module version number not found)\n"
: join( "\n", @found );
}
# if you want, print this to a log file instead:
print "$version $module loaded from $INC{$k}\n\n";
}
}
Monday July 01, 2002
04:57 PM
Wheeee! YAPC was fun!
(and so is this journal thing, or maybe it's just 'cause I'm a wee
bit punchy from lack of sleep... we'll find out in future days)
Highlights (Letterman style)
#10 the weather could have been substantially worse (really!)
#9 being paid to have nothing but fun for three days
#8 finding little ways to pitch in with assistance
#7 seeing more women (I think) than at YAPC::NA 2001
#6 laughing my ass off (especially allison's & gnat's l.Talks)
#5 being local so I didn't have to miss Laura for a week
#4 seeing some interesting ideas in code (YAML, abigail's OO)
#3 seeing the perl community *qua* community
#2 catching up with folks from far places
#1 meeting neat new people (Riley would have to be the most new)
#0 great company every day and evening, Wed though Sat!
Lolights
#4 gnat's 'something something' eleventh-hour slot-filler
turned out to be something else at the last minute. I
have yet to see him speak, and was looking forward to
whatever 'something something' might have been. Next time.
Silver lining: even though I still didn't get to see him
speak for his l.Talk, the movie was fucking hillarious.
#3 MJD wasn't quite his usual animated and focused self
when giving his red flags talk on Friday morning.
Silver lining: in reading the slides (half of the YAPC
proceedings!) I found a flag I need to watch myself.
I can think of a few scripts where I do the icky
if (...) {
if (...) {
if (...) {
# ...
} else { ... } # tertiary error
} else { ... } # secondary error
} else { ... } # my initial error
insted of using breaks or carting it all off into a
sub where I can use 'condition or return' statements.
#2 I'd hoped for more perl code in T::S::C
but it's all hidden to avoid spoiling the effect.
Silver lining: maybe I'll start playing with source
filtering to figure it out myself.
#1 I could only be in one room at a time. Silver lining:
I'm looking forward to seeing more recorded sessions
show up on the web as folks get settled in and have
time to process their recordings.
Of course not every cloud has a silver lining...
#0 YAPC was over far too quickly :(
Biggest Bummer of them all:
I think I might have to miss YAPC next year. We'll be
moving to Portland, OR around YAPC season, and so not
only will the budget be leaner, but time will be more
precious (and likely spent job-hunting). Sigh...
-matt