September 2002

« August 2002 | Main Index | Archives | October 2002 »

30
Sep

Cruelty

  • 8:47 PM
I was channel-surfing, and I found a program called Crank Yankers on SBS. It's one of those phone-prank shows, adapted to TV by having the calls enacted by puppets. It reminded me just how un-funny I find this kind of humour.

The prank phone-call, at its essence, relies on the generosity of the person on the other end of the line. It preys on someone's willingness to do their job to the best of their ability, or it preys on the victim's willingness to give the perpetrator the benefit of the doubt. So in essence, what it's trying to say is “People who take strangers at face value are funny, and it's fine to laugh at someone whose job it is to be nice to you whatever you say.” That, to me, is not funny.

It's just cruelty.

Now don't get me wrong, a lot of, even maybe most1 humour is cruel. But I can only find cruelty funny if the victim is deserving or complicit, when they bring it upon themselves. That's why the best sitcoms are populated by flawed people2, because really good comedy is about bad things happening to people, and bad things happening to nice people aren't nearly as funny as people who bring misfortune on themselves.

It's why a good scam is entertaining—all good scams target the greed of their victims. But prank phone-calls? No thankyou.

1 Puns are the exception, although you could argue that puns are cruel, just to the listener.

2 Basil and Cybil Fawlty were cruel. Manuel was incompetent. Polly was nice, notice how she escaped most episodes largely unscathed? Lister, Rimmer, Cat, Kryten and Holly. The vanity and selfishness of the cast of Seinfeld. Each Simpsons character, defined by a character flaw.

Joe: To edit or not to edit?

Should you edit old entries to correct mistakes or should leave it as a snapshot. If a blog is form of a time capsule, each entry should be considered sealed for prosperity. If a blog is consider a living resource, it makes sense to trim and prune it much like you would care for a garden.

If I'm just fixing typos or punctuation, I'll do it silently and not worry. If I add anything that substantively changes the meaning of a post, I'll label it. I try never to delete anything substantive. Attempting to un-say something by deleting it is really just a case of hiding the evidence. I'd much rather correct myself out in the open than pretend I was never wrong in the first place.

Today, we installed JIRA on an NT server for a client. It turned out the NT server was running into swap because of a bunch of other stuff running on it and the app ran too slowly, so David suggested, “Why don't we stick it on the AS/400?”

So we did. Now from Mike's reaction we're the first person to try this. It worked first time. In fact, it took less time to get running than it did to poke a hole in the firewall so people could see it.

Next time someone tells me Write Once Run Anywhere is pointless, or just a myth, I shall beat them with my clue-stick.

Russell Beattie:

It's surprising to me how most bloggers could care less about their domain name. It would drive me absolutely batty to have a number as the sole identifier of my weblog.

Yes, it bugs the hell out of me. The Radio weblog was just a bit of a weird hobby I never really expected anyone to read, but then one day I started getting links and readers, and I was somewhat stuck with it. Now I've got enough link-cred that Google notices what I'm saying, and that's a drug that's hard to give up.

I don't particularly like Radio either. I was planning to just stick MT or Roller on www.pastiche.org and be done with it, but then my hosting provider jacked up the prices by 33% and I had to move the server back onto the wrong side of my 56k modem.

Oh well, at least 190 is a low number.

How about this for the worst product name in the Java space? Javaanal: Java documentation analysis utility![rebelutionary]

<rant>It does quite suit the application, though.

  • It's for examining Javadoc coverage, but it's written in Visual Basic, and hence single-platform.
  • It works by looking at the generated HTML instead of the source, so if you've got a non-standard doclet, it'll fall over and die.
  • It presumes to recommend word counts for Javadoc—from 200 words per interface definition to 10 words for each instance variable. This just reinforces my belief that Javadoc coverage tools don't encourage better documentation, they just encourage more documentation.
  • From the disclaimer: “HCi Consulting Pty Ltd would like to warn potential users that this product may provide misleading, dangerous, and just plain silly results if not used by our staff experts.” In other words, “If you're stupid enough to use this tool, you'll probably want to pay us for consulting, too.”</rant>

Edit: Ah. They're an ISO9000 consultancy, suddenly everything is clear. When I lived in Perth, I worked for an ISP. The owner ran an ISO9000 consultancy out of the same office. Whenever you added a new user, they had to be entered in four different places: the Unix passwd file, the contacts database, the accounting software and a paper file. This procedure led to the four sources of data never agreeing with each other, and obviously much hilarity ensuing therein.

