Fog Creek Software
Discussion Board

Better Mousetraps

So what are some great technologies, software or hardware or otherwise, that are better than the middle-of-the-road, won't-get-fired-for-choosing-it tech that's in popular use?

I'd like to propose as rules for this thread:

1. Name the technology
2. Say why it's better that its competitors
3. Objections on the basis of popularity are verboten: the whole point is to judge purely on technical and aesthetic grounds, not popularity or business considerations

Saturday, October 4, 2003

Borland Delphi

A RAD development enviromnent based on ObjectPascal. Excellent component architecture (better than the .NET one), true compiler which generates fast, tight Win32 executables.

MyIE 2 web browser

Web browser based on Internet Explorer. It uses the Internet Explorer rendering engine, but it has an excellent interface with tabs, and many advanced features.

The Bat!

Excellent no-nonsense e-mail client. Doesn't have a nice interface, but it's e-mail processing capabilities are unmatched.

Advanced Uninstaller

Modern uninstaller software utility, including privacy and clean-up functions. Can configure Internet Explorer plugins and stuff, and this way you can fix IE.

Jack Kite
Saturday, October 4, 2003

I have three issues with The Bat:
1) You can't filter on any headers but the short list of ones they give you. This precludes using spam proxy filters (which use custom headers to filter)
2) Their text editor is awful. Truly awful - it uses some kind of absolute positioning - wherever you click, that's where the cursor goes (as opposed to the end of the line); it dynamically inserts spaces to keep the cursor there. In addition I have yet to figure out how to reflow text - if you type a paragraph, it automatically wraps lines. If you then *edit* that paragraph, your lines are all out of kilter.

Since the text editor is where you spend most of your time in an email client, this is painful to the point that I'm thinking of switching clients again.

3) They recently released Version 2. They charge for the upgrade, but as of two weeks ago there was nothing on the website about what the upgrade changes. Queries on the website forum went unanswered.


Saturday, October 4, 2003

The great unknown email client is Becky at . The web site for it sucks, but the email client is outstanding. The editor that comes with it is as good as some programmer's editors (even has column-mode editing and reformatting comands) and it has another feature that's outstanding -- it lets you choose your own editor.

It lets you filter on any header. It has 24 headers listed in its filter manager, and will also let you specify your own. It has a remote mail manager, threaded viewing, and a thriving plug-in community. A much better threaded view manager is available as a free third-party plug-in, and it works great and even lets you drag and drop messages into whichever thread you like.

It lets you specify whether to default to the HTML or plain-text view of messages (and will always let you switch between them while reading), and can disable scripts in HTML emails. You can set up multiple accounts on one inbox, or have multiple inboxes. You can set up different check intervals on each mailbox, and pause the checks easily. It supports flagging and color-coding of messages.

It also lets you do something I've never seen any other mail client do: It will let you edit received messages, including the subject line. I use that feature to take notes directly in an email if it requires a phone call for clarification. You can also schedule delivery of future emails, which is great for sending yourself reminders.

You can even just copy its install folder to back it up -- that makes it very easy to transfer from install to install or machine to machine. It also supports command-line arguments for certain commands, so I've assigned a CTRL-ALT-N Windows shortcut to it's "new mail" command, which means I can create a new message from any program without having to switch to Becky first.

I could go on and on with its features. I've been using it for a couple years, and absolutely love it.  The down-side is that it is a little complex, and a bit overwhelming when you first use it, but you grow into it.

Troy King
Saturday, October 4, 2003

The easiest file back-up program to use "Second Copy".

A fabulous program for windows 9* that allowed you to set security for users without the horrors of  poledit. Called "Security Wizard" and unfortunatley not only not updated, but the guy who wrote it has lost the name to another program. Who says there's justice in the world?

And on the subject of Win 98 utilities no longer needed with NT type OS's , "Cacheman" (allows you to change the system cache without messing around with system.ini) and "Freemem" memory manager - a godsend in the days when you were lucky to have 64MB of RAM.

"Free Extractor Wizard" creates self extracting zip files from standard zip files and allows you to program where they extract to, what messages you can give and what you do, all within 100KB. Truly a marvel!

Two of Stuart Rubenking's creations for ZDNet, StartUp Cop (still works with XP) and Regedit Plus ( which may or may not have been updated).

Jaws PDF creator, not because it is anything special but because it is free (I got it on a cover CD) and creates .pdf files simply by clicking on print.

