TweetFollow Us on Twitter

March 95 - MPW TIPS AND TRICKS

MPW TIPS AND TRICKS

Launching MPW Faster Than a Speeding Turtle

TIM MARONEY

One myth about MPW is that it's slow, but that's an unfair description. Personally, I think "glacial" would be a more appropriate word, or perhaps "executionally challenged." However, it's possible to speed it up in a variety of ways, such as simulating the 68020 instruction set on a fully loaded Cray. On a tighter budget, you can improve MPW's launch time just by making some minor changes to your configuration.

Perhaps some of you are asking, "Who cares about launch time? Compile speed is the important thing! God built the whole world in less time than it takes me to compile my project with PPCC, and he only had a slide rule!" It's a valid objection, and I'm glad you brought it up, but many people launch MPW more often than they compile. Quite a few projects use MPW as a development workhorse because of its scripting and source control capabilities, but compile and link using language systems that aren't laboring under the delusion that they're getting paid by the hour.

I didn't invent this technique, but I've tuned it up and eliminated some trouble spots. The original was distributed on a Developer CD so old that I can't find it now. *

STATES' RITES
The trick is simple and capitalizes on an important fact about MPW tools. Because of the innovative approach MPW takes to the traditional TTY interface, it's easy to execute the output of tools by selecting the output with the mouse and pressing the Enter key. Tool writers are strongly encouraged to write executable commands as their output. Since some of the tool writers didn't get the message, there are umpty-million exceptions, but when the tool does the right thing it's very useful.

There's an even better way to select the output, which is to press Command-Z twice after running the tool, but don't say I told you so. On the Macintosh, Undo followed by Redo is supposed to return you to your original state. *

The nice people responsible for the Set, Export, Alias, AddMenu, SetKey, CheckOutDir, and MountProject commands followed MPW policy and made them reversible: giving these commands without parameters dumps a list of commands that you can execute later to return to your current state.

As it happens, in a standard MPW configuration there's not much to your state beyond the output of these seven commands. You're in a current directory and some file windows might be open, and that's about all that matters. You can save the directory and the open files with four lines of script.

You can probably see where all this is leading. MPW lets you install scripts that get run when it quits and when it starts up. Is it really faster to save your state when you quit and restore it on your next launch than it is to iterate over your startup files? The answer is an emphatic yes, at least with the usual baroque MPW configuration. You'll see much less improvement if you're already using a lightweight MPW without many startup files.

Now if you're clever, you've probably written all kinds of things that need to get loaded each time you start up. I can understand that -- I often feel like I need to get loaded every time I launch the MPW Shell myself! Maybe you've written a tool that lets you add hierarchical menus to the MPW Shell so that you can keep your wrist muscles toned, or a floating utility window with buttons for your frequently used commands. These clever hacks are going to hurt your startup time, but if you must do something every time you start up the Shell, you can move these commands into separate files that still get executed on each launch.

THAT DOES IT - I QUIT!
Saving the state is the easiest part of the trick. Just put a file named Quit in your MPW folder. You can overwrite the default Quit script if you have one, but if you need to keep it, you can name this script Quit*SaveState instead; the default Quit script will run it, as well as any other scripts named Quit*Whatever. The script should read like this, more or less:

# Quit and save state for fast startup

# We need to set Exit to 0 so that errors won't
# cause Quit or Startup to bomb, but we also want
# to maintain the user's setting of the Exit
# variable. Save and restore it.
Set SaveExit {Exit}
Export SaveExit
Set Exit 0

# State saving is turned off by creating a file
# named DontSaveState in the MPW folder.
If "`Exists "{ShellDirectory}"DontSaveState`"
    Delete -i "{ShellDirectory}"DontSaveState ð
        "{ShellDirectory}"MPW.SuspendState ð
        ≥ Dev:Null
        