The thing about ISO9000, though, is that any procedure is a good procedure, so long as it's documented. You could say “all new customers must be entered into the database using only your left hand, while standing on your head in a vat of cow dung”, and so long as that was written down on a sheet of paper and photocopied a thousand times, you'd still qualify for “Quality Management” If you've got a nice cover-sheet where you tick the boxes for each place you have to enter the information, the inconsistency becomes the fault of the employee, not of the overly complex steps he has to take.

Bleah.

I mentioned the bad state of affairs to my boss when I started, told him it'd probably take six months to write a replacement system (since I'd basically have to have done most of it myself), and that he'd better start now because the more the company grew, the harder it'd be to replace the broken system and transition to the new.

Needless to say, twelve months passed, the user-base grew by about a third and the number of different services being offered doubled. Then I was told to drop everything and start on the replacement system. Number one priority. I was also asked if I could have it done by the end of the month. Oh, and I couldn't really drop everything because I was also having to spend the next few weeks filling in for the system administrator who was on holiday, so I'd just have to do overtime to get it done.

It's about then that I started applying for jobs elsewhere.

Mike:

Why don't people understand that opening windows for me is a bad idea? It's one of the original usability sins.

Erik:

I spawn new windows, and I like it. So stop your whining.

Charles:

I'm on Mike's side.

  1. Spawning new windows is annoying. I use tabbed browsing. If you're spawning new windows, you're breaking out of my carefully organised tabs.
  2. Spawning new windows is bad accessability
  3. Spawning new windows is presumptive. It's saying that your style of browsing is better suited to my needs than my own.
  4. Spawning new windows is arrogant. It's saying “I know my site is more important than the site I'm linking to, so I'm making sure you have to come back!” Rubbish. That's my decision, not yours.

I generally browse by opening up three quarters of links in new tabs, but even then that's my decision. I certainly wouldn't presume to force it on anyone else.

Name: Error Codes

Context:

You need to provide a stable platform for clients to interpret errors occurring in a networked application (for example a web service)

Forces:

  • You want to make it as easy as possible for a client writer to inform the user of abnormal conditions. The easier it is to write a client, the more likely your service will be quickly adopted.
  • You want to make it possible to write an advanced client that intercepts errors and handles them internally. For example, the client may wish to present messages in another language, or perform some action other than reporting the error to the user.
  • Clients should not break if a service's human-readable error codes are changed.

Therefore:

Present error messages both as an easily machine-parsed code, and as a textual description. Client writers may choose to pass the description straight to the user, to interpret the code and take some other action, or some combination of both.

Examples of use:

SMTP, NNTP, FTP, HTTP, etc...

Notably absent from:

Pretty much every web-service designed by amateurs.

Cory Doctorow has made one or two posts about warchalking recently. In one of the comments on his site, he makes the claim that “...the default assumption of the Internet is that open services can be connected to. That's as true of httpds on port 80 as it is of WiFi.”

I'm sorry, but this is simply not true. It is like saying that because you can assume it is legal to walk into a shop with an unlocked door, all unlocked doors are fair game. WiFi is not WWW, and a WiFi network is just as likely to be private as it is public even if it's not properly secured. If someone forgets to lock their door, that still isn't legally an invitation to wander through their house, even if someone's graffiti'd “Come Inside!” on the steps.

firewall-wizards moderator, Paul Robertson, put it like this:

While I realize that there are people who advertise their own networks, I think that the potential for damage for folks with large networks and angry people who've “moved on to persue other opportunities” makes the whole idea bad. Couple that with people who deploy networks and don't understand the technology and it gets worse. IMO, the folks wishing to provide open access should have chosen a common SSID and perhaps even a common WEP key. People who conciously choose to make their nets open shouldn't have a problem doing that- taking the insecure default, or worse-yet having to manage keychanges and SSID changes over a large enterprise because the intern in the mail room is pissed at his boss and things it'd be cool to publish your WEP keys and SSIDs in midtown Manhattan is a bad thing. Someone's pissed off kid chalking the home “behind the VPN” access point is a bad thing. The default of attackable and exploitable until made otherwise is a bad thing, some people will take advantage of this and worse-yet will encourage others to (perhaps inadvertantly) trespass on networks that don't belong to them.

The last thing we need is some poor innocent being prosecuted for hacking because they saw a chalk with the WEP key and SSID and thought it was made by the network operator, but it was really put there by the receptionist's ex-husband.

