You are currently browsing the monthly archive for October 2009.


I just released version 1.0-beta.11 of Metacello this morning. It’s been in the works for a couple of weeks as I’ve been applying Metacello to GLASS. You can see a detailed list of updates here.

With GLASS, I’ve been really beating on Metacello. At this point I feel that I’ve flushed out most of the bugs and you can look for a release candidate for Metacello, in a couple of weeks.

If you’re curious, install Metacello into your image and take the tutorial!

[1]Photo by Thibault Dangréaux (Creative Commons).


I just released version 1.0-beta.7 of Metacello this afternoon. Besides a handful of bugfixes, the big news for this release is that I’ve updated the Tutorial to cover project references.

I consider being able to specify a dependency upon a specific version of another project, one of the more important features of Metacello – right up there with managing platform-specific packages.

If you’re curious, install Metacello into your image and take the tutorial!

[1]Photo by sonicdeviant (Creative Commons).


I just recently found out that James Robertson had posted a video of my “Share Everything” talk from ESUG 2008 several months ago. I must have missed the announcement:)

An MP4 version of the talk was posted here a month ago.

And here’s a link to the slides.


Shortly after I announced the GemTools Client for Pharo, Gerhard Obermann jumped in and refactored a number of the GemTools menus using sub menus. Unfortunately, I got involved in a number of other tasks (including refining the Metacello API) before I could push his changes out. Now that Metacello is stabilized, it is time to revisit the installation and update procedures for the GemTools Client.

[Update 10/16/2009: fixed egregious errors in the installation instructions … 2 steps and the first step was plain wrong:) … thanks Gerhard]

[Update 11/04/2009] Please see the GemTools Client 1.0-beta.1 post for up-to-date instructions.


[Update 11/04/2009] Please see the GemTools Client 1.0-beta.1 post for up-to-date instructions.

If you haven’t already been using the GemTools 2.3.1 Preview for all platforms (which is based on Pharo), then you should download the preview GemTools client and follow the instructions for setting up your session to verify that you can connect to your stone. You’ll need the session information and the gci files from the Preview to get things running with the either Squeak or Pharo.

I’ve tested the installation procedure using Squeak3.10.2-Trunk-090912 and pharo1.0-10470-BETAdev09.10.2.

To load GemTools into a client image:

  1. Load the latest version of the GemTools-Configuration package  from GemTools-Configuraton-dkh.12 is currently the most recent version.
  2. Execute the following expression in a workspace:
    GemToolsConfiguration loadLatestVersion.
  3. Execute the following expression to open the GemTools launcher:
    OGLauncher open
  4. Copy the session information from your old GemTools Client to the new GemTools Client in your image. Use the Edit session menu item on the Session Menu in the launchers.
  5. Save the image.
  6. Copy the gci files (gciForWindows.dll,, and from in the one-click into the directory containing your image and changes files.
  7. Press the Login button on the GemTools Launcher and you should be in business.

Last December when I first introduced the GemTools Launcher, it took 6 steps to install the GemTools Client code:


In July I announced the GemTools Client for Pharo (based on version 0.9 of Metacello), it took 4 steps:


Today it takes only 2 steps:


The configuration class bootstraps Gofer and Metacello, then loads FFI and finally loads the OGLauncher application code. Danged close to a one-click install:)


To update the GemTools Client to a later version, you can follow the instructions for the Update…menu.

If you have any trouble join and send mail to the GLASS Beta Mailing List.

[1]Photo by Okinawa Soba (Creative Commons).


Since ESUG, Tudor Girba and I have collaborated to define a shiny new API on top of the Metacello engine. I released version 1.0-beta.3 of Metacello today, so you can take the new API for a spin.

The new API is completely different than the API described in my previous post: Metacello: Package Management for Monticello. The basic concepts and functionality hasn’t changed, but the details of the API have been changed significantly.

The best way to pick up the new API is to take the tutorial or read the Metacello API Reference on the Metacello Google code project.

The following sections are intended to give you a taste of the new Metacello API.

Metacello Configuration

To create a Metacello configuration for your project, you start by copying the class MetacelloConfigTemplate to your own class (i.e., SeasideConfiguration, MetacelloConfiguration, YourProjectNameConfiguration, etc.). MetacelloConfigTemplate has a handful of helper methods defined. MetacelloConfigTemplate is a subclass of Object, so a Metacello configuration can be loaded into an image without requiring Metacello itself to be pre-loaded. The #ensureMetacello method bootstraps Metacello into an image if Metacello has not already been loaded.

Once you’ve created your project configuration class, you can start defining your project metadata.

The metadata for a project has been split into two distinct components: the baseline and the version.The baseline defines project structure and the version defines package versions.

Baseline definition

The baseline defines the structure of your project in terms of the list of packages involved, the dependencies between packages and the groupings of packages. The


The baseline structure of your project should be stable relative to the version definition.

