<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:emacsmood</id>
  <title>Knew Eeh Max</title>
  <subtitle>Knew Eeh Max</subtitle>
  <author>
    <name>Knew Eeh Max</name>
  </author>
  <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom"/>
  <updated>2007-11-11T01:32:16Z</updated>
  <lj:journal userid="631654" username="emacsmood" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://emacsmood.livejournal.com/data/atom" title="Knew Eeh Max"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:110722</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/110722.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=110722"/>
    <title>Votrax Type-n-Talk emulator</title>
    <published>2007-11-11T01:30:28Z</published>
    <updated>2007-11-11T01:32:16Z</updated>
    <content type="html">&lt;p&gt;One of those &amp;ldquo;kludgy-let's-throw-this-together-in-a-day&amp;rdquo;
projects, the Java Web Start applet is available
from &lt;a href="http://b54.net/votraxtntemu"&gt;here&lt;/a&gt;.  Enjoy... or
something.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:110418</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/110418.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=110418"/>
    <title>Kurt Vonnegut's dead. Hmmm.</title>
    <published>2007-04-13T02:28:44Z</published>
    <updated>2007-04-13T02:29:14Z</updated>
    <content type="html">&lt;p&gt;As usual, mixed feelings about his work. I shall avoid saying
&amp;ldquo;he was an old annoying fart,&amp;rdquo; even if he was.&lt;/p&gt;

&lt;p&gt;I've read most of his books, but not anything written in the last
5-10 years. I liked his early stuff, but it started getting too
cynical and weirdly bizarre to be enjoyable. &lt;cite&gt;Player Piano&lt;/cite&gt;
is my favorite; &lt;cite&gt;Breakfast of Champions&lt;/cite&gt; is another good
one. &lt;cite&gt;Bluebeard&lt;/cite&gt; is my least favorite of the ones I
suffered to read to the end.&lt;/p&gt;

&lt;p&gt;Though my real favorite is anything written by Kilgore Trout, even
though the books don't really exist. I'd rate Trout much higher than
Vonnegut.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:110253</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/110253.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=110253"/>
    <title>Scala: dogfood for the 33l33t</title>
    <published>2007-04-10T22:37:15Z</published>
    <updated>2007-04-11T00:24:59Z</updated>
    <content type="html">&lt;p&gt;Scala's a fairly new language from EPFL (Martin Odersky) which
is (according to the developers):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiparadigm (object-oriented, functional, concurrent elements)&lt;/li&gt;
&lt;li&gt;lightweight syntax&lt;/li&gt;
&lt;li&gt;typesafe&lt;/li&gt;
&lt;li&gt;fully interoperable with Java&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It has some very nice features not mentioned here: Actors and
implicit typing checked at compilation time, for
starters. Unfortunately, it's turned out to be a real
disappointment. In particular it makes absolutely clear why infix
languages are a poor choice for functional programming in
general.&lt;/p&gt;

&lt;p&gt;Let's take a close look at the first FP example in the Scala By
Example document, an implementation of Quicksort:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;def&lt;/b&gt; sort(xs: Array[int]): Array[int] =
  if (xs.length &amp;lt;= 1) xs
  else
     &lt;b&gt;val&lt;/b&gt; pivot = xs(xs.length / 2)
     Array.concat(
       sort(xs filter (pivot &amp;gt;)),
            xs filter (pivot ==),
       sort(xs filter (pivot &amp;lt;)))
  }
&lt;/pre&gt;

&lt;p&gt;The first thing I noticed is the &lt;tt&gt;def&lt;/tt&gt; keyword. You know
you're in trouble when the designer can't spare two vowels and a
consonant. Lightweight syntax, indeed! Why not just use the letter
&lt;b&gt;d&lt;/b&gt; and get it over with? Oh, and just look at all those wasted
letters in Array, length, sort, etc. Terrible amounts of verbosity
linger within this code, marring its inner beauty. Bah! It really
should be written like this instead:&lt;/p&gt;

&lt;pre&gt;
d srt(xs: a[i]):a[i]&amp;larr;
  (xs.l&amp;le;1)?xs:{
     c p&amp;larr;xs(xs.l/2)
     a.ct(srt(xs f (p &amp;gt;)),xs f (p =),srt(xs f (p &amp;lt;)))
  }
&lt;/pre&gt;