The best thing the warchalking community can do right now is to follow Robertson's advice. Pick a standard naming scheme for open networks, and publicise it as widely as warchalking. Otherwise, it'll all end in tears, and protestations that you thought you weren't doing anything wrong are going to be soundly, and deservedly ignored.

Too much of the marketing of development environments seems to ignore the fact that the thing coders spend the majority of their time doing is either writing code, or thinking about writing code. “Just fill in this wizard, and you've deployed your very own web service” does not impress me much when all the service does is say “Hello World”

So long as you follow the advice of the Pragmatic Programmers and automate everything you're likely to do more than once, it's pretty easy to get around the absence of specialised tools for things like EJB development, application deployment and so on. All the development environment needs to do in that situation is stay out of the way (which some do better than others). On the other hand, you're unlikely to want (or have time) to write a fully-featured editor or code-navigation tools, and these are the two things that help you write code, and think about writing code.

The reason Intellij IDEA is so cool is that they started with the plan “let's write an environment for writing code, and thinking about writing code”. With that and the hooks to Ant, JUnit and CVS, there really wasn't much you couldn't make it do. A guy from Sun was giving us a sales demo for SunONE Studio on Friday, and all the questions that sprung to mind about it were a checklist of IDEA editor features. Does it have smart templates? Refactoring support? Java context-aware searches?

Amongst all the things SunONE Studio could do with EJBs, web services, web applications and so on, refactoring turned out to be a third-party plugin. To me, this is like shipping a car with air-conditioning, mag wheels and a turbocharger, but it's stuck permanently in first gear until you buy Rational Gearbox™

Maybe us bloggers should band together and buy Howard a certificate for Ekit? I wonder if that would solve the Ekit copy-and-paste problem? [Blogging Roller]

Maybe us bloggers could come up with a co-operative code-signing certificate scheme that bypasses Veri$ign completely? How easy/difficult is it to add a new trusted root certificate to a Java installation?

Attachment...

  • 8:33 AM

When the plate has been sitting unwashed in the sink for over six months, it's time to let go.

Joel Spolsky's take on the cancelled Space Shuttle project is an interesting read, as always. I was going to post an anecdote of my own experiences replacing old systems, (CICS. COBOL. Die. Die.) with new (Entity EJBs. Die. Die.), but I'd probably be skirting too close to an NDA. Discretion is, after all, the better part of valour.

I started wondering on Friday how many people respond to something I write, but I never see them because Userland wipe my referrer logs at 5pm AEST every day—If I don't check them while I'm still at work, I'll never see who's linking to me. They're stored on the server somewhere, I seem to recall, but I can't remember the URL.

A good weblog post doesn't exist in a vacuum, it's either a contribution to an ongoing conversation or it's an attempt to initiate a new conversation. Even when a post is just a link to an article, there's an implicit “what do you guys think?” there. What I would love to see is an easy, efficient way to graph and follow these conversations.

The web solution to this are services like blogdex or protocols like trackback, which graft relationships between blog entries onto the web pages. These are nice enough, but they require some work to follow, and the more a conversation branches, the more work it is for someone trying to follow it.

My initial, really vague idea was this. Think of it in terms of Instant Messaging. You are a member of a cloud. When you post a blog entry it gets intercepted, and for each URL you have linked to in your post, you join a ‘channel’ devoted to that URL. The channel is notified of the contribution you have just made to the conversation about that URL. Thus, as the conversation progresses, each contributor can follow the activity in the channels. Close, but needs polish.

Then, I suddenly realised. Wow, I've finally found an interesting application for Javaspaces. Create a Tuple Space. Every time you post a blog entry, you put it into the space, along with a bunch of linking objects that point to any other URL you referenced in your post. Clients could traverse the conversations in the space, ask for event notifications if a new reference is made to a post, et. al. Leasing would ensure the space culled conversations that nobody was referring to any more.

I wish I wasn't so damn busy over the next few weeks...

For some reason, I find this highly amusing.

They were the men and women of the Capitol's Flag Office - a little-known department of the Government whose sole duty is to raise and lower US flags over the roof of the US parliament building, so that senators and representatives can distribute to their constituents flags that have officially flown over the Capitol.

...

The discretion is understandable. Most recipients - party donors, supporters, cronies and good causes, as well as ordinary constituents who have paid $US30 (about $54) to have a flag flown for them - fondly imagine that they are getting a flag that has flown all day.

