Previous Issue | Search TidBITS | TidBITS Home Page | Next Issue

TidBITS Logo


Feeling geeky? Matt Neuburg reviews Text Machine, the grep utility for more of us. We also finish off Rick Holzgrafe's Successful Shareware series, staving off accusations of it being the article equivalent of Zeno's Paradox. Other topics include details about Apple's fourth quarter loss, a pointer to extensive information on dealing with spam in the last two issues of NetBITS, Apple price reductions, and the long-awaited release of Spring Cleaning 2.0.


Copyright 1997 TidBITS Electronic Publishing. All rights reserved.
Information: <> Comments: <>

This issue of TidBITS sponsored in part by:


Recently in NetBITS -- If you're interested in the burgeoning problem of spam email, check out the last two issues of NetBITS. In NetBITS-003_, Adam wrote what's can be done personally, commercially, and legally to limit the vast quantity of unwanted, unsolicited, commercial email many of us now receive. Then, in NetBITS-004_, NetBITS Editor in Chief Glenn Fleishman looked at ways of stopping spam at the server level. Other topics included a look at how time zones relate to the times displayed in email headers, how to use the Internet to set your computer's clock correctly, and thoughts about purchasing ISDN equipment for a small office. You can read these back issues of NetBITS on our Web site and subscribe to NetBITS for free by sending email to <>. [ACE]


Apple Posts $161 Million Fourth Quarter Loss -- Last week, Apple posted its fourth quarter results, which included a $161 million net loss. For the year, Apple's revenues totaled $7.1 billion, down 28 percent from $9.8 billion in 1996. The net loss for 1997 reached $1.0 billion, compared to an $816 million loss in 1996. Though the $161 million loss is nothing to crow about, without the charges Apple took related to the acquisition of Power Computing's Macintosh assets, it would have been a $24 million loss. Also positive was the reduction in recurring operating expenses to $353 million, down from $408 million in the third quarter of 1997 and $505 million in the fourth quarter of 1996. Helpful were the strong sales of Mac OS 8, which has sold two million copies since its July release. The $1.0 billion net loss for the year is alarming, but remember it contains restructuring charges of $217 million and $450 million in write-offs related to the NeXT and Power Computing acquisitions. Without that $667 million in one-time charges, the 1997 $1.0 billion loss drops to $333 million. [ACE]


Apple Cuts Prices, Begins Rebates -- Last week, Apple decreased pricing dramatically on the PowerBook 3400 and Power Macintosh 8600. For instance, Apple dropped the price on the Power Macintosh 8600/300/Zip from $3,200 to $2,600 and the PowerBook 3400c/200 decreased from $4,500 to $3,800 (see the PowerBook 3400 review in TidBITS-371). Additionally, Apple has instituted a series of rebates designed to encourage people to purchase Apple peripherals either singly or in tandem with a new Mac. For example, the Apple QuickTake 200 digital camera ($550 street price) comes with a $75 rebate if purchased alone or a $150 rebate if purchased with certain Macs. Apple traditionally drops prices in anticipation of upcoming product releases; no doubt this promotion relates to the forthcoming release of the so-called Gossamer Macs. [TJE]


Cyberian Outpost has updated its DealBITS deal on the PowerBook 3400, and - through the URLs below - is offering a 200 MHz model for $3,679 and a 240 MHz model for $4,427. This deal reflects a $50 discount from the regular Cyberian Outpost price.


Aladdin Releases Spring Cleaning 2.0 -- Aladdin Systems today started shipped the long-awaited upgrade to Spring Cleaning 2.0, the popular uninstaller utility for the Macintosh. Spring Cleaning helps you clean up your hard disks by removing redundant and unnecessary files in ten different ways. Changes and additions from Spring Cleaning 1.0 include a new, easier interface; a Duplicates Remover module that finds and removes duplicate files; Storage Folders that can act as temporary holding spots until you feel confident in deleting files; and archiving with StuffIt compression, if you want to save space without deleting files. Features remaining from 1.0 include the capability to uninstall applications and their related files, remove unnecessary PowerPC or 68K code within fat binary applications, remove orphaned preferences, fix broken aliases, remove empty folders, and more. Spring Cleaning 2.0 requires System 7.0 or later, and it lists for $120; free upgrades from 1.0 will be available on Aladdin's Web site through 31-Dec-97. [ACE]


