Just a Theory

Black lives matter

david.wheeler.net Content Migration

I’ve completed the migration of all of the content from my old site, david.wheeler.net. All requests to that domain will get a permanent redirect to this site. Where possible, I tried to make the old URLs redirect to the new URLs. So if you try to connect to david.wheeler.net/osx.html, you should be automatically redirected to www.justatheory.com/computers/os/macosx/my_adventures.html. The same goes for the following documents:

If you happen to notice that I missed anything, comment on this blog entry to let me know.

Looking for the comments? Try the old layout.

NTPD Configuration on FreeBSD and Red Hat Linux

Well, I got no responses to my [request for assistance] setting up NTPD on FreeBSD, but today I must’ve just been Googling better, because I found the resources I needed.

The most important site I found was the [NTP configuration] page from Computer Facilities Management at the University of Washington. It was valuable because it provided some simple ntpd.conf file samples that set up ntpd to run only as a client. So no I’m confident that no one will try to connect to my servers and cause any mischief. The CFM NTP page also helpfully pointed out that I could easily enable ntpd on my Red Hat box by typing chkconfig ntpd on.

Another interesting site I found is [www.pool.ntp.org]. The cool thing about using pool.ntp.org as the time server to synchronize my servers to is that it distributes the load to lots of time servers. So I set up my ntpd.conf files to point first to pool.ntp.org, and then to two geographically close servers.

And finally, [this DynDNS page] gave me the instruction I needed to get ntpd running on FreeBSD. All I had to do was add xntpd_enable="YES" to /etc/rc.conf. I restarted my box, and now I’m in business!

[request for assistance]: {{ ref “/post/past/tools/os/ntptd-help-requested” %}} “I ask for help with NTPD” [NTP configuration]: http://cfm.gs.washington.edu/network/ntp/ntp/ “NTP Configuration” [www.pool.ntp.org]: http://www.pool.ntp.org/ “pool.ntp.org” [this DynDNS page]: http://freeunix.dyndns.org:8088/site2/howto/NTP3.shtml “Using NTP”

Looking for the comments? Try the old layout.

Bricolage 2.0 UML Diagram

I’ve just finished updating the UML diagram for the design of Bricolage 2.0. It’s not completely comprehensive, mainly because the lines would start criss-crossing all over the place and no one would never be able to make any sense of it, including me! Notably, I’ve left out the links to Bricolage::Biz::Site, Bricolage::Biz::Class, Bricolage::Party::Person::User, and Bricolage::Party::Person::Contributor. But it’s pretty clear how they hook up if you study the classes, since they contain the appropriate *_guid attributes. And that’s all those of us who will be writing Bricolage will need.

I’m happy to get this largely done. The technical specification is also largely complete. I’m going to fill in a bit on Bricolage::Client::CLI right now, but otherwise, it will probably be stable for a while. It will change of course, because it’s not completely comprehensive, and there will be things that I haven’t thought about as I’m starting to code. But that’s probably a ways off, as there is quite a lot to get going with right now.

I’m not sure if I’ll update the functional specification anytime soon. It’s really out of date, but would take up quite a lot of time to rewrite, and for what benefit I’m not really sure at this point. The technical spec contains most of the information I need. Perhaps it will be time to update the functional spec once the API is nearing completeness and I start really working on the UI.

In the meantime, it’s time to get back to hacking!

Looking for the comments? Try the old layout.

How do I Configure NTPD?

So I need simple instructions to get NTPD running on FreeBSD. It should function solely as a client, and not accept connections from other servers. I could also use the corresponding instructions for Linux (and don’t say “RPM”!). I’ve found an awful lot of information online about NTPD, but the simple instructions for setting up a secure NTPD to start when the system starts up are sorely lacking. Part of the problem with regards to BSD may be my not yet fully understanding how FreeBSD startup stuff is supposed to work, but I also can’t find simple instructions for how to configure ntptd to operate only as a client.

Links and instructions gladly accepted.

Looking for the comments? Try the old layout.

bricolage.cc Has a New Server

The Bricolage project has a new server! Thanks to a generous donation from NetStumbler.com, we have a shiny new hosted FreeBSD server. I’ve started building it, and have migrated the Bricolage Web site over today. By tomorrow, DNS records should be updated, and it’ll be rarin’ to go!