In fact the Flag Office uses special short flagpoles, near the small dome over the House of Representatives. For rainy days, there are three poles under the lip of the dome, and for September11 a dozen extra poles were erected. Each flag is typically hoisted for just a few seconds.

The flags flown on September11 were a little slower, as they had to be flown at half mast, said Reynell Bennett, a supervisor.

"It takes a little longer to raise them to half mast. They have to go up to the top, then come back down and stop halfway. They said the average was about 30 seconds."

It's just quintessential capitalism, isn't it?

RMS

  • 8:01 AM
Richard Stallman is a grade-A nutbar, but sometimes he hits the nail right on the head:

The purpose of a company is profit, but profit can be made in various ways. Some methods respect the freedom and well-being of others, while some trample other people's rights and lives. When the executives of a company have no principles or scruples to restrain them, it is only natural that they will try the latter methods. It is natural, but that is not an excuse. To accept selfishness as an all-purpose excuse for mistreating others is to reject the whole idea of right and wrong. (from The Register)

Pointless

  • 11:05 PM
I'm currently downloading a 13 Megabyte MPEG. Five minutes of video. Of a championship tetris game. No, I have no idea why I'm doing this. It's all targaff's fault.

Update: I would like to apologise for besmirching Targaff's good name. That video was possibly the most amazing feat of skill I have ever seen. It verges on superhuman.

Charles' steps to the perfect cup of Earl Grey1.

  1. The water must have only just boiled the second before you pour it. The hotter the water, the better taste you get from the tea. If the kettle's sat even a moment since boiling, boil it again.
  2. Don't put any milk in until after the tea has finished brewing2. Adding milk changes the consistency of the water, and cools it down, so the tea can't brew properly, and tastes wrong.
  3. Tea wants to be strong. Don't rush it while it steeps. Let it wait long enough.
  4. Don't add more than a small splash of milk, or you'll drown the tea. The tea should be a white-ish brown, not a brown-ish white.
  5. Start drinking the tea while it's still too hot to take a full gulp. You can take bigger mouthfulls later into the cup, but the feeling of the really hot tea sliding down your throat is what this whole experience is all about.

1 Purists would say it can't be the "perfect" cup because I use teabags. You'll have to excuse my heathen ways
2 Many tea purists have argued bitterly over whether the milk should go in the cup before, or after the tea, but this debate comes from those days when tea was brewed in a pot, and then poured into the cup. You shouldn't put the milk in first when you're brewing the tea in the cup.

I'm Batman

  • 12:05 AM

In an amusing piece of comic timing, there's an article on Slashdot containing the line “Is this possibly the worst fit for an actor in a superhero role since Michael Keaton in Batman?”

I protest. lonita and I were talking about this just last night, (hence the comic timing). It's stupid casting Batman like you're casting an action movie, because as soon as the big rubber suit goes on, he could be anyone. Keaton was a very good Batman, precisely because he was not cast to play Batman, he was cast to play Bruce Wayne.

Of course, Kilmer and Clooney weren't the only reasons that post-Keaton Batman movies sucked. But they're a pretty big contributing factor.

If you are walking across someone's path (i.e. you are walking along, and someone else is walking towards you from a 90 degree angle), the correct thing to do is to either keep the same pace, or walk faster. Under no circumstances are you to slow down or stop.

If you keep walking, the person walking towards you can adjust his pace slightly, and aim just behind where you are likely to be when he reaches you. By the time he reaches you, you will no longer be in that space. If, in the meantime, you walk a little faster, you'll ensure he misses you by more. This is an approach you really can't go wrong with, and it requires the least effort on the part of both parties.

If you slow down, he will have to readjust to react to your new speed, and go further out of his way to walk around you. This is annoying.

If you stop entirely, you'll end up with him walking straight at you, and you'll be left in that stupid "do I go left or right" dance that people end up in when they meet face to face. This is even more annoying.

This public service announcement was brought to you care of some stupid git on Erskineville road.

American Gods

  • 5:10 PM

A great article by Neil Gaiman about the gender of books, and how American Gods got itself written.

For some reason today, I looked at Userfriendly. I haven't read that site for years, and looking through the recent archives I don't regret my not reading it in the slightest. Anyway, one thing that did make visiting the site worthwhile was today's Link of the Day.

I've been very good in my avoiding all coverage of the anniversary of the World Trade Centre attacks so far, even to the point of turning off the TV in the corner of the pub last night because they were showing footage. This, however, was different. Exhibit 13 is a video-clip by Blue Man Group, although the blue men themselves don't make an appearance. Instead, the video stars pieces of paper that blew into Brooklyn after the collapse of the towers.