There was also a beauty of a program whose name I've forgotten that allowed you to print booklets in Word.

None of these are hi-tech but then, nor is a mousetrap. What they do do, is let you do your work that little bit easier.

And a final mention for something in my fiield  -"Hot Potatoes" - which allows you to write web based teaching exercises. Not great technology,; it was built in Javasript though later versions may have used Delphi, but it was developed by EFL teachers, not programmers, and, considering how awful commerical  programs of its type are, worthy of a mention.

Stephen Jones
Saturday, October 4, 2003


I've been playing with this for a week now, and I'm gobsmacked.

Really Rebol is just Lisp with a friendly syntax.  Where I've been struggling to understand Lisp and how I might apply it to solving some real problems, Rebol just flows.  Whole, useful applications can be built in hours.  Amazing.

Its surprising that all of those oh so clever evengelical Lisp programmers have never thought of this.

Its also interesting that Rebol seems to try to hide its Lisp roots.

The other suprising thing is distribution.  Usually these runtime languages are a nightmare to distribute.  Java and .Net are the worse, but even Python and Ruby needs some effort installing the runtime.

With Rebol you can write an application and write it to a floppy with diskspace to spare.

Ged Byrne
Saturday, October 4, 2003

I also vote for the REBOL language ( ): There are a few issues, however; REBOL isn't open source, the  mix of features/functionality is somewhat hindered by a dogma of platform-independence, and the GUI needs work (and documentation).
I would add that the developer community is incredibly small, but that could change if it continues to attract smart, adventurous programmers.

Saturday, October 4, 2003

K (at [ ]) is an APL-derived language that matches Rebol on environment footprint, has lesser support for internet stuff, but blows any other language, REBOL included, in the terseness department. It's also competitive with C in terms of speed for most apps (especially those needing number crunchign and databases), even though it is interpreted. The whole interpreter + standard library + GUI is a 200k exe file for Windows. Alas, it too is not open source.

Ori Berger
Saturday, October 4, 2003

An example of how amazing K is:

Problem: Compute the maximum-slice-sum of a vector v - that is, the maximum sum you can get by starting at an index, and summing some consequative numbers.

The trivial solution is two loops, one for the starting index, and one for the length - an O(n^2) solution. There is, however, an O(n) solution for this problem: Keep a running maximum of the sum so far, and replace it by zero every time it becomes negative. The largest sum encountered along the way is the solution. Proof that it yields the right answer is left as an exercise for the reader.

In K, this solution is written:
max_slice_sum: |/(0|+)\

Note that an abbreviated function _name_ is longer than the functions _definition_. This terseness is common in K; For example, a function that returns the average of a vector is written:


Now to explain the meaning of both - first the average.
"+/x" means "+ continuously applies to all elements of x", specifically "x[0] + x[1]) + x[2]  + ... + x[n-1]". It is made of two distinct tokens - "+" and "/". The latter works on _any_ function, so, for example, ",/" concatenates all elements of a vector ("," is the concatenation operator in K). "*/" is a product of all elements of a vector. "f/"  applies f continuously, and is often useful, e.g. for running state machines.
"#x" means the length of x (read 'count x')
"%" means divide-by.

Now for the slice sum:
"+\x" is like "+/x", except it returns a vector of all partial results, so +\x is a vector containing (x[0], x[0]+x[1], x[0]+x[1]+x[2], ..., x[0] + ... + x[n-1]). The "\" operator is called "scan".

"|" is, in this context, the "max" operator. "a|b" is the maximum between "a" and "b"
"0|" locks "0" as the left argument of the max operator. So, it is a function of one argument, that returns a positive argument unmodified and zero for a negative argument.
"0|+" binds that function to "+" in the sense that if "f" is the function "0|+" then "f" applied to "a" and "b" is "0|(a+b)".
Now we apply the "scan" operator to this function, which means we continually sum elements, but zero each negative. The result of the scan is the list of all partial results along the way.
Now, we apply "|/" - "max over", to compute the maximum in an anlogous way to the way "+/" computes the sum. And that is the result.

Long description, but it's just 8 characters. Each of this characters has a completely orthogonal meaning, and their combination yields the required algorithm. The language is not in any way optimized to solve this specific problem as a special case.