While I was at it, I rolled out the new Bricolage API documentation browser. There are now browser available for all of the major stable releases of Bricolage, listed on the old documentation page. The API browser for the current stable release will always be available here. Meanwhile, the documentation will also be generated from the Subversion trunk every morning; you can find those docs here.

We’ll also be able to keep better track of the kind of traffic the site gets thanks to the new stats site, which will also be updated daily.


Looking for the comments? Try the old layout.

Perl.org Subversion Authentication Woes

It looks like the Perl.org authentication system that handles authentication for svn.bricolage.cc doesn’t properly cache an authentication token. Robert discovered this when a very large merge I was working on from the rev_1_8 branch of Bricolage to trunk was hanging and then timing out on me. The problem was that it was disconnecting from the MySQL server. Odd. At any rate, Robert switched over to an auth system that doesn’t use MySQL so that I could do the merge and then the commit. This morning, he restored the original auth system. I shouldn’t often have to do such a big merge or commit in Bricolage, so hopefully it won’t come up again, but it sure was annoying there for a while.

So for my fellow Bricolage developers who thought that the auth system was down: Sorry, it’s back now. And the trunk is fully updated with all of the changes to rev_1_8, which means that new development in the trunk can begin again in earnest.

Looking for the comments? Try the old layout.

New Blog

This space intentionally left blank.

Originally published on use Perl;

Blosxom Rewrite Rules

I finally got my mod_rewrite rules working for Blosxom, so now it finally looks like I have a real site! The problem was that %{REQUEST_FILE} wasn’t actually the full file name on the file system, but the request URI! I have no idea why, but once I figured out this problem I was able get ‘round it by using %{DOCUMENT_ROOT}%{REQUEST_URI}. So now my configuration looks like this:

<VirtualHost *>
  DocumentRoot /usr/local/www/doc_roots/justatheory
  ServerAdmin david@justatheory.com
  ServerName justatheory.com
  ServerAlias www.justatheory.com
  CustomLog /usr/local/www/logs/access_log.justatheory combined
  <Directory /usr/local/www/doc_roots/justatheory>
    AddHandler cgi-script .cgi
    Options +ExecCGI
  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
  RewriteRule ^/(.*)$ /blosxom.cgi/$1 [L,QSA]

And all is well. Now, if only I could get the meta plugin working properly…

Looking for the comments? Try the old layout.

How to Extend Bricolage 2.0

Going through the latest version of the Bricolage 2.0 technical specification, I can see at least six ways that developers will easily be able to extend Bricolage:

Write a new task by subclassing Bricolage::Biz::Task
A task can be designed to do just about anything to a single Bricolage object. Hell, you’d be able to look up other objects, too, so anything’s possible. Tasks are run by scheduled jobs, event-triggered actions, or by distribution jobs.
Create a new data type by subclassing Bricolage::Biz::Value and Bricolage::Biz::Type::Value
We’ll support quite a few different value types to start with, but we couldn’t anticipate everything, so this’ll be your chance!
Create a new UI widget by subclassing Bricolage::Widget and Bricolage::Biz::Type::Widget
Maybe your new value requires its own special widget. Or maybe you don’t like the way the existing widgets handle other types of values. So write your own!
Write a new distribution mover by subclassing Bricolage::Biz::Dist::Mover
We’ll start out with file system copy, SFTP, SFTP, and WebDAV distribution movers just as we have in Bricolage 1.8, but there’s always room for more!
Write a new authentication plugin by subclassing Bricolage::Util::Auth
The built-in and LDAP-based authentication systems aren’t doing it for you? You want to authenticate against a different database? Make it so!
Write a new storage back-end by subclassing Bricolage::Store
We’ll have a PostgreSQL back-end from the start, and perhaps SQLite and/or MySQL. But here’s your chance to get Bricolage running on FileMaker Pro just as you’ve always secretly desired!

So have fun with it! When it gets here. Want to help get get here? Subscribe to Bricolage-Devel and chip in!

Looking for the comments? Try the old layout.

Bricolage Tasks, Jobs, Actions, and Alerts