This is what a memorial should be. It's understated and poetic, where everything else has been massively hyped, and about as subtle as a punch in the face. It offers peace, where the news wants you to revisit horror. Most importantly, it invites you to sit for three and a half minutes and think for yourself, instead of telling you what you should be thinking.

Gutei's Finger

  • 1:36 PM
This is probably my favourite Zen story:

Whenever anyone asked him about Zen, the great master Gutei would quietly raise one finger into the air. A boy in the village began to imitate this behavior. Whenever he heard people talking about Gutei's teachings, he would interrupt the discussion and raise his finger. Gutei heard about the boy's mischief. When he saw him in the street, he seized him and cut off his finger. The boy cried and began to run off, but Gutei called out to him. When the boy turned to look, Gutei raised his finger into the air. At that moment the boy became enlightened.

I recently educated myself on the correct HTML way to do ‘single’ and “double” curly quotes, as well as em and en dashes: (‘—’ and ‘–’). I think I can even remember the rules about which dash goes where (a good explanation can be found in this A List Apart article, although it recommends using the numerical entities I can never remember). I doubt the character entities I'm using work in all browsers. On the other hand, I don't really care that much. This is my journal, cross-browser compatibility be damned.

There are a number of people who are saying that moving to XHTML now is a good idea.

Thus, it's refreshing to hear Ian Hickson, Mozilla's web-standards guy, saying that we should stick with HTML4 for now.

Being Skinned

  • 12:47 PM

(This story was also posted to Kuro5hin)

One of the User Interface trends that emerged in the 1990's was ‘skinnability’: the ability to customise the appearance of an application right down to its controls and window decorations. Skinning continues to be a big hit amongst computer users who can now make their entire computer look like their favourite cartoon, but it presents a challenge to User Interface designers.

Paradoxically, skinnability reduces the expressiveness of a user-interface. It does so by restricting the vocabulary of the interface to those things that can be expressed compatibly with all existing skins (or even all potential skins). This is a minor problem for applications, and a huge problem for platforms.

System Colours

On most Operating Systems you can customise the system colours. The reasons for doing this range from the insignificant (you just like purple a lot), to the incredibly significant (you are colour-blind or visually impaired, and you want a contrasting colour scheme that would look really stupid to anyone else).

While they increase the freedom of the user, customiseable system colours reduce the possible range of expression within an application. The typical computer can display several million different colours, but an application designer can rarely use them, because they are restricted to the small set of named and customiseable colours. If you are designing some interface element, the colour of which can not be described in this language, you just have to pick the one that is ‘close enough’.

Using colours in a User Interface can be a bad thing if the colour-choice is bad (making for an ugly application), or if colour is the only thing that distinguishes a particular element (making the feature unuseable for the visually impaired). However, colours can be a useful tool, and colour is an important way of communicating with people who can see it.

Notably, Mac OS X only has two supported colour-schemes: Blue (with the familiar aqua controls), and Graphite. Graphite was provided for graphic-designers who found the blue interface made it harder to judge colours while working on a picture. When designing an OS X application you can pretty much rely on having black-on-white windows with those horizontal stripes. That said, the UI toolkit still has a set of named system colours, and recommends you use them instead of defining your own.

Speaking in Tongues

Full skinnability adds to the limitation of expressability by limiting the available vocabulary of an application to those interface objects that are already supported by the available skins. This problem appears in skinnable toolkits, such as GTK+, or Java Swing.

A common metaphor in interface design is that of language. The vocabulary of a user-interface lies in the set of available controls. The controls themselves are nouns. The state of a control is an adjective. The actions that we can perform on those controls are verbs.

Most platforms come with a particular dictionary of available nouns, verbs and adjectives, and developers are encouraged to stick to the official dictionary as much as possible. Firstly, users find it easier to understand an application that way because the language is familiar. Secondly, if the official language is changed or expanded in the future, it can be done in a way that doesn't conflict with existing applications. The exception to this rule is games, but the analogy holds—fiction-writers have always been able to be freer with language than technical writers.

Sometimes, however, you come across something that you want to represent in an application that, as hard as you may try, can not fit into the existing vocabulary. At that point, you must create a new control, and wear the cost of having your user learn it for themselves. New words are invented by looking at existing words, and maybe crunching a few of them together, or making something that looks very similar to the words you almost mean. Similarly, you make a custom control either by combining existing controls, or by looking at the existing controls and thinking what changes you would need to make to them so that they have the capabilities you want.