Successful Shareware, Part 4

by Rick Holzgrafe <>

Part one of this article (see TidBITS-395) focused on two items from my list of seven "Ps" that shareware authors must consider: Product and Patience. The second installment covered the third P, Polish (see TidBITS-398). After talking about Pay Up and Propagation in the last issue (see TidBITS 400_), it's time to wrap up with the final two Ps: Promotion and Politics.


The Sixth P: Promotion -- "If you build it, they will come." I'm here to tell you they won't. If you don't advertise your software, few people will notice it or buy it. Promotion (also called evangelism) is the art of shouting good news about your product and getting other people to shout good news about it, too. It takes time and effort and perhaps a little money, but it's essential to your success. Here are some ways to start shouting.

Promotion: Advertising -- If you have the bucks, you can make people notice your product. Just buy advertising everywhere: in magazines, on Web sites, on TV, in inserts in other people's commercial products.

The trouble with that idea is that it takes a barrel of bucks. Advertising is hideously expensive, and few shareware authors can afford it. In ten years of selling shareware, I have never paid a penny for advertising. That's not because I don't approve of advertising, but because a penny buys precious little ad space and I've never had the ton-weight of pennies it would take to buy significant ad. Ads in major magazines, for example, cost thousands of dollars, and even in my dreams I don't have enough money to consider television ads, which can cost tens or hundreds of thousands of dollars.

Lately an alternative has appeared that might be worth considering. Many major Web sites support themselves by selling ad space, and the starting rates are in the low hundreds of dollars: high for anyone on a shoestring, but not out of the question for everyone. I haven't tried it myself, so I can't recommend it - maybe it's worthwhile, maybe not. But all publicity is good, so if you can afford a small Web ad, it might be worth the experiment.

Promotion: Your Web Site -- Set up a Web site of your own. This won't cost you more than $20 or $30 per month from most ISPs, and you may be paying for it already. If not, you should be: this is a case of spending a little money in order to make more. If you can't hack raw HTML, then invest in any of the good HTML editors that are now available - there are plenty, just pick one.

Your site should offer the same information that's in your Read Me file. Unlike a Read Me file, however, your site is primarily an advertisement, so organize it differently: put the boring (but important) info near the bottom, and put your brags and puffery near the top. Don't go wild with huge graphics: many users won't wait for a big page to load over a slow modem. Do make the page as good-looking and professional as possible (just like your product). You can put big screen shots on separate pages for people who are willing to put up with big downloads. Use smaller screen shots or thumbnails on your main page, along with your company and product logos. In your download area, for a Mac product, offer pointers to selected Info-Mac and UMich mirrors around the world. Redundancy is good, because not all sites are available all the time.

If your product becomes popular, your $20 Web site may not be able to handle the load. When that happens, find a more expensive site that can take the traffic. It's worth it! When you can afford it, register a domain name of your own with InterNIC for $50 per year. That way your site will be easier to find ( is all it takes to find mine) and you'll be able to move your site to another provider without invalidating links and bookmarks to your old one, which can prove invaluable.


Promotion: Other Web Sites -- There are a zillion Web sites, and some of them attract people who should be your customers. Some are shareware sites, some are concerned with the work or play that your product offers. Find these sites and send mail to their webmasters. Give them your elevator presentation, ask them to link to your site promise to link back to theirs, and ask them to review your product. Evangelize! Be polite, but get their attention.

Promotion: Usenet News -- Usenet is a great, free way to spread the word. But be careful - you will anger many people if you use newsgroups for blatant advertising. Newsgroup readers will generally put up with brief, to-the-point announcements of your new releases; they'll regard those as public service announcements. But if you post every week with, "Check out this great software!" you will drown in hate mail. Respect Usenet: only post when you have news, and only post in appropriate newsgroups.

Promotion: Press Releases -- Use a press release to blow your own horn. News organizations want press releases; it's one of the major ways they get news about the business world. [If you post a press release on your Web site, make it easy for the press to locate it. Many sites have a press link on the home page, or link from the home page to an "About Us" page that then links to press releases. You might also reference a press release from the page belonging to the product it describes. -Tonya]

The Seventh P: Politics -- The last of our Seven P's is Politics: the art of making nice. You want to make as many friends as you can, for two reasons. First, friends are cool! Second, a good collection of friends adds up to a tremendous amount of goodwill, an asset for any business or person.