Else

    # Write the state to a temporary file.
    Begin

        # Tell the restoration not to bomb.
        Echo Set Exit 0

        # Save the custom menus.
        AddMenu

        # Save the current directory.
        Echo Directory "`Directory`"
        
        # Save the open windows.
        Echo For window In "`Windows`"
        Echo '  Open "{window}" || Set Status 0'
        Echo 'End ≥ Dev:Null'
    
        # Save the aliases.
        Alias

        # Save the variables.
        Set

        # Save the exports. This runs much faster 
        # with all the exports on one line, so we
        # use -s to get all the names at once.
        Echo Export "`Export -s`"
                
        # Save the key assignments.
        SetKey
        # Save lines that will execute the UserMount
        # script if any. The script doesn't have to
        # exist, and it's harmless to throw it away
        # between saving and restoring state.
        If "`Exists "{ShellDirectory}"UserMount`"
            Echo Execute ð
                "{ShellDirectory}"UserMount ð
                "≥ Dev:Null"
        End

        # Save the mounted Projector databases and
        # their checkout directories.
        MountProject
        CheckOutDir -r

        # After the rest of the state is restored
        # with Exit set to 0 to prevent bombing,
        # save lines to restore the user's setting
        # of Exit.
        Echo Set Exit '{SaveExit}'

    End > "{ShellDirectory}"MPW.SuspendState ð
         ≥ Dev:Null

End

# Sometimes anomalies prevent the Worksheet from
# auto-saving at Quit time; make sure it does.
Save "{Worksheet}"

Every time you quit the MPW Shell normally, this Quit script will save your complete state to a file named MPW.SuspendState in your MPW folder. You probablynoticed that this can be turned off by creating a file named DontSaveState. You don't have to do this by hand; if you'll just wait a gosh- darn minute, I'll give you a menu command for it.

Unfortunately, the Choose command, which lets you mount a file server, isn't reversible; that is, it doesn't put out a list of Choose commands that you could run later to remount your servers. Using this Quit script, though, you can create a file named UserMount in your MPW folder that will be executed every time you launch, before any attempt is made to remount your saved projects. This file should contain Choose commands that mount the servers on which your Projector databases are located. If you're not using Projector or other remote services, there's no reason to create this file. Here's an example, assuming I have a Projector database on the volume "Rendezvous" on the server "Development" in the zone "Engineering Heck":

if !"`Exists Rendezvous:`"
    choose -u 'Tim Maroney' -askpw ð
        "Engineering Heck:Development:Rendezvous"
end
The Quit script isn't especially tricky, but if you're new to MPW scripting, you may be interested to note a few features.