When an interface is skinnable, each different skin becomes a dialect of the language. So if you want to write a custom control, you are no longer introducing a new word to a single language, you're introducing the same word to an infinite variety of languages. You either have to choose a control that looks natural in every skin (impossible), or ‘translate’ your control to each skin (far too much work). Designers of skinnable applications come across this problem freqiently—having to render all existing skins incompatible (or horrendously ugly) because the application has some new interface element that only the default skin supports.

Buttons!

It is even worse when skinnability not only alters the appearance of the generic controls (“This is the appearance of the class of all buttons”), but allows the customisation of specific controls (“This is the appearance of the ‘Go Back’ button). Most skinnable applications, such as Winamp or Mozilla take this route.

For a pathological case, consider Mozilla. The hypothetical case is a developer wishing to write a Mozilla add-on that places a “blog this page” button on the toolbar. Like all buttons, it needs an icon, but unfortunately ‘Blogger Button’ is not a supported noun in Mozilla's skinning vocabulary.By default, Mozilla comes with two skins (Modern and Classic), and there are several popular third-party skins such as Orbit (which the author uses).

Unless you want to draw different icons for each of the popular skins, you are stuck with the fact that your icon will only fit in with one skin, and be inconsistent with all the rest. Inconsistency is a very bad thing in User Interface design, an icon that is incongruous will make it more difficult (and take longer) for the user to target any toolbar button as a result. For anyone not using the same theme as you, the overall user experience of your add-on will be negative, and people will not use it.

Choice

The problem with skinning is... users like it. From the point-of-view of a user, skinnability gives them greater choice within an application or environment because they can customise how it looks. Many people spend inordinate amounts of time on this pursuit. Unfortunately, from the point of view of an application designer, skinnability ultimately reduces the user's choice, especially when it comes to applications that may innovate in terms of their design, by reducing the vocabulary, or palette available to the developer.

The Nomic Game

  • 11:54 PM

I was reminded of this by a few other posts flying around this evening.

The Nomic Game was invented by Peter Suber, and first published in a column by Douglas Hofstadter (of Godel, Escher, Bach fame).

Like every game, it has rules. Amongst other things, the rules tell you how you earn points, and how many points you need to score to win. One of the rules prescribes the procedure for voting in changes to the rules. You see, it's a self-modifying game. Every rule can be changed, if you follow the right procedure, and the right procedure is defined by the rules.

Sounds a bit weird? Why? That's how most democracies work.

The very first rule says you have to obey the rules. That one could be changed too, but it would make the game very difficult for anyone to win.

It'd be interesting to play.

Apple have posted a new batch of Switch ads, including the destined-to-be-parodied-to-death, “My name is Janie Porche, and I saved Christmas.”. Amusingly enough, pretty much all the old ads have been banished from the page, except the stoner's favourite switcher, Ellen Feiss.

It was a really good paper.

Dave Winer opines:

I've been posting this question on various weblogs and in private emails. The question is this. Why not add language to the spec that says it's okay for an RSS feed to include elements not defined in the spec, and leave it at that.

Please. God. No.

  • Pretty much every element of RSS0.94 is optional, and can be left out. If you also allow arbitrary elements to be added, do you have a specification any more?
  • In the RSS 0.9x series, a valid version 0.9x document is also a valid 0.9x+1 document. If you allow arbitrary elements you break this contract, or at least make it impossible to add new elements to the specification. Each added element becomes a redefining of a previously permitted but undefined element.
  • It would discourage the adoption of RSS modules (for which there are already a good set of defined standards, and which can be mixed and matched) in favour of a hundred splintered dialects of the core RSS, which may be mutually incompatible.

Oh, and ten points for someone who can tell me where this post's title (Babble out in simile, since the titles are only visible in my RSS feed) comes from, without using Google.

For a while, my mother had a job that involved helping writers. If you were a writer, she'd be able to tell you how to get in touch with publishers, how to get your manuscript assessed, what writing events were going on around the state, and so on. Regularly, she'd receive a phone-call that went something like this: “I've got this really good idea for a book. Do you know someone who could write it for me?”

If you want to see the same theory at work in programming, have a look at this gem on Sourceforge (all spelling and grammar atrocities are transcribed verbatim from the original):

An online life simulation game. You play againts many users for a life simulation game. Its like an online version of The Sims accepot better and multiplayer. It will be targeted to run on linux, using mysql as the database apache as the web server php

