First (alpha!) release of Pier running with Magma Persistency.
Image available from ftp.seasidehosting.st
User: preloaded Password: squeak
Image Use Instructions
In pier configuration click on 'Magma Control Panel', which will inform
you that the repository does not exist. If you have placed this image on
seasidehosting then you will have to manually create the repository
directory. Given the list of options as to what repository to create,
click the 'create' button (and wait). The existing pier kernel should
appear in the list with a 'persist' button next to it, click 'persist'.
Then try it and see!
Detailed Log of Image Creation Steps (alternative title: "monticello
This image was prepared as follows:
Beginning with Squeak3.8-6555full
Initial start asks for updates: select "do not ask again" - this is
important should you wish to deploy. Headless servers (e.g.
seasidehosting) cannot handle user interaction and will stop at this point.
From "world menu > open.... > Monticello Browser"
Browser opens with (Monticello....)
Click the "+Repository Button", select "HTTP" as the repository type,
as the repository info (if you have a login on Squeaksource then you can
enter your initials
as the 'user' above.)
Add the following repository for Monticello.
Add the following repository for Magma.
and the following two repositories for Magritte and Pier
(to edit this information:
click the menu button in the right hand pane of the Monticello Browser)
Loading Latest Monticello.
More recent versions of Monticello provide better feedback as to which
packages are currently loaded.
Select the http://www.squeaksource.com/Monticello repository, click
"open", select the latest package (Monticello-avi.279) from the main
"Monticello" branch, and click "load".
Select the Monticello package on the left hand pane, and the
squeaksource/Monticello repository in the right hand pane. Click 'open'.
In the repository browser, click on the latest version
(Monticello-avi.279.mcz) and click 'Load'.
Select "world menu > open... SqueakMap"... and a dialog will ask if you
wish to upgrade SqueakMap. Which you do. Notice that SMBase, SMLoader
packages appeaer in the Monticello browser, since the upgrade is
performed by loading Monticello packages.
In SqueakMap, select the ever so convenient "Seaside Installer" which
should load in the whole of seaside with its dependencies in one go. To
do this select the left had pane menu button, "install". (Part way
through the install you will be prompted to enter an admin username
(seaside) and password (admin))
(if SqueakMap doesnt work it is being knobbled by a more recent
package-cache, remove it and try again)
Select the seaside repositoryClick the "open" and the repository browser
Select Seaside2.6b1 which is the current latest. In the right hand pane
are the releases. Releases may be made by anyone and they may be small
branches off from the main stream. Periodically an effort will be made
to ensure that all changes are merged. Click the history button in order
to browse the history of this package to get some idea of what is going
on. Look at the ancestors of a package to see if one version is being
sequentially built on the next, or whether any branching is occurring.
Seaside is fairly mature and changes infrequent, therefore it is likely
to be safe to grab the latest version.
To start Seaside doit:
WAKom startOn: 8080.
( Or use the "beach flags" SeasideMorph
available from: http://minnow.cc.gatech.edu/squeak/5862 )
To test if everything is running, check the following url in your normal
you should be prompted for you username and password (as given earlier).
Back to the Monticello Browser. Deselect the selected package by
clicking on it once. This should re-reveal all of the registered
(It is worth saving this. In the right hand side pane menu button there
is a menu item: "Save Repositories", which writes a simple configuration
script to the working directory.)
Select the http://www.squeaksource.com/MagmaTester repository, and click
Select MagmaServerLoader, and click "load". (it takes a while!)
loaded Ma client server-cmm.123
loaded Ma exception handling-cmm.22
loaded Ma time objects-cmm.37
Load Magma Seaside Integration Package
Select "Magma Seaside" (lhs) and the latest package and click "load",
loaded Magma Seaside-kph.18
Load Magma Seaside Sushi Store Demo fixes
Before using Magma may need to execute the following.
MagmaSession allInstances cleanUp.
Latest Pier-Magma code
Monticello Browser - "flush cached versions".
Release Preloaded Image as Sqk3.8f-smp.image
The all-new Yahoo! Mail goes wherever you go - free your email address from your Internet provider. http://uk.docs.yahoo.com/nowyoucan.html
I'm dealing now quite a bit of time with Magritte to do a
web application. It took a while to get into Magritte and
I'm not sure how much I've grasped til now. But I'm quite
impressed by the power of Magritte. It seems to be customiz-
able at the right places which distinguishes it from others.
At the moment I'm refactoring the code I hacked the last weeks.
I have a few questions about best practice patterns using
Magritte. For the demo, you have a model and you just need
any component, the case is quite easy. aModel asComponent
will do. But most of the tasks that have to be done for a
web application aren't that trivial. You need to have a
customized layout (which can be very complex), you need your
own components etc.
For customization I put every little bit in a wrapper class
around the generated Magritte component. This is for customizing
the generated component as well as to do some manual html if
it isn't avoidable. I have the feeling that this is not the
right way to do but I have no better idea. To minimize the effort
to do a component for a model component I've built a base class
which should ease the customization of the component. The parameters
for the base component are:
This is a symbol which is invoke on the model if you need a subset
of the descriptions. The default value is #description
The visitor which is used to render the component
A Collection of Associations (button label -> selector). MAForm-
Decoration is only useful if you have save and cancel buttons. As the
selectors are performed on the MAContainerComponent there is no way of
extending it. I extendend MAFormDecoration to have associations for
buttons (to distinguish the button label and the selector to use) and
to be created with a delegator. The selector is than performed on the
delegate which leads to a usage form
(WHFormDecoration delegate: self)
buttons: #( #ok -> commit. #abbrechen -> abort)
There are three choices:
* no validation
* validation by MAValidationDecoration (or similar)
I must confess that I never understood processChildCallbacks.
* manual validation and error handling
Using the form
[self component validate]
do: [:anException | self exception: anException].
Having a wrapper component I need to process answer in the wrapper.
This can be customized by defining answerBlock. Default value is
self component onAnswer: (
answerBlock ifNil: [
[:anAnswer | self answer: anAnswer]
I'm mimicking the behaviour in MAElementComponent having
renderViewerOn:/renderEditorOn:. This is a good way to switch a
component between readonly and readwrite mode. In my case the layout
of the component is completely different between those two modes. So
I use two different renderers for readonly and for readwrite mode.
- really complex layout cases
I have one case where it is necessary to put css classes to some of
the components of a form. The best way I found so far (being dirty)
is to use propertyAt:put: at description level and use this in a
So far so good. I like to hear your oppions and experiences doing this
kind of stuff.
Another problem I have no solution til now is the mixture of models into
one component. Sometimes you build your data model and then page layout
forces you to edit two objects at the same time. I have no problem to
mix descriptions in a desired way. But by invoking asComponentOn: they
would have all the same model which is wrong for a subset of the
descriptions. Is there any clever way to mix descriptions, set the model
accordingly and then produce the component?
thanks in advance,
Smallwiki rocks! I made a custom stylesheet for Smallwiki, how can I
add it to the list of defaults?
My stylesheet is called "The Pixel is Dead" and can adapt to any user-
given font-size in the browser. for an example see http://
All the latest versions of magritte in the
Monticello repository seem to be empty. For expample,
I downloaded the latest Magritte-Seaside (219) with my
web browser from mc.lukas-renggli.ch. The mcz file is
16205 bytes in size. source.st is just 279 bytes. This
doesn't seem to be a full release.
I get error's like this sometimes when I click a link in pier:
Error: "/seaside/mmiki/seaside/mmiki/A-Page" not found.
Notice the path is duplicated. I figure that this is an error that
occurs after the page time's out. yes?
How can I fix this? Why does this happen? Lukas mentioned a thread to
search for but I can't find that message (sorry!) and I haven't found a
Can anyone point me in the right direction?
+1 (408) 799-6124
I am trying to figure out the design of the classes in Pier Blog. I am
wondering why PBBlog is a subclass of PRCase, and not a direct
subclass of PRStructure:
PRStructure #('parent' 'name' 'title' 'tags')
PBBlog #('managingEditor' 'webMaster' 'copyright' 'language'
PBEntry #('uuid' 'author' 'publication')
PBPost #('sourceUrl' 'sourceTitle' 'enclosure')
PRComponent #('componentClass' 'settings')
PRForm #('model' 'metamodel')
PRCase's class comment says:"I am an abstract class holding onto a
document definition representing the contents of the receiver. Most of
my subclasses will allow user to edit myself using the Wiki syntax."
I guess my question is: for an application that is similar to a blog
(managing a list of homogeneous entries, maybe nested), is it a good
idea to make it a direct subclass of PRStructure?