I’ve been working on the design for what are called distribution jobs and alerts in Bricolage 1.x. There were some good ideas there. Distribution jobs enable users to set up a list of tasks to execute against the files being distributed, such as validating them against a DTD or distributing them via email. It also allowed developers to create fairly simple plugin modules that could be added as new jobs. Alerts are great ways of letting users know that some even has happened, and their rules-based evaluation of event attributes is a powerful way of configuring alerts to be sent only for certain events logged for certain objects.

The problem is that they’re specific solutions to general problems. Distribution job s are an example of scheduling arbitrary tasks to be executed, while alerts are an example of triggering the execution of arbitrary tasks upon the logging of an event. So what I’ve been working on is trying to generalize these ideas into a simpler yet more powerful and flexible architecture. What I’ve come with is this:


Very simply, a task is an object of a class designed to perform a simple, um task. Examples include publishing a document, expiring a document, sending an alert, or validating a file against a DTD. An abstract base class, Bricolage::Biz::Task, will establish the the interface for tasks, although its subclasses may add their own attributes (such as the subject and message of an alert). Each will implement an execute() method that will simply carry out the task on the object passed to it. Some task classes may operate on only one type of object (such as Task::Publish), while others may operate on many or even all Bricolage business classes (such as Task::SendAlert). There is no connection between task classes and events or jobs, except that the object that called the task object’s execute() method will be passed to execute() as a second argument.


An action is an event-triggered series of tasks. New action types can be created that have rules set to be evaluated against the event, just as is currently the case for alert types in Bricolage 1.x. The difference is that rather than being limited to sending alerts, actions types will be associated with one or more task objects, and each of those tasks will be executed in sequence when an action of that type is triggered. This will enable users to, for example, configure an action to republish an index document whenever a story document is published.


A job is a scheduled series of tasks. Users will be able to create new jobs for any single object in Bricolage, associate any number of task objects, and then schedule the job to be run at some specific date and time in the future. This approach will enable users to, for example, schedule a job to send an alert about a given document one year in the future, as a reminder to update the document.


Destinations will be similar to what’s currently in Bricolage 1.x. However, rather than having “job” classes specific to distribution, they’ll be able to specify a list of any tasks that are designed to be executed against an output file. This keeps the interface for tasks identical across all three uses.


Alerts are no longer closely tied to events, since they can sent as part of a scheduled job or as part of a distribution to a destination in addition to when an event is logged. Rather, they will only be created by Bricolage::Biz::Task::SendAlert. So a Bricolage business object can have any number of associated alerts, just as it can have any number of associated events.


The upshot of this redesign, which took me several days of thinking to tease out to be general enough to satisfy me, is that more users will have more of what they need from Bricolage, and developers can more easily add new functionality that’s immediately available to event actions, scheduled jobs, and distribution destinations.

Looking for the comments? Try the old layout.

Internationalizing Numbers in Address Book

Anyone got a recipe to go through all of the phone numbers in the Panther Address Book and add “+1 " to any numbers that don’t have a + International code? Mac::Carbon, AppleScript, XML::Parser, or any approach would be welcome.



Originally published on use Perl;

In Search of a Server

The Bricolage community is currently working on the design for a new Bricolage site. The site will of course be managed in Bricolage. But we need a server!

If you or someone you know would be willing to donate and host a server for us, with the ability to install Bricolage and manage the Bricolage site, please contact me forthwith!


Originally published on use Perl;

Bricolage 1.8.0 Arrives!