Politics: Be Nice -- Always be courteous, no matter what the circumstances. Say "please" and "thank you" a lot, just like Mom taught you. Before sending a message, read it, re-read it, and look for ways in which the reader might misunderstand what you're saying. Many shareware authors are not great writers, and it's easy to write something that unintentionally gives offense. Your readers can't see your face or hear your tone of voice, and they may not realize you're trying to be funny or sarcastic. If you distribute your product via the Internet, it's especially important to consider that English may not be the first (or principal) language of your readers. Be clear and precise.

Politics: Help Everybody -- I made the mistake in my early years of refusing to provide technical support to people who hadn't paid their shareware fees. One day I refused service to someone whose check I had misplaced. I apologized profusely, but the damage was done: that person will never buy my software again, and will tell others what a lousy person I am. Now, I support everyone, and I don't ask whether they've paid.

Helping everybody has another benefit. Many of your users (the "mouse potatoes" I talked about in part three of this series) won't pay until they need something from you. Give them a little support and - presto - a check shows up in the mail.

Politics: Make Friends -- I mentioned the benefits of making friends already. What kind of friends can you make?

Developers are good friends. They can help solve technical problems, and give advice on selling your products. In return, of course, you help them solve their problems, and share your own good advice.

Artists are good friends. Even if they can't contribute free artwork, they can offer good advice on graphic design, and perhaps point you to artists within your budget.

Journalists are good friends. They can offer advice on promoting your products, they can tell you about trends in your part of the industry, they may be willing to write reviews, and they will listen in a most flattering manner to any news, gossip, or opinion you can offer in their areas of interest. Plus, they're fun to listen to: they're knowledgeable and good with words.

Webmasters are good friends. They can publish links to your site, advise you on site design, and occasionally offer you an interesting opportunity,perhaps an offer of advertising space in return for a few free copies of your product to their raffle winners.

But mostly, friends are good to have. Friends are better than money, better than fame. I've met some of my best friends through my shareware business - even though I've never seen some of them face to face. So make friends, lots of them! It's the best advice I can give.

That's it folks. I've given my take on the seven P's of shareware success. If you'd like to further explore this topic, check out my page of links to more information.


[Rick Holzgrafe has programmed for a number of well-known Silicon Valley firms when he's not crafting shareware products.]

Win One For the Grepper: Text Machine

by Matt Neuburg <>

They walk among us - the greppers. One might be sitting next to you at this very moment. In fact, you might be one yourself. Yes, you! You may never have grepped before; you may not even know what grepping is; yet chances are good that within you too, inchoate and amorphous, has stirred a secret need to grep.

Now that I have your attention, what on earth am I talking about? The fact that GREP originates as a Unix acronym for "global regular expression and print" need neither detain nor deter us. Let's just let "grep" mean a certain kind of powerful text search or search-and-replace without which life as we know it would be impossible, or at least meaningless. Lots of everyday text-manipulation tasks turn out to be a snap with grep.

In the past, I have routinely amazed friends (and astounded enemies) with feats of greppy legerdemain, solving seemingly baffling text processing problems. For instance, someone once approached me with a text file that he wanted to import into an existing database. The file consisted of thousands of tab-delimited lines:

John  [tab]  Doe    [tab]  473   [tab]  yes
Dick  [tab]  Smith  [tab]  2471  [tab]  no
Jane  [tab]  Brown  [tab]  587   [tab]  yes

The problem? The database expected the last name first, first name second, and could not easily switch them. The names had to be switched before the import took place. My friend was stunned as I opened his file with Nisus Writer, asked it to find all instances of:


and replace them with:


and calmly returned his file to him. This friend was a perfect example of someone who needed to grep, but didn't know anything about it. Why not?

Perhaps it's because the only way to grep is to own a word processor (or text processor) with a built-in grep facility, and then to learn to construct expressions which, unless you're a computer, are opaque to the point of illegibility. And as if that weren't bad enough, different programs implement grep in different ways (my Nisus Writer example above would fail in BBEdit). But PreFab Software is changing all that, with the release of Text Machine 1.0.

The Text Machine concept is that of a universal grep utility. You learn just one grep, Text Machine's; then you call upon Text Machine from another application. And Text Machine wants you to be able to grep successfully, so not only does it provide a powerful variety of grep, but also the commands that you give it are English-like, and much simpler to work with than grep's normal backslashy mess. Text Machine is scriptable - that's how other applications talk to it. So you can command it remotely, and you can share grepping capabilities with less technically inclined colleagues who also own Text Machine, just by giving them a script.


It's a wonderful idea, but the best is yet to come. Ideally, what you'd like is for Text Machine to put up a find-and-replace dialog, complete with pop-down menus so you barely have to learn any grep at all, and make changes directly in your application. And indeed, that seems to have been PreFab's original plan - Text Machine was to be an OpenDoc part. But then things were derailed by Apple's abandonment of OpenDoc, and the dialog interface has been postponed to version 1.1. I've seen an alpha of this, and had a blast doing dialog-based grep find-and-replace within Eudora. But right now, Text Machine lacks an interface; the only way to communicate with it is via scripting (typically, in AppleScript or Frontier's UserTalk). To many of us, that's a pleasure, not a problem; but if you don't feel up to it, perhaps you'll want to wait for 1.1.