Looking down below the Development Status: 1 - Planning, but just above the section that shows the project has released no files, and has nothing in CVS, is a link: HELP WANTED: This project is looking for Developer(s). Follow that link, and you get the plaintive request...

start programming first step. We need the game planned up. Please give us ideas.

It would improve the site no end if sourceforge refused to make a project visible to other users until it posted some working code. Just one minor feature or prototype would do, just enough to show that the thing isn't just some flight of fantasy.

Sam Ruby explains where he would take RSS if he were king of the world. Imho, he punts on the hard decisions, but maybe that's not so bad. [Scripting News]

Now, given a few minutes digging through the recesses of my memory for my sketchy recollections of American football, I can almost work out what “punts on the hard decisions” means. Ward's Wiki has a page on this: AmericanCulturalAssumption.

It's been a long time since I wrote a stream-of-consciousness rant. I expect to not make much sense. :)

After seeing all the advertisements of what is lined up, the only thing that is going to convince me to turn on the television this September 11th is if something new blows up.

This isn't about grief, or respect, or commemorating the dead. It's about adopting someone else's tragedy. It's standing by the side of the road, gaping at the wrecked car. It's an emotionally stunted public trying to become part of something bigger, even if that “something bigger” is a mass-murder. It's about taking the humanity away from everyone involved in the event, and turning them into media symbols.

This isn't part of a healing process. Showing all that footage again in prime time isn't a memorial of lives lost, it's a replay of death. Showing the fire-fighters rushing into a building we know is about to collapse on them, that we've seen collapse a thousand times already in the last year, is voyeurism, pure and simple.

It's the same pattern repeated. When two children in England are murdered, the news value of the event in Australia is practically nil. But it's run anyway, full page spreads in the tabloids, pictures in the news, for weeks on end. Why? For the entertainment of the masses. Yes, it's entertainment. It's something that has absolutely no meaningful impact on the people who read it, it just provokes an emotional reaction. It's the same reason we go see movies. It's a tear-jerker, a murder mystery, and in the end they catch the killers.

Entertainment. We live mostly routine, unremarkable lives, and that's not enough. We crave the endorphin rush we get from extremes of emotion, that natural chemical hit. It's just so much more convenient to get that hit vicariously, to momentarily adopt someone else's emotion, than to actually be involved. Much less messy. Much easier to limit it to a short, intense moment, and then be done with it and go back to our lives, sated.

Until, of course, it's time to re-show all the footage for the first anniversary.

Lovely quote from Doc Searls (via Dave Winer) about Steve Jobs' contributions to computing: “They were also inventions intended to mother necessity”

This week I'm experimenting. I bought a USB keyboard, turned off my Win2k desktop box, and I'm running the Powermac as a desktop replacement plugged into its monitor whenever I'm home. So far, I've not missed Windows one iota.

A very interesting mailing-list post from Ralph Johnson, one of the authors of Design Patterns. He talks about good and bad Patterns practices.

People who make up-front designs are attracted to patterns, because they think that patterns will help them to have designs with less of the flaws of their current designs. Patterns might help a little, but the real problem is lack of feedback and lack of experience, and patterns do not directly address these problems. If people are both designing and implementing systems, then when they use a pattern, they will quickly learn whether it works and whether it makes their system better. If they are doing paper designs then they will not, and so are likely to use the pattern inappropriately.

One of my pet Java peeves is that some people religiously avoid the String concatenation operators, + and +=, because they are less efficient than the alternatives. It's an urban legend with a very tenuous basis in fact. Yes, there are some situations that requires StringBuffer instead of String. No, that doesn't mean that String concatenation is bad in all cases.

The theory goes like this. Strings are immutable. Thus, when you are concatenating "n" strings together, there must be "n - 1" intermediate String objects created in the process (including the final, complete String). Thus, to avoid dumping a bunch of unwanted String objects onto the garbage-collector, you should use the StringBuffer object instead.

So, by this theory, String a = b + c + d; is bad code, while String a = new StringBuffer(b).append(c).append(d).toString() is good code, despite the fact that the former is about a thousand times more readable than the latter.

For as long as I have been using Java, this has not been true. If you look at StringBuffer handling, you'll see the bytecodes that a Java compiler actually produces in those two cases. In most simple string-concatenation cases, the compiler will automatically convert a series of operations on Strings into a series of StringBuffer operations, and then pop the result back into a String.