Another example: The function "func:{[t;f;o]{x y z x}/[_n;o;t f]}"  means either multicolumn "select where" or multicolumn "order by" on one table (in the SQL sense), depending on parameters, e.g, with the above definition,


returns a table containing all rows of table with size > 3, without changing their order

func[table; `size; <]

returns all the rows of table sorted by size, and

func[table;`size`color`flavour;< ,`red~ , amazing]

returns the rows that have red color and that the function "amazing" returns true on their flavour. It returns that list of rows sorted by size.

Yes, that function does all that, and it's actually quite verbose - it can equally be written
"func:{{x y z x}/[_n;z;x y]}" which is probably shorter than how it would have been named in any other language ("multicolumn_select_where_and_order_by" or something).

Explaining this function is beyond the scope of this post, but trust me, it DOES work, and it again builds on composition of entirely orthogonal structures.

Learn K. It takes time, but is well worth the effort.

A closing note: When I first looked at APL (that was back in the day; APL is an ancestor of K, and is not as terse and orthogonal, but is very close), the first example looked like the language was built for it. And the second one too. And the third. And the fifteenth. If you only look at two or three examples, it will look that way because our experience with C, Java and similar languages makes us believe that anything this short must be a specific hack. But once you get used to the power of the language, you start to question why all other languages are so needlessly verbose.

This [ ] is an in-memory database written in K, that has insert/update/delete, select, order by, group by with aggregation operators (sum, average, count), and a random-table generator (for tests). It takes all of 16 lines, non of them longer than 80 chars, only one of them longer than 30 chars, at least two of the lines essentially redundant.

It's also very fast. The file contains an alternative implementation of the aggregation code which is simpler, shorter, and easier to understand, but is 4 times slower.

Ori Berger
Saturday, October 4, 2003

P.S: The example above works on "tables", but K actually has no "table" type. It has C-like vectors, and associative arrays - and it can nest them to any dimension.

A table is usually implemented as a two dimensional array, one dimension being the numeric-index "row", and the second dimension being the associative-index "column".

Ori Berger
Saturday, October 4, 2003

Sorry, I fell asleep during that.

Sunday, October 5, 2003

That's a real pitty. Although complicated at first, it was very interesting.

programming language junky
Sunday, October 5, 2003

" start to question why all other languages are so needlessly verbose."

Until you start to work on a team and you can't read anything anyone else wrote.

Not that I have any experience with the language, but that line surprised me.  I personally find a language like Pascal (Object Pascal in Delphi) a lot easier to read than C, simply because it is more verbose.  "Begin..End" is a lot harder to miss than "{..}"  X=X+1 is a lot clearer than X++.  To me, anyway.

I remember how hard it was to figure out what an APL program was supposed to do.  I also remember how much fun it was to write my own APL.  If you were working on a team, I think the frustration of reading the code would outweigh the enjoyment of writing it. 

Scott Stonehouse
Monday, October 6, 2003

First, there are two meanings of verbose confused here:

The C vs. Pascal sense, in which 'begin' is more verbose than '{', but semantically, they convey the same amount of information.

The APL vs. The Rest sense, in which a routine to compute the maximum-subrange-sum is much longer, and contains much more information, even though it conveys the same algorithm. If I used K's english transcription, the experssion "|/(0|+)\x" would read "max over ( 0 max sum) scan x". It might be more readible but it's still terser than any other language. It is this sense of "needlessly verbose" that I meant.

Second, if I was to take your logic ad-absurdum, one can claim that COBOL is more readable than either C or Pascal, because
is infinitely more readable than:
  C = A + B

But to 99% of the programmers (note: programmers! not "english speaker population"), the former is LESS readable.

It's all a matter of what you're used to. If you're using APL in a team, they should all be fluent in APL. Personally, I wouldn't want a C programmer not fluent in Pascal to modify any production Pascal code, because e.g., in Pascal logical "and" and logical "or" do not shortcircuit.
The Pascal code is very readable to the C programmer, but it is not easily amendable, and what's worse, it is not evident to the C programmer that he lacks knowledge.

There's a difference between appealing to professionals and to the layman; An earlier post of mine to this list, at [ ] discusses this.

And yes, as you can see, I do evangelize K/APL. No, I'm not affiliated with a commercial vendor for K or APL - I do believe they deserve much better recognition and much wider use.

Ori Berger
Monday, October 6, 2003

*  Recent Topics

*  Fog Creek Home