Grep School -- Though I dearly love Nisus Writer's grep, I do admit that a certain portion of its satisfaction lies in the hocus-pocus factor. How can gibberish be so powerful? If I had used Text Machine when I helped my friend prepare his file for import, I might have lost my honorary warlock status, upon giving my friend an AppleScript script that does the same thing (when executed, for instance, in Apple's own Script Editor):

    tell application "Text Machine" to
      replace in alias "HD:yourFile" all
        "[(textstart or paragraphdelimiter)1]" &
        "[(column)2, tab]" &
        "[(column)3, tab]" with
        "[group1, group3, tab, group2, tab]"

This is still in code, to be sure, but a more English-like code, quite comprehensible once you know a few facts. The things in parentheses with numbers after them are groups. The term "column" means the whole text within a column, everything between one tab or return and the next. So, the first group is whatever precedes a paragraph; the second group is everything in a paragraph up to the first tab; and the third group is everything between the first tab and the second tab. We then just swap the second and third groups.

Here's another example of Text Machine's grep. Yesterday (truly!), an acquaintance wanted to extract the title of any HTML document (that is, what's between the <title> tags). This would work in most cases:

    tell application "Text Machine" to
      extract in alias "HD:my Web site:default.html" first
        "['<title>']" &
        "[(shortest oneOrMore char)1]" &
        transform with "[group1]"

Single-quotes denote stretches of literal text. The addition "transform with" performs a replacement on the text returned to us, not in the original; so we end up with group 1, which is precisely everything between the <title> tag and the next tag (which we may assume is </title>).

A more generalized solution requires us to supply alternatives for every letter, because Text Machine is case-sensitive:

    tell application "Text Machine" to
      extract in alias "HD:my Web site:default.html" first
        "['<']" &
        "[('t' or 'T'), ('i' or 'I'), ('t' or 'T')]" &
        "[('l' or 'L'), ('e' or 'E')]" &
        "['>']" &
        "[(shortest oneOrMore char)1" &
        transform with "[group1]"

Luckily, this is due to change with version 1.1, when a case-insensitive matching option is added.

Greptitude Test -- PreFab Software has shown tremendous ingenuity in implementing grep patterns as English-like phrases rather than the traditional Unix-style codes. This feature is unique - Nisus Writer has something similar, but it's clumsy to use and has limited features. PreFab Software has also given Text Machine a stunningly well thought out repertoire.

Consider the range of entities on which Text Machine can operate. It can do search-and-replace on a literal string handed to it as one parameter of a command. But, as we have seen, it can also search and make replacements in files on disk.

Even more useful, Text Machine can open a document and leave it open. It doesn't display the document, for it has no windows (except in a special debugging mode). But it maintains the text of a file in memory, so any changes made through search-and-replace are not written out to disk unless you explicitly save via one of your script's commands. Also, an "insertion point" is maintained so that successive calls to a verb such as "match next" will cycle through the text. What's more, Text Machine can create a new document in memory; it can maintain multiple documents in memory; it can assign text to a document in memory. Thus one can work with large texts without passing them repeatedly to Text Machine; this reduces overhead and increases speed.

Then there is the ample syntax of Text Machine's four verbs. "Replace" alters the original text, returning the altered result or the count of replacements. "Extract" searches and returns the found text, optionally performing a replace on it; "extract all" returns a list or a delimited string. "Locate" and "match" report such things as the contents, position and length of the found text or texts, the results of replacing, and the contents of any groups; such information helps other scriptable applications to operate on what Text Machine has found.

Here's a nice touch. A common need is to perform a series of "replace all" commands to alter a document in some wholesale manner. For this, Text Machine provides a notational shortcut: the texts to search for and the texts to replace them with are concatenated into two lists; you give one "replace all" command, and Text Machine loops through both lists. An included utility script shows how to implement a further convenience: you create the search-and-replace pairs as a tab-delimited text file, then have Text Machine parse it to generate the lists.

Grep Tide -- Text Machine's grep is almost a superset of grep implementations in such programs as BBEdit, Nisus Writer, and Microsoft Word. For example, it lets you specify longest or shortest match, which BBEdit and Word do not; it lets you specify a quantity or range of quantities - for example, 60 to 80 successive non-returns - which is very difficult in BBEdit and Nisus.

On the other hand, it lacks some traditional grep constructs. You can't speak of a letter range, such as a letter alphabetically between "a" and "g"; you must specify the range's contents explicitly, like this: "[<abcdefg>]". (The justification might be that such specification is no hardship, and anyhow the most commonly needed sets are predefined, like "[lowercaseLetter] or [controlChar]".) The inability to do a case-insensitive match (in version 1.0) is inconvenient. Further, there are almost no positional keywords: thus, in my first example, I had to speak of the beginning of a line (paragraph) as "[textstart or paragraphdelimiter]" and then work around the fact that the matched text includes an extra character.

Still, these shortcomings can be worked around, and so all in all Text Machine's grep is as powerful as they come, along with being easy to express using English-like phraseology.

For example, I have a HyperCard stack that archives messages from mailing lists. I receive the mailing lists in digest form (many messages in one email message); the stack parses the digest, storing each message's date field, subject field, sender field, and content on a separate card. Originally I had a devil of a time coding this in HyperTalk; but HyperCard speaks AppleScript, so Text Machine's grep is available to HyperCard, at which point the same task becomes trivial (and much faster) to code. Microsoft Word, too, can benefit from calling Text Machine: how often, writing a WordBasic macro, I have wished Word's grep were more like Nisus Writer's! Now with Text Machine on hand, it can be.

Grep extensions to AppleScript (such as Late Night Software's "Regular Expressions") and UserTalk (the "regex" UCMD) do exist. But Text Machine is much easier to use than these and more powerful. Also, Text Machine benefits from being a true application, which can modify text files or memorize large texts for extensive interaction.

Get a Grep -- If you own Nisus Writer, feel comfortable with its grep, and you don't need to do any scripting beyond Nisus macros, you probably don't need Text Machine. Also, Nisus Writer's grep has a special feature: it works on styled text. Thus, there are some tasks for which Nisus is uniquely suited, and Text Machine isn't trying to compete.

On the other hand, if you use or are willing to use AppleScript or UserTalk, and if you have any program which is scriptable or which can execute an OSA script (HyperCard, Microsoft Word, FileMaker Pro, and so on), you can incorporate Text Machine's grepping functionality and perhaps find an answer to your text-processing prayers.

Undoubtedly Text Machine's learning curve beats that of traditional greps, hands down. It would be wrong, though, to pretend there is no learning curve. In this version, Text Machine is not, I think, grep for the user-in-the-street. Let's face it: Text Machine is geeky. You have to be willing to script, and even though Text Machine's phraseology is easy to learn, experimentation and ingenuity may still be required to get the right results.

However, in my vocabulary, "geeky" is a term of praise. Perhaps you have to be weird in just the way that I am in order to appreciate it, but I think that Text Machine is, well, beautiful. It offers a single functionality, superbly realized, placed at the service of other applications. I've waited months for Text Machine to come to fruition, and now it has a firm place in my bag of tools. PreFab has a free 30-day demo to let you decide if you feel the same way.

Text Machine costs $75, until 12-Nov-97 when the price increases to $95. Those who purchase 1.0 get a free upgrade to version 1.1.

Non-profit, non-commercial publications and Web sites may reprint or link to articles if full credit is given. Others please contact us. We do not guarantee accuracy of articles. Caveat lector. Publication, product, and company names may be registered trademarks of their companies. TidBITS ISSN 1090-7017.

Previous Issue | Search TidBITS | TidBITS Home Page | Next Issue