It is with great pleasure that the Bricolage development team announces the release of Bricolage 1.8.0. The culmination of over 15 months in development, with contributions from over 20 independent developers, and new features sponsored by numerous organizations world-wide, version 1.8.0 represents a significant new pinnacle for the much-lauded open-source content management and publishing system. This release offers more new features, improvements, and performance gains than any previous release. There are so many, in fact (over 120), that they can’t effectively be included in this announcement. Here are some of the highlights:

  • Support for managing multiple sites from a single Bricolage installation. Each site has its own categories, templates, document types, and workflows, and collaboration across sites is supported by document aliasing and shared workflow desks.

  • Significant performance boosts to search queries and URI uniqueness validation.

  • Email document distribution, which can be used to email the files generated by an output channel to one or more email addresses.

  • A greatly simplified and flexible templating and element API.

  • Template sandboxes to enable template development without interfering with production templates.

  • Support for Template Toolkit templates (http://www.template-toolkit.org).

  • New “Publish” and “Recall” permissions, for improved workflow management.

  • Per-user preferences.

  • Document formatting at publish time, rather than publish scheduling time.

  • New German and Mandarin localizations.

  • Image thumbnails and icons for all media documents.

  • Support for HTMLArea WYSIWYG editing with HTMLArea. See http://www.interactivetools.com/products/htmlarea/.

For a complete list of the changes, see the release notes and changes list on SourceForge. For the complete history of ongoing changes in Bricolage, see Bric::Changes.

Download Bricolage 1.8.0 now from the Kineticode download page or from the SourceForge download page.


Bricolage is a full-featured, enterprise-class content management and publishing system. It offers a browser-based interface for ease-of use, a full-fledged templating system with complete HTML::Mason, HTML::Template, and Template Toolkit support for flexibility, and many other features. It operates in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its repository. A comprehensive, actively-developed open source CMS, Bricolage was hailed as “Most Impressive” in 2002 by eWeek.


–The Bricolage Team

Originally published on use Perl;

Bricolage 1.7.5 “Ashland” (1.8.0 RC2)

I’m thrilled to announce the release of Bricolage-Devel 1.7.5 “Ashland”, the second release candidate for Bricolage 1.8.0. This version of the open-source content management system addresses all of the bugs discovered since the release of the first release candidate, 1.7.4, and adds several new features and numerous improvements. The changes since 1.7.4 include:

  • New Features

    • Added bric_template_dump to contrib. This script uses the Bricolage SOAP server to export all of the templates in a single output channel. [David]

    • Added SFTP_MOVER_CIPHER bricolage.conf directive to tune the SFTP mover (if enabled) to the best cipher for good performance on the wire. [David]

  • Improvements

    • Added site and output channel support to bric_template_diff and bric_template_patch in contrib. [David]

    • When cloning a story, you can now select a new primary output channel, in addition to category, slug, cover date, etc. Suggested by Serge Sozonoff. [David]

    • Spell checking now works in HTMLArea. [Eric Sellers]

    • When creating a new story without a slug, Bricolage will now autogenerate a slug based on the title. [João Pedro]

    • Added single underscore parameters to the list() methods of the Story, Media, and Template classes to complement those that have the awful double underscores. [David]

    • Made SOAP modules more tolerant of lack of sites in 1.6. [Scott]

    • The collection API now checks newly added members when deleting members. This ensures that newly added objects won’t be saved to the database if they are deleted, first. [David]

    • Turned off browser autocompletion in the Server and User profiles. This prevents some browsers (e.g., Camino) from filling in your username and password where it doesn’t belong. [David]

    • When the “Filter by Site Context” preference is enabled, it no longer filters documents when searching for documents to alias. Reported by Patrick Walsh. [David]

    • The “Cancel Checkout” button in the Story, Media, and Template profiles now tries to do the right thing instead of just leaving the asset on a desk in workfow every time. If the asset was just created by the user, it will be deleted. If it was just recalled from the library by the user, it will be removed from workflow and shelved in the library. Otherwise, clicking the “Cancel Checkout” button will leave the asset in workflow. Requested by Sara Wood, Rachel Murray, and others. [David]

    make clone now provides the current date and time for the default name for the cloned package. Suggested by Marshall Roch. [David]

  • Bug Fixes

    • Bricolage no longer tries to display thumbnails for related stories, since stories don’t have thumbnails and would therefore create an error. [Eric Sellers]

    • Text::Levenshtein is again correctly loaded as an optional module, not a required module. Reported by Marshall Roch. [David]

    • Bric::Util::Burner’s preview_another() method now actually works. Thanks to Serge Sozonoff for the spot. [David]

    • Fixed clone interface for IE users. Spotted by Serge Sozonoff. [Scott]

    • Some of the supported values for the Order parameter to the Story, Media, and Template classes, such as category_uri, did not work before. Now they do. [David]

    • Changing categories on a template no longer creates Frankensteinian template paths. [David]

    • Added constant HAS_MULTISITE to the Bric base class so that all classes properly declare themselves for UI search results. [João Pedro]

    • Story and Media SOAP calls now correctly use the element’s key name to identify the element. [João Pedro]

    • Story, Media, and Template creation via SOAP now correctly look up the Category by URI and site ID. [João Pedro & David]

    • The Template SOAP interface now suports the site parameter to list_ids(). [David]

    • The Story, Template, and Media SOAP list_ids() interfaces now properly look up categories, output channels, and workflows with the site parameter, if there is one. [David]

    • The LOAD_LANGUGES and LOAD_CHAR_SETS directives are now space delimited, to better match other bricolage.conf options. [David]

    • Aliased media documents now correctly point to the file name for the aliased media document. Reported by Patrick Walsh. [David]

    • Thanks to the improvements to the collection class, cloning stories and putting them into new output channels to ensure that they have unique URIs now works properly. Reported by Serge Sozonoff. [David]

    • The publish status and version is once again properly set for media when they are published. Reported by Serge Sozonoff. [David]

    • The group manager now properly displays the names of the sites that member objects are associated with if the class of the objects being managed knows that its objects are associated with sites. Reported by Ho Yin Au. [David]

    • The list of output channels to add to a media or story document in the media and story profiles now includes only those output channels associated with the site that the story or media document is in. [David]

    • Thanks to the fix to 1.6.13 that prevents deleted groups from affecting permissions, there is no longer any need to provide a checkbox to get access to deleted groups in the permissions interface. So it has been removed. [David]

For a complete list of the changes, see the changes file.


Bricolage is a full-featured, enterprise-class content management and publishing system. It offers a browser-based interface for ease-of use, a full-fledged templating system with complete HTML::Mason, HTML::Template, and Template Toolkit support for flexibility, and many other features. It operates in an Apache/mod_perl environment, and uses the PostgreSQL RDBMS for its repository. A comprehensive, actively-developed open source CMS, Bricolage has been hailed as “Most Impressive” in 2002 by eWeek.

Learn more about Bricolage and download it from the Bricolage home page.


Originally published on use Perl;

“use.perl.org journal of Theory: “Bricolage 1.7.5 “Ashland” (1.8.0 RC2)””

Cross-Platform Conferencing Software?

Suddenly I’m getting a number of requests to do Bricolage demos via conferencing software. I tried to join a WebEx meeting yesterday, but it didn’t like any of my Mac OS X browsers or the versions of Java they had installed (browser sniffing == bad!).

I’d like to use Mac OS X software to conference with folks using Windows and other platforms. I can use my old Windows 98 SE box if necessary, but I’d rather not. Anyone know what the options are for good cross-platform conferencing, and what works and what doesn’t?



Originally published on use Perl;

Bricolage-Devel 1.7.4

I’m thrilled to announce the release of Bricolage-Devel 1.7.4 “Sacramento”, the first release candidate for Bricolage 1.8.0. This version of the open-source content management system addresses all of the bugs discovered since the release of the fourth development release, 1.7.4, and adds several new features and numerous improvements. The most significant changes since 1.7.3 include:

  • New Features

    • A “Bulk Publish” link in ADMIN->PUBLISHING that lets members of the Global Admins group publish story and media documents by category. [Scott]

    • Added notes() method to Bric::Util::Burner, along with the accompanying clear_notes(). The notes() method provides a place to store burn data data, giving template developers a way to share data among multiple burns over the course of publishing a single story in a single category to a single output channel. Any data stored here persists for the duration of a call to burn_one(). [David]

    • Added new contributed scripts for Bricolage button generation. These scripts use the Gimp to generate localized buttons for the Bricolage UI based on the contents of an input file. See contrib/button_gen/README for details. [Florian Rossol]

    • Added support for icons for all media documents when the USE_THUMBNAILS bricolage.conf directive is enabled. These rely on the presence of PNG icon files for each MIME type in comp/media/mime. Only one such icons is distributed with Bricolage, comp/media/mime/none.png (borrowed from the KDE project under a free license), which is the default icon when the MIME type of a media file is unknown or when no icon file exists for the MIME type of the media file. Administrators are free to add their own icons, and the copy_gnome_icons script in contrib makes it easy to use GNOME icons. [David]

    • Added bric_template_diff and bric_template_patch scripts in contrib/bric_template_diff. These scripts can be used to sync templates between two Bricolage servers. [Sam]

    • added bric_media_load to contrib/. This script copies media into Bricolage while accounting for the new to update existing media. [Sam]

    • Added HTMLArea support. This adds a new type of field to be added to elements and contributor types, “WYSIWYG”. Such fields are then displayed in the UI using HTMLArea, a WYSIWYG HTML editor. This can be useful in particular for simple fields that often need emphasis added or links. It is not currently available in Bulk Edit or Super Bulk edit. See Bric::Admin for installation and configuration details. [Eric Sellers]

  • Improvements

    • The list of categories for which permissions can be granted to user groups to access the documents and templates in the category now displays the categories for each site separately, so that categories with same URIs (such as for the root category in each site) can be easily told apart. Reported by Ho Yin Au. [David]

    • The list of workflows for which permissions can be granted in the permissions page now includes the parenthesized name of the site each workflow is associated with. [David]

    • Modified the indexes on the workflow__id and desk__id columns of the story, media, and formatting (template) tables to be more efficient, being indexed only when their IDs are greater than 0 (that is, when a story, media document, or template is actually on a desk and in a workflow). [David]

    • Added a method is_fixed to story and media objects, to determine whether a business asset has a fixed URL (for example, a Cover page). Refer to Bric::Biz::Asset::Business. [Scott]

    • Added the ENABLE_OC_ASSET_ASSOCIATION bricolage.conf directive to remove the ability to associate output channels from the story and media profiles. [Scott]

    • The element admin profile now automatically adds the currently selected site context to new elements, thus generally saving a step when creating new elements. [João Pedro]

    • Added an interface to ‘Clone’ for stories so that you can change the category, slug, and cover date, because otherwise an identical story is created, which would cause errors for some stories. Clones are no longer allowed to have URIs that are identical to the stories they were cloned from. [Scott & David]

    • Added the ability to Delete from desks (same as My Workspace). Note however, that you can’t delete from a publish desk. [Scott]

    • Completely documented the document element classes: Bric::Biz::Asset::Business::Parts::Tile, Bric::Biz::Asset::Business::Parts::Tile::Data, and Bric::Biz::Asset::Business::Parts::Tile::Container. This should make it a bit easier on templators learning their way around the Bricolage API. [David]

    • Refactored quite a bit of the code in the element classes. Renamed the methods with “tile” in their names to use “element” instead (but kept the old ones around as aliases, since they’re used throughout the UI). Added a few methods to make the interface more complete. [David]

    • Modified the get_containers() method of Bric::Biz::Asset::Business::Parts::Tile::Container to take an optional list of key name arguments, and to return only the container subelements with those key names. This is most useful in templates, where it’s fairly common to get a list of container subelements of only one or two particular types out all at once. It neatly replaces code such as this:

      for ( my $x = 1; my $quote = $element->get_container('quote', $x); $x++ ) {

      With this:

      for my $quote ($element->get_containers('quote')) {

      And is more efficient, too. [David]

    • Modified the get_elements() method of Bric::Biz::Asset::Business::Parts::Tile::Container to take an optional list of key name arguments, and to return only the subelements with those key names. [David]

    • Added the get_data_elements() method to Bric::Biz::Asset::Business::Parts::Tile::Container. This method functions exactly like get_containers() except that it returns data element objects that are subelements of the container element. It also takes an optional list of key name arguments, and, if passed, will return only the subelements with those key names. [David]

    • The ANY() subroutine will now throw an exception if no arguments are passed to it. Suggested by Dave Rolsky. [David]

    • Added the unexpired parameter to the list() method of the story and media classes. It selects for stories without an expire date, or with an expire date set in the future. [David]

    • The “User Override” admin tool is now available to all users. But a user can only override another user if she has EDIT permission to that other user. This makes it easier for user administrators to masquerade as other users without having to change passwords. [David]

    • Eliminated another SQL performance bottleneck with simple searches of media assets. [João Pedro]

    • Images with no dimension greater than the THUMBNAIL_SIZE bricolage.conf directive are no longer expanded to have one side at least THUMBNAIL_SIZE pixels, but are left alone. [David]

    • Thumbnails are now displayed when searching media to related to an element. [David]

    • Thumbnails are now displayed in related media subelements. [David]

    • Added preview_another() method to Bric::Util::Burner. This method is designed to be the complement of publish_another(), to be used in templates during previews to burn and distribute related documents so that they’ll be readily available on the preview server within the context of previewing another document. [Serge Sozonoff]

    • Added the subelement_key_name parameter to the list() method of the story and media classes. This parameter allows searches on the key name for a container element that’s a subelement of a story or media document. [David]

    • Added support for all of the parameters to the list_ids() method of the Story, Media, and Template classes to the list_ids() method of the corresponding SOAP classes. This allows for much more robust searches via the SOAP interface. [David & Scott]

    • Eliminated login_avail() PostgreSQL function, replacing it with a partial constraint. This not only makes things simpler code-wise, but it also eliminates backup and restore problems where the usr table is missing. The downside is that it requires PostgreSQL 7.2 instead of our traditional minimum requirement of 7.1. So any PostgreSQL 7.1 users will need to upgrade before upgrading to this version of Bricolage. Suggested by Josh Berkus. [David]

  • Bug Fixes

    • make clone will now properly clone a database on a different database server, provided the host name (and port, if necessary) have been provided. Thanks to Ho Yin Au for the spot! [David]

    • Admin tool lists that include the number “9” in the corner of a table of items is now properly orange instead of green. Reported by Ho Yin Au. [David]

    • Bricolage works with Perl 5.6.x again, although it’s pretty strongly deprecated. Perl 5.8.0 or later is required for character set conversion and if any content uses characters outside of US ASCII. Thanks to John Greene for the spot! [David]

    • Image files uploaded in formats not recognized by Image::Info no longer trigger an error. Reported by Alexander Ling. [David]

    • Changing the cover date of a media document once again correctly updates the primary URI of the media document. Reported by Serge Sozonoff. [David]

    • Fixed API that was causing no elements to be returned on “Add sub-elements” page, when “Filter by site context” was turned on. [João Pedro]

    • When the SOAP server serializes and deserializes element templates, it now correctly identifies the element by its key name, rather than its name. Thanks to João Pedro for the spot! [David]

    • The template profile’s “cheat sheet” of the subelements of an element now correctly display subelement key names instead of munging element names, as was required before version 1.7.0. [João Pedro]

    • Bric::SOAP::Category->list_ids now converts site names to site IDs. [João Pedro]

    • Bric::Util::Burner->preview once again defaults to previewing in an asset’s primary output channel instead of using the element’s primary output channel. [João Pedro]

    • Added first_publish_date attribute to the SOAP input and output for stories and media. [David]

    • The category SOAP class now correctly calls lookup() with the site ID to prevent multiple categories with the same names but in different sites from being looked up. [João Pedro]

    • User overrideable preferences are now properly checked for permissions to allow users with READ permission to a user to see the permissions. [David]

    • Users can now edit their own user-overrideable preferences. [David]

    • Group management now works more correctly in user profiles where users have on READ access to the user object. [David]

    • Removed queries added in 1.7.2 that were running at Bricolage startup time. They could cause DBI to cache a database handle and return it after Apache forks, leading to strange errors such as “message type 0x49 arrived from server while idle”, and occasionally a frozen server. [David]

For a complete list of the changes, see the changes file.


Bricolage is a full-featured, enterprise-class content management and publishing system. It offers a browser-based interface for ease-of use, a full-fledged templating system with complete HTML::Mason, HTML::Template, and Template Toolkit support for flexibility, and many other features. It operates in an Apache/mod_perl environment, and uses the PostgreSQL RDBMS for its repository. A comprehensive, actively-developed open source CMS, Bricolage has been hailed as “Most Impressive” in 2002 by eWeek.

Learn more about Bricolage and download it from the Bricolage home page.



Originally published on use Perl;