Similar to the old versionSpec, you can specify a collection of attributes for a baseline (see the API Reference page for a full list of attributes):

  • author. The author of a particular version
  • blessing. A version can be tagged with a blessing like #alpha, #beta, #release, #development, #baseline, or any other tag that is deemed useful. The blessing is used as a version filter. For example the latest version of a Metacello project is currently defined as the latest version whose blessing is not #development or #baseline.
  • description. Useful information about the version.
  • timestamp. The create date and time for a version.
  • packages. A list of Monticello package versions that make up the project.
  • repositories. A list of Monticello repositories from which the packages can be loaded.
  • groups. An alias for a collection of packages.
  • projects (not shown). A list of Metacello configurations for other projects that a package within the current project may require. For example, you would use a project to specify the dependency that a Pier project has upon the Seaside and Magritte projects.

A baseline is a full-fledged version, so it can be loaded. When the loader encounters a package for which a specific version has not specified, the loader will load the latest version of the package from the repository.

Version definition

The version definition associates an explicit list of package versions with a named version. Once a version is snapped off, it should never change so that at any point in time one can come back to a specific version with confidence. The version gets its structural information by imported another version (typically a baseline version).


The same list of attributes associated with the baseline definition can be specified for the version definition.

Metacello Tools

The OB-based Metacello tools have been slightly changed since I originally wrote about them.

[Update 11/03/2009] For the most up-to-date documentation visit the  Metacello Tools page.

The Spawn New Version command has been added, the Load Project Version command has been changed and finally the  Update Package Repositories command has been eliminated.

Select a Metacello configuration class and bring up the Class menu:


Save Packages

Finds the dirty Monticello packages that are members of the selected version of the Metacello project and saves them, prompting you for version name and commit comment. After the packages are saved you are prompted to Update Package Methods.

Spawn New Version

Genearates a new version method prompting for source version, version number and the new methods selector. The package specs for the new method reflect the currently loaded Monticello package versions, like the Update Package Methods command.

Update Package Methods

Automatically updates the package spec metadata for the selected version (i.e., modifies and compiles the methods with the #packages:attribute: pragma for the appropriate version to match the currently loaded Monticello package versions). After the methods are update you are prompted to Save Project.

Current Project Version

Displays the current version of the selected Metacello project. The version is calculated by comparing the currently loaded Monticello packages to those specified in the version spec. A leading ‘~’ means that the version is partially loaded (i.e., not all of the packages associated with the project have been loaded into the image).

[Update 11/03/2009] For the most up-to-date documentation visit the  Metacello Tools page.

Load Project Version

Prompts for the version of the selected Metacello project to be loaded, then loads all of the packages in the project using the ‘ALL’ pseudo group.

Save Project

Saves the selected Metacello project to the repository specified by the project package of the selected version. You are prompted for version name and commit comment.

Update Project

Loads the latest Monticello package version from the repository specified in the project package of the selected version of the Metacello project. Remember that you are simply loading the Metacello project metadata, so it doesn’t hurt to have the latest metadata loaded. Once the latest version is loaded, you are prompted to Load Project Version.

[Update 11/03/2009] For the most up-to-date documentation visit the  Metacello Tools page.

Loading Metacello

[Update 11/04/2009] For the most up-to-date download instructions visit the Metacello donwload page.

To use Metacello in GLASS, modifications to some base classes are needed, so you will still have to wait until I publish a GLASS package to bootstrap Metacello into GLASS.

To load Metacello into Squeak or Pharo:

  1. Load the latest version of the Metacello-Configuration-dkh.50ConfigurationOfMetacello package from
  2. Execute the following expression in a workspace:
    MetacelloConfigurationConfigurationOfMetacello loadLatestVersion.

The above expression loads all of Metacello into your image (including the OB-based tools). If you want to load a minimal configuration, exucute the following expression in a workspace:

MetacelloConfigurationConfigurationOfMetacello project latestVersion load.

To learn about other loading options, take the Tutorial:)


The tutorial covers all of the important Metacello features in some detail. To ensure that the tutorial is loaded, execute the following expression:

MetacelloConfigurationConfigurationOfMetacello project latestVersion load: 'Metacello-Tutorial'.

Then open two class browsers on the MetacelloTutorialConfig class. In the left hand browser view the methods in the ‘lessons’ category. In the right hand browser view the ‘–all–‘ category. Read the comments in lesson01 through lesson13.

Current Status

Version 1.0-beta.3 is the current version of Metacello, is feature complete and I am happy with the configuration API. I will port the new API to GLASS as part of my Seaside 3.0 porting work.

announced a SeasideConfiguration for Seaside 3.0 the other day that is based on the new Metacello API.

I have created a  Metacello Google code project for bug tracking and distributing up-to-date information about Metacello. If you run into problems with the tutorial or using Metacello, please submit a bug.

[1]Photo by ahhyeah (Creative Commons).

Ken Treis gives some love to lighttpd in his post: My Favorite GLASS Front-End Server: lighttpd:

lighttpd maintains a running “load” for each FastCGI backend server. When an incoming request hits, lighttpd chooses from among the servers with the lightest load. This is exactly what I was looking for.

Photo by TW Collins (Creative Commons).

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 446 other subscribers


RSS GLASS updates

  • An error has occurred; the feed is probably down. Try again later.

RSS Metacello Updates

  • An error has occurred; the feed is probably down. Try again later.

RSS Twitterings

  • An error has occurred; the feed is probably down. Try again later.
October 2009