The only time you need to switch to an explicit StringBuffer is in more complex cases, for example if the concatenation is occurring within a loop (see StringBuffer handling in loops)

Regular String Handling

Tests performed on an OS X 10.2 system running the supplied 1.3.1 compiler, which is basically Sun's compiler. The compiled bytecodes were identical on my Linux box running 1.4.0

The Class

public class Test {
        private String a = "alpha";
        private String b = Beta;
        private String c = "gamma";
 
        public String test1() {
                return a + b + c;
        }
 
        public String test2() {
                StringBuffer s = new StringBuffer(a);
                s.append(b);
                s.append(c);
                return s.toString();
        }
}

Test1 decompiled:

Method java.lang.String >test1()
   0 new #8 <Class java.lang.StringBuffer>
   3 dup
   4 invokespecial #9 <Method java.lang.StringBuffer()>
   7 aload_0
   8 getfield #3 <Field java.lang.String a>
  11 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
  14 aload_0
  15 getfield #5 <Field java.lang.String b>
  18 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
  21 aload_0
  22 getfield #7 <Field java.lang.String c>
  25 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
  28 invokevirtual #11 <Method java.lang.String toString()>
  31 areturn

Test2 decompiled

Method java.lang.String test2()
   0 new #8 <Class java.lang.StringBuffer>
   3 dup
   4 aload_0
   5 getfield #3 <Field java.lang.String a>
   8 invokespecial #12 <Method java.lang.StringBuffer(java.lang.String)>
  11 astore_1
  12 aload_1
  13 aload_0
  14 getfield #5 <Field java.lang.String b>
  17 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
  20 pop
  21 aload_1
  22 aload_0
  23 getfield #7 <Field java.lang.String c>
  26 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
  29 pop
  30 aload_1
  31 invokevirtual #11 <Method java.lang.String toString()>
  34 areturn

String Handling in a Loop

The Source

public class Test2 {
        private String a = "alpha";
        private String b =  "beta";
        private String c = "gamma";

        public String test1() {
                String r = "";
                for (int i = 0; i < 10; i++) {
                        r += "foo";
                }
                return r;
        }

        public String test2() {
                StringBuffer r = new StringBuffer();
                for (int i = 0; i < 10; i++) {
                        r.append("foo");
                }
                return r.toString();
        }
}

The Bytecodes

Method java.lang.String test1()
   0 ldc #8 <String "">
   2 astore_1
   3 iconst_0
   4 istore_2
   5 goto 31
   8 new #9 <Class java.lang.StringBuffer>
  11 dup
  12 invokespecial #10 <Method java.lang.StringBuffer()>
  15 aload_1
  16 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
  19 ldc #12 <String "foo">
  21 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
  24 invokevirtual #13 <Method java.lang.String toString()>
  27 astore_1
  28 iinc 2 1
  31 iload_2
  32 bipush 10
  34 if_icmplt 8
  37 aload_1
  38 areturn

Method java.lang.String test2()
   0 new #9 <Class java.lang.StringBuffer>
   3 dup
   4 invokespecial #10 <Method java.lang.StringBuffer()>
   7 astore_1
   8 iconst_0
   9 istore_2
  10 goto 23
  13 aload_1
  14 ldc #12 <String "foo">
  16 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
  19 pop
  20 iinc 2 1
  23 iload_2
  24 bipush 10
  26 if_icmplt 13
  29 aload_1
  30 invokevirtual #13 <Method java.lang.String toString()>
  33 areturn

I recently had a similar experience to John H. Farr. I followed a back-link from my referrer log, and found that someone was using my RSS feed to re-display my whole front-page on their website. I can't remember the name of the site any more—I was going to write about it at the time but I got distracted.

Anyway, I think that republishing my blog on another site is somewhat less than polite. Hence, I've stuck a copyright notice in my RSS feed explaining what I consider to be permissable uses of the file:

Copyright 2002 Charles Miller. This content is made available for personal use and limited syndication. It may be viewed, stored and cached without limit. It may only be republished in an abbreviated form: as headlines, with optional truncated summaries of the contained items. Permission is NOT given to republish this page in full, even if all credit is given to the original author.

If man has no tea in him, he is incapable of understanding truth and beautyJapanese Proverb (thanks lonita)

A few words to live by from Mike1Mark Pilgrim: “Most of the people you hate don't know it, and the rest don't care.”

1 I haven't a clue how I made this thinko. I've only been reading his site regularly for the last year, after all.