&lt;p&gt;Much better! Saves a ton of typing that way, and y'all know we've
got a global shortage on 0 bits. (Better recycle while you still can.)
Note the clever usage of &amp;amp;le; and &amp;amp;larr;. But we definitely need
to get rid of those braces, they give the casual reader too much of a
hint there's something resembling code in there. Probably should use
parenthesis instead, or maybe &lt;tt&gt;`&lt;/tt&gt; and &lt;tt&gt;'&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;I implicitly assumed &lt;tt&gt;Array[int]&lt;/tt&gt; was declaring an array of
objects with an &lt;tt&gt;int&lt;/tt&gt; index. But of course not; the object type
held by the array is in brackets. Why, I don't know. I find this
thoroughly confusing, especially as I've used languages where
&lt;tt&gt;Array[int]&lt;/tt&gt; really did declare an array with int index;
&lt;tt&gt;Array[String]&lt;/tt&gt; was an associative array, etc&lt;/p&gt;

&lt;p&gt; Arrays accesses are done with parenthesis: sensibly consistent
with the rest of the language, very odd considering the way arrays are
declared. I suppose the bracket syntax is some sort of parameterized
type thing... but confusing no matter how you slice it.&lt;/p&gt;

&lt;p&gt;Worse, there are &lt;tt&gt;val&lt;/tt&gt;s and &lt;tt&gt;var&lt;/tt&gt;s. A val is a
constant, a var is a variable. Yuck! One letter differences do not
make for happy programmers. But, hey, lightweight syntax, right? Can't
spare too many letters, it wouldn't be lightweight anymore.&lt;/p&gt;

&lt;p&gt;The &lt;i&gt;coup de gr&amp;acirc;ce&lt;/i&gt; is that funky &lt;tt&gt;filter&lt;/tt&gt;
thang. You may be wondering what that is; I certainly was. It's an
anonymous function! Of course, you moronic dolt! How silly of me! I
thought that was a typo... no, see, there's this magic implicit
argument being passed into the magic anonymous function.&lt;/p&gt;

&lt;p&gt;Scala's &lt;em&gt;only&lt;/em&gt; saving grace here is its use of lexical
scoping, probably a consequence of using the JVM. (I feel certain many
of its users are unhappy about this.)&lt;/p&gt;

&lt;p&gt;Scala's type signatures are ugly. The declaration for
&lt;tt&gt;filter&lt;/tt&gt; is&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
&lt;b&gt;def&lt;/b&gt; filter(p: t=&amp;gt; boolean): Array[t]
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obviously (and if it's not obvious you're an utter fool who should
go back to programming in BASIC) that means &lt;tt&gt;p&lt;/tt&gt; is a function
which takes something of type &lt;tt&gt;t&lt;/tt&gt; and returns a boolean. Of
course it does! Of course!&lt;/p&gt;

&lt;p&gt;I've noticed that keywords are consistently bolded throughout the
documentation. If they'd made them just a wee bit longer, just a tad,
a smidgen, wouldn't need to be much, say, spare a couple of vowels and
a consonant here and there...  that crap wouldn't be necessary.&lt;/p&gt;

&lt;p&gt;It amazes me people still believe &lt;i&gt;fewer characters&lt;/i&gt; = &lt;i&gt;more
goodness&lt;/i&gt;. I'm not saying we need COBOL-like verbosity. I know for
a fact there's a happy medium between COBOL's meandering verbosity and
Perl's impenetrable line-noise.&lt;/p&gt;

&lt;p&gt;To top it all off, this &amp;ldquo;elegant&amp;rdquo; implementation of
Quicksort is impressively inefficient. &lt;tt&gt;filter&lt;/tt&gt; has to scan the
array three times to build three separate arrays; I hate to ask how
those arrays are being allocated.&lt;/p&gt;

&lt;p&gt;Only a complete doltish moron incapable of understanding why you
put variable types after the variable and array types inside brackets
could write a sort routine which took advantage of Quicksort's
efficient logarithmic characteristics &lt;em&gt;and&lt;/em&gt; only scans the
entire list once per iteration.&lt;/p&gt;

&lt;pre&gt;
(defun quicksort (list)
  (if (null (cdr list)) list
      (let ((pivot (car list)))
        (loop
          for i in list
            when (&amp;lt; i pivot) collect i into ll
            when (= i pivot) collect i into ml
            when (&amp;gt; i pivot) collect i into rl
          finally (return (append (quicksort ll) ml (quicksort rl)))))))
&lt;/pre&gt;

&lt;p&gt;This isn't exactly in a &amp;ldquo;functional programming&amp;rdquo; style,
though it could be; but it's difficult to efficiently accumulate the
results into multiple lists that way. &lt;tt&gt;collect&lt;/tt&gt; is efficient in
most CLs and we can assume it has O(1) behavior. It also uses the
first element of the list as the pivot point rather than the middle
one. This can be changed, but it would require taking the list's
length&amp;mdash;potentially an expensive operation.&lt;/p&gt;

&lt;p&gt;Here's an INTERLISP version. (CL's &lt;tt&gt;loop&lt;/tt&gt; construct used in
the previous example was based on INTERLISP's CLISP. This next version
uses explicit LAMBDA statements instead.)&lt;/p&gt;

&lt;pre&gt;
(DEFINEQ
  (ACCUM-MULTIPLE
   (NLAMBDA ARGS
	    (PROG ((LST (EVAL (CAR ARGS)))
		   (REST (CDR ARGS)))
		  LOOP  (COND ((NULL LST) (RETURN NIL))
			      [T (PROG ((VAL LST))
				       (SETQ LST (CDR LST))
				       (RPLACD VAL NIL)
				       (MAPC REST 
					     '(NLAMBDA (E)
						       (COND
							((OR (NULL (CDR E)) (APPLY (CADR E) VAL)) 
							 (SET (CAR E) (LCONC (EVAL (CAR E)) VAL))
							 (GO LOOP])
		  (GO LOOP))))
  (QUICKSORT
   (LAMBDA (LST)
	   (COND
	    ((NULL (CDR LST)) LST)
	    (T (PROG
		(LL ML RL (PIVOT (CAR LST)))
		(ACCUM-MULTIPLE LST
				(LL (LAMBDA (VAL) (ILESSP VAL PIVOT)))
				(ML (LAMBDA (VAL) (EQUAL VAL PIVOT)))
				(RL))
		(RETURN (APPEND (QUICKSORT (CAR LL)) (CAR ML) (QUICKSORT (CAR RL]

&lt;/pre&gt;

&lt;p&gt;The INTERLISP code probably looks a little strange. &lt;tt&gt;LCONC&lt;/tt&gt;
isn't in CL at all (tail concatenate list&amp;mdash;an efficient way to
append a list to the end of a list) and &lt;tt&gt;RETURN&lt;/tt&gt; is needed to
return values from &lt;tt&gt;PROG&lt;/tt&gt;. Its one advantage is that it doesn't
use any auxiliary storage for lists, the list is sorted in-place.&lt;/p&gt;

&lt;p&gt;Most any LISP (or Lisp) implementation, no matter how primitive,
can express the necessary algorithms in an efficient manner without
resorting to macros, builtins, or syntax redefinition. You could
obviously do it in Scala as well, but it would lose all
its... charm.&lt;/p&gt;

&lt;p&gt;I suppose the INTERLISP version isn't &amp;ldquo;functional
programming&amp;rdquo; either because it has side-effects (the horror!)
but it's functionally very similar to the Scala version&amp;mdash;only
it's a lot easier to read. No mystery implicit arguments, no funny
array syntax garbage. And almost any programmer could puzzle out the
Common Lisp version.&lt;/p&gt;

&lt;p&gt;At this point I'm wondering what the real point of Scala
is. Writing mostly-functional routines without resorting to Java's
anonymous class syntax is helpful on occasion; Actors instead of
explicit threads is Good; safe implicit typing can be a powerful,
flexible tool more easily understood than parameterized
types. Unfortunately, by making the syntax &amp;ldquo;lightweight&amp;rdquo;
they've thrown out the baby with the bath water.&lt;/p&gt;

&lt;p&gt;The general rule for &amp;ldquo;functional programming&amp;rdquo; is that
the code has to look as terse and incomprehensible as possible. If it
looks too verbose, it starts to resemble something normal humans might
understand (and want to use). Can't have that.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:110001</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/110001.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=110001"/>
    <title>Laughable quote of the day</title>
    <published>2007-04-08T20:41:53Z</published>
    <updated>2007-04-08T20:42:32Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;only supports prenex polymorphism&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prenex. Yes, indeedy, it's... prenex. &lt;em&gt;Prenex! It makes your
teeth turn green! Prenex! It tastes like Listerine! Prenex! Oh yes
it's Prenex! So have some Prenex, and&lt;/em&gt; Whoops.&lt;/p&gt;

&lt;p&gt;The word &amp;ldquo;prenex&amp;rdquo; appears in the Oxford English
Dictionary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Designating a quantifier placed at the beginning of
a formula which affects the whole formula; relating to or involving
such a quantifier.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should be taken out and shot. Or at least roughed up a little,
told to go home and to never show its face again. Gaaaah! Where do
these space aliens come from, and where can I get some repellent?&lt;/p&gt;

&lt;p&gt;Anyway, I'm mighty proud to have brought this phrase to your
attention, especially as it only occurs 68 times in Google and you
probably could've gone your entire life without ever reading it. I
mean, those damn inadequate languages only supporting prenex
polymorphism! How dare they?!&lt;/p&gt;

&lt;p&gt;Thanks for listening, and have a nice day.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:109660</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/109660.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=109660"/>
    <title>Archeological expeditions...</title>
    <published>2007-04-06T21:17:30Z</published>
    <updated>2007-04-06T21:18:37Z</updated>
    <content type="html">&lt;p&gt;A couple of years ago someone apparently... typed in by hand... the
LISP 1.5 assembly sources for the 7090. Why, I can't imagine.&lt;/p&gt;

&lt;p&gt;Oddly enough, some other equally batshit person went back through
and checked for typos. But it seems nobody's really been able to get
it to go.&lt;/p&gt;

&lt;p&gt;To make a long story short I've figured out how to use it... but it
took some head-banging and a lot of staring. If for some bizarre
reason you want to run it (it runs on the 
&lt;a href="http://simh.trailing-edge.com/"&gt;SIMH&lt;/a&gt; IBM 7090 emulator)
the instructions are &lt;a href="http://b54.net/lisp15"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The most frustrating part was SIMH's lack of useful error messages,
actually. It usually says something like "didn't work", only with a
lot more words.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:109513</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/109513.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=109513"/>
    <title>Software reusability</title>
    <published>2007-03-23T20:53:08Z</published>
    <updated>2007-03-23T21:02:36Z</updated>
    <content type="html">&lt;p&gt;I've been thinking about this a lot lately, because I've been
advising on projects done by others. In almost every case I've
recommended complete rewrites rather than trying to modify the
existing code, and with some pretty solid justifications. (Granted, a
lot of it is crappy FORTRAN which has to be rewritten in C, some of it
is all-too-typical curdled LISP, and some of it is just very old
spaghetti code written under a tight deadline.)&lt;/p&gt;

&lt;p&gt;Much of it was written with care and consideration for re-use, with
copious documentation. Some of it was written as libraries intended to
be used as "building blocks" for other projects. Yet it's becoming all
too apparent that one programmer's good, tight, clever design is
another programmer's jumbled mess.&lt;/p&gt;

&lt;p&gt;As a specific example, much of the LISP code tries very hard to be
efficient and clever, lots of macros, memoization, and tossing about
of lambda expressions. It is, in fact, quite clever. It was not
prematurely optimized, but it was optimized to run on hardware circa
1995 out of sheer necessity.&lt;/p&gt;

&lt;p&gt;Unfortunately, it is too clever for its own good. It is
near-impossible to maintain... unless you were either the person who
wrote it, or are willing to spend a year (and to understand the whole
system it literally could be a year) understanding the particular set
of clevernesses involved. It could be rewritten using a brute-force
approach in two or three months. You figure it out.&lt;/p&gt;

&lt;p&gt;The tradeoffs have changed dramatically. If I were to write the
equivalent functionality of that LISP code today (I'm not actually
writing any code for this project, I'm just giving advice) I wouldn't
worry about making it efficient; I can just toss more CPU and RAM at
it, and a programmer's time is more valuable than a high-end
computer. The problem can be easily parallelized if needed, but I
really don't think it will be necesssary.&lt;/p&gt;

&lt;p&gt;Overall it's been a disappointing experience. One lesson I've
learned is that it's very hard to write truly reusable code beyond the
level of &lt;tt&gt;strcmp()&lt;/tt&gt; or &lt;tt&gt;regmatch()&lt;/tt&gt;. Granted, a lot of
this code over 25 years old, but some of it isn't; some of it is C++
which, again, tries to be too clever with template abuse and other
all-too-typical &amp;ldquo;I'm a &lt;em&gt;good&lt;/em&gt; C++ programmer!&amp;rdquo;
tricks. The people who write this stuff should be publically
ridiculed.&lt;/p&gt;

&lt;p&gt;I should probably become a design consultant, because I can avoid
flogging my particular design methodology; I don't believe in design
methodologies.&lt;/p&gt;

&lt;p&gt;Oh, this reminds me of a situation I ran into a few years ago. There's a GCC extension which allows the middle value of &lt;tt&gt;?:&lt;/tt&gt; to be omitted; &lt;tt&gt;x?:y&lt;/tt&gt; returns &lt;tt&gt;x&lt;/tt&gt; if it is non-zero, otherwise &lt;tt&gt;y&lt;/tt&gt;. I'd never seen it actually used. In the process of porting someone else's code to a new OS I ran into it (GCC warning) and promptly eradicated it. The code in question pretty much had to use GCC (it had lots of &lt;tt&gt;__asm__&lt;/tt&gt; statements) so it wasn't an unsafe thing to use; but I removed it because it was unnecessarily non-portable and very rarely used language feature. I ended up in a 15-minute shouting match with the person who wrote the code, of course; the other programmer claimed I was an idiot if I hadn't seen that extension before, etc, etc. Reminds me of the same people who won't use "unnecessary" parenthesis when it would be helpful for clarification.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:109230</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/109230.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=109230"/>
    <title>Use of the word &amp;lsquo;empower&amp;rsquo; should be encouraged</title>
    <published>2007-03-23T20:26:22Z</published>
    <updated>2007-03-23T20:27:35Z</updated>
    <content type="html">&lt;p&gt;It's a helpful word; we can be pretty sure any writing which
seriously uses it is not worth reading.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:109022</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/109022.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=109022"/>
    <title>Google... has problems.</title>
    <published>2007-03-16T21:46:24Z</published>
    <updated>2007-03-16T21:46:57Z</updated>
    <content type="html">&lt;p&gt;I just tried to access this Google search:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;http://www.google.com/search?hl=en&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;q=site:mail-archive.com+gcl+2.7.0
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am politely informed that my query &amp;ldquo;looks similar to
automated requests from a computer virus or spyware
application&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Sure, sure, whatever you say. But if I remove the "hl=en" part, it
goes through OK. Crazy idiots. Sounds to me like the Google Guice is
destroying their braincells.&lt;/p&gt;

&lt;p&gt;I dearly wish they had a way to be contacted. (They don't; they
don't want to hear from the unwashed masses. Plus they'd be swamped
with requests from pathetically desperate SEO morons.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:108789</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/108789.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=108789"/>
    <title>K = 1024 versus K = 1000</title>
    <published>2007-03-16T20:16:59Z</published>
    <updated>2007-03-16T20:58:08Z</updated>
    <content type="html">&lt;p&gt;For whatever reason, today I ended up reading Wikipedia articles on
the new binary prefixes. The discussions in their talk pages is a
little silly.&lt;/p&gt;

&lt;p&gt;As I'm sure a few of you are aware, the IEC declared a few years
ago (apparently without discussing the issue with any programmers)
that 1K of memory is equal to 1,000 bytes of memory because K =
1000 in the metric system. 1M = 1,000,000 bytes. Etc. The decision has been
rubber-stamped by various organizations including ANSI and IEEE.&lt;/p&gt;

&lt;p&gt;While there's a certain symmetrical logic to this, it's equally
obvious that few computer programmers need memory units in powers of
10. I personally can't think of a single time when I've needed a 1KB =
1000 bytes unit. I use 1KB = 1024 bytes all the time, probably every
day.&lt;/p&gt;

&lt;p&gt;There rarely is any confusion in programming. I've run into the
issue exactly once, and that was because some of us took a 160MB disk
drive marketing figure too literally. Supposedly some poor consumers
are confused because the poor waifs don't know if a 500GB disk drive =
500&amp;times;1000&amp;times;1000&amp;times;1000 bytes drive&amp;mdash;or is it
500&amp;times;1024&amp;times;1024&amp;times;1024 bytes?&lt;/p&gt;

&lt;p&gt;It's neither, of course. But let's take a slightly different tack.&lt;/p&gt;

&lt;h2&gt;Historical facts&lt;/h2&gt;

&lt;p&gt;1K = 1024 bytes has been around since at least 1959. The original
4K Drum FORTRAN ran on an IBM 709 with 4,096 words of memory. The
abbreviation was used both in their source code and the marketing
literature. IBM used 4K and 8K to describe 709s with various memory
configurations. (I'm sure there are earlier references; that was just
the earliest I'm aware of.)&lt;/p&gt;

&lt;p&gt;DEC used 1K as 1024 bytes very consistently. The earliest DEC
reference I've found was 1968, in a manual for a DF32 disk drive with
a total capacity of 131,072 13-bit (yes, 13-bit!) words. At the start
of the manual they spell out all the numbers, but throughout the rest
of the manual they consistently use K = 1024. The source code for the
driver uses K = 1024 in the comments.&lt;/p&gt;

&lt;p&gt;In general, DEC usually referred to a PDP-8 with 4,096 words of
memory as a 4K device and 8,192 words as an 8K device; I would not be
surprised to see this in the earliest marketing literature for the
machine. PDP-11s were always described as having &lt;i&gt;n&lt;/i&gt;KW of
memory.&lt;/p&gt;

&lt;p&gt;I'm pretty sure I've seen the K designation used for 1K and 2K
memory devices in data sheets written in the mid-1970s, but I don't
have any references to hand. Certainly by 1980 the use of K = 1024 was
very consistent in datasheets.&lt;/p&gt;

&lt;p&gt;Here's the point of all this: K = 1024 is all over the place. It
certainly didn't start in the microcomputer era; it probably started
with IBM back in the 50s, though it would not surprise me to find even
earlier references. It's a convenient unit to use, because nobody in
their right mind wants to say things like &lt;i&gt;a 4.096KW
machine&lt;/i&gt;. Might as well just spell it out.&lt;/p&gt;

&lt;h2&gt;Marketing numbers and approximations&lt;/h2&gt;

&lt;p&gt;Just a look at various popular uses which are at variance with the
K = 1024 standard.&lt;/p&gt;

&lt;h3&gt;64K or 65K?&lt;/h3&gt;

&lt;p&gt;One argument I've read was that the earliest users just rounded off
the number instead of assigning K = 1024. This is entirely plausible,
but a bit irrelevant.&lt;/p&gt;

&lt;p&gt;I have definitely seen computers with 64K of memory referred to as
65K computers. And a Google search for 65K turns up a reference to
&amp;ldquo;65K colors&amp;rdquo; as the very first hit.&lt;/p&gt;

&lt;p&gt;But the 65K number is wrong! It should be 66K, not 65K; 65.536K
rounds up to 66K. I can't give these uses much credence. Those using
65K are truncating because it's an easy way to remember it's just
about 65,000. (I've memorized 2&lt;sup&gt;&lt;small&gt;16&lt;/small&gt;&lt;/sup&gt; = 65536, and so don't need the
approximation.) It's typical to say things like &amp;ldquo;65,000
colors,&amp;rdquo; but 66,000 is closer to the actual value. 65,000 has a
safety factor, so it may be preferred by some users.&lt;/p&gt;

&lt;h3&gt;1.44MB floppies&lt;/h3&gt;

&lt;p&gt;One of the most common variants on the K = 1024 theme is the
3.5&amp;Prime; floppy. Their capacity is&lt;/p&gt;
 
&lt;blockquote&gt;
&lt;p&gt;80 tracks &amp;times; 18 sectors &amp;times; 512 bytes/sector &amp;times 2 sides = 1474560 bytes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;[did that from memory, ha!]&lt;/p&gt;

&lt;p&gt;which translates to 1,440K or 1.40625MB. They are typically
referred to as a 1.44MB floppy. 1.44 is a nice round number which
sounds good and is easy to say/write/remember. Whoever picked that
term chose units which made it come out that way; in their universe,
1MB = 1000 * 1024.&lt;/p&gt;

&lt;p&gt;Of course thanks to filesystem overhead I usually can't store
1,440K worth of information on a floppy. (Though if I don't use a
filesystem and don't hit any bad sectors, I can store &lt;em&gt;exactly&lt;/em&gt;
1440K worth of data.)&lt;/p&gt;

&lt;h3&gt;Ethernet&lt;/h3&gt;

&lt;p&gt;10baseT Ethernet is usually described as a 10Mbps protocol instead
of a 9.54Mbps protocol. The hardware transmission layer uses
Manchester coding at a 10Mhz clock rate, so it is theoretically
possible to transmit 10 million bits of information per second.&lt;/p&gt;

&lt;p&gt;Now there's no way you can transmit 10 million bits at the data
transmission layer because of framing overhead and collisions. So
while there's some basis in calling it a &amp;ldquo;10Mbps
protocol,&amp;rdquo; in reality it's nowhere near that efficient.&lt;/p&gt;

&lt;p&gt;10Mbps is used because it's a nice round number which is easy to
remember. If I need to know how much data I can transmit through
Ethernet, while I can assume it's somewhere in the 8-9Mbps ballpark, I
can't use that 10Mbps number literally. It's just a marketing
number.&lt;/p&gt;

&lt;h3&gt;CD-ROMs and DVDs&lt;/h3&gt;

&lt;p&gt;I don't know what the typical capacity number is, but I seem to
recall it's in the 600-650MB ballpark. But those are just
approximations. The exact capacity depends on several factors related
to how it is recorded. The underlying units matter little whether it's
K = 1024 or K = 1000, you can't use those values to determine exactly
how much a CD-ROM will hold.&lt;/p&gt;

&lt;p&gt;Single-layer DVDs are often described as holding somewhere around
4-4.5GB of data, and dual-layer 8GB.  Again, mere approximations.&lt;/p&gt;

&lt;h3&gt;Modern disk drives&lt;/h3&gt;

&lt;p&gt;Typically we see hard drives described as
&amp;ldquo;500GB&amp;rdquo;. Drive manufacturers assume the smallest possible
units, or K = 1000; it's clearly to their benefit to make the capacity
numbers as large as possible.&lt;/p&gt;

&lt;p&gt;If you advertise your drive as holding 465GB and everyone else uses
500GB, you'll lose sales. If you add enough extra capacity to your
drive so that you can say it's a 500GB drive using 1024-byte units,
you're losing a golden marketing opportunity because you could list it
as a 550GB drive instead.&lt;/p&gt;

&lt;p&gt;It doesn't really matter because no disk drive in the world has an
exact capacity of 500,000,000,000 bytes, and no one with any sense is
going to base their storage capacity calculations on that 500GB
value.&lt;/p&gt;

&lt;h3&gt;DSL/Cable speeds&lt;/h3&gt;

&lt;p&gt;It's typical to see DSL advertised as 768Kb or 4.2Mb or
something. Ditto with cable.&lt;/p&gt;

&lt;p&gt;Those numbers are just as approximate as the Ethernet and disk
drive capacities I listed above. They're marketing speak, not actual
figures which can be counted on to mean anything (other than you'll
get values probably within an order of magnitude of the ones listed).&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;None of the marketing uses present good arguments for assuming K =
1000. What marketers do has little relevance for people who really
make use of the units involved. Consumers shouldn't be basing capacity
or bandwidth calculations on numbers like 500GB or 512Kbps; not only
is it an approximation no matter what units you use but overhead has
to be taken into account.&lt;/p&gt;

&lt;p&gt;Of course this argument is futile, because the IEC has
spoken. Still, the new units have yet to catch on, and it's going to
be a very long time before they do&amp;mdash;if ever. If there were an
actual need I would see them catching on very quickly, but so far I
just don't see a use for 1KB = 1000 bytes.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:108328</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/108328.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=108328"/>
    <title>Oh dear.</title>
    <published>2007-03-11T21:15:07Z</published>
    <updated>2007-03-11T21:15:49Z</updated>
    <content type="html">&lt;p&gt;&lt;a href="http://code.google.com/p/google-guice/"&gt;Google Guice&lt;/a&gt;.
Some of the hilarious highlights:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Annotations finally free you from error-prone,
refactoring-adverse string identifiers&lt;/i&gt; What a relief! I was having
such horrible error problems with my refactoring-adverse string
identifiers. And just the other day I was talking with one of the
neighbors and she was mentioning all the problems she was having
refactoring &lt;em&gt;her&lt;/em&gt; string identifiers. Now I can tell her about
Guice!  Hurrah! We are saved! The rapture is upon us!&lt;/p&gt;

&lt;p&gt;&lt;i&gt;empowers dependency injection&lt;/i&gt;. You know, my life has been
magnificently incomplete without the power to inject dependency
directly into my veins. Thank you, Mr. Google! I am empowered now!&lt;/p&gt;

&lt;p&gt;&lt;i&gt;cures tight coupling&lt;/i&gt; Hmmmph. So does sexual lubricant, but I
don't think I want to use it on my dog.&lt;/p&gt;

&lt;p&gt;This has &lt;em&gt;got&lt;/em&gt; to be a joke. Either that, or it explains why
Google got rid of the "More results from" links: their minds are
dead.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:108215</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/108215.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=108215"/>
    <title>Classic Unix source goofiness</title>
    <published>2007-02-28T01:02:47Z</published>
    <updated>2007-03-01T01:48:18Z</updated>
    <content type="html">&lt;p&gt;I know there are several which are very well known, but this one
doesn't seem to be. I ran across this aeons ago when I was
rebuilding HPsUX (die, bletcherous cancer!); it was still in their
sources! I very distinctly remember printing it out and hanging it on
the wall.&lt;/p&gt;

&lt;p&gt;This is from the SysIII (y'all remember System III, don't'cha?)
&lt;tt&gt;chroot.c&lt;/tt&gt;. I'm fairly sure it was also in V7 and possibly
earlier, and it was in at least one SVR3 release:&lt;/p&gt;

&lt;pre&gt;
# include &amp;lt;stdio.h&amp;gt;
/* chroot */

main(argc, argv)
char **argv;
{
        if(argc &amp;lt; 3) {
                printf("usage: chroot rootdir command arg ...\n");
                exit(1);
        }
        argv[argc] = 0;
        if(argv[argc-1] == (char *) -1) /* don't ask why */
                argv[argc-1] = (char *) -2;
[...]
&lt;/pre&gt;

&lt;p&gt;Uh, OK. I won't.&lt;/p&gt;

&lt;p&gt;Actually, gosh darn it, I &lt;em&gt;will&lt;/em&gt;. Why the fra is it looking
for -1 and changing it to -2?&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;The answer is in the last code extract I posted in the comments. I won't answer the question so's to spoil the fun, but the answer's right in front of you. Hints: Where did those pointers come from? How could the next-to-last pointer end up being -1? How can we be sure setting it to -2 will give the equivalent string?&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:108025</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/108025.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=108025"/>
    <title>Damn, I'm posting a lot today</title>
    <published>2007-02-21T21:13:44Z</published>
    <updated>2007-02-21T21:14:17Z</updated>
    <content type="html">&lt;p&gt;Anyone else notice that Google isn't returning the &amp;ldquo;More
results from&amp;rdquo; link for most sites? No explanation, either.&lt;/p&gt;

&lt;p&gt;If you haven't noticed, do a search for "intel x86" without the
quotes. One of the top hits is Intel's website, but it only lists two
pages... not likely. If you happen to get the right set of servers
you'll get the &amp;ldquo;More results from&amp;rdquo; link, but for most of
them I don't see it.&lt;/p&gt;

&lt;p&gt;I'm now writing an Opera UserJS hack to make it show up. I really
have come to rely on that particular feature...&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:107608</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/107608.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=107608"/>
    <title>Brilliant UI idea</title>
    <published>2007-02-21T21:08:44Z</published>
    <updated>2007-02-21T21:10:00Z</updated>
    <content type="html">&lt;p&gt;Hopefully the idea isn't patented.&lt;/p&gt;

&lt;p&gt;You may have already seen 
&lt;a href="http://www.cs.swan.ac.uk/calculators/applet/applet.html"&gt;this Java applet&lt;/a&gt;. If you haven't, go check it out. You'll like it.&lt;/p&gt;

&lt;p&gt;(On my Linux laptop I can't type into it. I don't know why, and
don't want to take the time to figure out what's wrong. That's exactly
what I mean about Java applets being inherently broken.)&lt;/p&gt;

&lt;p&gt;The idea I think is &amp;ldquo;brilliant&amp;rdquo; is the clock, which
cleanly and easily solves a problem I've been puzzling over for a
while. (Try using the applet for a bit, then moving the hands.)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:107352</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/107352.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=107352"/>
    <title>Java versus Flash versus JavaScript...</title>
    <published>2007-02-21T20:01:19Z</published>
    <updated>2007-02-21T20:16:31Z</updated>
    <content type="html">&lt;p&gt;I saw 
&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=193593"&gt;this
article&lt;/a&gt; and decided to comment on it, though there
have been several similar essays as of late.&lt;/p&gt;

&lt;p&gt;Most of the articles on the subject are a little misguided, and
fail to take into consideration the actual technologies involved. I'd
also claim most opinions about this are, at best, subjective.&lt;/p&gt;

&lt;h2&gt;Java applets&lt;/h2&gt;

&lt;p&gt;Java applets have pretty much failed because the implementation was
and is lousy. The plugin mechanism used to integrate them with the
browser wasn't up to the task; they were both too loosely coupled (in
the modern DOM sense) and yet too tightly coupled (depending on a
browser to provide near-hardware-level interfaces is wrong).&lt;/p&gt;

&lt;p&gt;The reasons for this made sense at the time. It was from Sun, and
running on Unix was important; back then there were many actively-used
Unix platforms and Sun wanted a way to support them all. That doesn't
change the fact that it just hasn't worked, and will never offer
Windows users the level of performance they've come to expect from
more closely coupled technologies.&lt;/p&gt;

&lt;p&gt;It also didn't help that AWT widgets looked bad no matter how you
sliced it. That's something Sun could and should have addressed from
the start. Bold, black, non-anti-aliased Lucida on a dingy gray
background is hideous&amp;mdash;unless, it seems, you're a GUI designer at
Sun. Combine that with dicey event dispatch and you've got a real
mess.&lt;/p&gt;

&lt;p&gt;(Lucida is a hideous font. Period. There. I've said it, and I'm
proud.)&lt;/p&gt;

&lt;h2&gt;JavaScript&lt;/h2&gt;

&lt;p&gt;JavaScript works well because it's integrated at precisely the
right level for the job it's trying to do. Writing dynamic web pages
is a much easier and more rational task for the browser to
handle. There was also a serious commitment from the major browser
vendors to make DHTML work. If Java applets had initially used a
similar mechanism they would've fared much, much better; it's not
likely we'd be having this debate today.&lt;/p&gt;

&lt;p&gt;JavaScript's obvious problems are its lack of speed and an overall
poor language design. Writing and maintaining large JS projects with
multiple programmers is a challenge, to say the least.&lt;/p&gt;

&lt;p&gt;Sometimes performance isn't an issue, and this problem will soon be
addressed with better JS interpreters and JS compilers. But the lack
of warnings and little in the way of type or argument checking are a
more serious problem. Experience has shown most pseudo-free-form
languages don't do well in the longterm.&lt;/p&gt;

&lt;p&gt;(I've written hundreds of thousands of lines of code in various
scripting languages over the last 25 years. So I think I know a little
bit about it.)&lt;/p&gt;

&lt;p&gt;There's also no clean way for JavaScript applets to have network
access, though AJAX addresses this to some extent. But along with AJAX
come lurking security issues, ones which haven't been
considered. People are going to be pissed when that seemingly-innocent
multiplayer game turns out to have a builtin SMTP proxy.&lt;/p&gt;

&lt;p&gt;I feel people make too much of the cross-browser JS issues. For at
least the last year it's been reasonably straightforward to write
substantial Javascript apps which run cleanly on the big three
browsers. (That was my experience; feel free to disagree.) There are
usually more problems related to CSS than JavaScript or DOM.&lt;/p&gt;

&lt;h2&gt;Flash&lt;/h2&gt;

&lt;p&gt;Flash works well because it's completely unintegrated with both the
web browser and the operating system GUI libraries. There's a small
amount of linkage between the browser and a Flash applet, but it's
little more than saying &amp;ldquo;put your window here&amp;rdquo;. They
rarely try to present UIs which resemble desktop apps. (If they do
resemble a desktop GUI it's just a happy happenstance of the
particular Flash design process.)&lt;/p&gt;

&lt;p&gt;Traditionally, Flash-based apps have had poor UIs. They're usually
designed by &amp;ldquo;GUI designers&amp;rdquo; or graphic artists, and the
results speak for themselves.&lt;/p&gt;

&lt;h2&gt;Java Web Start: devil in disguise, or software installation nirvana?&lt;/h2&gt;

&lt;p&gt;There have been a number of complaints recently about JWS. I feel
strongly most of the problems are related to applet authors making bad
design decisions, and not with any inherent problem with JWS.&lt;/p&gt;

&lt;p&gt;It seems 90% of JWS applets use bogus certificates or self-signed
apps, when most of the time they don't need to be signed at all. JNLP
provides safe mechanisms for unsigned applets to do many common
operations (the usual issues are filesystem or network access, both of
which can be done without signing).&lt;/p&gt;

&lt;p&gt;(Oh, and my beef about the Preferences class requiring a signed app
is going to be fixed in the next release. Though it turns out using other mechanisms for preferences storage has advantages.)&lt;/p&gt;

&lt;p&gt;As for which user interface is &amp;ldquo;best&amp;rdquo;... like so many
things, &lt;em&gt;it depends&lt;/em&gt;. I wouldn't use standard GUI widgets to
implement a pool game, and I wouldn't use a GUI based on a pool game
for filling out forms. But I would use standard GUI widgets for the
pool game's preferences dialog, and if the form filler needs
something more than standard GUI widgets I'll use it.&lt;/p&gt;

&lt;p&gt;I also completely disagree that the majority of users insist these applications be
embedded within the web browser window. Sometimes that's useful, but
sometimes it isn't, and sometimes it's irrelevant. Some AJAX
developers also disagree; quoting from the AJAX page on Wikipedia:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
The most obvious reason for using Ajax is an improvement to the user
experience. Pages using Ajax behave more like a standalone application
than a typical web page.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bring up a separate window with no browser menu and the user could easily
forget (or never even realize) the app is really DHTML running in a web
browser. And they aren't going to care one way or the other.&lt;/p&gt;

&lt;p&gt;Each of the technologies under discussion has limitations. I
iniitally wanted to use Javascript for some of the applications I've
been writing lately, for many of the reasons listed by the article I
mentioned at the start. JS is built into the browser, no downloads, it
just works. But it's far too slow for my needs, and I found the lack
of solid debugging facilities and code checking painful.&lt;/p&gt;

&lt;p&gt;Flash+Flex+blahblahblah was one alternative I briefly considerered,
I didn't like the lack of integration with the desktop, it has most of
the same problems as Javascript, development tools are usually
Windows-only, and it's hard to design a professional-looking interface
with Flash instead of a cutesy toy.&lt;/p&gt;

&lt;p&gt;Swing + JNLP + JWS has worked well for me. I have many sincere
issues with Swing, and Java in general, but most of them have
workarounds. (I was especially happy after I hacked a command-line
editor into &lt;tt&gt;jdb&lt;/tt&gt;.)&lt;/p&gt;

&lt;h2&gt;Some specific comments&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;
Ajax is popular because we know that the necessary
software for the client side is already installed.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My experience has been that most users also have a JVM installed,
and usually something newer than 1.4.&lt;/p&gt;

&lt;p&gt;From a personal perspective I absolutely hate installing software
in general. I have yet to run into any significant issues with
downloading and updating JWS or Java, and I'm running on three
vastly-different platforms.&lt;/p&gt;

&lt;p&gt;(Cue someone complaining about how their computer caught on fire
and exploded when they tried to install JWS. Yes, yes, I know. That
doesn't mean it doesn't work for &lt;em&gt;most&lt;/em&gt; users. I've honestly
had more problems with Flash upgrades than I ever have with Sun's Java
or JWS.)&lt;/p&gt;

&lt;p&gt;I wouldn't try to distribute an app based on, say, Python or TCL/Tk
these days. Few users have the software and hardly anyone would be
willing to take the time to install it. But Java is a different matter
entirely: it's installed because it's ubiquitous, and it's ubiquitous
because it's installed.&lt;/p&gt;

&lt;p&gt;[referring to the Aerith demos]&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
If you click on the JNLP version link on that page, it
will appear to start up, downloading a bunch of stuff and asking you
questions.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It asked me one question: did I want to run this app signed with a
bogus certificate? And I quite sensibly said, &amp;ldquo;Heck
no!&amp;rdquo;. But that goes back to what I wrote above: &lt;em&gt;there's no
reason that app needs to be signed if it's just a demo&lt;/em&gt;. Complain
to the people who signed it with a bogus certificate, not Sun.&lt;/p&gt;

&lt;p&gt;[It turns out there's a bug where, if the app needs Java 1.6
(needed by the Aerith demos), JWS ignores this requirement and lets
the user run it even if they only have 1.5. Very few real apps should
absolutely require a 1.6 JVM.]&lt;/p&gt;

&lt;blockquote&gt;
It's not impossible to build GUI applications with Java, but it's been
10 years and there are still installation hiccups with applets, Java
WebStart, and regular applications.
&lt;/blockquote&gt;

&lt;p&gt;I agree it's not impossible to build GUI applications with Java:&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://pics.livejournal.com/emacsmood/pic/00001pba"&gt;&lt;img src="http://pics.livejournal.com/emacsmood/pic/00001pba/s320x320" /&gt;&lt;/a&gt;
&lt;br /&gt;(Click to see a larger version; I will have a demo version available
soon.)
&lt;/p&gt;

&lt;p&gt;It's amazing what a nice color scheme, good choice of fonts, and
clean 3D effects can do for a Swing-based app.&lt;/p&gt;

&lt;p&gt;I completely disagree that JWS is inhrently flawed and cannot
present a good user experience. I've had virtually no complaints about
installation problems with the apps I've distributed via JWS. That's
not to say it won't happen, but it's clearly not going to be &lt;em&gt;for
me&lt;/em&gt; the huge issue some are making it out to be.&lt;/p&gt;

&lt;p&gt;It's true it's not quite the brain-dead-simple experience one gets
from running a Flash-based app. But keep in mind Flash-based apps have
until recently been very limited in functionality. Now that Flash is
offering similar capabilities, they'll also need to start asking the
user exactly the same sorts of questions JWS currently does.&lt;/p&gt;

&lt;h2&gt;In conclusion&lt;/h2&gt;

&lt;p&gt;As always, use the technology which makes the most sense. Each of the three listed here have tradeoffs: development time versus UI versus speed versus desktop integration versus browser functionality. No one of them is or ever will be clearly superior to the others; be glad we have such a diverse set of options.&lt;/p&gt;

&lt;p&gt;Developers tend to see the world in terms of the particular thing they're working on, be it game software or database access. Don't forget that not everyone does the same thing you're doing.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:107051</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/107051.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=107051"/>
    <title>Suicide?</title>
    <published>2007-02-21T04:58:53Z</published>
    <updated>2007-02-21T04:59:25Z</updated>
    <content type="html">&lt;p&gt;I'm not contemplating suicide... but I truly, sincerely believe
there's a serious problem when searching for "suicide" turns up the
Wikipedia article on the subject as the #1 entry.&lt;/p&gt;

&lt;p&gt;And if you can't understand why that might be a problem, try
reading the #2 entry.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:106907</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/106907.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=106907"/>
    <title>much better</title>
    <published>2007-02-20T05:13:59Z</published>
    <updated>2007-02-20T05:19:32Z</updated>
    <content type="html">&lt;p&gt;javac is a darn clever piece of work. A lot of tweaking later:&lt;/p&gt;

&lt;pre&gt;
$ cat Test.java
#pragma javac_stop_being_annoying
public class Test {
      public static void main (String[] args)
      {
	 String s = "abc";

	 if (s == s)
	 {
	    System.out.println ("Hi!");
	 }
	 if (s eq s)
	 {
	    System.out.println ("Hi!");
	 }
	 if (s eq 0)
	 {
	    System.out.println ("Hi!");
	 }
	 if (1 eq 2)
	 {
	    System.out.println ("Hi!");
	 }
      }
}
$ javac Test.java
Test.java:7: operator == cannot be applied to java.lang.String,java.lang.String
         if (s == s)
               ^
Test.java:15: incomparable types: java.lang.String and int
         if (s eq 0)
&lt;/pre&gt;

&lt;p&gt;Brilliant! Genius! [Note line 19 compiles (autoboxing, yay!) but the
test will fail. I should probably fix that. Easiest is to just disable
autoturding entirely; perhaps &lt;tt&gt;javac_stop_beiing_annoying&lt;/tt&gt;
should do that as well.]&lt;/p&gt;

&lt;p&gt;Source files without the &lt;tt&gt;javac_stop_being_annoying&lt;/tt&gt; pragma
are compiled as before, including allowing eq and neq as
identifiers. (I love the &lt;tt&gt;#pragma&lt;/tt&gt; bit, but I'm easily
amused.)&lt;/p&gt;

&lt;p&gt;Heh. This actually prints "Hi!":&lt;/p&gt;

&lt;pre&gt;
	 if (1 eq 1)
	 {
	    System.out.println ("Hi!");
	 }
&lt;/pre&gt;

&lt;p&gt;This doesn't:&lt;/p&gt;

&lt;pre&gt;
	 if (129 eq 129)
	 {
	    System.out.println ("Hi!");
	 }
&lt;/pre&gt;

&lt;p&gt;Oh, those magnificently wacky Sun guys and their flying machines.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;javac_stop_being_annoying&lt;/tt&gt; also gets rid of the &lt;tt&gt;+=&lt;/tt&gt;
syntax for String lossage. What were they &lt;em&gt;thinking&lt;/em&gt;?&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:106605</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/106605.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=106605"/>
    <title>Java comparison operators</title>
    <published>2007-02-19T20:27:43Z</published>
    <updated>2007-02-19T21:07:39Z</updated>
    <content type="html">&lt;p&gt;I have a lot of beefs with Java, ones which are only growing over
time. But with Java's equivalence operators we reach the pinnacle of
poor design. I think the designers should and could fix this before
adding eye-candy like closures or properties.&lt;/p&gt;

&lt;pre&gt;
StringBuffer s1 = new StringBuffer ("ha");
StringBuffer s2 = new StringBuffer ("ha");

System.out.println (s1.equals (s2));
&lt;/pre&gt;

&lt;p&gt;prints &lt;tt&gt;false&lt;/tt&gt; because StringBuffer &amp;ldquo;doesn't implement
&lt;tt&gt;equals ()&lt;/tt&gt;&amp;rdquo; and the default &lt;tt&gt;equals ()&lt;/tt&gt;
implementation is equivalent to &lt;tt&gt;==&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;No good explanation exists as to why this is so; there's a
confusing answer along the lines of &amp;ldquo;the Java API uses
&lt;tt&gt;equals ()&lt;/tt&gt; inconsistently&amp;rdquo; but that doesn't explain
anything. Sure, if I read the documentation for StringBuffer I'd learn
it doesn't implement &lt;tt&gt;equals ()&lt;/tt&gt;; my working assumption is that
something as basic as a string class would implement it.&lt;/p&gt;

&lt;p&gt;The &lt;tt&gt;equals ()&lt;/tt&gt; method has a contract: if two objects of the
same type are considered to have the same value, it returns
&lt;tt&gt;true&lt;/tt&gt;. It is clear the behavior of StringBuffer does not meet
this criteria; it is broken.&lt;/p&gt;

&lt;p&gt;General rule: surprising behavior is Bad in a programming
language. Not implementing &lt;tt&gt;equals ()&lt;/tt&gt; according to its
contract is surprising behavior. Rather than using some bizarre
default behavior, &lt;tt&gt;Object.equals ()&lt;/tt&gt; should throw a &amp;ldquo;not
implemented&amp;rdquo; exception when it is invoked.&lt;/p&gt;

&lt;p&gt;Better still, the code shouldn't compile in the first place.&lt;/p&gt;

&lt;p&gt;Another gotcha:&lt;/p&gt;

&lt;pre&gt;
void foobar (int a, int b)
{
[...]
   if (a == b)
   {
     blorknitz.add (Integer.valueOf (a));
   }
   else
   {
     fleeblui.add (Integer.valueOf (b));
   }
[...]
}
&lt;/pre&gt;

&lt;p&gt;Hmmm. It'd be more efficient if I passed in two &lt;tt&gt;Integers&lt;/tt&gt;
instead of &lt;tt&gt;int&lt;/tt&gt; because I have them right here, the compiler's
just autoboxing and unboxing them. I can fix this easily:&lt;/p&gt;

&lt;pre&gt;
void
foobar (Integer a, Integer b)
{
...
   if (a == b)
   {
     blorknitz.add (a);
   }
   else
   {
     fleeblui.add (b);
   }
...
}
&lt;/pre&gt;

&lt;p&gt;Say, that's funny. It's not working right anymore. Wonder why?
(More scary: it &lt;em&gt;does&lt;/em&gt; work consistently for particular values
of a and b.)&lt;/p&gt;

&lt;p&gt;Given the current state of Java's equivalence operators
&lt;tt&gt;javac&lt;/tt&gt; shouldn't allow programmers to write code like that in
the first place. More specifically, &lt;tt&gt;==&lt;/tt&gt; needs to be one type
of equivalence or the other instead of varying its behavior between
built-in types and instances of &lt;tt&gt;Object&lt;/tt&gt;. In BOOP, if you want
to know if two handles point to the same object:&lt;/p&gt;

&lt;pre&gt;
if (@address (a) == @address (b))
{
  ...
}
&lt;/pre&gt;

&lt;p&gt;That's absolutely clear. It takes more keystrokes but that's OK.
(And it's not actually doing function invocations, the compiler does
the right thing instead.) I'm not going to read that five years from
now and wonder what it does; I'll know.&lt;/p&gt;

&lt;p&gt;You can't even code defensively against this problem in Java
because invoking &lt;tt&gt;.equals ()&lt;/tt&gt; on a &amp;ldquo;non-object&amp;rdquo;
(whatever that is) doesn't work.&lt;/p&gt;

&lt;p&gt;What does this do?&lt;/p&gt;

&lt;pre&gt;
  String s = new String ("hi");
  String t = s;
  System.out.println (s == t);

  s += " there";
  System.out.println (s == t);

  t += " there";
  System.out.println (s == t);
&lt;/pre&gt;

&lt;p&gt;Clever dog, I bet you thought it'd print &lt;tt&gt;true&lt;/tt&gt; three times,
right? Or if you're forgetting how &lt;tt&gt;==&lt;/tt&gt; behaves, perhaps
&lt;tt&gt;true, false, true&lt;/tt&gt;. Nope! It prints &lt;tt&gt;true, false,
false&lt;/tt&gt;. That definitely seems broken; s and t are handles for the
same object, and all I did was append to the String object we created
in the first line... right?&lt;/p&gt;

&lt;p&gt;Wrong! Java really does this:&lt;/p&gt;

&lt;pre&gt;
  String s = new String ("hi");
  String t = s;
  s = new StringBuffer (s).append (" there").toString ();
&lt;/pre&gt;

&lt;p&gt;This Is Not Good.&lt;/p&gt;

&lt;p&gt;Another silliness:&lt;/p&gt;

&lt;pre&gt;
Long l = Long.valueOf (0);
System.out.println (l.equals (0));
&lt;/pre&gt;

&lt;p&gt;Prints &lt;tt&gt;false&lt;/tt&gt;. Bwahaahahahaahah! Why? WHY? That makes no
sense at all.&lt;/p&gt;

&lt;p&gt;It's because &lt;tt&gt;Long.equals ()&lt;/tt&gt; is defined something like:&lt;/p&gt;

&lt;pre&gt;
 boolean equals (Object o) {
   if (o != null)
   {
     if (o instanceof Long) { return ((Long) o).whatever == this.whatever; }
   }
   return false;
}
&lt;/pre&gt;

&lt;p&gt;We passed in an &lt;tt&gt;int&lt;/tt&gt;, which is autoboxed to
&lt;tt&gt;Integer&lt;/tt&gt;, and the test fails because &lt;tt&gt;o&lt;/tt&gt; is not an
instance of &lt;tt&gt;Long&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&amp;ldquo;Makes sense, right?&amp;rdquo;&lt;/p&gt;

&lt;p&gt;Only if you're from Bizarro World. How could they get so many
little things wrong, then fail to fix them in a timely fashion?&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:106478</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/106478.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=106478"/>
    <title>Closures for Java: booo!</title>
    <published>2007-02-17T21:44:13Z</published>
    <updated>2007-02-17T21:46:05Z</updated>
    <content type="html">&lt;p&gt;Some &lt;a href="http://www.javac.info/"&gt;crazy people&lt;/a&gt; want Java to
be more Lispish, and think closures are the greatest thing since
canned Spam. I disagree.&lt;/p&gt;

&lt;p&gt;Closures are anonymous code blocks which can be passed around and
evaluated. That's OK as far as it goes, but it can lead to very unreadable
code.&lt;/p&gt;

&lt;p&gt;They aren't very popular. The article mentions that &amp;ldquo;Scheme,
Smaltalk, Ruby, and Scala&amp;rdquo; provide them; honestly, none of those
are languages I'd ever use for anything practical. The people who do
use them usually come from Scheme/Lisp backgrounds, and enjoy the
&amp;ldquo;flexibility&amp;rdquo; these sorts of constructs give. (I call it
&amp;ldquo;curdled milk programming,&amp;rdquo; it's usually full of ugly
lumps.)&lt;/p&gt;

&lt;p&gt;The final deciding point for me is the syntax. Here's a prime
example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
&amp;lt;K,V,throws X&amp;gt;
void for eachEntry(Map&amp;lt;K,V&amp;gt; map, {K,V=&amp;gt;void throws X} block)
        throws X {
    for (Map.Entry&amp;lt;K,V&amp;gt; entry : map.entrySet()) {
        block.invoke(entry.getKey(), entry.getValue());
    }

}
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ugh. If I stared at that for an hour I might be able to guess at
what it's trying to do. Not something I'd want to see when debugging
someone else's code. And that's a &lt;em&gt;simple&lt;/em&gt; example!&lt;/p&gt;

&lt;p&gt;There's also
&lt;a href="http://crazybob.org/2006/10/java-closure-spectrum.html"&gt;this
proposal&lt;/a&gt;, one which is much more readable and less powerful. I
think that one's OK; it doesn't lead to users writing incomprehensible
gobbledygook, like the mess C++ templates have become. (In fact,
that's exactly what that example above reminded me of.)&lt;/p&gt;

&lt;p&gt;Many programmers believe shorter syntax is better. I'm just the
opposite, I like lots of syntax. To me, consistency and ease of
reading is more important than saving keystrokes. And I think most
programmers would agree, otherwise we'd be using languages which
resemble APL.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:105894</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/105894.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=105894"/>
    <title>sigh</title>
    <published>2007-02-15T19:52:53Z</published>
    <updated>2007-02-15T19:57:17Z</updated>
    <content type="html">&lt;p&gt;This is just kitten-eatin' badness in Java.&lt;/p&gt;

&lt;p&gt;I need efficient access to four integers. The usual method in most
languages is to use an array. But...&lt;/p&gt;

&lt;pre&gt;
public class Foobar {
   public int b1[] = new int[4];
   public int b2[] = new int[4];
}

public class Barbaz {
  public int b11, b12, b13, b14;
  public int b21, b22, b23, b44;
}
&lt;/pre&gt;

&lt;p&gt;Suppose we need to save b1/b2 temporarily; what's the fastest
way?&lt;/p&gt;

&lt;p&gt;Yep, you guessed it:&lt;/p&gt;

&lt;pre&gt;
	 Foobar p1, p2;

	 int h1[] = p1.b1;
	 int h2[] = p2.b2;
	 int p10 = h1[0];
	 int p11 = h1[1];
	 int p12 = h1[2];
	 int p13 = h1[3];
	 int p20 = h2[0];
	 int p21 = h2[1];
	 int p22 = h2[2];
	 int p23 = h2[3];

	// then put them back later
&lt;/pre&gt;

&lt;p&gt;This is at least one order of magnitude faster than using
clone/System.arraycopy. But it turns out we'd be even smarter not to
use the array at all.&lt;/p&gt;

&lt;p&gt;Which is faster?&lt;/p&gt;

&lt;pre&gt;
	Foobar f11;

	java.util.Arrays.equals (f11.b1, f11.b2, 4);
&lt;/pre&gt;

&lt;p&gt;versus&lt;/p&gt;
&lt;pre&gt;
	Barbaz b1;

	b1.b11 == b1.b21 &amp;&amp; b1.b12 == b1.b22 &amp;&amp; b1.b13 == b1.b23 &amp;&amp; b1.b14 == b1.b24
&lt;/pre&gt;

&lt;p&gt;The latter, of course. By a factor of five.&lt;/p&gt;

&lt;p&gt;So how about:&lt;/p&gt;

&lt;pre&gt;
	Foobar f11;

	f11.b1[0] == f11.b2[0] &amp;&amp; f11.b1[1] == f11.b2[1] &amp;&amp; f11.b1[2] == f11.b2[2]
	&amp;&amp; f11.b1[3] == f11.b2[3]
&lt;/pre&gt;

&lt;p&gt;It's slightly slower than the Barbaz version. But if I'm going to
write code like that, why use the array in the first place?&lt;/p&gt;

&lt;p&gt;Here's a &lt;em&gt;really&lt;/em&gt; evil one: which is faster?&lt;/p&gt;

&lt;pre&gt;
   public void f (Foobar foo, int x) {
     w += foo.b1[x];
   }
&lt;/pre&gt;


&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;
   public void f (Barbaz foo, int x) {
      w += (x &amp;lt; 2 ? (x == 0 ? foo.b11 : foo.b12) : (x == 2 ? foo.b13 : foo.b14));
  }
&lt;/pre&gt;

&lt;p&gt;Almost exactly the same speed. (If anything, the Barbaz version is
faster. Unfortunately, adding a member function to Barbaz to simulate
the array makes it about 1/2 the speed.)&lt;/p&gt;

&lt;p&gt;Why is this? &lt;em&gt;Because arrays are not an integral Java type.&lt;/em&gt;
Dumb. Very, very dumb. The reason arrays were invented was so I
wouldn't have to use typo-prone code like the above. In C we can
expect the compiler to optimize much of this, but not so in Java.&lt;/p&gt;

&lt;p&gt;The usual Java answer seems to be "use collections". I think this
misses the point; they're much slower. Sometimes you really do need
efficient code, and arrays can be an extremely efficient data
structure.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:105323</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/105323.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=105323"/>
    <title>Anyone know...</title>
    <published>2007-02-05T05:10:02Z</published>
    <updated>2007-02-05T05:10:59Z</updated>
    <content type="html">&lt;p&gt;why signed certificates are so damn expensive these days?&lt;/p&gt;

&lt;p&gt;I remember buying one about 6-7 years ago, and it was like $40.
Now they cost upwards of $200 per year.&lt;/p&gt;

&lt;p&gt;I vaguely care about this because I've been writing JNLP apps, and
it seriously would be to everyone's benefit if they were signed. The
prohibitive cost just doesn't justify it.&lt;/p&gt;

&lt;p&gt; (I'm aware of the various "open certificate" efforts, but they're
not feasible&amp;mdash;if you seriously look at the requirements, few
humans would ever be able to get a code signature. If you're one of
the "in" people it's easy; I'm not.)&lt;/p&gt;

&lt;p&gt;Ridiculous. I'm almost tempted to start my own.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:105043</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/105043.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=105043"/>
    <title>Wikipedia grows up a little, film at 11</title>
    <published>2006-10-30T04:58:12Z</published>
    <updated>2006-10-30T05:00:02Z</updated>
    <content type="html">&lt;p&gt;I am insanely amused by:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
This article must adhere to the policy on biographies of living
persons. Controversial material of any kind that is unsourced or
poorly sourced must be removed immediately, especially if potentially
libelous. If such material is repeatedly inserted or there are other
concerns relative to this policy, report it on the living persons
biographies noticeboard.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pretty soon they'll figure out that libelous and/or controversial
material for &lt;em&gt;dead&lt;/em&gt; people is important too. Or, for that
matter, libelous and/or controversial material about
&lt;em&gt;anyone&lt;/em&gt;. That's called... responsibility.&lt;/p&gt;

&lt;p&gt;Granted, a collective encyclopedia isn't held responsible to any
&lt;em&gt;one&lt;/em&gt; individual. Yet, it should be held responsible to a
group; there's ultimately no difference.&lt;/p&gt;

&lt;p&gt;Some people want to believe that they live in a vacuum, and that by
posting &amp;ldquo;anonymously&amp;rdquo; they somehow are exempt from telling
the truth.&lt;/p&gt;

&lt;p&gt;Life doesn't work that way&amp;mdash;and shouldn't.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:104738</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/104738.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=104738"/>
    <title>Random rant</title>
    <published>2006-09-04T09:31:04Z</published>
    <updated>2006-09-04T09:31:41Z</updated>
    <content type="html">&lt;p&gt;Recently I was looking for white shoe polish. (It's just the thing
for whitening canvas spats.) Couldn't find any. I'm not
surprised... but at the same time, it's disheartening.&lt;/p&gt;

&lt;p&gt;I'm sure five years ago I couldn't have walked into a drugstore or
grocery store and not stumbled across the stuff. You know what I'm
taling about; there were (are) a few brands on the market, one with a
picture of a cute baby &lt;i&gt;circa&lt;/i&gt; 1940 called "Hollywood Shoe
Polish;" and of course the ubiquitous Kiwi shoe polish in a bottle
with sponge applicator. Every store I ever heard of had at least one
brand.&lt;/p&gt;

&lt;p&gt;Of the &lt;em&gt;many&lt;/em&gt; places I visited only one had any Kiwi shoe
products&amp;mdash;and no white polish, just a couple of cans of dried-out
black and a few other colors. Nobody polishes shoes anymore...  or if
they do, they order their shoe polish via mail-order. (I always buy a
tube of polish with my shoes.)&lt;/p&gt;

&lt;p&gt;Not even &lt;tt&gt;amazon.com&lt;/tt&gt; has white shoe polish. I ended up
ordering it from a special shoe care place on the net; local shoe
shops didn't have any either. I didn't realize white shoe polish was
such a special item, I guess nobody wears white shoes which need
polishing.&lt;/p&gt;

&lt;p&gt;Remember: if everyone had good taste there'd be no reason to have
it.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:104542</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/104542.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=104542"/>
    <title>Eight planets!</title>
    <published>2006-08-25T07:52:28Z</published>
    <updated>2006-08-25T07:53:26Z</updated>
    <content type="html">&lt;p&gt;Hurrah! Finally, 
&lt;a href="http://www.ndtv.com/morenews/showmorestory.asp?slug=Pluto+no+longer+a+planet&amp;amp;id=92065"&gt;someone does the right thing&lt;/a&gt;. A difficult feat in
today's wacky fame-obsessed marketing-oriented world.&lt;/p&gt;

&lt;p&gt;For real, we only have eight planets now. Pluto and Charon are officially
asteroids, as is "Xena, Lesbian Warrior Princess of Lame-Ass TV,"
"Coca-Cola the One," "My Daughter's First Planet" and the hundreds of
other Pluto-like objects destined to be discovered by astronomers
desperate for fame, money and recognition.&lt;/p&gt;

&lt;p&gt;I guess from now on they'll have to stick to discovering Jupiter's
"92nd moon," predicting
sorta-kinda-maybe-near-imminent-if-you-squint-really-hard-and-pray-a-lot
Earth vs. Asteroid collisions, and announcing the latest
quintuple-Jupiter-sized planet bathed in ultraviolet radiation
orbiting a K-class star tens of thousands of light-years away.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:104260</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/104260.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=104260"/>
    <title>Ghurka's having a sale...</title>
    <published>2006-08-05T05:34:31Z</published>
    <updated>2006-08-05T05:35:05Z</updated>
    <content type="html">&lt;p&gt;I know, I know, most of my reading audience wouldn't dare use a
&lt;a href="http://ghurka.com"&gt;Ghurka&lt;/a&gt; bag, too ritzy. But just to let
you know... most of their items are running 30-70% off.&lt;/p&gt;

&lt;p&gt;You won't go wrong by buying one of their bags. Or, if you're in
need of a wallet, theirs are very sturdy and stylish.&lt;/p&gt;

&lt;p&gt;Highly recommended. They have a store in downtown SF, and the
salespeople are very nice.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:emacsmood:104083</id>
    <link rel="alternate" type="text/html" href="http://emacsmood.livejournal.com/104083.html"/>
    <link rel="self" type="text/xml" href="http://emacsmood.livejournal.com/data/atom/?itemid=104083"/>
    <title>Generic software rant</title>
    <published>2006-07-09T19:11:44Z</published>
    <updated>2006-07-09T19:12:48Z</updated>
    <content type="html">&lt;p&gt;I needed to draw some vector objects for Postscript.&lt;/p&gt;

&lt;p&gt;My first choice was The GIMP. I have a 1.2.x version installed,
mostly because of the long delay between 1.2 and the following
versions (and it works well enough). It doesn't do vector objects, but
the newer versions do.&lt;/p&gt;

&lt;p&gt;I downloaded the latest sources and ran configure. Of course it
starts spewing about all the things I don't have installed... it
relies on four huge library packages, none of which are used by
anything else installed on my machine and never will be. (This is a
singularly odd definition of &amp;ldquo;library&amp;rdquo; which I'm not
familiar with.)&lt;/p&gt;

&lt;p&gt;I really didn't want to spend half a day downloading and installing
software just so I could upgrade to GIMP 2.2. I had this bizarre
little fantasy: download it, run configure, everything would build,
and I'd be done. I'd forgotten how much work building 1.2 was; the new
versions are much worse.&lt;/p&gt;

&lt;p&gt;Binary versions exist, but they use the wacky mutant-specific
packaging systems and I'd still have to hunt down and install the
&amp;ldquo;shared&amp;rdquo; libraries as well. Plus I have my own
incompatible mutant packaging system, one that makes more sense;
things are never installed in shared areas, instead each package has
its own separate area. I honestly don't want to install gimp in
&lt;tt&gt;/usr/local/bin&lt;/tt&gt; and its libraries in &lt;tt&gt;/usr/lib&lt;/tt&gt;, or
whatever.&lt;/p&gt;

&lt;p&gt;I gave up on that and started looking around. Finally found
&lt;tt&gt;tgif&lt;/tt&gt;. One binary, no funny libraries, no auxiliary crap. The
user interface is better than GIMP's, by a longshot. It exports to
EPS, exactly what I needed. There's a lot of things it doesn't do, and
when it uses bitmaps it chews up memory like it's going out of style,
but it's done everything I needed for drawing vector objects.&lt;/p&gt;

&lt;h2&gt;Rant number two: netpbm&lt;/h2&gt;

&lt;p&gt;The &lt;tt&gt;netpbm&lt;/tt&gt; maintainer must be either psychotic or a glue
sniffer. I can't otherwise explain how anyone would believe writing
man pages in HTML and requiring everyone to access them via the web is
a good thing.&lt;/p&gt;

&lt;p&gt;This really drives me up the wall:&lt;/p&gt;

&lt;pre&gt;
$ pbmclean --help
pbmclean: Use 'man pbmclean' for help.
&lt;/pre&gt;

&lt;p&gt;Drugs. It's &lt;em&gt;got&lt;/em&gt; to be drugs.&lt;/p&gt;

&lt;p&gt;The other problem with the oh-so-fucked-up online man pages is the
lack of versioning. The man pages never match what I have installed
because they're for the latest version and I'm not upgrading
&lt;tt&gt;netpbm&lt;/tt&gt; on a weekly basis.&lt;/p&gt;

&lt;p&gt;This unfortunate situation has existed since 2002 with no end in
sight; clearly the only way it's going to get fixed is if I do it
myself. I shouldn't have to, nobody should have to&amp;mdash;the programs
&lt;em&gt;used&lt;/em&gt; to have perfectly usable usage statements before Psycho
Maintainer got his hands on it.&lt;/p&gt;</content>
  </entry>
</feed>