First, observe the use of the back quote ( `), that otherwise useless key at the top left of your keyboard. MPW uses it the same way ascsh (pronounced "sea-shell"), the seminal UNIX shell from Berkeley: a command inside back quotes is executed and its output is inserted into the command line containing it. In this case, the Directory, Windows, and Export commands are backquoted, capturing their output so that it can be combined with other text using the Echo command. The Exists command is backquoted so that its output can be treated as a conditional expression.

Another handy fact is that compound statements, like Begin...End blocks, conditionals, and loops, are treated as single commands that can be redirected in their entirety. This saves a lot of needless repetition: you don't have to redirect each statement inside the block. Note the use of the error redirection operator ">=", typed as Option-period. Like UNIX, MPW Shell has separate output and error channels that can be redirected independently. In this Quit script, errors are redirected to yet another UNIXism, the faux file "Dev:Null," which is another way of saying send them to oblivion.

You can find out more about the various redirection options in MPW by starting up the MPW Shell and giving the command Help Characters. For clarity, the help text refers to the error channel as the "diagnostic file specification." *

One very important feature of MPW is its set of built-in variables. You can set up any variables you want by using the Set command, and expand them by putting them in curly brackets; there are also quite a few built-in variables that tell you things about the state of the MPW Shell and let you modify its behavior. The ShellDirectory variable is used extensively in the script; when expanded ("{ShellDirectory}") it yields the path name of the folder containing the MPW Shell, where many useful things are stored. The old name for this variable is "MPW," which you can still use as a synonym.

Another built-in variable is Exit. If Exit isn't 0, script commands that fail will bring the execution of their script to a screeching halt; if it is 0, subsequent script commands will go on regardless of earlier failures, much like some people's conversational gambits at trade-show parties. These fast-launch scripts set Exit to 0, because if there's a failure at some point, the rest of the state should still be saved and restored. In normal MPW setups, Exit is set to 1 most of the time, but since idiosyncratic MPW configurations set it to 0 as the default, some special work is needed to save and restore the user's Exit setting. This is done by saving Exit in a custom variable named SaveExit, which records Exit at the beginning of the Quit script and restores it at the conclusion of the MPW.SuspendState script.

HAPPINESS IS A WARM BOOT
The startup sequence is slightly more complicated. After all, you've got to iterate over all those startup files sometime. The approach I'm using distinguishes between a cold boot, which does a pretty normal startup, and a warm boot, which starts up quickly from MPW.SuspendState.

"Cold boot" and "warm boot" are terms that old-time programmers will remember from the manual kick-starters on the original Model T computers.*

There's a menu item you can use to force the next launch to be a cold boot, or you can throw away the MPW.SuspendState file before launching for the same effect. The cold boot mechanism exists mostly for the sake of paranoia, so programmers tend to use it frequently. Generally speaking, you don't need to do a cold boot after you change your startup files; you can just select the change and press Enter. The modifications will get stored in the saved state the next time you quit.

MPW comes with a file named Startup that gets executed each time the Shell is launched. Rename Startup to ColdStartup and put the following in a new Startup file:

# Restore the state if possible; else cold boot.
# ∑∑ means redirect to end of file.
If "`Exists "{ShellDirectory}MPW.SuspendState"`"
    Execute "{ShellDirectory}MPW.SuspendState"
       ∑∑ "{Worksheet}"
    Set ColdBoot 0
Else
    Beep 2g,3 2f,3 2a,3     # Hum a merry tune
    Begin
        Echo "MPW.SuspendState was not found."
        Echo "Here's your Cold Boot..."
    End ∑∑ "{Worksheet}"
    Execute "{ShellDirectory}ColdStartup"
    Set ColdBoot 1
End

Export ColdBoot

# Do anything that needs doing each launch
# (UserStartup*X files in EachBoot folder).
If "`Exists -d "{ShellDirectory}EachBoot"`"
    For fileName in `(Files ð
                "{ShellDirectory}"EachBoot:UserStartup*≈ ð
                || Set Status 0) >= Dev:Null`
        Execute "{fileName}"
    End
    Unset fileName
End
Unset ColdBoot

The default Startup script runs all the files whose names start with "UserStartup*" in the MPW folder: UserStartup*Utilities, UserStartup*EraseBootBlocks, UserStartup*AlterPersonnelRecords, and so forth. You just moved the default Startup script to ColdStartup, so these files will get reexecuted whenever you do a cold boot. Also, in case you need to do something every time you launch regardless of whether it's a cold or a warm boot, you can put it in a UserStartup*Whatever file in a folder named EachBoot in the MPW folder.

Sometimes you need to do something different at startup depending on whether it's a cold or a warm boot. The Startup script above sets a variable named ColdBoot so that you can distinguish between cold and warm startups. In one of your startup scripts, you can use the ColdBoot variable in a conditional construct. For instance, suppose you're part of a large project with a centrally maintained MPW configuration that uses a custom tool named HierMenu to create a hierarchical menu. HierMenu is called from the central UserStartup*Project script at cold boot, but because it's not a standard part of MPW, it also needs to get called from an EachBoot script at warm boot -- the state isn't automatically saved by the Quit script. You don't want to edit the shared file UserStartup*Project because you'll have to laboriously reapply your change every time the build engineers improve the central copy, but you can't run HierMenu more than once without bringing the system to its knees. The solution is to create a UserStartup*DoHierMenu file in your EachBoot folder which only runs HierMenu in the case of a warm boot, like so:

If ¬ "{ColdBoot}"
HierMenu HierItem MainMenu 'Title for Item'
End

I promised you a menu command to do a cold boot. Here it is (in the immortal words of Heidi Fleiss, don't say I never gave you anything). Put this in a file named UserStartup*ColdBootItem in your MPW folder:

AddMenu File '(-' '' # menu separator
AddMenu File "Quit with Cold Boot..." ð
    'confirm "Quit with cold boot?" && ð (Set Exit 0; ð
    Echo > "{ShellDirectory}"DontSaveState; ð
    Quit)'

MEASURING PERFORMANCE WISELY
If you measure performance by elapsed time, MPW can be slow. However, real-world performance has more to do with usefulness than with theoretical throughput. I don't use my computer to run Dhrystone benchmarks: I use it to accomplish tasks. MPW gives me the power to accomplish the complex and bizarre tasks of programming automatically.

Real-world friendliness is always relative to a particular set of users and a particular set of tasks. The very things that make UNIX and MPW unfriendly to novice users make them friendly to programmers, who have the unusual skill of memorizing arcane commands and connecting them in useful ways. Don't get me wrong; MPW is not the final frontier of development environments. A true next-generation software authoring system would make command shells and project files seem equally ridiculous, but command-line interfaces for programmers are a sound approach, at least for now. And with a little tuning, they can begreatly improved. In future columns I'll be sharing more tips on making the worksheet a pleasant place to live.


TIM MARONEY is a leather-wearing vegetarian from Berkeley, California. He's been published in MacTutor and Gnosis magazines and in the San Francisco Chronicle. Tim is currently working as a contractor at Apple on the next release of the Macintosh operating system. When he's not standing on his head, he's usually peering at eldritch tomes such as the R'lyeh Text and the SOM User's Guide. No, that's not what we expected him to look like either. *

Thanks to Dave Evans, Greg Robbins, and Jeroen Schalk for reviewing this column. Thanks also to beta testers Arnaud Gourdol, Jon Kalb, and Ron Reynolds.*

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Microsoft OneNote 15.29 - Free digital n...
OneNote is your very own digital notebook. With OneNote, you can capture that flash of genius, that moment of inspiration, or that list of errands that's too important to forget. Whether you're at... Read more
Spotify 1.0.44.100. - Stream music, crea...
Spotify is a streaming music service that gives you on-demand access to millions of songs. Whether you like driving rock, silky R&B, or grandiose classical music, Spotify's massive catalogue puts... Read more
SpamSieve 2.9.27 - Robust spam filter fo...
SpamSieve is a robust spam filter for major email clients that uses powerful Bayesian spam filtering. SpamSieve understands what your spam looks like in order to block it all, but also learns what... Read more
VueScan 9.5.62 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Fantastical 2.3.2 - Create calendar even...
Fantastical 2 is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event... Read more
PCalc 4.4.4 - Full-featured scientific c...
PCalc is a full-featured, scriptable scientific calculator with support for hexadecimal, octal, and binary calculations, as well as an RPN mode, programmable functions, and an extensive set of unit... Read more
Alfred 3.2.1 - Quick launcher for apps a...
Alfred is an award-winning productivity application for OS X. Alfred saves you time when you search for files online or on your Mac. Be more productive with hotkeys, keywords, and file actions at... Read more
OmniPlan 3.6 - Robust project management...
With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more
Backblaze 4.2.0.990 - Online backup serv...
Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more
AppDelete 4.3.1 - $7.99
AppDelete is an uninstaller that will remove not only applications but also widgets, preference panes, plugins, and screensavers along with their associated files. Without AppDelete these associated... Read more

Latest Forum Discussions

See All

Galaxy on Fire 3 and four other fantasti...
Galaxy on Fire 3 - Manticore brings the series back for another round of daring space battles. It's familiar territory for folks who are familiar with the franchise. If you've beaten the game and are looking to broaden your horizons, might we... | Read more »
The best apps for your holiday gift exch...
What's that, you say? You still haven't started your holiday shopping? Don't beat yourself up over it -- a lot of people have been putting it off, too. It's become easier and easier to procrastinate gift shopping thanks to a number of apps that... | Read more »
Toca Hair Salon 3 (Education)
Toca Hair Salon 3 1.0 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0 (iTunes) Description: | Read more »
Winter comes to Darkwood as Seekers Note...
MyTona, based in the chilly Siberian city of Yakutsk, has brought a little festive fun to its hidden object game Seekers Notes: Hidden Mystery. The Christmas update introduces some new inhabitants to players, and with them a chance to win plenty of... | Read more »
Bully: Anniversary Edition (Games)
Bully: Anniversary Edition 1.03.1 Device: iOS Universal Category: Games Price: $6.99, Version: 1.03.1 (iTunes) Description: *** PLEASE NOTE: This game is officially supported on the following devices: iPhone 5 and newer, iPod Touch... | Read more »
PINE GROVE (Games)
PINE GROVE 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: A pine grove where there are no footsteps of people due to continuous missing cases. The case is still unsolved and nothing has... | Read more »
Niantic teases new Pokémon announcement...
After rumors started swirling yesterday, it turns out there is an official Pokémon GO update on its way. We’ll find out what’s in store for us and our growing Pokémon collections tomorrow during the Starbucks event, but Niantic will be revealing... | Read more »
3 reasons why Nicki Minaj: The Empire is...
Nicki Minaj is as business-savvy as she is musically talented and she’s proved that by launching her own game. Designed by Glu, purveyors of other fine celebrity games like cult favorite Kim Kardashian: Hollywood, Nicki Minaj: The Empire launched... | Read more »
Clash of Clans is getting its own animat...
Riding on its unending wave of fame and success, Clash of Clans is getting an animated web series based on its Clash-A-Rama animated shorts.As opposed to the current shorts' 60 second run time, the new and improved Clash-A-Rama will be comprised of... | Read more »
Leaks hint at Pokémon GO and Starbucks C...
Leaked images from a hub for Starbucks employees suggests that a big Pokémon GO event with the coffee giant could begin this very week. The images appeared on Reddit and hint at some exciting new things to come for Niantic's smash hit game. | Read more »

Price Scanner via MacPrices.net

New 2016 13-inch Touch Bar MacBook Pros in st...
B&H Photo has stock of new 2016 Apple 13″ Touch Bar MacBook Pro models, each including free shipping plus NY sales tax only: - 13″ 2.9GHz/512GB Touch Bar MacBook Pro Space Gray: $1999 - 13″ 2.... Read more
New 2016 15″ Touch Bar MacBook Pros in stock...
B&H Photo has new 2016 Apple 15″ Touch Bar MacBook Pro models in stock today including free shipping plus NY sales tax only: - 15″ 2.7GHz Touch Bar MacBook Pro Space Gray: $2799 - 15″ 2.7GHz... Read more
DietSensor App Targeting Diabetes and Obesity...
DietSensor, Inc., a developer of smart food and nutrition applications designed to fight diabetes and obesity and help improve overall fitness, has announced the launch of its DietSensor app for... Read more
Holiday 2016 13-inch 2.0GHz MacBook Pro sales...
B&H has the non-Touch Bar 13″ MacBook Pros in stock today for $50-$100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.0GHz MacBook Pro Space Gray (MLL42LL/A): $1449 $... Read more
Holiday sale: Apple TVs for $51-$40 off MSRP,...
Best Buy has dropped their price on the 64GB Apple TV to $159.99 including free shipping. That’s $40 off MSRP. 32GB Apple TVs are on sale right now for $98 on Sams Club’s online store. That’s $51 off... Read more
12-inch Retina MacBooks, Apple refurbished, n...
Apple has restocked a full line of Certified Refurbished 2016 12″ Retina MacBooks, now available for $200-$260 off MSRP. Refurbished 2015 models are available starting at $929. Apple will include a... Read more
Holiday sale: 12-inch Retina MacBook for $100...
B&H has 12″ Retina MacBooks on sale for $100 off MSRP as part of their Holiday sale. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.1GHz Space Gray Retina MacBook: $1199 $100... Read more
Apple refurbished 13-inch MacBook Airs availa...
Apple has Certified Refurbished 13″ MacBook Airs available starting at $849. An Apple one-year warranty is included with each MacBook, and shipping is free: - 13″ 1.6GHz/8GB/128GB MacBook Air: $849 $... Read more
Apple refurbished iMacs available for up to $...
Apple has Certified Refurbished 2015 21″ & 27″ iMacs available for up to $350 off MSRP. Apple’s one-year warranty is standard, and shipping is free. The following models are available: - 21″ 3.... Read more
Apple’s Education discount saves up to $300 o...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free: -... Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions- Trumbul...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions- Philade...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions- San Ant...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Products Tester Needed - Apple (Unit...
…we therefore look forward to put out products to quality test for durability. Apple leads the digital music revolution with its iPods and iTunes online store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.