30.11.2014 Views

Smalltalk Solutions 2008 Report, ESUG 2008 report, VAS report

Smalltalk Solutions 2008 Report, ESUG 2008 report, VAS report

Smalltalk Solutions 2008 Report, ESUG 2008 report, VAS report

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Smalltalk</strong> Conferences between June and September <strong>2008</strong> 1<br />

<strong>Smalltalk</strong> Conferences between June and September <strong>2008</strong><br />

This document contains my <strong>report</strong>s of<br />

• the <strong>Smalltalk</strong> <strong>Solutions</strong> conference in Reno June 18 - 21, <strong>2008</strong><br />

• the <strong>ESUG</strong> conference in Amsterdam, August 25 - 29, <strong>2008</strong> (and brief<br />

info of the Camp <strong>Smalltalk</strong> 23rd - 24th and Seaside Sprint 29th - 31st)<br />

• the VA<strong>Smalltalk</strong> User Group conference in Frankfurt, September 23,<br />

<strong>2008</strong><br />

I have combined my three conference <strong>report</strong>s into a single document. They<br />

follow in the order in which conferences occurred. An initial section<br />

‘Shared Keynotes’ gives two talks that were given at both <strong>ESUG</strong> and<br />

<strong>Smalltalk</strong> <strong>Solutions</strong>.<br />

Style<br />

‘I’ or ‘my’ refers to Niall Ross; speakers (other than myself) are referred to<br />

by name or in the third person. A question asked in or after a talk is prefixed<br />

by ‘Q.’ (sometimes I name the questioner; often I was too busy noting their<br />

question). A question not beginning with ‘Q.’ is a rhetorical question asked<br />

by the speaker (or is just my way of summarising their meaning).<br />

Author’s Disclaimer and Acknowledgements<br />

These <strong>report</strong>s give my personal view. No view of any other person or<br />

organisation with which I am connected is expressed or implied. The talk<br />

descriptions were typed while I was trying to keep up with and understand<br />

what the speakers were saying, so may contain errors of fact or clarity. I<br />

apologise for any inaccuracies, and to any participants whose names or<br />

affiliations I failed to note down. If anyone spots errors or omissions, email<br />

me and corrections may be made. My thanks to the conference organisers<br />

and the speakers whose work gave me something to <strong>report</strong>.<br />

Shared Keynotes<br />

Gilad’s talk on Newspeak and Georg’s talk on Bach were given at both<br />

<strong>Smalltalk</strong> <strong>Solutions</strong> and <strong>ESUG</strong>. A single write-up combining material and<br />

questions from both conferences tells the story better than two write-ups.<br />

How to find the Bach house in Cöthen, Georg Heeg<br />

(This combines the talks Georg gave at <strong>Smalltalk</strong> <strong>Solutions</strong> and at <strong>ESUG</strong>.<br />

Questions asked and answers given at either venue are included. Strictly,<br />

Georg’s talk was not billed as a keynote in either conference, but it presents<br />

<strong>Smalltalk</strong> in a context of much wider interest, so I think it is worth<br />

highlighting here.)<br />

Dinosaur bones have been found in Cöthen, and evidence of stone age<br />

occupation. More recently it was the capital of the independent state of<br />

Anhalt in Germany; there are city records going back 900 years. It was also<br />

the location of the second largest <strong>ESUG</strong> (in 2004, eclipsed only by this year<br />

in Amsterdam).


2 Shared Keynotes<br />

Johan Sebastian Bach worked for 7 years in Cöthen, during which time he<br />

wrote ‘The Well-Tempered Clavier’ among many other works: Georg<br />

played us an excerpt from the 10th piece. Prince Leopold of Anhalt was the<br />

reason Bach lived in Cöthen for many years. (Unlike those princes who just<br />

had parties every day and spent all their money) he was very musical,<br />

invited Bach to the city, founded societies for the study of the German<br />

language and so on.<br />

Even during his lifetime, Bach began to lose popularity and only 100 years<br />

later did the superb quality of his music begin to be recognised. Thus there<br />

are many open questions about his life, including where he lived in Cöthen.<br />

Today the city wants to improve its tourist trade by finding all it can about<br />

Bach’s time there. Their first question was, ‘Where did he live?’ They got<br />

EU funding for a suitably long-winded title (Feasibility study for ....) and<br />

asked for bidders; Georg Heeg won. The bidding started in 23 March 2006;<br />

Georg Heeg completed the task on 15th February of this year.<br />

They did it in 4 phases as an agile project. They knew from the start that if<br />

they used the same approach as all the historians had tried - looking for a<br />

piece of paper with an address on it - they would fail: if such a paper<br />

existed, it would have been found. Instead, they intended to use exclusion<br />

as their proof method (c.f. the computer proof of the four-colour problem).<br />

Phase 1 was drill down to brainstorm and identify key issues. Phase 2 was<br />

locating, scanning and OCRing all the old material they could find in<br />

archives, libraries, old bookshops, eBay. 736 documents in gothic, latin and<br />

handwriting fonts were scanned. For example, they copied all the city<br />

property records for 100 years. Phase 3 built the semantic network. There<br />

were two existing semantic network products written in <strong>Smalltalk</strong>. K-<br />

Infinity (see my <strong>ESUG</strong> <strong>report</strong>s in 2001 and 2002) is used by the police,<br />

publishers, etc. It had no interface to word. Atlas TI is an analysis tool for<br />

non-numeric data, but is not extensible (it easily could be but the company<br />

only sell the packaged software). Neither of these could be fitted exactly to<br />

their problem without some work.<br />

They therefore created a specific semantic network solution GHBachNets.<br />

It provided direct connections between the automatic procedures and the<br />

human decisions. The UI was a web browser, using Seaside on VW and<br />

GemStone. Two phone calls to Monty improved performance from hours<br />

to seconds. The coder and researcher worked closely so UI ideas were<br />

implemented quickly.<br />

The first thing they discovered was that the 18th century public treasurer<br />

was either a fraudster or very bad at arithmetic; they suspect the former but<br />

cannot pursue it as he’s been dead for over 2 centuries. They also found lots<br />

of simple writing errors. To do the searching, they went back to Thorsten’s<br />

JavaSpektrum tree implementation, porting it from VW to GemStone.<br />

They soon realised that a semantic network concept of an idea or a Notion<br />

(Begriff in German) was naturally a class so they made it a subclass of<br />

ClassDescription (at first of Behavior but they found they needed the


Shared Keynotes 3<br />

subclass’ abilities as well). Thus Notion (Begriff) is a sister class to Class<br />

and Metaclass (only <strong>Smalltalk</strong> can do this!). Special Notions are Values<br />

and Relations between two or more Notions. GemStone does not allow this<br />

extension of its metaclass so they had a mapping from a description of a<br />

network to the real network in VW.<br />

Next they needed TemporalObjects. “Bach lived in this house” is not useful<br />

information without knowing from when to when he lived there. They<br />

created a time framework that could handle vague and precise dates and<br />

historical ways of dating. For hundreds of years, tax registers showed who<br />

owned a house and how much they had paid (but not where the house was<br />

located). They had old maps to locate things and they had a princely<br />

homage accession record which was a few years too early, but useful<br />

because it lists who rented as well as who owned. Thus they had a tax<br />

register of householders in 1710, and in 1765, and of those houses with the<br />

right to brew beer (most useful data - and doubtless a much-prized right at<br />

the time, too :-). He showed one page of the thick one-per-year book of<br />

which they handled 100 years-worth of books. Georg showed some of this<br />

information in an Excel table for a single home: house built in 1738, first<br />

tax record in 1741, relationships, graphics, etc.<br />

All this was imported from Excel via COM connect (the VW7.6.<br />

implementation was driven by this project’s needs).<br />

Cöthen was in the postal system. Bach wrote from Cöthen to the city of<br />

Erfurt (120 miles, which cost 2 groschen which was about 10 dollars in<br />

those days); Georg showed a copy of the letter. As was typical for that time,<br />

it listed the title, profession and position of recipient and sender in great<br />

detail, but not the street address let alone a house number. Half of the<br />

houses in Cöthen were owned by the Prince and rented; the rest were<br />

owned mostly by their residents. They swiftly concluded that Bach neither<br />

owned a house nor rented from the Prince; those records are complete. The<br />

oldest city map dates from 1730, seven years after Bach left (and<br />

conveniently is oriented north, not always the case in those days). By<br />

comparing with Google earth, you can see that streets today are very<br />

similar to what they were then. A second map of 1778 also showed little<br />

change and was easier to work with. While Bach lived in Cöthen, the city<br />

was enlarged and its walls rebuilt to enclose a larger area. They started to<br />

build the new city wall on 24th February 1719.<br />

We know that Bach must have had a spacious home. He had a big family<br />

and students lived with him, and he needed four big waggons for his goods<br />

when he moved (this useful fact is recorded in a humble newspaper of the<br />

time). They looked at all the houses that had been proposed. They also<br />

looked for any other homes that could fit.<br />

The first candidate (Burgstasse 11) was built in 1721 (too late) and was too<br />

small (luckily, as it has now been knocked down and is a space between<br />

two very modern houses). The second was simply too small. A third one,<br />

Holzmark 12, is mentioned in a list of 1855 with the names Bach and<br />

Erhardt. However it had six or seven families living in several apartments


4 Shared Keynotes<br />

within it - not at all ideal for music practice all the time. Stifstrasse 11 has<br />

a sign ‘probable Bach home’ and famous historians have backed the claim<br />

but it is not so; the project systematically proved their arguments were<br />

wrong, and were a classic case of historians quoting each other so that an<br />

‘astonishing’ document found by one such historian was in fact already<br />

well known and not persuasive. Essentially, a historian called Hartung just<br />

published a guess.<br />

That left three homes, all owned by Johannes Lautsch. One was a shop,<br />

which does not fit music practice. Another was seventh in the property tax<br />

list (2 thalers and 9 groschen ~ $265), so one of the largest homes in<br />

Cöthen. There is evidence that Bach complained that the rattle of a water<br />

mill next to his home disturbed his music - he could only compose music<br />

with one speed. There is a water mill 100 yards from this house. Its<br />

previous occupant, Stricker, who was Bach’s predecessor as cappelle<br />

maister, had his rent paid by the prince and we know that Bach’s rent, also<br />

paid by the prince, was the same as that of the prior occupant. This looks<br />

like Bach’s first residence.<br />

They also wanted to find where he lived next. Before 1719, Wallstrasse was<br />

an area of gardens and a gold and silver thread factory. On 25 February<br />

1719 Prince Leopold decided to expand the city: he ordered Wallstrasse<br />

and Shulstrasse to be built as streets, and ruled they would be tax-exempt<br />

until all houses were built. It is not only in modern times that laws cause<br />

the reverse of what the government expected. This rule, intended to<br />

encourage building, had the opposite effect: the people who moved to the<br />

new streets had a strong reason to delay their completion. Only when the<br />

prince’s successor, his brother August Ludwig, ruled that only three years<br />

of tax exemption would be allowed were the remaining houses built.<br />

A tax-exempt house Wallstrasse 25/26 was built by Johannes Andreas<br />

Lautsch. The house only appeared in the tax register in 1730 but it was built<br />

in 1719, in the middle of the time when Bach lived in Cöthen. (A claim it<br />

was built in 1712 was recognised as a misreading of 9 for 2 in an old<br />

document.) They concluded that Bach was the first renter of this house.<br />

When his landlord built a new house, Bach moved to it. Georg was very<br />

pleased to note that it was only two doors away from his own house. (A<br />

later owner of this house was Erhardt, which is where the 1855 confusion<br />

occurred)<br />

He demoed (in Safari; they use some clever stuff for tooltips that not even<br />

Firefox supports yet). He showed the various lists (literature, names, etc.)<br />

and hints, thence navigated to schematics of the houses in their locations in<br />

Cöthen, plus tables of data on the houses.<br />

Q. Were you surprised to find you lived so close to the second house? Yes.<br />

(As a side effect of the work, they also discovered who built the house that<br />

was on the site of their own house before the current building which is 1911<br />

art deco. The builder was a doctor and Georg knows where he did his<br />

thesis, who he married, how he built the excellent garden, and that he was<br />

mayor of Cöthen at one point)


Shared Keynotes 5<br />

Q. Will you find the holy grail next? If we’re offered a contract to do so. :-)<br />

Q. How many people were employed? 30 part-time (this omits some of the<br />

data collectors). There were 6-800 pages of handwritten text to scan and the<br />

rest was printed in gothic or latin font.<br />

Andrés mentioned Silverman, a friend of Bach who talked to the Italian<br />

inventor of the piano and built an early piano. Maybe Cöthen can get even<br />

more tourists if a connection can be discovered. Georg searched and found<br />

some 50 documents mentioning Silverman in their data.<br />

Georg played some more music from ‘The Well-Tempered Clavier’ to<br />

close.<br />

(Eliot) Is it Koethen (the spelling in all the <strong>ESUG</strong> 2004 docs) or Cöthen,<br />

the spelling in Georg’s talk? The most correct spelling is with K (the word<br />

comes from a Slavic language) but in the nineteenth century, or when<br />

latinising, it would be spelt with C. The oe is just the way of anglicising an<br />

umlaut.<br />

Q(Christian) Why were you unable to use the existing products (K-Infinity<br />

and Atlas TI)? We needed to customise to get our data in and we had to map<br />

between numeric and non-numeric data; those were the two reasons.<br />

Q. Reaction of historians? Some say, “Yes, we’ve found it!” Others say,<br />

“We do not accept your methodology; you did not find the piece of paper<br />

we were looking for.”<br />

Tampering with Perfection: From <strong>Smalltalk</strong> to Newspeak; Evolving<br />

<strong>Smalltalk</strong> for the Age of the Net, Gilad Bracha, Cadence Design<br />

Systems<br />

(This records material from the talk Gilad gave at <strong>Smalltalk</strong> <strong>Solutions</strong> and<br />

the one he gave at <strong>ESUG</strong>, including questions and answers from both.)<br />

Gilad wants a language where everything is a message send. Not almost<br />

everything as in <strong>Smalltalk</strong>, but everything.<br />

Relevant changes since 1984 include multi-cores and this web thingy that<br />

Al Gore invented or maybe it wasn’t quite that way :-). We’ve learned that<br />

security matters, that modularity is crucial and that ecosystems matter (no<br />

he’s not referring to global warming, that’s enough of the Al Gore jokes)<br />

i.e. how a program fits into its environment.<br />

<strong>Smalltalk</strong> was defined to be open and malleable so it is not that secure. the<br />

various, non-standard unsatisfactory solutions for modularity around today<br />

are also not that secure. Interoperability: why would you want to go outside<br />

<strong>Smalltalk</strong>? Sometimes there are good reasons, e.g. to get something current<br />

<strong>Smalltalk</strong> solutions do not do or do not do well.<br />

Newspeak is a message-based language with no static state in which<br />

classes can nest.


6 Shared Keynotes<br />

Message-based: isn’t <strong>Smalltalk</strong>? Well, Alan Kay says ‘<strong>Smalltalk</strong> should<br />

have been message-oriented.” The idea of Newspeak is that everything is a<br />

message. In t := Array new: n. only new: is a message send. If we<br />

rewrite so everything is, it would look like<br />

self t: (self Array new: self n).<br />

Self went this way but decided to have implicit receivers, so the above<br />

becomes t: (Array new n). That only works because of various<br />

constraints. Instead, Newspeak writes t:: Array new: n. Here :: is a<br />

message send but with lower precedence so you can skip the brackets. With<br />

this, no code cares what class implementation you have chosen. In<br />

<strong>Smalltalk</strong>, most code does not care but your subclasses care; rework the<br />

superclass and you must refactor your subclasses. Here, you are talking to<br />

self so no code cares. Even the class itself does not care, i.e. its method<br />

code does not care.<br />

Implications: access control starts to matter. In <strong>Smalltalk</strong>, all messages are<br />

public and you encapsulate by putting things in instvars or blocks. Thus<br />

Newspeak must apply some private/protected/public rules to messages that<br />

are replacing non-messages in <strong>Smalltalk</strong>.<br />

Global state is a bad thing for many reasons. Gilad focused on one:<br />

security. Newspeak is not a secure language: it is a basis for building secure<br />

systems. If a party does not want gate crashers then either the person on the<br />

door can check if the person arriving is on the guest list or else they can ask<br />

them to show their invitation. In the programming domain, the latter<br />

approach is called capability in terms and maps well to object-oriented<br />

systems (described in a good paper by Miller in 2006).<br />

Thus the object-graph provides the authority but this means no static state<br />

and thus no ambient authority. For example, you may be handed an object<br />

that knows how to open a given file; you are not possessed of ambient<br />

authority to open that file.<br />

In <strong>Smalltalk</strong>, there’s a bigger problem. You can look at an object, inspect<br />

its methods, compile new on the fly. This is one of the key things that<br />

makes <strong>Smalltalk</strong> wonderful but of course it makes it hard to argue you have<br />

a secure system. Newspeak uses the idea of mirrors that Self introduced<br />

(not for reasons of security but it works well for security). Mirrors are<br />

objects that reflect other objects but, like a real mirror, give no inevitable<br />

ability to change the real object whose reflection you see. Mirrors act as<br />

capabilities for reflection. They let you control what people can do and so<br />

you can design the security you need. Mirrors are also useful for<br />

deployment.<br />

There is no static state, so how do classes share state: they use nested<br />

classes (as in Beta; forget Java’s nested classes: this is not that!). In<br />

Newspeak, classes can nest. Gilad thinks this is an oversight in <strong>Smalltalk</strong>:<br />

if you push <strong>Smalltalk</strong>’s semantic ideas to their logical end, he believes that<br />

this idea falls out automatically and is a powerful enabler of many things.


Shared Keynotes 7<br />

He opened a Squeak image in which an implementation of Newspeak was<br />

running. (The browsers are Vassili’s; see his talk in the <strong>Smalltalk</strong> <strong>Solutions</strong><br />

conference.) He opened a class AlternatingParser that was nested within<br />

CombinatorialParser. (It showed the syntax. Newspeak has a syntax, not<br />

just a file-out format. :-)) It had four slots (in vertical bars, like temps in<br />

<strong>Smalltalk</strong>). You can only access the slots via accessors (pfun slot means<br />

pfun, pfun: accessors are automatically and inevitably present).<br />

either: pf1 or: pf2 = {<br />

self assert: (pf1 isKindOf: BlockContext)<br />

pfunc: pf1.<br />

qfunc: pf2.<br />

}<br />

where pf1 is actually an accessor call to pf1 and likewise for pf2.<br />

The enclosing class also had slots. These had initialisers and an = sign<br />

meaning they are read only, i.e. there will be no setter available so, short of<br />

reflection manipulation, you cannot change these values.<br />

BlockContext = platform BlockContext<br />

OrderedCollection =<br />

platform Collections OrderedCollection<br />

Error = platform Error<br />

Q. These are message sends? The above are not expressions but they are<br />

compiled into message sends.<br />

A top-level class has no global scope; you must get its scope from its<br />

superclass or get things explicitly. (They could have a global scope<br />

provided it had no state but in fact they see no need for it.) Thus slot<br />

BlockContext gets initialized by sending a message to platform which<br />

returns a BlockContext class. Here we have a true modular structure. This<br />

class’ methods have no access to the outside world except through<br />

parameters so if you refuse to pass it an object that e.g. has the capability<br />

to open a certain file, it cannot contrive to do so. Thus every object runs in<br />

a sandbox all the time.<br />

You could assign platform to a slot named platform, calling platform<br />

OrderedCollection or whatever all over your code and be back in Java’s<br />

situation of fully-qualified state, but they are training their users - few in<br />

number at the moment - not to do this.<br />

Q. So you need to know what classes you will call beforehand? The end<br />

system will have tool support to add these as you type a class. For the<br />

moment, you have to go back and add it as you code.<br />

Q. Add new classes on the fly? Yes, if you have the right mirror.<br />

Because there is no state, all the code in CombinatorialParser is innately<br />

reentrant. We can also have other implementations that do things<br />

differently e.g. a more complicated and larger memory footprint but faster


8 Shared Keynotes<br />

implementation. Since all classes are accessed via message sends, plugging<br />

in different implementations never meets hard-coded obstacles. Every<br />

module has its own sandbox; it can only call what it is given.<br />

The classes are created lazily; the first time you send the message<br />

CombinatorialParser that is when the class CombinatorialParser is created.<br />

He showed where SequentialParser was overridden between super and<br />

subclasses. CombinatorialParser can be extended as a subclass of<br />

SuperCombinatorialParser, whose slot is defined by<br />

SuperCombinatorialParser = super CombinatorialParser<br />

The message Object is the same: it is defined in Object and can be<br />

overridden in subclasses (Object exists in the bases system but any<br />

subclass’ Object would be created when first called).<br />

WrappingParser = CombinatorialParser<br />

says WrappingParser’s superclass is defined by (the send to itself of the<br />

message) CombinatorialParser and so on up to Object. These classes are<br />

computed lazily and cached. Thus we have the class hierarchy inheritance.<br />

The point is that because a class sends its superclass name to itself, it can<br />

override its superclass method and redefine itself. A class has no idea who<br />

its superclass really is: it is just a message send which can have different<br />

implementors at different times like any other message. Thus every class<br />

must be defined as a mixin and can be used as a mixin; it can be in different<br />

hierarchies in different contexts.<br />

Q(Christian) What about tools; who sees all the objects as opposed to a<br />

scoped subset? The appropriate mirrors would allow it; most users should<br />

not have those mirrors.<br />

Now we can understand nested classes. Classes are nested per instance of<br />

the class, not per class. (Needless to say, this is not the way it is in Java !)<br />

There are backpointers from a nested class to its instances and the instances<br />

know about their enclosing objects. Understanding this is key to<br />

understanding how method lookup actually works in Newspeak.<br />

In the absence of an explicit receiver, we send a message to the activation<br />

record of the send. Accessors get sent to the implicit receiver self but a<br />

message like BlockContext is sent to the slot which is inherited from the<br />

enclosing object, so we have to know AlternatingParser and its enclosing<br />

object. Method lookup goes up the receiver inheritance chain as in classical<br />

<strong>Smalltalk</strong> but at each point in that chain it goes up the lexical scope chain,<br />

going to the next super only if no match is found in that lexical chain. The<br />

lexical scope chain starts from the activation record and thence looks in the<br />

local class, then the local class’ superclass and so on, eventually reaching<br />

the local class’ Object. Then we go up the receiver inheritance chain: the<br />

superclass looks in itself, then its local superclass and so gets to its Object.<br />

This continues till an implementor is found or until DNU is reached.<br />

Although this sounds complicated, that is just the complexity of explaining


Shared Keynotes 9<br />

it. When programming, it is obvious because as you program the lexical<br />

scope is right there. (Vassili compared it to the difficulty of explaining to a<br />

newbie <strong>Smalltalk</strong>er how super lookup worked as against the ease of using<br />

super in code and understanding what the effect would be.) A necessary<br />

consequence of this scheme is that the machine has to know the enclosing<br />

object to figure all this out.<br />

Explicit receivers are different: they do not walk the lexical scope. Suppose<br />

we were explicitly calling self Dictionary. If Dictionary were not<br />

defined in this inheritance tree, we would walk to the top of the inheritance<br />

chain of implicit receiver self - without walking the side chains of lexical<br />

scope - ending on DNU if it is not found. The effect is that changes in<br />

supers do not get captured, unlike Self or Beta.<br />

Module definitions are objects. An instantiated module is deeply<br />

immutable in the module’s main: method. The mirrors you are assigned<br />

will be the ones you get.<br />

So modules are well isolated; so, how do we hook them together? He<br />

showed a slide of an Object literal (which they have not implemented yet;<br />

they do these in <strong>Smalltalk</strong> workspaces today):<br />

Object<br />

private class MyApp platform: p args: args {,...}<br />

public main: platform {<br />

MyApp platform: platform<br />

args: platform commandLineArgs ...<br />

This is like C but without pointers back to loads of places so it is<br />

sandboxed. Thus you link your modules at runtime when you start up. His<br />

slides show an example for CombinatorialParser, with grammar, parser<br />

AST and other Newspeak libraries linked explicitly via the modules’<br />

factory methods.<br />

Interoperability: don’t you just love explaining primitives to non-<br />

<strong>Smalltalk</strong>ers. Everything is a message so are primitives messages? Well,<br />

sort of; it can sometimes be hard to say what the receiver is. Newspeak has<br />

no primitives. Instead you send a message to the VM object reified via a<br />

mirror (so not everyone can invoke every primitive). In many languages,<br />

primitives are just foreign calls; in Java, for example, you call C to access<br />

some VM features. This is wrong: these ideas are distinct. The VM is not<br />

just another language. (If you do things right, the VM will ultimately not<br />

even be written in another language.) Your primitives should know all<br />

about your data. In <strong>Smalltalk</strong>, it is the other way round: calling foreign<br />

functions is usually a variant of the primitive syntax, often an ugly one<br />

since it was an afterthought.<br />

In Newspeak, you send a message to an alien object, e.g. a DLL (Niall:<br />

pretty scary alien that one :-)). Specific APIs may map to particular<br />

‘planets’ from which groups of aliens may come. Thus they can do e.g.<br />

portable native GUIs. (Current <strong>Smalltalk</strong>s either emulate or do something<br />

very low-level, e.g. Squeak’s bitmap, or are very specific to the dialect and<br />

the host OS.)


10 Shared Keynotes<br />

This lets them run portable native GUIs; he showed a vista GUI (“it runs<br />

because the licence happened to fall into my hands” but is a little flakey).<br />

The team is 4 people (Peter Ahe, Vassili Bykov, Yaron Kashai and Gilad)<br />

plus Eliot Miranda (emeritus). If they had the planned current team of 5,<br />

that would still be few people to do all this. The main thing they lack is<br />

libraries; until they are there, Newspeak is embedded in Squeak for better<br />

or worse. Squeak was a great place to start. Newspeak no longer runs on a<br />

vanilla Squeak VM. There will be some tweaks to syntax and semantics.<br />

They aim for public release under the Apache 2.0 licence.<br />

Q. Versioning? See his talk on YouTube. In the long term, he aims to rid<br />

the world of versioning.<br />

Q. Syntax of Newspeak is extensible? No; he is not a fan of extensible<br />

syntax. He will stick with <strong>Smalltalk</strong> where its syntax adds something and<br />

yield to ‘marketing’ pressure where it does not (e.g. character literals).<br />

Newspeak is the only project he knows of that actually uses its parsercombinator<br />

library for its language, as opposed to just writing papers on it.<br />

Q. Developer’s doing maintenance may need to know what the superclass<br />

is? Well, <strong>Smalltalk</strong> does not tell you what a message send will bind to. A<br />

Fortran programmer would probably say ‘I need to know’. No, they need<br />

not to know. Q. How do I know what messages my superclass implements?<br />

Same answer: you don’t ‘know’ what messages the return of a message<br />

send understands; this merely puts super in the same state.<br />

Q. Funding? It’s been easy to convince people to fund this and open-source<br />

it afterwards. It addresses issues that people care about and where<br />

<strong>Smalltalk</strong> has weaknesses (and other things have great weaknesses).<br />

Q. Security? Security has to be there from day 1 or it is never there. It is<br />

your machine you connect to the internet. This runs on Squeak so of course<br />

is not secure but it is an architecture which makes it possible to build<br />

systems that are secure.<br />

The above is how they solve issues that were known in 1980 but not<br />

addressed by <strong>Smalltalk</strong>. The world has also changed since then; now we<br />

have multi-cores and the internet. Actors (known in 1972) and functional<br />

programming are a natural fit to multi-core.<br />

(Q. Have you thought of E’s concurrency model? The project has not yet<br />

actually done anything on this. Gilad expects what they do to be more E-<br />

like than Erlang-like, and to be actor- and FP-focused. Newspeak is already<br />

very near FP, differing only in areas like initialization and similar.)<br />

In the age of the net, everyone talks about cloud computing. Clouds are<br />

vapour and, having reached the end of what has been implemented so far,<br />

he is adding his bit of vapour at the moment. Cloud computing is about<br />

delivering software and maintaining it over the net. Javascript is the<br />

assembly language of this idea and the web browser is its excuse for an


Shared Keynotes 11<br />

operating system. Using these is like going back to 1970s timesharing or<br />

later X-terminals.<br />

Web apps have their downsides. The system software has to be local, UI is<br />

the web browser (!), the network had better be reliable, fast and cheap, and<br />

session expired is the reboot of this world. Gilad does not like rebooting.<br />

As he sees it, if you need to reboot please be discrete: surely you can do it<br />

in 300ms, below his threshold of perception. Instead, his phone now<br />

reboots and his television is starting to reboot!<br />

The cloud model means the ISP is providing your computing power so they<br />

are driven to session-expiration and similar low-level computing tricks to<br />

do things like save their electricity bill (yes, seriously; talk to people in this<br />

business). There are very good reasons for pursuing solutions that use your<br />

local computing power. But the good thing is that users cannot go to<br />

Google Earth and say, I liked your 2003 web page so you must maintain<br />

that till the end of time. The great thing is, users don’t even realise they<br />

can’t ask for this. The best solutions are when the users can’t even<br />

formulate the stupid question.<br />

Maintaining the software and the data on the server provides audit trail.<br />

Having modularity gives you well-defined units of deployment, helps hotswapping<br />

over the net. Some people in the <strong>Smalltalk</strong> world are already<br />

doing things of this kind and Gilad aims to make it reasonably pleasant.<br />

State of Newspeak today: the language will evolve and may become less<br />

<strong>Smalltalk</strong>-like in some syntax: it will definitely keep keywords but might<br />

throw in some curly braces. The implementation is incomplete, especially<br />

the libraries. They don’t yet have a native GUI on Unix.<br />

Generally, they find a good synergy between Newspeak’s elements:<br />

message-based programming, object capability, modularisation and virtual<br />

classes / mixins, mirror-based reflection.<br />

Q.Syntax changes: make them settable? It is a possibility. Gilad does not<br />

trust the user to change the syntax but might allow consistent syntax<br />

schemes with the user choosing between them. He shudders to think what<br />

Ruby programmers would make of it if left to themselves. :-)<br />

Q. Lookup approach: are messages distinguished? Messages may be<br />

automatically defined from a slot or by the user in various ways. If you<br />

have separate namespaces for different kinds of message instead of having<br />

a single lookup and namespace, well, Gilad spent 10 years in a language<br />

like that. :-/)<br />

Q. Lexical scope understandability post-hoc when methods have been<br />

added to superclasses? Beta and Newspeak both find it tricky to explain the<br />

mechanism briefly but Beta found that it did what users wanted and he<br />

believes Newspeak will find the same. Ask him again when he has a<br />

million users.


12 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

Q(Georg) class extensions? Eliot liked them too; Gilad does not. See his<br />

blog post ‘Monkey Patching’. he does not expect everyone in this hall to<br />

agree with him. He sees class extensions as tending to create classes with<br />

many methods and noone responsible for coordinating them so it becomes<br />

harder to know what will happen when you load. Of course, the system is<br />

open-source and people can change things.<br />

Q(Colin Putney) Implicit receivers versus explicit receivers? In regular<br />

dispatch, the receiver is fixed. In implicit receiver, lookup must determine<br />

from the lexical chain who the receiver will be. It is not done for some<br />

specific set of reasons; it is done almost all the time for almost everything.<br />

They also have super send and sometimes you send to another object but<br />

implicit is the norm. Thus lexical gets priority because lexical is what you<br />

can see. If there really is a conflict and you really want inherited, you write<br />

self or whatever<br />

Q. Performance aims? Their baseline aim is Squeak performance. Naive<br />

implementations of implicit send lookup can hit performance; they have<br />

now optimised that. Super cannot be bound and Squeak does not do a good<br />

job of their implicit super (no <strong>Smalltalk</strong> would, he thinks).<br />

Q(Georg) What is the big picture? Making it easy to write applications that<br />

run locally but can easily be updated over the web. Gilad got people to pay<br />

him to do this by concentrating on that. Beyond that, it will be open-source<br />

and where it goes he knoweth not.<br />

<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

Seattle being a well-placed hub for travelling from Heathrow to Reno, I<br />

visited friends in Seattle the day before the conference. On Wednesday, Sue<br />

dropped me at the airport for my morning flight and drove off to her work<br />

as a coastal engineer - after which I realised that the small pouch with my<br />

cards, my money, my passport, and all means to identify me was still in the<br />

car with her. Having no means to reach her and get it back before my flight,<br />

I presented my self to the homeland security desk as a mad Englishman<br />

who forgets things and asked them to take pity on me - which they<br />

generously did. I was sent through ‘special search’ and for all I know now<br />

figure on some database, but I got to Reno. Travis kindly guaranteed my<br />

bill to a doubtful hotel check-in lady so I got a room (and Sue faxed my<br />

passport details to the hotel the next day to reassure them). Adriaan and<br />

Sytske lent me some cash. Luckily, I had arranged to fly back to Seattle and<br />

see my friends again en route home, so reacquiring my passport before<br />

attempting to leave the US was easy. All in all, it was the most painless<br />

‘arrive at airport without identification’ experience I can imagine, but I<br />

shall avoid repeating the experiment.<br />

Summary of Presentations<br />

I have sorted the talks I attended into various categories:<br />

• Keynotes<br />

• Experience <strong>Report</strong>s


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 13<br />

• Tools and Process<br />

• Aida and Seaside<br />

• BoFs and the Coding Contest<br />

after which I describe Other Discussions, note some Follow-up Actions<br />

and give my overall Conclusions.<br />

As each afternoon had two tutorial tracks and two talk tracks in parallel, I<br />

could not attend, still less <strong>report</strong> on, all I wished to see. (Some choices<br />

forced by the schedule were painful, but luckily James Foster’s go-at-yourown-pace<br />

GLASS tutorial allowed me to attend it and Vassili’s talk and<br />

Georg’s talk). James Robertson’s blog posts cover some talks I missed, as<br />

do those of other bloggers, and recordings of the talks will be posted. Talk<br />

slides and video can be reached from the STIC website http://www.stic.st.<br />

Keynotes<br />

Interfaces without Tools, Vassili Bykov, Cadence Design Systems<br />

(This talk follows naturally from Gilad’s in the Shared Keynotes section<br />

above, so is put here in ‘Keynotes’ even though strictly speaking it wasn’t.)<br />

Vassili started by doing something magical which he did not explain (it<br />

would take half the talk), so opened something that looked like the standard<br />

5-pane browser.<br />

browser := BrazilClassBrowser new open<br />

morphicDesktop := browser window desktop.<br />

windowDesktop := ...<br />

He moved the browser from the Morphic desktop to the Windows desktop.<br />

He showed that while its state was preserved from what he had selected in<br />

Morphic, the browser widgets were now true Windows widgets. He then<br />

did:<br />

windowsDesktop remove: browser.<br />

morphicDesktop add: browser.<br />

It reappeared in Morphic and he opened halos and showed doing the things<br />

you can do in Morphic and not in Windows.<br />

He calls the widget framework Brazil because he feels the movie has many<br />

references that could easily be applied to software, and is in keeping with<br />

the (Niall: slightly unfortunate, to my mind) 1984-theme Newspeak name.<br />

Morphic is just one of the native libraries from the point of view of Brazil.<br />

That was all on Brazil. The talk was about Hopscotch. The Squeak browser<br />

in is quite like the first one created in ‘76. The structure of objects in<br />

<strong>Smalltalk</strong> is 4 levels deep (categories, classes, protocols, methods) so the<br />

browser did not change much because it was a good fit to this.<br />

In Newspeak, classes nest. Thus you need an N-pane browser similar to<br />

TrailBlazer and suchlike; he sees this as a sub-optimal solution. More<br />

seriously, the browser shows you one method at a time but exactly while<br />

you are coding one method is when you need to look at other methods.


14 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

The hopscotch browser deliberately looks very like a web browser. It has<br />

buttons along the top left, a search box at top right and then panels for<br />

Navigation, Recently Visited entities and Did You Know.<br />

He went to the demo package for this talk and created a class: click button,<br />

see template, edit. He went to other places then returned and saw his class<br />

template edited as he had left it. The created class showed its name in a list<br />

with number of methods and number of subclasses tab-listed to its right.<br />

He clicked on a class and showed its comment, definition, instance<br />

methods and class methods listed in vertically-arranged panels. Some<br />

ghost methods - subclassResponsibility in super class indicated method<br />

was needed - were shown.<br />

He jumped to the Collection class and showed the methods being annotated<br />

(one by one, took a few second for them all) with icons / numbers for how<br />

many senders each had and similar. There is an icon for whether there is an<br />

overridden definition; click on it and you see the local implementors view.<br />

Vassili likes using just one window and navigating around and back to see<br />

the views you want.<br />

All this has been standard <strong>Smalltalk</strong>. He then went to a Newspeak class<br />

StS<strong>2008</strong>Demo and showed in the definition how he was importing and<br />

renaming.<br />

Slots<br />

Presenter = platform Hopscotch HPresenter<br />

...<br />

He then got panels for File and its subclass Folder under the StS<strong>2008</strong>Demo<br />

definition panel and added methods to these two classes to enable the<br />

StS<strong>2008</strong>Demo to show files of demo information. He created a demo<br />

object and sent it one of these methods (exampleDirectoryTree). He<br />

briefly presented the Presenter/Subject paradigm: Presenter is like an<br />

application, Subject like an implementor of an application.<br />

He created a class FileSubject and noted there were no ghost classes<br />

because we did not yet know its superclass; that can be bound later in<br />

Newspeak than in <strong>Smalltalk</strong>. He then created FilePresenter and gave it a<br />

method definition that called the non-existent method file, for which<br />

another panel promptly appeared. (Nothing of this is modal: Vassili can go<br />

elsewhere and return to find it as he left it.) He was now working on two<br />

methods at once, their code stacked vertically in his single window. He<br />

saved and opened a window that showed the FilePresenter on the top of<br />

directory tree, i.e. on /.<br />

In the definition method he then added<br />

..<br />

ṙow: {<br />

label: ‘Name’.<br />

label: file name}<br />

...


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 15<br />

and showed the file presenter window redisplaying to show Name: /. (Add<br />

on package adds {} array constructor). A bar of colour on the right of a<br />

panel indicates when things are being edited (i.e. dirty in DB terms). He<br />

made the FilePresenter clickable. He added<br />

private Color = platform Graphics Color<br />

Alas, Newspeak is still work in progress and so he had to reboot (Sorry,<br />

Gilad) to make this binding visible. Now he can make the FilePresenter use<br />

colour. Georg asked whether that was Newspeak or <strong>Smalltalk</strong>. Objectwise<br />

it was both, one messaging the other; syntax-wise it was Newspeak.<br />

He added ‘inspect me’ and ‘browse me’ buttons to the FilePresenter. The<br />

latter demoed getting a reflection mirror using sendUp navigatorDo:...<br />

where sendUp walks the hierarchy of widgets. He then combined these to<br />

show an inspector when collapsed and a browser when expanded.<br />

Thus we no longer have a tool. We have Presenters within Presenters that<br />

reflect the structure of the domain in the structure of the window internals.<br />

Thanks to Peter Ahe, Gilad Bracha, Eliot Miranda (emeritus) and Bob<br />

Westergaard.<br />

Q(James Savidge) Newspeak version control? Vassili is not really the<br />

person to answer that.<br />

Q. Return from method and return from block? Just like <strong>Smalltalk</strong>.<br />

Seaside: Your Next Web Framework and Persistence <strong>Solutions</strong> for<br />

Seaside, Randal Schwartz, Stonehenge Consulting<br />

Randal gave the first of these two talks two months ago to 7,500 people in<br />

Brazil. They gave him a 3-day <strong>Smalltalk</strong> conference as a result,. So he’s<br />

repeating this talk to us, though many of us know all about Seaside, to show<br />

ways of explaining to outsiders why Seaside is good.<br />

Randal likes <strong>Smalltalk</strong> because it is very simple to learn: the entire syntax<br />

can be shown in 2 minutes and explained in 20. All the libraries are open<br />

to you to show how to code and to extend. <strong>Smalltalk</strong> has been around for<br />

20-30 years so it has extensive, mature, robust material.<br />

It has very mature debugging. The walkback stack is alive: it’s not like<br />

doing an autopsy on a dead body on a table. When you mix that in with the<br />

web framework you get intra-hit debugging. Fix and resume your web<br />

session. Randal was interviewed on web radio two weeks ago and as James<br />

put it later, “You could hear the guy’s jaw dropping” as Randal explained<br />

this. (After seeing Dale’s talk on GLASS, Randal realised that he could<br />

also persist these errors and e.g. debug errors that happened last night.)<br />

<strong>Smalltalk</strong> has good unit testing. The <strong>Smalltalk</strong> community invented<br />

eXtreme Programming.<br />

Seaside uses <strong>Smalltalk</strong> for the templating language and this is very


16 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

expressive. (At this point he would show examples but he’ll assume this<br />

audience knows <strong>Smalltalk</strong>.) You paint on a canvas with a brush using<br />

objects, written in ordinary readable text, from which you naturally<br />

generate sane HTML. <strong>Smalltalk</strong> refactoring tools also make improving<br />

your code easy.<br />

You have a choice of vendors. He reviewed them. People used to Ruby or<br />

Perl find this a good point.<br />

Team development environments are <strong>Smalltalk</strong>-aware, so powerful.<br />

Squeak and GemStone have Monticello, Cincom has Store, VA<strong>Smalltalk</strong><br />

has Envy. They can all file in and out if you want to use files but you won’t.<br />

Continuations: Seaside maintains the inter-hit state transparently. You<br />

write your app as if the web is uninvolved.<br />

self firstPage.<br />

[self validate] whileFalse: [self secondPage].<br />

self thirdPage.<br />

html anchor<br />

callback: [self exit];<br />

with: ‘exit’.<br />

html textInput<br />

callback: [:value | e := value];<br />

with: ‘exit’.<br />

This handles the back button. It provides you with callbacks. It saves you<br />

form having to name all your parameters.<br />

Persistence (more in following talk): you can use object-relational mapper<br />

frameworks of which GLORP is the most obvious. Alternatively you can<br />

save as objects with Magma (watch this tree and save when I change it),<br />

Squeak reference streams, or of course GemStone for very easy, very<br />

scalable, very mature pure OO persistence.<br />

Seaside has a large community doing active development, lots of add-ons<br />

like Scriptaculous and a free hosting site seasidehosting.st.<br />

Get this talk from MethodsAndMessages.vox.com and give it at bar camps<br />

or web user groups.<br />

That ended his first presentation. Then he spoke on persistence in<br />

<strong>Smalltalk</strong>. Randal only recently reentered commercial <strong>Smalltalk</strong> after<br />

many years (but he first executed a doIt in 1981). His first Seaside app for<br />

hire was deployed last month. He has also done a lot of Seaside advocacy<br />

(which is fun but does not pay as well).<br />

Randal then talked about licensing. He has nothing against the GPL or<br />

LGPL but be aware that it can block anyone else’s use because subclassing<br />

could be regarded as derivative work. However it is a non-issue for web<br />

servers which you are not distributing. (Niall: but you must then be careful<br />

never to distribute to anyone who might want to exploit their GPL rights.)


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 17<br />

His perl experience is that with friendlier licences he can arrange to write<br />

a system, give back some code but leave the key parts with the customer.<br />

Alan mentioned that Glorp, which is under the LGPL, explicitly ‘clarified’<br />

how <strong>Smalltalk</strong> code should be handled, excluding such ideas.<br />

Persistence requires you to understand both reachability and migration.<br />

Over time, classes acquire new behaviour and instance variables and also<br />

change these. Do we tell everyone to re-login to our website or do we take<br />

people with us. Some persistence schemes deal with these; others ignore it.<br />

Persistence means dirty objects; do we have to notify or will our solution<br />

handle it automatically.<br />

Thus we have various strategies in <strong>Smalltalk</strong>. Saving the image is easiest<br />

and of course gives us most problems re the above issues. We can serialize<br />

objects in and out. We can access a non-<strong>Smalltalk</strong> database directly or<br />

through an OR mapping layer. Finally, we can run in an OO database,<br />

persistent from the start.<br />

Randal showed the simplest code to save the image every 5 minutes. You<br />

could be saving an image you could not restart so it’s better to save it with<br />

the timestamp in the name. This is good enough for e.g. a small blog server;<br />

few people will be furious if their last five minutes of blog typing has to be<br />

reentered when the occasional crash catches them.<br />

Serialization is simple if file-based. Randal also knows a couple of serverbased<br />

solutions, better for clustering.<br />

(ReferenceStream newFileName: ‘blog’)<br />

nextPut: self allPosts.<br />

...<br />

allPosts := (ReferenceStream oldFileName: ‘blog’<br />

contents.<br />

The above is from Ramon. Avi also told him about storing part of the live<br />

image on the disk. Avi is using this for DabbleDB but Randal looked for<br />

documentation and failed to find much. If you see Avi, ask him how it<br />

works (and tell Randal).<br />

SIXX converts objects to and from XML via asSIXXString. Randal is<br />

no fan of XML but observes that you can use code very like the above:<br />

(SIXXWriteStream newFileName: ‘blog’)<br />

nextPut: self allPosts.<br />

...<br />

allPosts := (SIXXReadStream oldFileName: ‘blog’<br />

contents.<br />

Be aware that SIXX streams do not inherit from the main stream hierarchy<br />

and only have some of the stream API methods implemented.<br />

OmniBase does not load into Squeak 3.9 or 3.10 and he could load it but<br />

not make it run in 3.8 so perhaps it is no longer maintained. He liked its<br />

general multi-transaction design but disliked that all dirty objects had to be<br />

explicitly marked. Unless it is being maintained, it had best be left.


18 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

MinniStore is incompatible post Squeak 3.4 and the tests fail on 3.8. Its<br />

SqueakMap entry teases you with cool things like ‘English-like query<br />

language’ and ‘multiple indexes’ but don’t go there till someone tells you<br />

its running again.<br />

Server-Base solutions are more complex to configure but also more<br />

scalable. The two main players here are GOODS and Magma. Goods is<br />

language-neutral; he even found a CPAN Perl binding called Pogo. You<br />

have to configure a server in C++, not ideal. Persistence is by reachability<br />

and it notices dirty objects automatically. All this is good but commits may<br />

conflict in which case exceptions are raised and objects get updated in<br />

conflicting ways, which concerns him.<br />

Magma is local single-user or clustered multi-user, is ACID and handles<br />

large collections. It does live class migration with some tools. However it<br />

seems to be a one-man development project (others use it). It cannot be<br />

vacuumed to reclaim old storage while clients are connected, so this blocks<br />

24 x 7 use. He likes its transparency for dirtying objects. Commit is just<br />

reaching the end of the commit block, rollback via raising an exception.<br />

There is a package, by someone whose name he forgets, that combines<br />

Magma and Seaside by adding WAMagmaConfiguration. So your<br />

configuration pages have an addition screen to configure server location,<br />

connection type (single, shared, pool). So except for the 24 x 7 and oneman<br />

operation, he likes this best.<br />

There are also interfaces for SQL DBs.<br />

SQLite is indeed light and fast. It is small enough that you can embed<br />

SQLite in your app but the <strong>Smalltalk</strong> wrapper does not do that; it uses FFI<br />

to talk to native SQLite lib. But he cannot load it into Squeak 3.8, 3.9 or<br />

3.10. (It works fine on VW and Jim’s WebVelocity demo uses SQLite.)<br />

He’s pretty sure it is a small problem, possibly due to changed version of<br />

Monticello. You connect to SQLite library, which opens a file for you, and<br />

talk to your connection. However SQLite does not handle placeholders in<br />

SQL so you must be clever to escape them correctly.<br />

PostgreSQL is similar to SQLite but much more powerful. It handles<br />

placeholders, streaming results (i.e. getting a large result not all at once),<br />

and events. It is mature and well built but is now slightly out of date and he<br />

had to monkey patch it once for a customer.<br />

ODBC he’s heard of and no more.<br />

OR mappers are Glorp, and ROE. Glorp is a very large and uses names that<br />

might conflict with other apps in non-namespaced <strong>Smalltalk</strong>s. Its test suite<br />

is large and educates you in it. A Glorp descriptor says what the table<br />

contains, what objects participate and how to map them. It is very flexible,<br />

almost too much so (needs moderate amount of work to do ultra-simple<br />

things). Glorp lets you do really interesting complex mappings e.g. row<br />

values can determine which objects were returned (e.g. return Manager if


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 19<br />

manager bit set, Employee otherwise). He creates a session object from an<br />

accessor object from a connection object from a login object - all lazy and<br />

it all works behind the scenes. It does the trace and reachability and seeing<br />

dirty objects stuff.<br />

Cincom then decided to add an ActiveRecord pattern. This will build a<br />

simple starter mapping for Glorp and then you modify as desired. The<br />

ActiveRecord may not work on all legacy databases but should be fine for<br />

80% of cases.<br />

Avi provided ROE. It is under-documented but has tests. It lets you write<br />

SQL queries as <strong>Smalltalk</strong> objects using a DNU trapper. It talks to<br />

PostgreSQL and works but appears to have been abandoned.<br />

The easiest way to do persistence is to do nothing at all. GemStone is this<br />

and see Dale’s talk, Dale’s excellent blog and all the info GemStone<br />

provides.<br />

Q(Georg) Some things alive, some dead; what is the common factor?<br />

Randal feels there has to be a critical mass of users and more than one<br />

developer. In other languages, e.g. perl, he sees these as the essential<br />

features. To get these two, it has to solve real issues adequately and be wellenough<br />

designed to let others work on it.<br />

Q(Niall) Your first talk mentioned which points played well to Ruby and<br />

Perl people; what points block such people? Mostly they relate to<br />

<strong>Smalltalk</strong>. “How do you deal with that stupid image”. He replies, “Try it<br />

for a week and you’ll never go back.” Performance, that ancient myth, is<br />

often raised; you just say, that is out of date (demo it). “If I start doing this<br />

I’ll not be hired anywhere because there are no <strong>Smalltalk</strong> jobs.” However<br />

the enthusiasm about continuations and debugging intra-hit gets people<br />

past this. He taught a 3-day perl course and in spare time at the end offered<br />

a seaside half-day. At the end people asked him, “Why did we spend the<br />

last three days learning perl?”<br />

Q.(James Savidge) Niall and I are doing work on the <strong>Smalltalk</strong> database so<br />

point them at it and maybe they’ll think there are some ST jobs.<br />

Go to seaside.gemstone.com to locate Dale’s blog.<br />

Q(James) Does anyone ask about security? The only questions are about<br />

Denial of Service attacks using old session states.<br />

Q(Colin) OR mapping is hard - he wrote one as his first <strong>Smalltalk</strong> project<br />

- and so it is natural that many have been abandoned.<br />

Implementing Programming Languages for Fun and Profit with<br />

OMeta, Allessandro (Alex) Worth, Viewpoints Research Institute<br />

Alan Kay heads Viewpoints Research. Alex works there on the ‘Steps<br />

towards the Reinvention of Programming’ project which seeks to build a<br />

whole personal computing environment in 20,000 lines of code. That is


20 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

almost an order of magnitude smaller than Squeak (don’t mention the 40<br />

million lines of Windows XP). The aim is to put people in charge: noone<br />

can understand 40 million loc but 20,000 lines is a 400-page book; a person<br />

can own that. Another aim is didactic: university students could study it<br />

and learn about architecture. They could even learn it instead of Java. :-)<br />

STEPS cares about code size and understandability. Choice of language<br />

can affect that a lot. So what language should STEPS choose, and should it<br />

be just one or several for the different part of the system? They don’t know<br />

the answer so they must experiment. However it takes a lot of time to<br />

implement a programming language, taking time from experimenting with<br />

it once built. Another problem is that traditional programming languages<br />

are big and they only allow 20kloc for the whole thing; the programming<br />

language had better not take too much of that. OMeta is a way of<br />

implementing programming languages that is quick and small.<br />

He introduced his examples with an ‘Ometa Inside’ logo complete with<br />

tune. His first example was an Ometa/Squeak implementation that<br />

generated Javascript: 300 lines with parser and all else. He showed<br />

javascripts controlling a morph and a lego game.<br />

Ian Piumarta is developing COLA, a new STEPS-oriented environment.<br />

His slide showed some things done in 350 lines of code running on Sun’s<br />

Lively Kernel. A Javascript program in a text morph evaluated on the fly<br />

to generate a spiral pattern.<br />

They also looked at Prolog ideas, but with syntax focused on nonprogrammers.<br />

Alan Kay suggested Toylog, a front-end for Prolog that is<br />

written in very English style, implemented in 70 lines of OMeta:<br />

Homer is Bart’s father.<br />

Marge is Bart’s mother.<br />

x is y’s parents if x is y’s father or x is y’s mother.<br />

Bart’s parents? -> Homer, Marge<br />

x is y’s grandfather if x is z’s father and z is y’s<br />

father or z is y’s mother.<br />

etc. The Squeak-based program that runs it lets you ask such questions and<br />

shouts the answers in excerpts from the Simpsons, complete with cartoons.<br />

Alex thinks the computing community splits into programmers and people<br />

using computers who are not programmers. A goal of OMeta is to create<br />

good domain-specific languages; these come from people who need them,<br />

not from programming languages. Another goal of OMeta is to make your<br />

apps scriptable by end-users without their having to learn <strong>Smalltalk</strong>, let<br />

alone any more ugly language.<br />

So much for motivation and goal. Next he presented OMeta in detail.<br />

Traditional programming language implementations (Squeak is an<br />

exception) use a kind of batman utility belt of specific tools for specific<br />

tasks: lex, yacc, AST transformation and suchlike tools are used to do<br />

specific things. This cannot work for their case. In OMeta, lexical analysis<br />

of characters to tokens, parsing tokens to trees, folding parse trees to parse


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 21<br />

trees and generating code from parse trees are all examples of the same<br />

thing: pattern matching. Using pattern matching for everything makes it<br />

simpler to build, easier to learn, and more extensible.<br />

Other languages have pattern matching: what does OMeta offer. ML-style<br />

pattern matching is great for tree rewriting and poor for lexing and parsing.<br />

OMeta uses a Parsing Expression Grammar (PEG) [Ford 04] which is a<br />

good framework for writing recursive descent parsers. A recursive descent<br />

parser’s ‘or’ is ordered. This eliminates ambiguities and makes the parser<br />

easy to understand (no SHIFT REDUCE conflicts). Backtracking and<br />

lookahead work better and we get semantic predicates. (?[x == y] means<br />

make sure x is equal to y; if not, fail this thread).<br />

He then showed BNF for a language (called MyLang) defined using OMeta<br />

dig ::= $0 | ... | $9:d => [d digitValue]<br />

num ::= :n :d => [n * 10 + d]<br />

expr ::= :e $_ :n => [{#plus. e. n}] | <br />

PEGs operate on streams of characters. OMeta extends that to operate on<br />

streams of objects. anything matches any one object; shorthands to avoid<br />

using it everywhere let them write ‘hello’ strings, #ans symbols, etc.<br />

He showed an example:<br />

eval ::= {#plus :x :y} => ...<br />

{#plus. {#plus. 1. 2}. 3} -> 6<br />

He extended MyLang to MyLang++ that understands minus as well using<br />

standard OO super<br />

expr ::= stuff to do - instead of + | <br />

This is an example of what he said about extensibility. We use the OO stuff<br />

we know to extend. He then showed parametrised rules looking very like<br />

<strong>Smalltalk</strong> blocks<br />

range :a :b ::= ...<br />

You can have higher-order rules. You find yourself writing stuff like<br />

formals ::= ($, )*<br />

args ::= ($, )*<br />

over and over so you’d rather write a listOfP higher order rule instead of<br />

defining comma separated lists in longhand all over the place.<br />

If we have an OMeta parser and a JSParser and only single inheritance,<br />

how do we write an OMetaJSParser. Inheriting from either forces you to<br />

clone the features of the other and later we’ll change the other and our clone<br />

will be out of synch. Inherit from both? But we may have clashes when the<br />

same name has different meanings in the two languages. So instead they<br />

offer foreign rule invocation. You can lend your input stream to another<br />

grammar: “I can’t parse this; you try”. This lets you compose grammars.<br />

There are several OMetas: OMeta/Squeak (and someone ported it to<br />

OMeta/VisualWorks), OMeta/COLA, OMeta/JS, and others are being<br />

built. Each one has syntax fitted to its host: OMeta lists in OmetaJS look


22 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

like Javascript lists.<br />

Takashi Yamamiya has done stuff in <strong>Smalltalk</strong>. He used Squeak to write a<br />

Javascript executing web page and this inspired Alex to write OMetaJS.<br />

Javascript is not <strong>Smalltalk</strong> but it is late bound, has properly closed firstclass<br />

functions and so on. Above all, it is everywhere. You can treat it as an<br />

assembly language: you don’t have to program in it, just target it for code<br />

generation. (Douglas Crockford’s book ‘Javascript: the good parts’ gives<br />

excellent insight into these issues.)<br />

He opened a browser on the OMeta/JS web page. It reminded me a little of<br />

Carl Gundel’s RunBasic pages. You type Javascript into the pane and<br />

evaluate it as if the pane were a smalltalk-style workspace. He sees no need<br />

to waste such a neat idea on Javascript so has some indirection between the<br />

code you type and the code that gets executed. He made the printIt, doIt<br />

invocations pass the string to the translator which is the OMeta and JS<br />

union he discussed above. He wrote a trivial OMeta rule to show it<br />

matching. He then went to pages with successive developments of a simple<br />

language definition and used them to recognise expressions, to evaluate<br />

them, to compile them, etc.<br />

He then showed a library of 70 lines of code written in Javascript that<br />

implements the semantics of Prolog. However to use it you must write very<br />

ugly code (he showed the code for his Simpson family definition and it was<br />

indeed horrible). With OMeta, he took 12 lines to write an incomplete<br />

parser for Prolog that put a pretty face in front of this stuff.<br />

He then showed a Logo OMeta program drawing a spiral on the page. Then<br />

he showed a source-to-source Javascript compiler. This is just an identity<br />

compiler of course, taking a JS program to a JS program but it is a start<br />

point for writing extensions to Javascript. He added a say() feature to<br />

Javascript, made the window use the new language and showed it handling<br />

say(‘Hello’), then changed it back and showed it <strong>report</strong>ing an error.<br />

Alan Kay taught a course on program design. Alex prepared an example of<br />

language bootstrapping for this course. It bootstrapped a language like<br />

OMeta, defined a compiler for the language in the language, showed the<br />

new compiler parsing correctly, then recompiled the compiler in the new<br />

language and so completely bootstrapped the language. The students liked<br />

this and some, for their projects, extended OMeta and tried things out.<br />

His last example was called Etude. Some students in the class, first year<br />

grads who had never written a compiler before, wrote a programming<br />

language to describe music, generating midi files from ‘code’. He<br />

compiled the code for happy birthday and (after the usual demo hiccough;<br />

he was so near the end I almost thought he wouldn’t have one) it played.<br />

He visited a friend with a Wii and discovered that it has a web browser<br />

(Opera) and OMetaJS works there too. Javascript really is everywhere. :-)


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 23<br />

See the DLS2007 paper or visit<br />

• OMeta mailing list: http://vpri.org/mailman/listinfo/ometa<br />

• OMeta JS Wiki: http://jarret.cs.ucla.edu/ometa-js<br />

Q. Where did the name OMeta come from? From Meta2, a 10-page paper<br />

that changed his life.<br />

Q. How up-to-date is the VW implementation of OMeta? (Jim Robertson)<br />

The latest publish to Store is May 27th. (Alex) that is recent but Squeak and<br />

will have the latest and greatest soon. Masashi Owosama is helping.<br />

Q(Georg) relation to general parsing work / research, specifically declarebefore-used<br />

variable declaration? This is more expressive than many<br />

things used today for industrial strength applications. It is more powerful<br />

than context-free grammars. Variable declaration in Javascript must handle<br />

its complex scope rules. He handles this in OMeta by having visitors that<br />

find and decorate the parse tree in multiple passes over the same data.<br />

Q. Tutorial on the web? Yes: google Ometa/JS 2.0 and find the tutorial on<br />

the website.<br />

Javascript has a bigger grammar than <strong>Smalltalk</strong>. He had written <strong>Smalltalk</strong><br />

and JS parsers before. This time he implemented a translator from<br />

<strong>Smalltalk</strong> to Javascript. His first workspace understood <strong>Smalltalk</strong> and then<br />

he extended that in OMeta to understand Javascript.<br />

Experience <strong>Report</strong>s<br />

Porting VW5i/Envy to VW7/Store, Tom Hawker, OOCL<br />

OOCL are a shipping company (see my <strong>report</strong> of Tom’s talk at StS2006 for<br />

a detailed description of its domain). The port is ongoing and has reached<br />

the point of its core being handed to QA for acceptance testing.<br />

The application is over 10 years old and was originally ported from Cobol<br />

to VW3/Envy thence to VW5i/Envy. The rich client is very complicated<br />

and has 100 of screens used modally and non-modally. The tasks that<br />

define bookings and eventually produce bills of lading are very complex.<br />

They have 2000 users on-line at a time.<br />

They want to port to get back on supported software, to get performance<br />

benefits they have noticed in VW7, and to get refactoring tools and other<br />

benefits. However there is a big cost: they expect it will take 18 months<br />

total elapsed time from the three staff (all at the talk) that work on the port.<br />

Some costs are also benefits. They have doubled the number of tests in<br />

order to make the port safe.<br />

They had to resurrect from old emails the directions to old websites where<br />

documentation actually resides. Some release guides had useful hints and<br />

they used the refactoring browser rewrite tool to find and change code that<br />

used VW5i patterns to code that used the equivalent VW7 patterns. They<br />

wrote a utility, called Topping Lift (Niall: I deduce someone on the project<br />

has a yacht), to move code from Envy to Store (StoreBridge was useless).


24 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

<strong>Smalltalk</strong> lets you look at a city skyline, raise it two inches, replace all the<br />

subsoil, drop it down again and have it look the same. Their goal was to<br />

have no changes in either application and server code and except for things<br />

like immutability, found by Refactoring Browser: this goal was achieved.<br />

A Harry Potter book mentions a cursed book you can’t stop reading; at<br />

times they feared they would suffer the curse of unputdownable code.<br />

There was no OSKit upgrade or equivalent (or suitable GemKit then, alas<br />

Paul’s work was not then available). Envy is not Store and breaking Envy<br />

users of Envy habits is also hard. Murphy’s law was a concern: throughout<br />

the code, they discovered that Murphy had been involved in its location.<br />

Column sets were modified in place to make specific windows do things<br />

the application needed and porting forward broke that.<br />

They knew that a rewrite of GemKit was inevitable given its state when<br />

they started. OOCL has a policy not to use open-source software, so they<br />

were obliged to rewrite GemKit from scratch. They went to a memorybased<br />

comparison model and reduced a six-hour build to less than one hour.<br />

They added heavy instrumentation which slows it but lets them study what<br />

they are doing. They had to map interface behaviour. He showed slides of<br />

the architecture of their GemKit implementation, and a collage of its<br />

windows. The VW-side drives the Refactoring Browser to change the<br />

image. The windows show hierarchies of changes.<br />

Store as it is does not fit their new agile/incremental development process,<br />

which aims to manage parallel disparate developments. However blessings<br />

were easy to change to match their development process. They then made<br />

it possible to label bundles with a tag or group of tags; prerequisites only<br />

match for tags specified or derived from the development. They found<br />

Store admin groups too primitive to control this mechanism so rolled their<br />

own re who was allowed to add or use tags. A slide showed all the changes<br />

to Store they made. Another showed a collage of windows: the four on the<br />

left were standard store windows with their additions, the others new.<br />

The port has taken 9 months elapsed so far (not continuously worked on,<br />

they have other things to do). The server code works fine, their frameworks<br />

are sadly broken, their GemKit does one-third of what they want it to do.<br />

Lessons learned. Noone follows their own development processes: the<br />

guidelines say use the framework this way but people use it that way, so it<br />

breaks when you port it. Envy does atomic loads that saves you from many<br />

pre-req errors. Store does not and working out why a load failed is not easy.<br />

Topping Lift was written to solve this for them.<br />

Vendor issues. Store did not come from Cincom, it came from Andersen<br />

consulting, so he has no inhibitions about being frank on its having some<br />

poor, rigid code and absent or unhelpful documentation.<br />

Murphy and his children have bigger class libraries than Jim Robertson and<br />

are impervious to bullets.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 25<br />

Q. Can you make your work on GemKit, etc., visible to the community,<br />

given that open-sourcing is not an option? Originally, OSing was the plan<br />

but Hong-Kong may not be open to the idea. They may be able have<br />

GemStone or Cincom cast a vague protective shield over its appearing in<br />

the Open repository or similar.<br />

Using User Changes, Leandro Caniglia, Valeria Murcia, Caesar<br />

Systems<br />

(This talk was also presented at <strong>ESUG</strong>; this write-up merges information<br />

and questions from both presentations.)<br />

Leandro presented but explained the paper is in fact almost entirely the<br />

work of his wife and colleague Valeria with occasional help from him. The<br />

smalltalk change system has a few stable commands (add class, method,<br />

...). A living application has many, changing commands.<br />

In their system a composite pane contains a wrapper round its model<br />

object. When it sends a message to its model object, the wrapper logs the<br />

message and passes it on. To the user and the programmer, this mechanism<br />

is transparent. Only messages that change the model are logged.<br />

The wrapper logs by creating a Change object which reifies the message.<br />

The Change validates itself; in debugging mode, the user gets a warning if<br />

this fails. Validated changes get added to the appropriate change collection,<br />

which can be written to a file for replay.<br />

Changes know their timestamp, author, message selector, receiver name<br />

and arguments. Validation checks that these are non-nil and non-empty,<br />

that receiver names resolve to an object that responds to the selector, and<br />

that the appropriate number of arguments for the selector are provided.<br />

Their mechanism for naming objects uses names like a:b2:c2 to trace<br />

from root object a to b2 and thence to c2.<br />

ModelObjectWrapper has nil superclass. It knows the object it wraps and<br />

its changeLog. Their first thought was to have a wrapper class for each<br />

class in their GUI but this merely duplicated their existing class hierarchy.<br />

They soon realised they only needed one object that recognised all<br />

messages in the GUI and sent them all to the wrapped object.<br />

doesNotUnderstand: aMessage<br />

| selector |<br />

selector := aMessage selector.<br />

self shouldBuildMethodFor: selector)<br />

ifTrue: [self buildMethodFor: selector]<br />

ifFalse: [aMessage receiver: wrappee].<br />

^aMessage perform<br />

When a new message is first generated, the programmer is prompted to tell<br />

the system whether this message changes the model or not (if the question<br />

makes sense; they keep a list of many messages for which there is no need<br />

to ask). If the user says it does, the wrapper acquires a new message, e.g.


26 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

oneArgSelector: arg<br />

changeLog newChange<br />

receiver: wrappee<br />

command: #oneArgSelector:<br />

argument: arg.<br />

^wrappee oneArgSelector: arg<br />

He showed this in the browser for the renameTo: method.<br />

The system therefore has a single ModelObjectWrapper class, a single<br />

Change class, a single UserChange class and a single ChangeValidator<br />

class. Most methods are automatically generated so the framework is very<br />

lightweight, development-wise.<br />

Their interest in changes of course is not to log them but to replay them.<br />

Leandro restarted their system with an empty project, showed it was empty,<br />

reran the changes and showed it had the same set of objects.<br />

Changes filed-in are always validated (they are coming from a file that<br />

might have been edited, corrupted or whatever) and the user is always<br />

warned if validation fails. They send the replied mechanism to the wrapper,<br />

not the receiver, to replicate the precise behaviour, including the logging,<br />

that created the change originally.<br />

Having outlined the system, Leandro discussed applications. They can<br />

replay their work whenever needed. They have auditing; you can see who<br />

did what, and also what changed recently in a model. You can right-click<br />

on an object and get the list of commands sent to that object. You can go to<br />

any part of this history and replay the change; this can be used as a kind of<br />

local undo/redo. He showed entering some data on a form and accepting,<br />

then changing his mind, getting the changes and altering the input data.<br />

You can use the change log as a scripting mechanism. The same approach<br />

gives you demo scripts and tutorials (and trouble-free conference talks :-).<br />

You can overcome backward-compatibility problems. If your model will<br />

not load in your new system, try replaying its change log in the new system.<br />

You can often fix the problems and complete this sequence.<br />

Merging changes is easier than merging projects. If a user calls you with a<br />

problem, and you take two days to solve it, the user will also have changed<br />

their model during that time. So instead of sending them your altered<br />

model, you send them your change set for the fix.<br />

Support: you can send the user the changes that show how you tried to<br />

reproduce a bug. They can send you the changes that elicit a bug, or just<br />

their recent changes when they don’t know what they did to elicit a bug.<br />

Once you have a script that shows a bug, it can be reused as a regression<br />

test, and it will help you write a test for that bug. Scripts can also teach the<br />

system to new programmers. Users can share patterns, ideas, etc., by<br />

sending the changes for an example of them.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 27<br />

You can count the number of commands or (by multiplying by command<br />

length) the number of keystrokes a user needs to achieve a given state. This<br />

is a useful metric to advertise for a productive <strong>Smalltalk</strong> system. You can<br />

also look for confusions or bad practices in your users.<br />

Changes were once <strong>Smalltalk</strong>’s CM system. You can still use changes to<br />

combine several people’s work on a model. Database accesses that did not<br />

commit can be recovered from their change set. Work done at home can be<br />

added to the central repository.<br />

These are general uses. They have also uses specific to their system.<br />

Scenarios can be captured as change sets and written out for later reexamination;<br />

these change sets are much smaller than keeping a copy of the<br />

whole project in the database.<br />

Decision Analysis is a growing area of interest in their domain. Users can<br />

create a base model and explore scenarios, keeping the change set for each<br />

scenario. You can then copy the base model and apply a scenario change<br />

set. Each scenario is a child of its base since if the base model changes,<br />

each scenario will see those changes. This can be repeated to create a<br />

decision tree of changes to the model, in which each parent change set has<br />

changes common to all of its children who also have their own changes. He<br />

opened a tree browser in their system to see a tree, annotated with the value<br />

of interest.<br />

They also do Monte carlo simulations.<br />

This was inspired by the <strong>Smalltalk</strong> change log, Dan Ingall’s Squeak event<br />

recorder and Valeria’s own work on that to include Morphic wrappers long<br />

ago.<br />

Q. Changes can be applied quickly (by design)? Their validations ensure<br />

this.<br />

Q(Christian) changes separated syntactically? Yes via <strong>Smalltalk</strong> ! chunk<br />

separator.<br />

Using Opentalk in an Unexpected Way, Giorgio Ferraris,<br />

OpenTalk makes communication between two <strong>Smalltalk</strong> images easy. It<br />

also does other things but <strong>Smalltalk</strong>-to-<strong>Smalltalk</strong> is what Giorgio will talk<br />

about today. OpenTalk is in your VW image today. It is mature and robust.<br />

It is a tool you have in your pocket to us. Giorgio heard talks about<br />

OpenTalk and often thought “must use that” but never had occasion to do<br />

so. Until ...<br />

He had a monolithic client-server application built in the last three years to<br />

support tour operators. It runs on Windows and Linux in VW and was sold<br />

as “this will run wherever you want.” Then a customer needed to connect<br />

an AS400 database and this needed ODBC. In Windows, it was not a<br />

problem: they built the connection and it ran fine. But then the customer<br />

wanted it to run on Linux. ODBC on Linux? It’s a nightmare!


28 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

They had to find a solution quickly. The customer had the app and had paid<br />

for it. Giorgio was called on the Saturday by a most unhappy tester.<br />

Can we connect from a Windows machine where ODBC is running to the<br />

application running in Linux. Web service was not adequate. Then they<br />

thought of OpenTalk.<br />

OpenTalk is easy to use, Giorgio opened two images and demoed a simple<br />

OpenTalk example.<br />

serverBroker := RequestBroker newStstTcpAtPort 4242.<br />

serverBroker start.<br />

serverBroker objectAdaptor<br />

export: Transcript<br />

oid: #transcript.<br />

and the same in the other image for the client<br />

clientBroker := RequestBroker newStstTcpAtPort 4243.<br />

clientBroker start.<br />

clientBroker remoteObjectToHost...<br />

His experience: OpenTalk was easy; almost too easy. Because you can get<br />

it working in seconds, it is easy to forget something it would have been<br />

better to handle.<br />

He showed his domain model. DbConnection was the abstract superclass<br />

of the specific database connections. HOPOdbcConnection was the<br />

ODBCconcrete class and SqlTranslator generated the SQL query from the<br />

systems request. The right place for OpenTalk was between the two of<br />

them. In two hours, they had the new system running.<br />

However everything was running in 2 hours so a relieved Giorgio forgot<br />

many things. Giorgio was running 2 images on the same PC. The<br />

developers are in Italy, the customer is in Genoa and Giorgio is at home so<br />

errors cost delay as these different locations and times got back about them.<br />

When you are on the same PC and environment, you may not notice you<br />

are not handling things correctly (see ‘too easy’ comment above). You can<br />

pass an unexpected component e.g. a system resource, that you should not.<br />

You cannot see latency issues. So he moved to two PCs. On the same local<br />

network, the latency is still low but now sending a local ODBC handler to<br />

the other operating system will raise an error. He now saw that not all<br />

methods in the monolithic system were still valid on a distributed system.<br />

A proxy was needed to filter methods appropriately.<br />

Next he moved to two machines with different OS, Windows and Linux.<br />

Now filenames were being written in Linux’ way and sent to Windows; the<br />

slash was wrong. The final try was to run over a slow connection. This<br />

exposed latency problems that needed optimisation. If you run smoothly<br />

over an internet connection, the task is complete.<br />

They have a DbEngine for each database they support. The SqlTranslator<br />

needed information from the DbEngine. OpenTalk sends references not


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 29<br />

values except for simple types (string, number, ...) so this generated much<br />

flow across Opentalk just to get data that was always the same for ODBC.<br />

Passing this data by value was the answer but it was hard to find how to<br />

make that change in OpenTalk’s documentation and he found it in a<br />

presentation slide.<br />

OpenTalk holds weak pointers to published objects, so remember: you<br />

must hold a reference yourself; don’t expect OpenTalk to hold it. Giorgio<br />

refactored away an instVar he no longer needed and could not understand<br />

why his system now ran fine for 10 minutes or 5 or 2 and then suddenly<br />

died (when the GC took an object he needed).<br />

A TCP/IP port allows one client only. When the customer ran many clients<br />

on the same Linux box, they needed to loop up to the first free port.<br />

(Giorgio’s slide shows the code he wrote to handle that.)<br />

When you have a hammer, everything looks like a nail. After getting<br />

OpenTalk running in 2 hours, he started using it everywhere. He uses it for<br />

two reasons: for scalability and because of necessity. He has other systems<br />

where he is being forced to move to distributed systems.<br />

They had a system running on Linux that wanted to add data (e.g. specific<br />

addresses) to MSWord documents. They created an MSWord server image<br />

on Windows talking by OpenTalk to the Linux system. He demoed this,<br />

loading COM and his package for MSWord document handling into one<br />

image, while another, without this, made requests for information from<br />

MSWord documents. The local image used class side calls but Opentalk<br />

prefers instances so slight changes to the API were helpful. He added the<br />

new method openVisible (‘visible’ so we can see it; you can also do this<br />

in background without having Word documents popping up on the screen).<br />

He now showed how COM raised a warning when a weakly-referenced<br />

instance dies (alas, ODBC does not warn). Then he went to the client, filedin<br />

a dictionary with some address values, got the remote reference and tried<br />

to call it; it has vanished so we saw the debug window in the client<br />

complaining that the server was denying all knowledge. Then Giorgio went<br />

back to the server and made sure he had an explicit reference on the server<br />

side so it did not vanish. Then it worked.<br />

A hotel supplier they supported only has a COM interface; their webservice<br />

interface is still being built. So they used OpenTalk to let the Linux<br />

system talk to that interface.<br />

Now they find they want to build an architecture on OpenTalk to facilitate<br />

their uses.<br />

Conclusion: OpenTalk is well built and scalable. Documentation could be<br />

better but Martin Kobetic was always there for them.<br />

Q(James Savidge) Any rules of thumb for when to pass by value, when by<br />

reference? No, we just let performance drive us. If the performance bugged


30 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

us, we considered switching to value passing, otherwise we accepted<br />

OpenTalk’s default behaviour.<br />

Q. Need to redesign for distribution? Not really, In the ODBC task they<br />

found places where the system was ill-designed and rework helped but that<br />

was not OpenTalk specific.<br />

ControlWORKS, James Savidge, Adventa<br />

(Impromptu talk offered by James after a BoF.) James demoed<br />

ControlWORKS 4.3 running on VW7.4. (Because their customers are<br />

large they like carefully staged upgrades, so tend to be running a version or<br />

two behind.) James had worked in the wafer fabrication domain and<br />

wanted to keep working in <strong>Smalltalk</strong>. He was therefore pleased to get a job<br />

with Adventa some two years ago, after two years coding in Objective<br />

Forth. He was hired to work on their related ProcessWORKS product but<br />

the trend of work that customers needed led him to ControlWORKS. He<br />

will be visiting a customer on Monday to show, amongst other things, the<br />

configuration comparator work he has recently done.<br />

The main image controls other images run on embedded machines running<br />

Windows or VxWorks. Their TMC image can control the robot and the<br />

interfaces to the central chamber. The same image with different<br />

parameters does the process monitors. He started one of each on different<br />

ports. The ControlWorks UI opened. The interface it uses is to a<br />

considerable extent required to be what it is by industry standards.<br />

(Industry wants operators to be able to move from machine to machine<br />

without having to handle different interfaces.)<br />

Users must login; this is mainly for capability: different users can do<br />

different things, especially can or cannot do dangerous things. They also<br />

have interlock, rules in the scheduling engine that are there not to allow<br />

things but to prevent things. You don’t want to replace one chemical in the<br />

chamber with another immediately afterwards if the two make an explosive<br />

combination.<br />

(The usual demo hiccough occurred at this stage. Everything appeared<br />

started but the control image was not doing anything. At first, James<br />

shutdown all the modules and started over but it emerged that parallax on<br />

the demo machine was the problem; it was doing an imperfect job of<br />

emulating the appropriate OS. He had to reboot it and stop displaying to the<br />

big screen; instead we clustered round his machine. Later, he had to use two<br />

mouse devices, one to move the mouse arrow, the other to get right-click<br />

menus.<br />

Because we were clustered round his machine, I could not take my usual<br />

notes at the time. These were typed up from memory afterwards and may<br />

contain errors. See user <strong>report</strong> on ControlWorks in my <strong>Smalltalk</strong> <strong>Solutions</strong><br />

2005 <strong>report</strong>.)<br />

James took us through several features of the app. An impressive graphical<br />

widget embedded in the screen to manage a cluster shows its circle of


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 31<br />

chambers with their valves, the robot moving wafers between chambers<br />

and the input and output wafer stacks. The robots, the values to the<br />

chambers, etc., are controlled by the scheduling engine, whose efficiency<br />

has immense financial significance. A stack of wafers input to a cluster<br />

might contain 25 wafers. If the scheduler allows the cluster to process two<br />

extra wafers in an hour, that could mean $500,000 extra earned by the enduser<br />

of this system.<br />

The system must manage the drift of the machine from its initial behaviour<br />

as it gradually gets ‘dirty’ (understand this in a very relative sense) with<br />

use, and must schedule the various maintenance processes that restore it to<br />

pristine state. At a given point in this cycle, the exact times and settings to<br />

do various things will differ. It must also manage the tolerances that the<br />

various analogue processes involved can endure.<br />

One of the key features is user-customisation. Users may create subclasses<br />

and connect the rules to them, etc. These configurations can become<br />

complex. James showed recent work on a comparator that lets both them<br />

and their user see the differences between configurations: all differences or<br />

just the important ones as they step by step see examples of and exclude<br />

types of difference that are not of concern.<br />

All in all, it was a powerful, well-elaborated system. It is well-placed in its<br />

chosen domain and could probably be applied in others, wafer-fabrication<br />

not being the only task using robots, complex processes and schedules.<br />

Tools and Process<br />

VA<strong>Smalltalk</strong> 8.0 and Beyond, John O’Keefe, Instantiations<br />

I’ve incorporated all the material, discussions and questions from John’s<br />

StS and <strong>ESUG</strong> presentations into his most recent one at Frankfurt.<br />

GemKit, Paul Baumann, Intercontinental Exchange<br />

GemKit was built by GemStone consultants for their customers. Later it<br />

was open-sourced at Camp <strong>Smalltalk</strong>. Paul has worked on it and version 4<br />

was released immediately after this presentation.<br />

His demo was of updating VW code from an empty GS/S database. He<br />

opened a vanilla VW image with GemStone client loaded (GBS). He<br />

loaded the GemKit code (connect to repository, load the version, very<br />

straightforward). GBCManagement does the main work. SystemUser<br />

represents the users in the GemStone dictionary. Each user can have their<br />

code maintained separately. Some extensions that GemStone needs (and<br />

that Paul will get added to the GemStone base release later) are supplied<br />

Normally a dialog would lead you through installation but his demo<br />

database has GemKit installed. He opened the comparison browser and<br />

showed how the ‘exclude similar’ button lets the user ignore white-space<br />

differences. Whenever there is a difference, the browser shows 2 panes,<br />

one for the database and one for the image, with colour-coding of the<br />

differences. His demo had 6,000 pieces of code to compare (GemKit<br />

seemed fast and responsive, given this number).


32 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

He updated the code (there were few changes since the demo image and the<br />

database were well aligned) and the globals (many changes). Some VW<br />

prompters (e.g. for do you want to capitalise Globals coming from<br />

GemStone with lower-case names) are not yet hidden by Paul.<br />

GemKit uses the original GSS class definition method. Later, he will allow<br />

exploitation of VW’s ability to add attributes to classes.<br />

He then went to an application database with code. He showed producing<br />

a patch that can apply a set of changes repeatedly. He first compared the<br />

code in the package (116 differences) then compared all the code in the<br />

Globals namespace (many more differences). A specific application would<br />

categorise (e.g. as GemKit, PerformanceProfiling, ...) and you update<br />

against specific packages rather than just update everything into the<br />

Globals namespaces unsorted (when you would be unable to distinguish<br />

general extensions from application-specific code and so on).<br />

He then used the compare tool to examine specific changes and do specific<br />

updates. Then he logged in as DataCurator and looked at AllClasses. He<br />

reverted a couple of things that had been changed to be capitalised (because<br />

he had OKed VW prompters which in fact you would not OK) and<br />

otherwise the ‘SystemUser’ and similar code was largely unchanged, with<br />

new code in ‘Managers’ and elsewhere. In VW, he showed that the changes<br />

where he took the GemStone code were also in the appropriate packages.<br />

If you do not commit, you lose your changes in GemStone but they remain<br />

in VW, which might sometimes be what you wish but usually of course you<br />

will commit.<br />

When you get used to using GemKit you may well want to edit the bundle<br />

specification to e.g. move Globals out of it or otherwise associate your<br />

specific changes to your application bundles rather than GemKit. This is an<br />

appropriate part of adapting GemKit to your application’s use of it.<br />

He showed comparison of 26,000 definitions between GemStone and VW<br />

with an unprepped shared page cache. It took a few seconds: maybe as<br />

many as ten. You can reformat to make the code appear to match, formatwise,<br />

in both panes and scroll both panes together.<br />

So far, he had showed developer tools. You can also file-out the entire<br />

symbol dictionary to be filed into GemStone via a topaz script by a<br />

database administrator. He showed generating a patch of differences and<br />

filing-out those (he demoed this for a package but you would more often<br />

do it for the entire bundle).<br />

If you have a package with several integration-ready changes from several<br />

developers, all in different bundles, then they can be hard to find. A tool<br />

(the ReleaseAssistant) finds all such changes that are under a selected<br />

bundle and lets you select and merge to produce an overall set of changes<br />

to apply. He demoed using the release assistant to see changes from another<br />

developer, create an integration build of all the changes, apply comments


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 33<br />

that will only be set on his own changes, etc. The tool warns if you include<br />

a change that the merge tool would exclude under ‘exclude similar’.<br />

Paul then showed how, if you have been lagging, you can apply your<br />

changes to the latest build. The setting ‘make changes on the latest build’<br />

does this. He loaded a previous version, selected a method that was<br />

changed and demoed this.<br />

Many people have two paths - a release path and an ongoing development<br />

path - and if they make fix changes in their release path they want to apply<br />

them to the development. The merge tool lets you apply changes in path to<br />

another path, with ignoring of white-space differences, etc.<br />

Q(Dennis) Exception-handling? GemKit has approaches to handling<br />

exceptions and subclasses.<br />

Q(Dennis) I have 3000 identical non-GUI subclasses? GemKit had a<br />

feature called mirroring which has not yet been ported to this Storeoriented<br />

version but could be got to work.<br />

Q(Niall) Some methods that are naturally different (e.g. DNU has different<br />

implementation in GemStone and VW)? This would be handled by putting<br />

the ‘don’t make the same’ code in a package or packages that you would<br />

know not to publish to/from GemStone.<br />

Q(Dennis) I have 20 databases to be updated every night? Paul thought<br />

Dennis’ existing process solution for this would probably use GemKit<br />

within the overall process rather than be replaced at top level by GemKit.<br />

Q. Method deletion? Comparison tells you and will remove (old GemKit<br />

had an ugly ‘remove everything and reapply’: this has been fixed).<br />

Q. Production users? Usually, only developers use the tool. The artefacts<br />

button is customised for apps; at Intercontinental Exchange they show a<br />

dialog to produce paths and etc. and where they were saved so production<br />

users find the patches where they expect and run them when appropriate.<br />

Monticello, Colin Putney<br />

(I had to leave before Colin’s talk was due but he kindly demoed for me<br />

during lunch on the last day. Read these notes in conjunction with my 2006<br />

<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>report</strong> on Monticello.)<br />

The UI is what is new. The Monticello 1 interface looked at the whole<br />

image at once and all the repositories you knew about: you had to set up<br />

repositories for each package manually. The new UI project ties together<br />

all the bits that go with Pier or Seaside or OmniBrowser or Monticello<br />

itself. All the slices, all the repositories are grouped and you save a<br />

snapshot to all the repositories (that you can see: you can synch with the<br />

rest later). When you load, you load from any repository where what you<br />

want can be found (checked in the order you added them at the moment;<br />

later he may add a strategy e.g. to take from local repository if available).


34 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

The next task is a much better merge tool. The merge command is ‘include’<br />

to make clear that its semantics differ from what you expect in Store or<br />

Envy.<br />

Italics mean an item is loaded, bold that it is not in the currently loaded<br />

item’s history. The tool shows all different elements, in bold if conflicting.<br />

The layout of the tool is diagonal: the bottom left pane shows the code in<br />

your image; the top right pane shows the code in the version being<br />

compared. This is unlike all other merge tools I know, but in all those other<br />

tools I find it is easy to get confused about which of the two lower panes<br />

corresponds to which of the two versions you are viewing. You can resolve<br />

in various ways and see immediate unbolding / whatever. Resolution code<br />

appears in the bottom right pane. You can edit the method there and save<br />

it; if you go elsewhere and come back, your edits are still there but not yet<br />

in the image. This is useful when you need a third option but must apply<br />

things atomically. You then apply all to image and snapshot to write to the<br />

repository. Applied resolutions are marked dirty so you know to save.<br />

Normally, resolving and publishing decides the history; that your choice is<br />

preferred to its rival when merging is known to the repository. (However<br />

you can also apply a resolution without enforcing the ‘my choice is the<br />

right choice’ record. You can apply to image without creating history.)<br />

When merging later to a third version then if a method or class definition<br />

version in it superseded the version you chose the tool knows that and<br />

offers that as the preferred choice - which you can change but usually you<br />

will take it.<br />

So far, this has been simply improvements to version 1’s features. The<br />

project configuration slice is a new feature: Projects themselves are<br />

versionable. Colin distinguishes a project’s repositories and its line-up: the<br />

slice of the project’s contents that are loaded, the versions that are loaded.<br />

Colin demoed loading a changeset slice.<br />

Documentation is to be written. He wants to write both a user guide and the<br />

technical definition. He is porting to GemStone. He also wants to port VW.<br />

Release will be soon.<br />

Automating <strong>Smalltalk</strong> Builds with Cruise Control, Randy Coulman,<br />

Key Technology<br />

This is half a how-to talk, half a <strong>report</strong> of Randy’s experience. Key<br />

Technology build big food-sorting machines (see <strong>Smalltalk</strong> <strong>Solutions</strong> 2006<br />

talks by Travis and Randy). 60% of their code base is in <strong>Smalltalk</strong> and it all<br />

runs on Linux. Builds should be automated because people make mistakes,<br />

especially when under pressure to meet a release deadline, which is just<br />

when you will be doing the build.<br />

Continuous integration is an XP value. Every time you make a change,<br />

send it to an integration machine that adds it to the main build. It was<br />

introduced in Envy but proved hard to translate to more conventional tools<br />

in which branching and merging are heavier tasks. Thus a tool for CI is


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 35<br />

needed. Key has multiple languages and their CI tool gives them an .iso<br />

image (of their C, C++ FastScript, <strong>Smalltalk</strong>, Graphics files, etc.) that they<br />

can burn on a CD and ship at the end of every check-in. They’ve been using<br />

ANT for 6 years. ANT drives CruiseControl.<br />

He opened a VW image, published a couple of packages (Key do not use<br />

bundles) and showed the automated build. It starts with a quiet period when<br />

the system things “he’s just published so maybe he’s still publishing”, after<br />

which it kicks off the verbose script. He opened his mail and saw his build,<br />

including a warning that a remote tester that he cannot see at this site was<br />

not reached for some tests. (They archive these emails for years back,<br />

sometimes useful for reconstructing when things were done.)<br />

CruiseControl was an open-source project written in Java released by<br />

ThoughtWorks back in 2001. It has a pluggable architecture. It has a build<br />

loop, a JSP-based recording application (he opened a web page and showed<br />

his project). He thanked Arden for publishing James’ build scripts which<br />

have been very useful. He went over them carefully (James: “They work<br />

just as well as my code.” Randy: “That’s why I went over them very<br />

carefully.” :-)) and a dashboard (newer; he’s unsure whether he likes it or<br />

not since the information is in a more attractive format but possibly less<br />

usable) that shows when your builds last passed.<br />

Travis built a <strong>Smalltalk</strong> system which Randy changed to work with cruise<br />

control for working with the rest of their code. CruiseControl 2.7.2 has<br />

Store support: Randy wrote it and the project added it the same day he<br />

emailed it to them.<br />

The build loop checks for changes, builds (“compile”, run tests, create<br />

debian packages, etc.) and publishes the results. Their C, C++ usually has<br />

make files so “compile” is calling them. For them, publishing the results is<br />

an email; you can make lights flash if you want to. They configure via<br />

XML; he showed the XML file of the build instructions.<br />

The raw XML has a lot of duplication and there are ways to reduce this<br />

using preconfigured XML entities or whole projects. He showed the<br />

refactored file that used these. Two pages reduce to 12 lines or so.<br />

CruiseControl lets you do remote control via Java Management Extensions<br />

(JMX). The UI is ugly but it lets you force builds, or pause the build while<br />

you put something it needs in place or do some maintenance without which<br />

it would fail. He forced a build and showed the email.<br />

For <strong>Smalltalk</strong> builds he tried to follow the standard Cruise Control<br />

expectations. He checks Store for changes (StoreForGlorp made this much<br />

easier than it would have been in standard Store). A version regex exploits<br />

their versioning standards to find what it needs. A file is used to cache the<br />

Store change information so he does not have to refind it at each point in<br />

the process. It is ordered by dependency, so it is a valid load order. The<br />

search is with reference to a particular timestamp.


36 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

He showed their prerequisite graph tool (thanks to Martin and Travis for<br />

cleaning it up) which is in the OR.<br />

A TestLogger package runs the SUnitToo tests (or it could run SUnit of<br />

course). It outputs in the format that JUnit uses because CruiseControl<br />

knows that. Then they run Fitnesse tests (see his tutorial).<br />

His slides show useful links, including his blog for more information on all<br />

the above.<br />

Q. Determining which version to load? We load the latest that matches the<br />

version regex. You can set a minimum blessing level as well.<br />

Q(Peter H-M) Stripping? It can and they do a little of it. They build on a<br />

base image from which stuff they do not need are mostly stripped anyway.<br />

Travis is using some of this stuff and extending it to use bundles.<br />

Q(Peter H-M) SUnitToo? Travis’ variant of SUnit that holds tokens, not<br />

whole test cases, so avoiding delaying GC.<br />

As an experiment, he built a variant that ran all his tests every time he<br />

accepted and he likes it better than he thought he would.<br />

AIDA and Seaside<br />

AIDA/Scribo: a powerful CMS at your fingertips, Janko Mivsek,<br />

Eranova<br />

Sadly, Janko could not be here so Martin Rueger gave the presentation.<br />

AIDA is not Seaside but it is a powerful web framework with many<br />

capabilities. Scribo can be compared with Pier. It is a content management<br />

system built on AIDA. Janko tries to have everything is in <strong>Smalltalk</strong>, even<br />

things like proxy path handling. It uses AIDA’s strengths: an MVC model,<br />

REST-style interface, built-in security, components and AJAX. The RESTstyle<br />

bookmarked URLS are important for CMS systems.<br />

Scribo is well suited to blogs, wikis and complex document-style sites.<br />

Developers can use it to do many things. AIDA runs on Squeak and<br />

VisualWorks. Scribo is mainly exercised in Squeak today but should work<br />

in VW no problem. Scribo was inspired by a prior system called BiArt.<br />

Components in Scribo are called scriblets. The core of Scribo is a<br />

Document. Versioning is built-in and many versioning schemes are<br />

supported. The rest URLs make it possible to interact with the versioning<br />

programmatically and/or webwise if needed.<br />

Documents have lifecycles. Scribo provides a range of states e.g. pending,<br />

redo, approved, released, obsolete, so an organisation can realise its<br />

process in the CMS. Folder is a subclass of document, Documents have<br />

chapters, horizontal and external links, etc.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 37<br />

Scribo has good multilingual support, mapping user language to display<br />

language and locale.<br />

Scribo is in alpha currently. Plugins are generic Wiki with subclasses Blog<br />

(very complete) and Website (less complete at the moment, so much like<br />

its Wiki superclass).<br />

Scriblets, components embeddable into the text, are how you extend<br />

Scribo. There are predefined scriblets like Gallery and Table of Contents,<br />

and developers write custom scriblets for what else you need.<br />

Aida grew out of legally-valid-archiving work done by Janko years ago.<br />

See Scribo on the web at nico.bioskop.fr (blog), Squeak Project Manager,<br />

the BiArt/ISO quality management system, www.swazoo.org,<br />

www.aidaweb.si and www.nets.si (a commercial website that shows<br />

templating scriblets).<br />

Future work: Janko will also do work in VW and his version of GLASS:<br />

GemStone, Linux, Aida, Squeak and <strong>Smalltalk</strong>. There will be more plugins<br />

and more scriblet sites.<br />

Michael then demoed, launching the server in Squeak then going to his web<br />

browser. He logged in. Yesterday he had to set all his permissions since that<br />

is not automatic yet; that will be one of the beta things. He went to the blog<br />

settings page and then wrote a blog post (using the same rich text editor that<br />

other systems use).<br />

Then he went to the wiki. It uses the same text editor, lets you add links<br />

using a typical smalltalk wiki syntax (WikiWorks IIRC: links are written [a<br />

link title>PageNameOrURL]. He created a page with an image. The<br />

settings page lets you configure the virtual host and other things that other<br />

systems would leave to Apache but Janko lets you do in <strong>Smalltalk</strong>. You can<br />

still do it in Apache instead if you wish but his replacing of the A in GLASS<br />

has reason. Other settings let you control access rights and see statistics for<br />

your site. Thus you get a server with everything in it, all very easy to find.<br />

Martin feels that is where this stuff shines.<br />

Q.Is this for platform applications or for general web stuff i.e. more static<br />

stuff? Rob Rothwell explained that it has AJAX built in and Nicholas<br />

Petton has been working on Scriptaculous.<br />

Q. Seaside scriblets? Janko is thinking of it. The different component<br />

models of the two systems mean a framework would be needed.<br />

Why <strong>Smalltalk</strong>? A Healthcare Perspective on Creating Internal<br />

Domain Specific Languages, Rob Rothwell, Fairfield Medical Center<br />

Rob Rothwell is not so much a programmer as a user who users computers<br />

to solve his problems. Janko helped him a lot to get a web framework on<br />

his app and he found he’d agreed to present.


38 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

50% - 60% of a hospital’s income comes from medicare and medicaid.<br />

They lose $3-5 million per year in their emergency room since people go<br />

there instead of visiting their doctor. They would like to save money.<br />

All the advances in medical care means increasing specialisation. The<br />

result is less holistic medicine. This in turn leads to complaints and this<br />

leads to government regulation: prove you gave the heart attack patient an<br />

aspirin within 24 hours. This is called ‘transparency’ but it is a lot of work<br />

for the hospital and it is ‘voluntary’ but income will depend on your having<br />

tick marks instead of red Xs here, there and everywhere. Then the<br />

insurance company decides to use the government’s scheme but with<br />

differences. So he has to generate that information as well.<br />

Having achieved this, he has to send the data through a vendor, not directly<br />

(legal requirement lest he fudged his data) so 3 months elapse iterating this<br />

data through the vendor and then they learn they failed, which is too late.<br />

How did he get into this? Well when he left the army he wanted to find<br />

somewhere he could make a difference and this is where he arrived.<br />

Everyone in the hospital is very IT challenged. This is not a criticism; it is<br />

the situation. Times are written down on forms and they do not match the<br />

times in the system and a project is needed just to match these for some<br />

data.<br />

All the above is an opportunity: large IT companies supply monolithic<br />

systems that are too rigid here and too customisable there and people in the<br />

hospital use 10% of it at most because they have not time to learn the rest<br />

or it does not really match their needs.<br />

Example: he tried to measure the cost of a surgery case. To know the cost<br />

you have to see what was used and know what each item cost. They<br />

collected all the wrappers and tried to match them to the names: an item can<br />

be called an adaptive dressing by one person and a non-occlusive dressing<br />

by another and the database has a third name that matches neither of these<br />

anyway. Is this a 1 inch needle or a 1.5 inch needle? People run out of the<br />

room and get new items quickly; if time allows they scan it, but if the<br />

patient is in a serious state they’re too hurried so you get the barcodes from<br />

the waste bin.<br />

One provider provides barcode scanning. It takes many screens and<br />

mouseclicks to get from the front screen to where the barcode can be<br />

scanned. Then you must find the right keyboard wedge to scan and ensure<br />

you’re on the right place on the screen. This is hopeless both for the<br />

technically-challenged workforce and for the timescale.<br />

People collect all this data and put it into Word, from which they copy it<br />

into Excel, then put it into Word and send it to someone who then puts it<br />

into Excel and so on and on ... That is how this <strong>report</strong>ing ends up. As for<br />

development staff, there’s him and another staffer, and a guy who must be<br />

given very clear instructions.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 39<br />

So why does he want a domain specific language? Because he has a set of<br />

very domain-specific problems.<br />

They must <strong>report</strong> that antibiotics were given 24 hours before surgery and<br />

discontinued 24 hours after surgery. Start time for surgery might be defined<br />

as when the surgeon entered the room in one scheme, as when the first<br />

incision was made in another, etc. The time window might be 24 hours in<br />

one situation, 48 hours in another, etc.<br />

Excel is the most prevalent business domain-specific language. When the<br />

name of a column is changed, mapping between data does not work so well<br />

but it is customisable by the users. Everyone else cares that two patients got<br />

the same care but they want their specific nuanced data on that specific<br />

patient.<br />

<strong>Smalltalk</strong> is a generic domain specific language. He can use it as is and<br />

customise it bit by bit to his needs. He needs transitional data storage.<br />

Healthcare has 30 years-worth of systems from which he must extract data<br />

(without bringing them down because they’re still using them on live -<br />

“and we’d like them to stay that way” - patients) and unify it. To him, a data<br />

warehouse is just another data source because he’s not going to get<br />

everything he needs into it anytime soon.<br />

A web interface can be made visible near to the person who has the data.<br />

A fat client is also possible. Dabble DB would be interesting if it could be<br />

brought in-site; they are not going to put medical data on an external server.<br />

Rob believes that documentation tools for healthcare could be better but<br />

will always be poor. Rob wants a nurse to see a screen that look like a<br />

patient so she clicks on an elbow and sees what elbow info to record.<br />

Ordinary people need extraordinary tools; that’s why he came here, to meet<br />

the people building such tools. People need to program. “Change your<br />

process to match my software” is what everyone says but it never works.<br />

<strong>Smalltalk</strong>s collection classes alone save him. Someone comes to the ICU<br />

then gets sick and goes elsewhere then comes back to the ICU and so on.<br />

It is hard to query a DB to get the intervening times matching this process.<br />

He can write a simple program on collections in <strong>Smalltalk</strong> to explore that.<br />

ODBC is a must in Healthcare because someone has always bought<br />

someone else’s custom system and you have to suck out the info.<br />

Thus his phase 1 task was a generic web-based data extraction tool. Phase<br />

2 was preloading all the info; don’t make people add the patient number<br />

and their name. Phase 3 is knowing whether the data will pass or fail<br />

against the government’s schema, against the schema used by Leapfrog (a<br />

healthcare company), etc. He implements this by subclassing general<br />

measures to capture that Leapfrog has 48 hours where the government has<br />

24 and so on.<br />

He then demoed his phase 1 system running on Aida. He has a Data


40 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

Abstraction Page Designer in which he can add checkboxes (“Checkboxes<br />

are real big in healthcare”) and menu designers. The result is all in the<br />

database and refactorable; you can rename headings and suchlike. Next he<br />

needs to bind these dynamic things to his changing requirements, Next year<br />

they will have 70 new core measures on which they will have to <strong>report</strong><br />

“voluntarily, so we get paid”.<br />

The one good thing is that the numbers are finite. Congestive heart patients,<br />

300 per month, are probably their largest single category.<br />

“We don’t face a health care problem in the US; we face a health business<br />

problem - socialist beliefs with capitalist payment.”<br />

Q.(Georg) How did you meet Janko? Rob was exploring web issues and<br />

Janko was superb at answering his questions.<br />

Everything in healthcare IT is based on, ‘Is it free’, ‘Is it cheap’, although<br />

somehow they can always hire 3 people to type data whenever the IT is<br />

lacking.<br />

GLASS: Share Everything, Dale Heinrichs, GemStone<br />

After a few minutes, the screen projector was persuaded to take notice of<br />

Dale’s machine and he opened a Firefox and a shell.<br />

Avi’s blogpost on GemStone architecture and Ruby got a comment saying<br />

‘Yeah these shared caches are OK but how do you do share nothing? That’s<br />

a technology that’s been around since 1994’. :-) (Later the comment got<br />

edited or deleted.) Share nothing could be characterised as ‘Hit the<br />

database every time you need anything.’<br />

GemStone/S persists every reachable object. In Seaside, they extended the<br />

framework to do an abort when an HTTP request is received and a commit<br />

before an HTTP response is sent. Thus users get the behaviour they expect<br />

without having to do anything more than they do already. There is no need<br />

to embed transaction logic in their application.<br />

Scalability for Seaside means being able to handle more requests by just<br />

adding more resources. The aim is to go from a single app to Apache<br />

running multiple Apps without making any changes to the application.<br />

Every object in GemStone has an oop (an integer) and objects are on pages.<br />

Thus object 1 on page 1 may have a reference to object 3 which lives on<br />

page 2 (real oops are a bit larger of course :-). The shared page cache means<br />

multiple VMs can use the same pages. An object graph can be partially<br />

loaded (for the very large models possible in GemStone, models must be,<br />

as the entire database will never load into memory at any one time). He<br />

showed object 1 being loaded with its reference to object 3 which if used<br />

would then be loaded (‘faulted in’ in GemStone’s parlance).<br />

Object tables map ids to actual locations on pages. A VM can load an<br />

object table (call it object table 1) and then makes changes and commit


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 41<br />

them, so one VM can point at an object table (call it object table 2) while<br />

another points at object table 3, each valid different entire views of the<br />

database. The changed object 1 can be written to page 3. The old object 1<br />

on page 1 s invalidated when no VM’s object table is still pointing at it.<br />

Commits can conflict of course and the loser in the commit race must<br />

handle that. In Seaside, if the automatic commit before the HTTP response<br />

fails then they resend the HTTP request. This aborts, restoring the state<br />

when the request first arrives, and so the request gets the same behaviour<br />

as before. In effect, it is just rearranging the times of the responses and will<br />

normally result in users getting times that do not overlap. Of course, at very<br />

high volumes, or with users who are having very long transactions, you<br />

may reach a situation where you want to provide application logic for<br />

commits. Every 3 minutes, the maintenance VM checks for sessions that<br />

have exceeded the Seaside timeout. It also does GC.<br />

The Seaside data is shared across all VMs so you do not need to use session<br />

affinity; any available VM can handle the next Seaside request and will<br />

have all the data it needs to do so.<br />

Three months ago, they changed the tools environment to make autocommit<br />

the default. In development, every accept commits. The standard<br />

log is big when you are running 5 VMs and even bigger when you are<br />

running 100, so Dale added an RcQueue object log with a Seaside interface<br />

focused on the data a Seasider will want to see.<br />

Dale then opened the tools to demo debugging. GLASS likes the Omni-<br />

Browser tools since, unlike GBS, all the objects live in GemStone and the<br />

tools act directly on lists of them, not on replicates of them into the client.<br />

Next there was the standard demo hiccough: Dale found that his demo<br />

counter was incrementing when he decremented due to work he was doing<br />

this morning and forgot to revert, so decided to use fixing that for his demo.<br />

He set a breakpoint, saw a standard Seaside walkback, went to the<br />

GemStone transcript window in the tools, clicked on the debugger, selected<br />

the appropriate context to debug (only one in this demo) and saw the<br />

debugger. The code can be saved in the debugger but hit refresh and you<br />

still see the old code; things like this are why this is still in beta.<br />

He then showed the object log in the web browser. It showed which VM<br />

handled the request, the oop of the object, the continuation (reified and<br />

persisted) and the process, etc. When they debug, they persist the process<br />

so when you hit resume it finds that process and resumes it. Thus you don’t<br />

have to think about whether you have 2 VMs, 8 VMs or whatever, you just<br />

get the process you want.<br />

He did a halt and showed that his drop-down list on the debug button had<br />

two items, the halt and the prior breakpoint (which no longer had the uparrow<br />

because you can debug it but you no longer can resume it, the<br />

infrastructure for it being no longer around).


42 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

Seaside is stateful and can generate a lot of state while you are running.<br />

Both he and Colin Putney independently decided that 2.9 is going to reduce<br />

the amount of saved session state.<br />

GemStone 3 will allow non-tranlogged objects since tranlogging is done<br />

for recovery and session state is not wanted for recovery. This will happen<br />

automatically when session data is put in a different global dictionary.<br />

Questions raised the point that if users could see this global dictionary they<br />

would find uses for it.<br />

In 3.0, exception handling will be ANSI standard. 3.0 has plans for Native<br />

methods and Foreign Function Interface; these are also interesting to<br />

GLASS. Sharding to address performance, there being a limit to how fast<br />

a commit can be done, will be looked at.<br />

Q. VMWare appliance? That is their preferred way of distributing GLASS.<br />

They are working to extend the installation possibilities but for now that is<br />

what works most easily so they recommend it.<br />

Q. Non-Squeak client for the tools? If you have VW or VA and GBS, then<br />

you can do much the same thing. They have not yet ported the Squeak tools<br />

to VW and VA, but on the other hand perhaps you will prefer to use<br />

WebVelocity or suchlike. Moving the OmniBrowser into GBS is being<br />

considered and certainly can be done technically.<br />

Monty pointed out that a Seaside app developed elsewhere can be deployed<br />

to GemStone easily - one customer did this in literally one minute. GLASS’<br />

aim is to create a pool of Seaside-competent programmers who will then<br />

work on larger apps and drive the growth of this market.<br />

Q(Paul Baumann) when working on this kind of thing a while back Joe<br />

Boscancas found some cases where you wanted a request that did abort but<br />

never committed. Do you have that? If no objects are written, that is the<br />

effect you get. That’s why Dale is working in 2.9 to reduce unnecessarilysaved<br />

session state.<br />

Q. SeaBreeze, WebVelocity, GLASS: how do they tie together? James and<br />

Dale both answered. They are all written on the same base Seaside<br />

framework. Genuine write once, run anywhere.<br />

Building a Seaside Application with GLASS, James Foster, GemStone<br />

James explained some features of the GLASS licence. If you go over 4 Gb,<br />

your server will shutdown. You can contact GemStone and get a one-week<br />

GLASS licence for 8Gb. During that week you will either realise that<br />

overflowing 4Gb was an accident and slim your DB under the limit again<br />

or else realise it was the natural growth of your app, whose revenues should<br />

therefore also have grown to the point where arranging a standard licence<br />

with support is both affordable for you and the right thing to do.<br />

I went to Vassili’s talk, then arrived and paired (by prior arrangement) with<br />

Werner Wild. Werner and the others had installed the GemTools software


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 43<br />

from the DVD James supplied. Those who had VMWare ran a local<br />

database, the others got user info and connected to James server machine.<br />

Everyone brought up Seaside, saw the counter example, added a<br />

breakpoint and saw the debugger, and connected to GemTools. At that<br />

point, some network problems had to be sorted out. Conveniently for me,<br />

I arrived just as they had been fixed, with Werner and Angela having<br />

GemTools back up and logged in, the rest doing this; work resumed.<br />

James switched to a more demo-oriented presentation, with those who had<br />

the VMware able to work locally, the rest observing, and everyone got<br />

started again on the exercises. James started servers for the course<br />

participants; each participant’s account ran with its own set of source code<br />

so each user has their own view of source code. Thus we again saw the<br />

counter app with its halos and the usual behaviour.<br />

Note that Squeak is not always 100% reliable. GemTools will occasionally<br />

get UI errors and lockups. When it happens (it has happened to James every<br />

hour or so at times) just close Squeak and restart. It may be a GemTools<br />

issue or it may be Squeak or a combination. Gemstone commits every time<br />

you save a method so you will not lose anything except your latest edit.<br />

The next exercise was the mini-calendar in the test suite. A walkback had<br />

been inserted into it and we had to fix it. The walkback appeared in the<br />

debugger. Werner selected ‘remote debug’ and at first could not see it in the<br />

drop-down on the Gemstone transcript widget but in fact he had just been<br />

too fast (large course class all running on small local server meant you<br />

sometimes needed to allow enough seconds). He fixed in the debugger but<br />

then could not proceed because the problem was a bad receiver (code was<br />

trying to treat the integer 6 as if it were the month of June) so we had to<br />

drop that session go back to the tests and run.<br />

After looking for WaMiniCalendar in Squeak and not finding it James<br />

explained to us that we should look in GemStone; select the GemStone<br />

Transcript and go from there. Squeak is not a host for Seaside, or a<br />

programming environment, as far as GLASS is concerned. It is simply a<br />

source of GemStone windows. (BTW, see James’ Dolphin equivalent).<br />

Thus we fixed and resumed.<br />

Then the server / connection crashed again and James restarted. It crashed<br />

repeatedly. Eventually it dawned on us that our attempted fix of the method<br />

year<br />

^ self year<br />

was likely to cause stack overflow and crash the server, after which we<br />

fixed the problem instead of making it worse (the WaMiniCalendar was<br />

initializing month to an integer instead of a Month). In the Squeak base<br />

time classes Date today month returns a Month object. In the<br />

GemStone base classes, the same code returns a SmallInteger, thus making<br />

it obvious where the bug comes from; the raw port from Squeak to<br />

GemStone of the mini-calendar hit this base class discrepancy.


44 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

We opened the chasing browser (hit escape when a class is selected gives<br />

you that menu). Next we went Seaside web page -> tools -> object log and<br />

browsed all our crashes and other activity.<br />

Now we were ready to create our first Seaside component: a web counter<br />

to monitor the huge hit rate our amazing app will soon be receiving. A few<br />

methods added and our counter could render all the content it could detect.<br />

While doing this, Squeak locked up for us and we restarted it. As James had<br />

promised, all our work was saved in GemStone so we simply had to open<br />

a browser on our new class and continue work. After a couple of hiccoughs,<br />

we managed to execute and commit the registerApplication: call<br />

for it and see the number zero.<br />

Seaside Tutorial, James Robertson, Cincom<br />

James showed the counter, the simplest Seaside app that could possibly<br />

work. This very simple class shows several Seaside values in a nutshell; no<br />

marshalling and unmarshalling of state; instead callbacks give a fat-client<br />

GUI feel. He set a breakpoint and walked through the debugger.<br />

Refactoring is far easier than if the logic were scattered across true code,<br />

code in templates in files, and etc. The workflow is a lot easier to follow.<br />

WAComponent’s subclass WACounter overrides renderContentOn: to<br />

paint the canvas. Set canBeRoot and registerAsApplication: on<br />

the class side to define your top-level component.<br />

First exercise: create a component that does ‘Hello world’. Werner and I<br />

noticed the guessing of protocols in vw7.6; it notices when the method is<br />

in a protocol on a superclass or elsewhere.<br />

We then loaded a domain model for a blog, plus some posts, and then built<br />

a blog server to show it on the web.<br />

After building the blog website we then added another entry point. If the<br />

user cancels when invited to login or is not allowed to post, we want to<br />

show them the blog view. Otherwise, we will offer them the chance to post<br />

to the blog.We needed a form<br />

html form:<br />

[...<br />

html textInput on: #username of: self user.<br />

...].<br />

and a call. Call is like invoking a new UI.<br />

(We managed unintentionally to set our BlogViewUI as the top level<br />

component instead of the standard Seaside, probably by setting it in the<br />

configuration.)<br />

Lastly we discussed styles.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 45<br />

BoFs and Contest<br />

<strong>Smalltalk</strong> Coding Contest<br />

The first round of the <strong>Smalltalk</strong> coding contest is described in detail at<br />

http://www.cincomsmalltalk.com/userblogs/niall/blogView. The winner<br />

was Rajesh Jayaprakash (who was using the contest to learn Seaside and<br />

had not used it much beforehand!).<br />

As Rajesh was unable to get to Reno this year, we invited him to come next<br />

year and organised a second round in which contestants had four hours to<br />

help Christopher Columbus rework what were columns and what were<br />

values in the spreadsheet he had prepared for the Queen of Spain. Martin<br />

McClure won, Peter Hugosson-Miller came second. Martin could be seen<br />

afterwards beaming as he mastered his new iPod touch. I understand his<br />

wife was also delighted; she will now finally be able to get her hands on<br />

the one she won in a promotion some months ago. :-)<br />

STIC meeting, Georg Heeg<br />

STIC’s main task for the last few years has been to organise this<br />

conference. Georg was elected executive director a year ago. It is a most<br />

honourable job, i.e. it is not paid. (Suzanne: “You’ve been not paid for a<br />

year. We’ve been not paid for much longer than that.”)<br />

STIC has worked with Gartner to get an appropriate positioning of<br />

<strong>Smalltalk</strong> and that <strong>report</strong> is now extant. Georg has found this one of the<br />

nicest <strong>Smalltalk</strong> <strong>Solutions</strong> for several years and thanked Suzanne, Joy and<br />

all the people who made it so. James is their webmaster and STIC’s website<br />

is now much improved.<br />

Monty thanked Suzanne and Alan and Joy for all their hard work, and Niall<br />

for the contest. John O’Keefe echoed that; several people have commented<br />

to him that the hotel is a great facility.<br />

Suzanne discussed the initiative of 2006 and 2007 of sharing <strong>Smalltalk</strong><br />

<strong>Solutions</strong> with Linux world and Network world. It did give us visibility.<br />

Suzanne started hearing from old customers. Unfortunately, they changed<br />

their direction dramatically from Linux world to IT360 and while we tried<br />

that for a year it was not such a good match so Suzanne and Joy decided to<br />

take the conference back. This location with its one-stop shopping, free<br />

shuttle and OK price was great. Nevertheless, she feels the buddying to<br />

other conference has paid off. Niall agreed and stressed that we should be<br />

prepared to combine with other conferences again on occasion.<br />

James mentioned that some East Coasters will be glad of moving around<br />

(i.e. nearer them). Alan and Suzanne said Seaside should of course be near<br />

a beach. Suzanne noted that Reno was not easy to get to for some but when<br />

you got there you did not need to leave the property and that is a good point<br />

for <strong>Smalltalk</strong>ers.<br />

Discussion of what conference we might buddy up to; a Ruby conference,<br />

an Agile conferences (but they tend to be large). Eric has suggested if we<br />

cannot buddy to the Ruby conference could we be in the same property or


46 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

down the street (and it would also give Eric less travelling to do :-).<br />

One customer has hired 15 <strong>Smalltalk</strong>ers in the last two years. The customer<br />

had decided to rewrite in Java but now backed off after a few years of<br />

unhappy experience. ObjectStudio is also seeing a lot of growth.<br />

Q. Numbers? Suzanne noted that publishing Cincom financial data has<br />

been a sensitive issue in the past. Someone mentioned that having the<br />

ability to navigate to those numbers, even if they were not too obvious to<br />

random browsers. If management do quick research on <strong>Smalltalk</strong> they see<br />

that IBM sold VA to Instantiations and Dolphin went under. Numbers<br />

would help. Suzanne noted this message and said she would see what could<br />

be done to put info on their site and the STIC site.<br />

James pointed out that GemStone, Cincom and Instantiations are all<br />

investing in Seaside, something that is not focused on the existing customer<br />

base; this is proof of something. Monty noted that GemStone has seen their<br />

Seaside efforts have paid off promotionally and privately. They would not<br />

publish data on specific customers but could work with STIC to provide an<br />

industry measure.<br />

Q. Publicise Cincom use of <strong>Smalltalk</strong>? Suzanne noted the request.<br />

Like Cincom and GemStone, Instantiations is a privately-held company.<br />

However they can confirm they have had substantial revenue growth.<br />

Instantiations did work with Gartner to provide info recently. Cincom also<br />

worked with Gartner and that will be a route to get info into the domain.<br />

Arden noted that Gartner has moved <strong>Smalltalk</strong> from elderly to mature.<br />

Q(Thierry) He was very pleased that vendors are open to SNBs which<br />

previously he had felt not. John OK noted that IBM of course was not<br />

interested in SNBs whereas Instantiations attitude is much more positive.<br />

Seaside BoF<br />

Carl Gundel demonstrated Run Basic. He showed a hangman program<br />

written by someone with no prior experience of the web whatever.<br />

They have sold several hundred copies since the start of this year. Their<br />

forum has 200 members. Users are very happy with it. Their other product<br />

makes them regular money but it is not unique; it competes with other<br />

products. By contrast, this app is unique. They could not have done it<br />

without Seaside. It was seeing what other people had done with Seaside<br />

that inspired them to try it.<br />

He has not yet tried any of the AJAX stuff. He wants to use it but feels he<br />

does not fully understand the examples. There is no STUG in Boston and<br />

Seaside users in Vancouver are a bit far to visit.<br />

When he started this, a frequent question was ‘Why are you creating a web<br />

basic?” His best customer asked that before she saw it. After she saw it, she<br />

saw the answer.


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 47<br />

Peter remarked that he met Seaside for the first time yesterday and liked it.<br />

Colin Putney has OmniBrowser running on the web in Seaside. His start<br />

page is one button but will become something like the VW launcher. It<br />

shows a Mac-like icon list and one of these opens the OmniBrowser, or<br />

would except for a DNU. As we were overtime and the GemStone BoF was<br />

ready to go, he decided to complete the demo later.<br />

GemStone BoF, Norm Green, Martin McClure, Monty Williams<br />

Norm presented the GemStone 64 server product roadmap. Martin talked<br />

about GBS and Monty outlined the Ruby Maglib work they have done.<br />

The 32 bit product is being wound down as almost all their customers have<br />

expressed intent to move to 64. They have just released 6.3.0 and 6.3.1 is<br />

due by the end of this month; it’s in QA now. He hopes this will be the last<br />

32 bit release for a while (but probably not the last). The current 64 V1<br />

release is 1.2.5. Major customers have moved to it and others will shortly.<br />

The next V2 release is scheduled for October 3rd.<br />

They’ve added Solaris 10 and HP Integrity (Itanium 2) to their supported<br />

server platforms. There is also an Apple Mac (Leopard, Intel) nonproduction<br />

version available to customers who ask for it.<br />

Gemstone 64 2.3.0 will have PersistentSharedCounters (like shared<br />

counters) for apps that need to generate new ids and similar. The protocol<br />

is the same as SharedCounter with larger range (signed 64 bit) and atomic<br />

persistence. StatMonitor can be run without running a GemStone and<br />

monitor any process and all processes owned by a given user id. All the<br />

host system statistics can now be accessed from <strong>Smalltalk</strong>. GsFile can now<br />

read and write compressed files (uses gzip library).<br />

A user-profile can now be made read-only programmatically by sending<br />

disableCommits to it (so e.g. could respond to improper operation by<br />

preventing user committing it).<br />

It will support direct I/O, bypassing the Unix buffer cache, a performance<br />

win for certain cases.<br />

GemStone 64 V3 is still in the planning stage. It will have native code<br />

support, which can give 2x speed-up, and multi-threading support for<br />

tranlog replay, so restarting will be faster. DLL access will also be added.<br />

Various other things might be added. Multi-thread global GC (singlethread<br />

takes weeks for 3 billion objects and the offline is better but can still<br />

take days). They know how to do this. Several other operations would<br />

benefit from multi-threading. They would like SSL socket support, SNMP,<br />

LDAP authentication, Web service classes and automatic load balancing<br />

across several shared page caches. They have customers who run large<br />

pools of Gems across several caches and there is no easy way to decide<br />

which cache a Gem should be started on; the system knows which is least<br />

loaded so could allocate sensibly.


48 <strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong><br />

Q. Proposed date for 3.0? Norm’s proposed guess is the end of this year and<br />

he is sure it will be released earlier in 2009 than this date.<br />

Martin McClure then spoke about GBS. Martin’s slides were yellow with<br />

blue background on his screen but orange with black background on the<br />

projector. Fortunately, they were still readable. Since the last <strong>Smalltalk</strong><br />

<strong>Solutions</strong> BoF they have released 7.1.2 (bugfix and support for VW7.5)<br />

and 7.2, which had performance improvements, configuration changes and<br />

single round trip. It is only supported on GS 64 servers at version 2.2 and<br />

later. It reduces several multi-trip operations to single-trip operations in<br />

forwarder sends (it also avoids updating unchanged things) and in remote<br />

evaluation (evaluate: calls). It also used to be the case that you chose<br />

lazy versus immediate faulting; since the new single round trip eliminates<br />

the other trips where lazy faulting would piggy back, they’ve eliminated<br />

this feature since immediate faulting will always be faster.<br />

This year, in GBS 7.2.1, they are working on performance. On Monday,<br />

they issued a release candidate that is twice as fast as their old benchmarks,<br />

and this is older 32 case compared with newer 64 case, so handling 30%<br />

more data in the benchmark. This is the fastest GBS they’ve ever released.<br />

He’s hoping that some performance techniques users have tried in the past<br />

can be discarded now that GBS can replicate > 100,000 objects per second.<br />

They got this performance by replacing C memory access (5 times slower<br />

than accessing a byte array in VW) with pointers in object space to avoid<br />

that primitive. The other technique was to streamline the code.<br />

In 7.2.1 they only support single trip so it only works against Gemstone 64<br />

2.2 and later. They will then release one where multiple round trip is<br />

reenabled so you can get the other speed-ups in 7.2.1 against older servers.<br />

Eric will work on completing the latest VA<strong>Smalltalk</strong> GBS when he returns<br />

from this conference and that will appear soon (yes, they know it is late).<br />

Other future features. Concurrent traversal of buffers (get first buffer, ask<br />

for second buffer while processing first) uses 105% or 110% of current<br />

time so with multiple CPUs it will reduce the elapsed time.<br />

Forwarding replicates that mix and match which methods they forward and<br />

which they handle locally is coded but needs tests before it can be released.<br />

Uses include DNU forwarding (if the client doesn’t understand this, try the<br />

server) and one-time forwarding.<br />

Q. Relation to uncached forwarder? Uncached forwarders are an<br />

abomination. That some people use them is what drove him to work on<br />

ForwardingReplicates. It is a far cleaner implementation of the same intent.<br />

He will give people time to migrate from them before eliminating them.<br />

(And if anyone thinks they use them in a way that ForwardingReplicates<br />

does not support, please tell him.)<br />

Q(Angela) When released? Before the weather turns cold again.<br />

Q(Angela) Supporting VA<strong>Smalltalk</strong> 8.0? A GBS release has about 100


<strong>Smalltalk</strong> <strong>Solutions</strong> <strong>2008</strong>, Reno, 18 - 21 June <strong>2008</strong> 49<br />

supported configurations so they are keen to limit it to what users use. If<br />

8.0 is out a few weeks before their release they will support it as well as<br />

earlier VA<strong>Smalltalk</strong> versions. VW7.6 will be supported by GBS 7.2.1<br />

Monty then talked about Maglib. Avi suggested that Ruby is close to<br />

<strong>Smalltalk</strong> and that Gemstone would make a good Ruby VM, existing ones<br />

being not so robust. Monty went to their conference and counted that there<br />

were a lot more of them than us but they are a lot less sophisticated: noone<br />

here need consider giving up <strong>Smalltalk</strong> for Ruby.<br />

Monty showed the 3.0 VM running Ruby and another window running a<br />

standard Ruby VM. He had to load stuff just to let the standard VM<br />

compute a 3000 size fibonnacci without crashing. He started a big<br />

fibonnacci in this and then opened topaz on the other and started Maglib.<br />

In less than a minute they had passed the slowly scrolling standard VMs<br />

benchmark and reached completion.<br />

People in the Ruby world thought what they and Avi were showing was<br />

magic whereas it was very ordinary to <strong>Smalltalk</strong>ers. There were a large<br />

number of people who didn’t get it - thought it was ‘hung up on<br />

performance’ - but some of the cleverer ones were very impressed.<br />

However there was also the fact that Ruby apps are very Rails oriented with<br />

the ActiveRecord well embedded, so dropping SQL for another persistence<br />

approach will be a stretch for them.<br />

3.0 uses the same VM for Gemstone/S and Maglib.<br />

Kent gave a keynote to 2000 people talking about 20 years of <strong>Smalltalk</strong> and<br />

unlike a Java conference the general message is very pro-<strong>Smalltalk</strong>. “Work<br />

with the <strong>Smalltalk</strong> people because they know what they’re doing and you<br />

don’t.” It was nice to be at a conference where they thought <strong>Smalltalk</strong>ers<br />

walked on water (correction from Randal Schwarts: “<strong>Smalltalk</strong>ers don’t<br />

walk on water; they send a message to water to walk on itself.) However<br />

Monty noted that one thing Rubyists seem to care about is to be able at any<br />

time to hit a button and reload all their code from text files, so the image is<br />

something they find weird.<br />

Q. If <strong>Smalltalk</strong>ers walk on water, do Rubyists plan to become<br />

<strong>Smalltalk</strong>ers? These people came from Java or Perl. What Ruby gives them<br />

is a great improvement on what they have. If they tried to become<br />

<strong>Smalltalk</strong>ers right away, their heads would explode. Chad Fowler gave a<br />

talk in Toronto where he said the innovation of Ruby was that it was not<br />

innovative; people can go to it easily. At the conference, someone asked if<br />

Ruby and <strong>Smalltalk</strong> can run in the same VM and the answer yes was taken<br />

very positively. If they can get over the ‘have all code in files’ issue they<br />

will be home free, but that is a big hill for them to climb.<br />

Q(James) Is it that people who sign the paychecks are the hold up? Those<br />

people know that traditional ways of building web apps don’t scale.<br />

However Rails apps have their persistence in Oracle so the manager can<br />

sleep at night. The decision to use GemStone persistence as well as the


50 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

GemStone VM will be their hill, to climb.<br />

Other Discussions<br />

Adriaan and I dined with John on Thursday and Ed on Saturday. The IT<br />

market in the US grew by 8% in the past year; Instantiations saw more than<br />

twice that growth in <strong>Smalltalk</strong>.<br />

CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

For the first time since Southampton in 2000, I was in the same country as<br />

<strong>ESUG</strong> before it started.<br />

Summary of Projects and Talks<br />

I give the Camp <strong>Smalltalk</strong> 13 projects summary, then the <strong>ESUG</strong> activities<br />

<strong>report</strong>s (including the awards presentations and ceremony). Next I<br />

summarise the conference talks, sorted into various categories:<br />

• Applications, Frameworks and Experience <strong>Report</strong>s<br />

• Development Tools and Techniques<br />

• VMs and <strong>Smalltalk</strong> Environments<br />

• Aida and Seaside<br />

• Modelling Tools and Techniques<br />

followed by the 10-minute talk track and Other Discussions. Talk slides are<br />

reachable from http://ww.esug.org.<br />

Camp <strong>Smalltalk</strong> 13<br />

Camp <strong>Smalltalk</strong> 13 ran for Saturday and Sunday before the conference, and<br />

during the conference breaks, afternoons and some evenings of the five<br />

conference days. More than 40 people attended it. There was much activity<br />

in the room, only some of which I learnt enough about to summarise (with<br />

possible errors) below. Inevitably, my notes treat my project in much more<br />

detail than others.<br />

The Custom Refactorings and Rewrite Editor Usability Project<br />

Michael Prasse worked on a tree widget for the class pane in the VW RB.<br />

TreeModel(SequencableCollection)>>includes: only <strong>report</strong>s true if the<br />

collection contains the item; if the collection contains an object whose<br />

children contain it, it returns false. HierarchyNavigatorPart>>fillInState:<br />

gets the hierarchy class of a new class, sets the widget to display it and its<br />

parent path, and then select:in: calls includes: on the list while mapping<br />

object root names to objects - and fails to find the class its state demands.<br />

He worked on a fix for this subtle interaction.<br />

Adriaan van Os and I ported the Extract with Holes refactoring to VA, then<br />

looked at making its dialog a code tool as an alternative mode of providing<br />

refactoring UI. Reinout gave us user’s feedback.<br />

PostgreSQL EXDI<br />

Bruce Badger and Michael Prasse worked on an issue with nested queries


in the PostgreSQL EXDI.<br />

CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 51<br />

Seaside Applications<br />

Dale Heinrichs, Lukas Renggli, Adrian Lienhard and several others<br />

worked on Pier and Magritte. Work was also done on the Seaside 2.8.3<br />

release. (2.9 by end year is hoped for, not certain.)<br />

COLA 86_64 code generator<br />

The title says it all: Martin McClure worked on an 86_64 generator for Ian<br />

Piumarta’s COLA. In the early stages, when the generated code was<br />

seriously rough, he had a hard time persuading the debugger to open on it<br />

until he realised it needed to be given two addresses; with only one, it was<br />

unsure where the function might end (or whether?).<br />

Amelia<br />

Primary school teaching tools using Squeak and Croquet were worked on<br />

by Filipe from Portugal and others.<br />

Moose<br />

Tudor Girba and quite a few others worked on a range of features. One was<br />

making the IC framework (Seaside bar charts and similar) less dependent<br />

on VW-specific features so it could be ported to other Seaside-using<br />

dialects.<br />

SqueakNOS (no operating system)<br />

Leandro and Valeria were among those working on this. Sadly, Gerardo<br />

Richarte’s talk on it conflicted with Alfred Wullschleger’s and I missed it.<br />

Other Projects<br />

Breakpoint logging in VW.<br />

<strong>ESUG</strong> Activities <strong>Report</strong>s<br />

Introduction to CWI, Paul Klint<br />

CWI was founded 1946 as Mathematics department, broadened to other<br />

disciplines including software engineering. He summarised language<br />

development LISP, Algol 68 (remember that; I programmed in it once -<br />

once was enough :-)), and in 1972 <strong>Smalltalk</strong> appeared. Static typing was<br />

fashionable for a long time. Python appeared in 1991(Guido van Rossum<br />

started it as a project there and still visits CWI regularly). CWI researches<br />

these and many other languages. Currently, they do much work on metaprogramming:<br />

analysing old programs (e.g. in Cobol - he hastened to<br />

assure us noone at CWI actually writes any Cobol :-), transforming them,<br />

etc.<br />

They do much research on parsing. There are still problems in the parsing<br />

field: compose two LALR context free grammars - it is not guaranteed that<br />

the result is LALR so you need generalised context-free grammar parsing.<br />

He showed screenshots of some of their tools.


52 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Conference Welcome and <strong>ESUG</strong> Activities Overview, Stephane<br />

Ducasse, Noury Bouraqadi<br />

Stephane thanked the sponsors (see their logos on http://www.esug.org/<br />

conferences/16thinternationalsmalltalkjointconference<strong>2008</strong>); he is really<br />

happy to receive a request for sponsorship from someone he has not asked.<br />

He also thanked the local organisers: Adriaan van Os, Rob Vens, Mathieu<br />

van Echtelt and all those who helped. This is the largest <strong>ESUG</strong> conference<br />

ever: 172 participants (max 150 on any day) 17 student volunteers, 43 talks<br />

(occasionally 2 parallel tracks), 22 award competitors and 4 books to buy.<br />

Stephane asked how many were attending their very first <strong>ESUG</strong>? Quite a<br />

few hands were raised. He urged us to use the student volunteers as the first<br />

point of contact for any questions about either the conference or the local<br />

area, and also urged us to help the students get in touch with the <strong>Smalltalk</strong><br />

community by showing them our projects.<br />

<strong>ESUG</strong> sponsors <strong>Smalltalk</strong> in various ways:<br />

• <strong>ESUG</strong> can sponsor presentations of <strong>Smalltalk</strong>, i.e. pay travel expenses,<br />

etc. For example, Stephane gave a lecture at Turino, the temple of type<br />

theory, and they were positive about <strong>Smalltalk</strong> (noone left and he was<br />

told that students walk out if the lecture bores them). They also had an<br />

RMLL’08 booth. <strong>ESUG</strong> offers material for giving <strong>Smalltalk</strong> lectures.<br />

• Via the Summer of Code, <strong>ESUG</strong> sponsors students to do projects. This<br />

year there are two projects (one started, one about to start)<br />

• <strong>ESUG</strong> sponsors free Seaside hosting (handled by netstyle.ch).<br />

• If you get a <strong>Smalltalk</strong> article printed in a magazine, <strong>ESUG</strong> will give<br />

you 100 euro.<br />

• <strong>ESUG</strong> helps students who move to <strong>Smalltalk</strong> groups. They also help<br />

people who go to conferences (will pay 150 euro and get <strong>ESUG</strong> on<br />

slides): one this year was rated ‘best talk in conference’.<br />

If you want to do any of this ask: they will evaluate and let you know if they<br />

will sponsor. They also sponsor projects: DrGeo (maths teaching for kids)<br />

has scripting in <strong>Smalltalk</strong> (its scripting was in scheme) and was sponsored<br />

by <strong>ESUG</strong>.<br />

Attending <strong>ESUG</strong> is how you sponsor all this. Next year, they are thinking<br />

of holding <strong>ESUG</strong> in Brest or Barcelona. Any interested would-be local<br />

organisers please contact them. Noury thanked us for attending the<br />

conference, especially MediaGenix who sent 13 people.<br />

Lastly, a new board member is wanted: ask Stephane what work you would<br />

be signing up for.<br />

Presenting at <strong>ESUG</strong>, Tudor Girba, www.tudorgirba.com<br />

Tudor used to be extremely nervous about speaking in public but had to, so<br />

prepared this talk. He started with a hilarious, very well acted, ‘how not to’<br />

demo: Use large fonts, have six bullet points per slide, left align your text<br />

and put your logo on the right, delimit zones on slides so people know<br />

where things are, have a nice footer with your name (in case people forget


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 53<br />

who you are) and the slide number (so people follow progress) but don’t<br />

have the total number of slides ... .<br />

The talk is not your slides. If all you will do is read your slides, why did<br />

you not just stay at home and put them on the web. You come to <strong>ESUG</strong> to<br />

tell a story beyond what is on your slides. Know your audience, then<br />

choose the message: not ‘a message’ but ‘the’ message, not two, not one<br />

and a half, just one. After 3 years of research, Tudor wrote a 200 page PhD<br />

to defend one sentence. Think about what you remember from last year’s<br />

<strong>ESUG</strong>. Your audience will remember one message at best so aim for that,<br />

not more.<br />

What were slides called in the past (transparencies, foils, ...?) Slides were<br />

once called ‘visual aids’. ‘Slides’ is the name of a solution, not of the<br />

problem. He compared a traffic stop sign with a slide of description of what<br />

the sign means. The description is detailed but the slide is effective. Not all<br />

details are important: he described a fish store whose sign ‘we sell fresh<br />

fish here’ was gradually slimmed down to a logo of a fish. Then Tudor<br />

finally added ‘fresh’ back into the logo; you can strip too far, but you are<br />

far more likely not to strip far enough.<br />

Open your slide: see Click here to add Title, click here to add bullet points.<br />

So you add a title and one bullet point. Then you add more because just one<br />

bullet point looks ugly on a slide. Consider having a blank slide and just<br />

put your one point on it. Then have several slides each with one point. By<br />

using a 64-point font, Tudor ensures he cannot put too much on his slides.<br />

There was a time when people just talked, without visual aids. Slides are<br />

technology; don’t let them get in the way. It is normal to be nervous but do<br />

not let that make you turn to the technology instead of to your story. Relax,<br />

walk out from behind the lectern (have your remote control).<br />

Tudor recommended the www.presentationen.com blog. And what was his<br />

message: presenting is storytelling.<br />

(Later in the conference, it was noted that one thing presenters should<br />

always try and know how to do is how to make their font larger or smaller.)<br />

<strong>Smalltalk</strong> Awards Ceremony, Noury Bouraqadi<br />

(Happily, a rumour that the wine for the awards ceremony had not arrived<br />

proved groundless.) There were 6 entries at Kothen in 2004, 9 at Brussels<br />

in 2005, 11 in Prague, 15 in Lugano and 20 this year. Noury thanked all the<br />

entrants for an impressive array of applications. All <strong>Smalltalk</strong> code (and<br />

related code, e.g. a <strong>Smalltalk</strong> VM) is eligible, whether used commercially<br />

or for research, and whether written by academics, by students or by<br />

commercial programmers, provided it is separable from its background<br />

system. Prepare your software for next year!<br />

The entrants made two minute presentations. The winners were:<br />

• 1st prize (500 euros): Dr Geo


54 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

• 2nd prize (300 euros): SeaBreeze<br />

• 3rd prize (200 euros): iSqueak<br />

Books<br />

Squeak by Example was on-sale for 10 euros, Andrés’ books on Hashing<br />

Functions and on <strong>Smalltalk</strong> Mentoring for 15 euros, and the Seaside book<br />

for 18.<br />

Farewell and Next Year, Stephane Ducasse<br />

On Friday, Stephane led a discussion on how the conference had been.<br />

Reinout thought the best talk (which was also the shortest one) was Rob<br />

Vens’ talk on exploratory modelling; please put it on YouTube.<br />

Having a full program is good but the days were very busy so it would be<br />

helpful to have session chair to say: keep to time, to announce e.g. whether,<br />

if time runs short, we have a short lunch.<br />

When there were two tracks it occupied both rooms; can we always have a<br />

break-out area as well? (Noted; only late on was it realised we would have<br />

to have two tracks in some sessions.)<br />

The first prize went to Dr Geo. Its creator was a C++ programmer a few<br />

years ago till Stephane paired with him in a session. We can all do this.<br />

This autumn, Rob Vens is organising two seminars for students leaving<br />

university to get them interested in <strong>Smalltalk</strong>.(gosmalltalk.nl is the Dutch<br />

users group). Next <strong>ESUG</strong>, we would like to have a talk on how to train<br />

<strong>Smalltalk</strong>ers.<br />

Where next? One proposal is Brest: low cost, good flights from Paris,<br />

Asterix lives there :-). Many rooms in student accommodation with<br />

internet connection are just across the street from the venue. And there are<br />

also good hotels and restaurants. The very first <strong>ESUG</strong> was in Brest.<br />

Barcelona is the other possible site.<br />

<strong>ESUG</strong> has principles, not rules. Ask them, give them proposals and they<br />

will decide. The need more active people in the board. How will they<br />

develop a new president. Maybe in 3 years Stephane will force us to find a<br />

new president. (Eliot: when you have gray hair, you can resign. :-)<br />

Applications, Frameworks and Experience <strong>Report</strong>s<br />

WideStrings and utf-8, Philippe Marschall<br />

Philippe sent ubercool (i.e. ü, u with umlaut) and saw it displayed in<br />

browser looking anything but cool (tilde-Afibercool). So what is<br />

happening here?<br />

ISO-8859-15 (Latin-9) is the same as ISO-8859-1 (Latin-0) except it has<br />

the euro. However it does not work in eastern Europe let alone Asia. So<br />

people decided to solve the problem once for all: this complete solution is<br />

unicode.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 55<br />

Unicode currently defines 100,000 characters (Philippe says ‘currently’<br />

because solving a problem once for all time is an ongoing job). It has a huge<br />

number of what we would call characters and it also has a lot of ‘wingdings<br />

style characters, white rabbit symbols and suchlike. Unicode is effectively<br />

a 22-bit character set. ASCII is contained in latin 1 which is contained in<br />

Unicode: all characters are included with the same index. Unicode is<br />

defined in terms of code points: a code point is an atom of text. [Niall: and<br />

this leads on to glyphs but he did not go into that level of detail.]<br />

Philippe use an analogy between Integer and String representations. An<br />

Integers is a SmallInteger or a LargeInteger and we talk about the range<br />

which these two classes cover, not endianness. Similarly a String is either<br />

a ByteString (ISO-8859-1) or a WideString (Unicode ISO-8859-1) and we<br />

talk about the character set, not the encoding.<br />

Unicode is a 22-bit character set but a SmallInteger in Squeak is 30 bits so<br />

you have 8 bits left over to have fun with. The #leadingChar uses these for<br />

some extra info, e.g. the language and some presentation data. This info is<br />

taken into account or masked out as required/desired when reading the<br />

character.<br />

So how do you know whether a unicode character is a letter, a number, a<br />

white rabbit or other shape, or what? You have to know unicode’s rules.<br />

Fußball is a German word (German German; Swiss German does not have<br />

it). The ß character is called sharp-S (it’s a curly-B-like character for<br />

anyone reading this without the appropriate character sets). It only exists in<br />

lowercase, having no uppercase implementation. (Georg promptly<br />

corrected him: 4 weeks ago it was given an uppercase representation and<br />

that made a big noise in Germany! Philippe was fascinated. However, as<br />

what he was about to say illustrates a general point, it remained of interest<br />

to continue with the explanation.) If you do Fußball asUppercase it<br />

returns FUSSBALL: your string got wider.<br />

Character ordering is also locale-dependent; A umlaut goes before A in<br />

German but after it in Swedish. “Some characters are more equal than<br />

others”; unicode defines degrees of equality: does e acute equal e? You can<br />

also compose characters: the umlaut character plus the a character equals<br />

the a-umlaut character.<br />

Encodings are isomorphic mappings from characters to bytes. For ASCII<br />

and Latin-1, one byte is one character. For wider character sets, the<br />

mapping may not be to just one byte for one character.<br />

There are (at least) 2 ways to encode a 32-bit integer: big endian or little<br />

endian. In UTF-32, both ways are allowed. You also have a lot of zero bytes<br />

(16r00) and code written in C doesn’t like zero bytes. UTF-16 has<br />

additional problems (little endian / big-endian). UTF-8 tries to avoid these<br />

problems by using less space for the western world (the rest of you, tough<br />

luck!). It is 100% ASCII compatible on the binary layer. Everything<br />

beyond ASCII is multiple bytes: send umlaut-u 16rC3 16rBC in UTF8 and<br />

the browser thinks it is in latin1. WAKom does 1:1 direct mapping from


56 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

bytes to characters which works for latin-1 and nothing beyond.<br />

WAKomEncoded uses utf-8. It reproduces WideStrings which in Squeak<br />

are known for bad performance and bugs. Philippe nevertheless<br />

recommends it: if you find bugs please <strong>report</strong> them or they will never get<br />

fixed.<br />

You must tell the browser what encoding you use. Set it in the http header<br />

and in html header tag, the latter being a nasty layer violation but<br />

nevertheless recommended. (And you have to come up with your code<br />

pages.)<br />

In Seaside 2.8, subclass WASession>>charset which defaults to utf-8. It<br />

will do both of the above.<br />

In 2.9, they realised that the character set is more application related than<br />

session related so they put it into the configuration.<br />

If you want to test, don’t use latin 1 text. Use hindi or something like that<br />

and test the whole round trip. Philippe strongly recommend Tim Bray’s two<br />

articles on unicode.<br />

WebTerminal: less code more RIA, Wouter Gazendam and Dirk<br />

Heijink, CosmoCows<br />

WebTerminal is a product developed by the authors at CosmoCows (see<br />

Mathieu’s talk). Mainframes were where big insurance companies were<br />

located, serving clients: the clients were completely powerless without the<br />

server. The next stage was the PC era. People had freedom to choose<br />

applications but the management of all this was a pain: you had 1000 PCs<br />

to upgrade, not one mainframe with a thousand terminals. Then we got<br />

GUIs, leading to rich desktop applications. The end users faced increased<br />

complexity. So did the creators of UIs and the writers of user manuals.<br />

Thus many developers adapted MVC to have a UI person in the team.<br />

Finally, we are getting rich internet applications. Now the application has<br />

returned to the server.<br />

WebTerminal is a client-server architecture, communicating by HTTP (S).<br />

They support IE6+, Firefox 2+, Safari most recent and Opera most recent.<br />

Customers on corporate networks have no control over what plugins are<br />

installed on their browsers. Therefore they cannot use solutions that need<br />

additional plugins; no Flash, no <strong>Smalltalk</strong> plugins and so on. The only<br />

thing they can use on the client side is Javascript. Most of these networks<br />

run behind firewalls, some of which disable long connections that are not<br />

exchanging information. Comet uses a long-lived connection in which a<br />

single client request then leads to several server pushes of data to the client<br />

over the same connection, but they cannot do that because the bad firewalls<br />

will kill the connection.<br />

Static content is served otherwise (by Apache, say); only dynamic content<br />

is handled by the app.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 57<br />

The client-side terminal must render a rich user interface: input fields,<br />

images, buttons. The terminal must record how the user has interacted<br />

(clicked here, typed there) and at the appropriate moment they must reply<br />

to the server in an XMLHttpRequest. The server’s response described how<br />

the UI must be updated and the terminal does that.<br />

The client-side terminal has no application logic. The server does that. It<br />

maintains an MVC pattern for communicating with the client. They have a<br />

protocol, the delat protocol, for sending UI changes from server to client.<br />

It synchronises the right UI on the client side with the virtual UI that is<br />

computed but not actually displayed on the server side.<br />

They only communicate significant changes. They ignore mouse and<br />

keyboard events. They synchronise high-level components (widgets), not<br />

bitmaps like the X Windows Systems. They have all the usual widgets:<br />

label, image, button, tree, groupbox, hyperlink, HTMLContainer and many<br />

more. He demoed and (had the usual demo hiccough - needed to refresh his<br />

session and) showed a tree widget. He then showed the messages<br />

exchanged between client and server when he changed a tree widget<br />

property. These are enough for administrative applications (they are not<br />

aiming at the games market).<br />

They use Javascript, the Prototype library, and have implemented a few<br />

widgets via jQuery and Xinha.<br />

Performance was a issue because they used a lot of DOM calls and on IE<br />

these can be very slow (one page took 30 secs to render on IE6 and < 2<br />

seconds on Safari). They rewrote the rendering mechanism to avoid DOM.<br />

Instead they build an HTML representation and put that source in the DOM<br />

screen only at the last moment.<br />

Support for CSS is poor in IE6 so they had to restrain their use of CSS. In<br />

some browsers, backspace is a keypress event but in others it is only a keydown<br />

event. This is hard to debug and some browsers are also very poor at<br />

debugging.<br />

The architecture is pure MVC with slight terminology changes:<br />

Applications (c.f. Application Model) and PageSpecs are connected to<br />

WebWidget Builders, thence to WebWidgets.<br />

Finally, he built a chat application in WebTerminal. He put the chat widgets<br />

into a simple grid layout, added the past posts widget and put them all in<br />

an overall panel widget. He showed the pageSpec:<br />

PanelSpec new<br />

beVertical;<br />

addSpec:<br />

((GridLayoutSpec new<br />

columnWidths:..;<br />

rowHeights: ...;<br />

specAt: 1 @ 1 put: (LabelSpec label: ‘Name’)<br />

specAt: 1 @ 2 put: ... aspect: #name ...<br />

...


58 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

addSpec:<br />

(RepeaterSpec new<br />

collectionAspect: #messages;<br />

spec: (LabelSpec new<br />

labelAspect: #yourself;<br />

yourself)<br />

....<br />

He saved the pageSpec method, then generated its aspects, name and<br />

nameHolder, text and textHolder. The messages must be the same for two<br />

users of the application so he did the simplest thing that could possibly<br />

work by making the instance-side delegate to the class-side to get messages<br />

from class instance variable.<br />

Lastly, he told the system that Chat was a top-level application (an entry<br />

point), showed it, added an entry and (got the usual demo hiccough - he had<br />

not yet implemented the submit button) and had to tell the other client to<br />

refresh and so demoed.<br />

Using User Changes, Leandro Caniglia, Valeria Murcia, Caesar<br />

Systems<br />

This talk was also presented at <strong>Smalltalk</strong> <strong>Solutions</strong>; go there for my single<br />

write-up merging information and questions from both presentations.<br />

GStreamer: media streaming in Squeak, John Macintosh<br />

(Having media problems during a talk about media is tedious. John was<br />

going to show Sophie but the 600 x 800 projection screen does not really<br />

allow it.) John has been working on Sophie and on the iPhone Squeak VM<br />

(with financial help from <strong>ESUG</strong>; thanks) with Michael Rueger. They will<br />

release the code for it next week so you can see it in the iPhone simulator<br />

or, after paying Apple, in the iPhone itself.<br />

GStreamer is a library for building graphs of media-handling components.<br />

It can be used and abused in a wide range of ways. Its code has good and<br />

bad features; e.g. mpeg codexes are not in the base and must be found by<br />

hunting on the internet. OGG is the only open-source framework for this<br />

John knows of. You can get GSTreamer on WIndows, Linux, etc., and has<br />

a reasonable licence (see the wiki).<br />

The Squeak plugin is not a full implementation. The GStreamer class<br />

library is immense and their subset lets them decode and encode audio and<br />

video via some 100 primitive calls. It has been written for 32 bit; any 64 bit<br />

people here who would like to volunteer? (some ‘yes’es). It should be quite<br />

doable<br />

Most code is in Slang; a very small amount is in C. There is an SUnit for<br />

each publicly-exposed API call. The architecture is subclassed from<br />

GStreamerObject (fortunately, the GStreamer library is fairly objectoriented).<br />

The plugin works by marrying a C object to a <strong>Smalltalk</strong> object<br />

so they must GC the C when they release the <strong>Smalltalk</strong> objects. However<br />

a pipeline of C objects will crash if all are released ineptly on its married<br />

<strong>Smalltalk</strong> object’s death; you must avoid the double-freeze problem.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 59<br />

Finalisation is when your code tells you that a <strong>Smalltalk</strong> object has died or<br />

is about to die, having gone out of scope. Thus a <strong>Smalltalk</strong> object married<br />

to a C object gets a message which prompts it to tell its C object to go away.<br />

(There is also resurrection, a horrifying procedure which indicates bad<br />

code.)<br />

A GStreamer can be a source (microphone, camera) or a sink (e.g. display)<br />

or both (audio comes in, gets altered and is sent out again. GStreamer<br />

objects are referred to by name and there is a command that lists all the<br />

installed elements. An element is then put into a pipeline or bin. You must<br />

then hook it up to show how the data flows between the elements. An<br />

element has a pad, either static (always there) or dynamic (created at<br />

runtime). A volume element would have a static pad but the OGG would<br />

have a dynamic one.<br />

A pad can be asked for its capabilities: it returns a mime stream of what it<br />

provides (source) or consumes (sink). He showed a video device returning<br />

its settings. You could tell a pad ‘you only understand 640 x 480’ to control<br />

elements. John showed an example of creating a tone generator on an<br />

ALSA platform (LSA means Linux Sound Architecture; what the A stands<br />

for he does not know). He created an element for a source data note<br />

‘audiodtestsrc’ that plays tones:<br />

audiodtestsrc := GStreamerElement<br />

elementfactorymake: ‘audiodtestsrc’<br />

name: ‘source’.<br />

added a converter element and volume controller element, and finally a<br />

sink element to talk to the ALSA hardware. (One would of course have<br />

helper methods to hide code like this in real use.)<br />

pipeLine := GStreamerPipeline name: ‘My-Pipeline’.<br />

result := pipeLine addElement: audiodtestsrc.<br />

result := pipeLine addElement: audioconvert.<br />

result := pipeLine addElement: audiovolume.<br />

result := pipeLine addElement: audiosink.<br />

result := GStreamerSystem default<br />

linkElementSrc: audiodtestsrc toDest: audioconvert.<br />

result := GStreamerSystem default<br />

linkElementSrc: audioconvert toDest: audiovolume.<br />

result := GStreamerSystem default<br />

linkElementSrc: audiovolume toDest: audiosink.<br />

pipeLine setStateTo: #playing.<br />

pipeLine setStateTo: #playing.<br />

pipeLine setStateTo: #pause.<br />

pipeLine setStateTo: #null.<br />

pipeLine release.<br />

The lowest level method setKey:toStringValue: connects to evil C<br />

typing which has to go on somewhere; double-dispatching hides it as best<br />

it can. See the gst-inspect Unix command to get info on an element: it is<br />

very helpful in deciding what capabilities an elements has. The<br />

waitUntilErrororMessage:upToMilliseconds:<br />

helper method returns on a range of conditions: end-of-stream, end-of-file,<br />

error message, 5000 milliseconds.


60 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

He then opened a Squeak image to show a more complex example: running<br />

a test to play 5 secs of audio from an OGG file recorded from the internet.<br />

The test quotes the unix command line equivalent. He ran it and produced<br />

5 seconds of sound !<br />

GStreamer lets you do complex video and audio streaming and push the<br />

responsibility of having it work down into the framework.<br />

requestForcallbackSignal: is ugly magic. The demux wants to<br />

create pads but the base Squeak VM does not support callback to <strong>Smalltalk</strong>.<br />

Their special set up knows how to interpret the pad-added message to<br />

hook-up the pads.<br />

John took the morphic mpeg player (written 8 years ago by John Muloney<br />

based on work by John) and rewrote it to use GStreamer. An OGG file can<br />

be audio or video or both and so they hang around for 5 secs waiting to see<br />

if it has video or errors and then assumes it is audio. He let us hear the<br />

audio, then opened a video (which he could rotate, etc., as usually in<br />

Squeak).<br />

Q. Who keeps the timing; Squeak or what? They wait for the next frame<br />

and then blt it to Morphic. John uses a q object and a p thread. It is a waste<br />

of time for audio to go to Squeak and then just be given to the laptop’s<br />

sound system so in this example he has the audio in this going directly to<br />

the audio output.<br />

Squeak can be a source but there is still work to be done there (volunteers<br />

welcome).<br />

Lastly, playbin and playbin2 aims to figure out all the complexity of<br />

arbitrary input and output. It works in some platforms for John but not on<br />

OLPC; it could be made to work.<br />

Q 100 native primitives? Calls for each type, to get attributes for a tab, set<br />

them, etc.<br />

Q. Use FFI instead of primitives? FFI is not offered on EToy environmnet<br />

which is one of the targets for this.<br />

Heating Control System with <strong>Smalltalk</strong>, Alfred WullSchleger<br />

Alfred retired in February and had time to address the problems in his home<br />

heating system. All control was handled by 230 volt switching of 4 relays<br />

for the outgoing flow (on/off) the mixer (open/close/off) and the gas valve<br />

(on/off). The system can know temperature going to the house (tv), the<br />

temperature returning to house (tr) and the earlier/later temperature going<br />

in and returning from the mixer (tvm, trm).<br />

The house likes 30C < tv < 55C. The boiler temperature should never be <<br />

40C (causes condensation, which causes corrosion). Boilers are small (< 10<br />

litres) whereas radiators have 300 - 500 litre capacity. Thus the heat<br />

capacity of the radiators far exceeds that of the boiler, so you must be


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 61<br />

careful when opening the mixer. It needs to rotate to just the right angle.<br />

The start point was the commercial control unit built into the boiler:<br />

tklower and tkupper control when the gas valve is started and stopped.<br />

Since the mixer is very inert, tk rises fast and the burner stops soon. When<br />

the mixer opens tk falls fast and the burner starts again. He showed a graph<br />

of these rapid rises and falls (six peaks and troughs in less than 20 minutes,<br />

and this behaviour typically continues for 40 - 50 minutes after the system<br />

starts), with frequent drops below 40C. By contrast tr varies very slowly.<br />

Thus the boiler is incessantly switching on and off, stressing the gas valve<br />

and not meeting the 40C requirement.<br />

(At this point, Alfred’s slides tried to help us understand by not aligning<br />

with the screen; he was using Dirk’s computer.)<br />

He therefore worked on a new control unit that would meet tk > 40C except<br />

for the first 3-4 minutes after startup. His hardware was a standard PC plus<br />

USB (from Minilab1008 USB module with 8 AD and 2 DA analogue<br />

channels; later, he will move it to a suitable small component on the boiler)<br />

plus an interface he built himself to control the valves and temperature<br />

sensors. All control and UI was in <strong>Smalltalk</strong>. The (manufacturer-supplied)<br />

DLL for the Minilab1008 is pleasant to use.<br />

He can control it remotely or though the house’ LAN via sockets for remote<br />

operation. (Q(Noury) Plain sockets, not distributed framework such as<br />

OpenTalk? Alfred was accustomed to using sockets in this way in his work.<br />

He also has very small commands, just changing temperature bounds.)<br />

He then made a simulator that was independent of hardware. He proposed<br />

3 phases:<br />

• early heat from cold boiler with tk < tmin, only tk is interesting,<br />

• intermediate with tk > tmin, tv < tvdesired<br />

• normal running with tk > tmin, tv ~ tvdesired, and tk should be as close<br />

to tv as possible<br />

(of course, he only realised this structure of the problem after a period of<br />

experimentation). The minimum energy needed is given by the formula<br />

Emin = c*mass of water in radiators * (tvdesired - tv). When Emin is < 0,<br />

the house has a reserve of energy. When Emin is > 0, we do not switch off<br />

the gas valve. This means that the mixer must be controlled very finely to<br />

avoid overheating or underheating the boiler. This phase can last for a long<br />

time, hours perhaps. Only when Emin is Emin > EminMaximumReserve we do this and if we exceed the<br />

maximum (10kJ) we switch off the valve hard, waiting until Emin has<br />

dropped significantly.<br />

The mixing angle is measured from the steady movement of the mixer<br />

linearly from 0 to 90 degrees while the mixer opener is on. He always<br />

closes the mixer for 2 minutes (it needs 107 seconds to close) to close it and<br />

so get into a known situation. This causes tk to rise quickly. He then starts


62 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

to open the valve to a set value. After 900 seconds, the intermediate phase<br />

starts and tv is also monitored, causing a more subtle behaviour of the<br />

mixer, but the gas valve remains on.<br />

He noted how tk moves significantly with tiny mixer motions. tv always<br />

shows a bump when the mixer moves (output is near the boiler so r bumps<br />

up and down as heat is supplied and then slightly more slowly is pushed<br />

into the house) while the return values move very slowly.<br />

Finally we reach the normal running mode. The mixer can be left at 90<br />

degrees when tk is well above tmin. He finds he can manage it between 17<br />

and 70 degrees for much of operation. Closing the mixer for 10 minute<br />

periods when the gas valve is off conserves heat in the boiler.<br />

When he started this work, the curves were not as clear as in his slides.<br />

They wandered all over the place. Fine control of the mixer was the key<br />

realisation. The start-up mode is more complex to handle than the steady<br />

state.<br />

Starting work in February was a good choice as the external temperature<br />

rose and so he could study a range of states. However he must wait till next<br />

year to see if it saves him financially or not.<br />

One safety issue is to avoid steam. He guaranteed this by a softwareindependent<br />

bimetal switch which turns off the gas valve when tkm>80C;<br />

the boiler came with a manufacturer device that switches off at 100C which<br />

he thought too risky.<br />

He can also switch between his unit and the old unit by moving a single<br />

connector. It is clear that his system is much more stable, less fluctuating,<br />

than the commercial one. <strong>Smalltalk</strong> was a great environment to work in; he<br />

could sit by the boiler and make live changes fast (important when the<br />

boiler was heating up very fast) and switch to hand control of the mixer. He<br />

could also see when his simulation did and did not match what the real<br />

world did, so teaching him the scientific behaviour he was modelling.<br />

Q(Niall) Commercial value? Yes, but having worked all his life in banking<br />

and similar he has few contacts. Anyone know any top-end boiler<br />

manufacturers?<br />

Croquet/Cobalt: An Open Collaboration Architecture for Education,<br />

Robert Sheperd and Julian Lombardi, Duke University<br />

Rob Sheperd has founded eduVerse (group in Amsterdam) and is talking to<br />

surfNet, seeking to interest them in Croquet. He wants to work with<br />

Squeakers here. He then called Julian Lombardi who gave the talk, his face<br />

in one screen, the slides in another.<br />

Julian summarised the mouse, window and office metaphor that our<br />

computers use now, then gopher and the world-wide web. The world-wide<br />

web uses the metaphor of the document. It’s good for that and poor at, for<br />

example, presenting talks like this. Google is a great search engine for


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 63<br />

finding information you want to have. At his university, they introduced an<br />

online library catalog - and people complain they now cannot simply<br />

wander round the stacks discovering things. They have lost the context. If<br />

you want to show the context - the books on the shelf that has your book,<br />

the other people browsing that shelf - how do you do that.<br />

The web works by replication of data. VirtualContext systems such as<br />

second life rely on this replication of data; they create a virtual world on<br />

the server. A client accessing that virtual world needs to ask incessantly<br />

about what is happening in that virtual world, unlike reading a web page.<br />

Many clients talking to a second life server creates a huge load; 20-30<br />

people at most can be handled by a single server.<br />

Croquet wants to make virtual worlds, and deep interaction in virtual<br />

worlds, available to millions. Companies that serve virtual worlds today<br />

have server-oriented financial models. Croquet/Cobalt aims to avoid the<br />

problem by replicating computation: each client has its own computation<br />

and synchronises only when things change, communicating with pier-pier<br />

mechanism called Teatime.<br />

They snapshot the world from time to time: if a client switches off and later<br />

reconnects, they get the snapshot and later messages from any pier.<br />

Croquet will be open-source under MIT. They are funded by the Andrew<br />

Mellon and the NSF.<br />

He then demoed - and immediately lost signal. A quick reconnection sorted<br />

things. The demo is available to ran over the web<br />

(There is also QuackForms, a commercial company, with several Croquet<br />

architects working there, that is commercialising some Croquet<br />

technology. He is focusing on open-source efforts.)<br />

Pier-pier messages are timestamped and executed in order of timestamp for<br />

all participants. He showed two users moving a window within a window<br />

(usual Alice and Rabbit avatars). Collaboration comes naturally in this<br />

stateful system: Julian can edit text in a subwindow and so can the rabbit.<br />

Portals resemble hyperlinks: avatars walk though portals to other worlds.<br />

The rabbit walked through a portal, then created another world and entered<br />

it. Julian then picked up the world/portal and moved it to a third world.<br />

Croquet can access remote applications., The rabbit launched the Squeak<br />

chess game (2D, projected on a screen in 3d croquet) and played it with<br />

Julian. Via VNC they could project many external applications from<br />

Windows or Linux or wherever, not just Squeak applications. He showed<br />

an avatar carrying around a screencast (of him lecturing, I think) projected<br />

into Croquet.<br />

He flew around the helicopter and showed the demo of drawing a shark in<br />

2-d, rotating it into 3d and making it swim.


64 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Next he projected a Flash screen - in Croquet Flash it can be shown in<br />

perspective because it is projected into Croquet, even though naturally<br />

Flash only accepts isometric transformation.<br />

Having demoed Croquet, he next showed Cobalt. Croquet has been under<br />

development for 4 years (depending how you count, he said: I’m sure it<br />

was doing some of what he showed in 2003). Croquet is a development<br />

environment. Cobalt will be an application. He dragged a jpeg image from<br />

the desktop to the cobalt world. Cobalt is making Croquet usable to endusers<br />

- the ones who will create virtual worlds. The Cobalt avatar was much<br />

improved over the basic Croquet avatars in terms of its movement and<br />

appearance (but he was much less characterful than the rabbit and Alice -<br />

just a typical PC figure).<br />

They have Jabber (rendezvous server), heads-up display tool, terrain editor,<br />

etc. He added a turtle from a repository (Niall: clearly Croquet is turtles all<br />

the way down :-).<br />

Q. Recent rewrite of OpenGL and deprecation of a number of functions<br />

will force rewrite on you? Yes, they will have to at some point but for the<br />

next year they are focused on getting this out the door. They are poorly<br />

funded and relying on a community-based effort.<br />

They aim to release Cobalt/Croquet next summer. Croquet was a top-down<br />

project. It is not any more. There are 12 people actively involved in croquet<br />

development; he would welcome involvement from people here. Visit<br />

croquetconsortium.org for the roadmap. And things not on the roadmap are<br />

also getting done - a group in Malaysia is integrating FreeCAD which was<br />

not on the roadmap but they thought it needed to be done.<br />

Madeo: a CAD tool for Reconfigurable Hardware, Loic Lagadec<br />

Madeo is from the University of Brest. Refactoring, reuse and agile<br />

development also exist in real hardware. Co-processors can have dedicated<br />

and dynamic instruction sets. Reconfigurable hardware is a way to build<br />

these. He is looking at very hardware programming at a very low level:<br />

take two input signals, decide what output should they compute.<br />

Q(Reinout) Static or dynamic? the idea is to change e.g. a portion of<br />

memory at a time while using memory.<br />

The targets are FPGAs and the eFPGAs that are coming on the market.<br />

These could be used for implementing hardware VMs amongst many other<br />

things.<br />

It is a very complex task to program these circuits. Loic seeks to apply OO<br />

methods to this task. He has been working in this field for ten years. Their<br />

first task was to build a framework to map high level code to circuits for<br />

one specific target (XC6200 from Xilinx), to learn all they could from that.<br />

They then generalised to more targets. He showed a screenshot of their<br />

system with circuit diagram displayed and an inspector open on a<br />

HardwareContext. He had various implicit assumptions in the first model


which use corrected.<br />

CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 65<br />

He opened the system and selected a target architecture. A complex<br />

indented text description listed the functions and their interconnections of<br />

the architecture.<br />

He opened a box array diagram; each box was a switching element. He<br />

moved to a diagram of connections and selected some functions. He<br />

opened a table of input combinations mapped to results. He built his<br />

choices, returned to the box array and placed his circuit on the board.<br />

They use the meta-modelling tool from Alain Plantec. They use the visitor<br />

pattern in several places in the tool. The modules are pluggable to allow<br />

various routes in from application specs and out to EDIF, C-like code and<br />

other outputs. In this domain, these results must be validated by standard<br />

tools, so must be exportable to them, but they are <strong>Smalltalk</strong>ers and also use<br />

SUnit.<br />

Madeo has been used in several projects and is open to third party use.<br />

Development lessons he learned: meta-modelling is a cost killer. When<br />

exporting code, target your partner’s reference language; treat partners as<br />

clients. Don’t show partners that you work faster than they do; they will<br />

become suspicious. Say the next release is in 1 month, not in 1 week. Treat<br />

validation as very important: your code must still work with the latest<br />

release.<br />

Q(Reinout) licence? Not yet clear but they are happy to send an image<br />

tomorrow (“Don’t say tomorrow, say in 1 month” :-).<br />

Q(Eliot) Optimise and download to chip or execute globally; how far have<br />

you got analysing that? (I lost some of the discussion: background noise)<br />

You want to map very high-level behaviour so can we have a semantic<br />

framework in which you could study the value of mapping a dictionary into<br />

associative memory? That is above what they are doing today.<br />

Q(Eliot) Time to market in games is vital. Some functions have been using<br />

lazy functional programming languages. The cell is a coprocessor with<br />

very limited resources. Does the <strong>Smalltalk</strong> machine dynamically manage<br />

the coprocessors? Loic has seen talks on using FPGAs to manage resources<br />

dynamically. A student is working on it. Problems are to decouple memory<br />

access from computation and to build the pipelines.<br />

Development Tools and Techniques<br />

Exploratory Modelling, Rob Vens, www.robvens.nl, rvens@sogyo.nl<br />

Rob has half-an-hour to describe what has taken him years to understand.<br />

He thought the best way to do it was just to do it. When he does xM with<br />

customers, he has to tell a story first, else they will stay in their own<br />

familiar mindset. Most businesses do not have a language to express<br />

themselves. They may think they have but in fact they automatically fall<br />

into business baby talk, “explaining things so simply, they’ll understand”.


66 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Business has been living with IT for a long time and having a lot of<br />

problems so they talk as if they were computer technologists. So when not<br />

talking business baby talk, they talk the language they think Rob will<br />

understand.<br />

Thus Rob tells them that the world they live in is the world he will mirror<br />

into their software. In a mirror, things are not exactly the same as in the real<br />

world. Mirrors turn some things upside-down or back-to-front. When you<br />

mirror the real world into the software world, things become alive and<br />

living beings become dead. Accounts and Products become alive and do<br />

things, whereas the accountants and product managers become<br />

incapacitated. In Disney, doors open themselves, teacups walk around. In<br />

the software world, products sell themselves, accounts transact themselves.<br />

Domain-driven design is very important to the <strong>Smalltalk</strong> community.<br />

Dynamic languages are becoming popular, closures are becoming popular,<br />

but also domain-driven design are becoming popular. (Reinout: people<br />

model the solution domain, not the problem domain.)<br />

The business owns their domain model, not (usually) the GUI, security,<br />

etc., technology components from which it is built. Technology<br />

components are there to synchronise the mirrored model with the real<br />

world. Good technology is invisible.<br />

As well as this active-passive switch, domain models can exhibit time<br />

reversal. They are constantly moving. A principle Rob uses is that models<br />

are evolved by adding new components: the existing components do not<br />

change.<br />

Bravely, Rob then asked the audience for a problem on which to show his<br />

approach. He got one: a company collects old metal in containers for<br />

recycling; the containers are distributed round the country, then moved to<br />

central locations and emptied, then moved back again. At the end of the<br />

year, 400 of their containers are missing. How can they track them?<br />

Rob starting modelling at the end. That is a key rule in his approach: first<br />

ask, “What is the situation you want to end up in?” At the end of the year,<br />

you want to have all your containers in a location and you knowing what<br />

that location is. Rob opened a vanilla VW image and created a package for<br />

the model. (This never bothers customers - he just says he needs a place to<br />

keep the model.) He opened a workspace and did<br />

Container new.<br />

(This container may live for a few days or a few weeks while the modelling<br />

session changes its methods and instvars a lot - only <strong>Smalltalk</strong> can do this.)<br />

He sent arriveAt: to the container, got DNU, hit define, wrote as a<br />

proposal<br />

arriveAt: aDestination<br />

self unloadAt: aDestination<br />

leading to a discussion of whether the end-year destination is the recycling


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 67<br />

or whether it is the return to the collection point after recycling. (Again,<br />

customers never complain about seeing the debugger). Rob stressed this<br />

time-reverse approach: he is working back from each end state to its<br />

predecessors.<br />

He had a customer with a very complex problem domain. He extended the<br />

inspectors to let him drag-drop (important for customers). The customer’s<br />

people were very pleased; they liked the sessions and found they<br />

understood their own problem domain much better than before.<br />

He is rewriting his MyGold personal finance system using this technique<br />

to guide the rework and will publish papers on it.<br />

Q. Eric Evan’s book? It is interesting but very technology-oriented.<br />

He built an XMI exporter so models constructed this way can be exported<br />

(and imported to C# in this customer’s case).<br />

What <strong>Smalltalk</strong> can Learn from Java, Philippe Marschall<br />

At the end of this talk he expects people to say, “we could build something<br />

better than this.” So do it!<br />

JMX monitors and manages images. Images do go bad in production on the<br />

server. In general it happens slowly: memory problems, too many sessions,<br />

whatever.<br />

In the past, Philippe just used a work space: some allInstance checks,<br />

state checks and so on. This does not scale well, is not automatic, etc.<br />

You can build your own: you need to convince your manager, write it,<br />

debug it, and maintain it - forever. It is yours and you alone use it. Seaside<br />

won’t use it to tell you how many sessions there are. Glorp won’t use it to<br />

tell you its cache size. If you hack into Seaside, Glorp and so on to use it,<br />

you must maintain your changes to those base products.<br />

JMX lets you query values, invoke some operations and receive<br />

notifications. There are in-image and ex-image APIs. He opened the<br />

external UI and viewed data on an image: how much time was spent in GC,<br />

in JITing, memory state, etc., as graphs and data. Another widget showed<br />

a list of web sessions with their age and state, the database sessions<br />

likewise, and much other information. He exercised the app and looked at<br />

changed values.<br />

Your Swiss manufacturer does not call the moon face and other aspects of<br />

your expensive watch ‘features’; they call them complications. Features<br />

are bad: they cause bloat and confusion. However, just as Swiss watch<br />

manufacturers discovered they needed ‘features’ to sell their watches, so<br />

we find that features are good: they sell your software. So you want to let<br />

people take the features they want. Plugins are one way of doing this.<br />

Plugins are good - provided they work together. Will your Squeak image<br />

still work after you load this package? Module systems break your


68 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

application into feature sets and also make it easier for you to add small<br />

features.<br />

OSGi is a module system used by Eclipse RCP, GlassFish v3 and smaller<br />

application servers like Sling, etc. Application servers that supplied all<br />

their features as standard could take 20 minutes to start up. GlassFish v3<br />

starts (in a second) as a core that can only serve files, with much else<br />

loadable.<br />

Maven 2 is a build tool. It aims to work in 4GL declarative style. Try<br />

releasing more than a dozen Seaside subprojects to SqueakMaps and<br />

Universes. It is not automated and you have to script a lot of stuff. We<br />

should make an object model of a project and publish it, not script.<br />

POM lets project builds inherit from other projects. A Pier subproject, for<br />

example, would inherit a lot of stuff from a general Pier project. He showed<br />

the dependency graph of Pier Blog. It needs RSRSS and Pier-Seaside,<br />

which needs Pier-Model and Magritte-Seaside. Pier-Model depends on<br />

Magritte-Model, Pier-Seaside on Seaside.<br />

Dependencies are transitive, may be optional, may be only for tests, for<br />

development or for deployment. All this data can be generated into a<br />

project’s home page and other tools.<br />

ANT was mentioned in discussion. But you should not use it in general.<br />

JMX and OSGi are not good. Java has an unerring gift for doing things<br />

wrong so we should not aim to be compatible with them or imitate them.<br />

We should aim to model abstractly the problem these solve, then build that<br />

abstraction.<br />

Q. How long to build these? In a week, you could have Maven working,<br />

then extend it.<br />

Q(Tim) Some Java sites have build servers? You check something in and it<br />

gets built and tests run. SqueakMap is littered with things which will not<br />

even load.<br />

Advanced Techniques for building Testing Tools, Andrés Valloud,<br />

Cincom<br />

Andrés thanked Stephane for mentioning his books then recapped SUnit.<br />

Tests pass (true), fail (false) or raise errors. Andrés had to write a test tool<br />

for hash functions. Hash functions analyse a particular dataset with a<br />

particular hash function and produce a set of statistics, which is rather<br />

richer than true, false, error. What object caused a particular hash value to<br />

appear. What collisions occurred.<br />

Thus your results are a collection of small integers. He therefore reified the<br />

evaluation context. The Distribution sends resultsInTheContextOf:<br />

to the EvaluationContext which holds a hash bucket dictionary.<br />

He also had a hierarchy of datasets. He showed the hierarchy drop-down in


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 69<br />

the tool, a standard class hierarchy. However some data sets are repetitive<br />

sequences, some are sequences of 4 letters, some are Dutch words as<br />

against English words, and so on. These do not share much code so have<br />

no common superclass but this commonality of type is important for the<br />

tests: does a given function do well or badly on given types of dataset.<br />

There are also ad-hoc datasets intensionally-defined by e.g. allInstances or<br />

a collect: called on another dataset or whatever and these also have no<br />

natural identifying superclass. Lastly, he sometimes wanted to handle the<br />

hashed result collections as input data.<br />

He therefore created AbstractDataCollection whose instances behave like<br />

the classes he wishes existed for these non-class datasets. Polymorphism<br />

lets classes be objects so it also lets objects be classes. :-) This has method<br />

subclasses that returns these dataset ‘classes’, while the actual class that<br />

the dataset is an instance of is returned by classToImpersonate, and<br />

LeafDatasetMetaclass>>new just returns the dataset.<br />

He returned to his tool and showed the ad-hoc dataset hierarchy with its<br />

not-classes. He opened an inspector on the <strong>Smalltalk</strong> dictionary and<br />

adopted it as another dataset in his tool upon which to do hashing tests.<br />

Andrés wrote various extensions to SUnit for validation and benchmarks.<br />

He therefore needed to extract all hard-coded references to e.g. TestSuite<br />

in methods so they could be subclassed. He also extended runCase: to<br />

handle the greater range of exceptions. He did not want to call on:do:<br />

over and over again. He instead double-dispatches on exception handlers.<br />

on: ...<br />

do: [:ex | ex occuredForTestcase: aTestCase<br />

inTheContextOf: self]<br />

(self is a TestResult). Thus he can add validation and benchmark SUnit<br />

failures without overriding code.<br />

When he wrote his book he had a lot of string matching checks (7 * 56 lines<br />

output for a typical test) which was very tedious. He was running<br />

essentially the same test for many pairs of patterns and matching result<br />

strings. For benchmarks he wrote multiple setUpCaseA1, setUpCaseA2,<br />

etc., methods with running the test meaning setUpCaseA1, run, tearDown,<br />

setUpCaseA2, run, tearDown. These also set whether failure meant a little<br />

slower, 10 times slower, etc. He also created modifications of the basic<br />

tests via e.g.<br />

self setUpCaseA1.<br />

self makeDataUppercase.<br />

but the more he extended SUnit the more he was concerned about<br />

incompatible SUnit mods (for example, lots of people do logging<br />

extensions to SUnit and he felt his work would be incompatible with<br />

theirs).<br />

He therefore created a new framework: Assessments. He asked why we<br />

have to create an instance of TestCase. He thought that having a separate<br />

test for each run in a given context was like giving someone a questionnaire


70 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

with a separate sheet of paper for each question instead of one sheet for all<br />

questions. An Assessment is a single instance that refers to a large number<br />

of Checks (equivalent of TestCases) on an AssessmentEvaluationContext.<br />

This has a result policy which returns a given Assessment result; the policy<br />

handles whatever logging you want.<br />

The Assessment Result has results of type A, results of type B and so on<br />

and knows which checks returned type A results, which returned type B<br />

and so on (so basic SUnit would have pass, fail and error as its types, his<br />

validation and benchmark would add two more types, etc.). The<br />

classificationTag for any result is its class. A Check has a receiver,<br />

selector and arguments, and it also has an executionPolicy. Run is one<br />

policy: get the result and don’t show the debugger. Debug is another: who<br />

cares what the result is, just show me the debugger. Thus he has a set of<br />

polymorphic exception handlers and the Check knows how it should run.<br />

So he can have execution policies for SUnitVM, for SUnitToo, for SUnit.<br />

(Someone’s computer or phone played a sad tune at just this point. Andrés<br />

picked that up as, ‘Well, if you are in SUnit, indeed that is sad for you. :-)<br />

He maps SUnitToo exceptions into Assessments exceptions; receive an<br />

exception, raise another. However he still has SUnit TestCase subclasses<br />

and SUnitToo (different) TestCase subclasses. He therefore uses the<br />

Metaclass trick he showed above to see them all and call them all from his<br />

Assessments UI via<br />

pretendToBe: self testCaseRoot from: someSuperclass<br />

He opened an Assessments evaluator and ran some Assessments tests.<br />

Then he expanded the AbstractSUnitTooBridge, ran some tests, found a<br />

failure and debugged: the debugger opens in a stack where you only see<br />

SUnitToo stuff; no Assessments stuff gets in the way.<br />

Q. This is available, licensed? Yes it’s available, feel free to use it. He will<br />

discuss licensing with Stephane then add an MIT or similar licence to allow<br />

maximum use and minimum inconvenience.<br />

Starting fresh every morning, rebuilding a development image every<br />

day, Yann Monclair, JPMC<br />

Yann went to university in Brest where he got hooked on <strong>Smalltalk</strong>. Kapital<br />

was released in 1995 and now has 22,000 classes (base VW 7.3 plus Envy<br />

is just 2,200 of these). Each development cycle changes 5,000+ classes<br />

(last cycle change ~ 7,000). The production image is 90Mb, the<br />

development image is 120Mb.<br />

A small team can resynchronise their code bases easily. A multi-site, three<br />

timezone team needs a process. 60 - 150 classes change every day. Every<br />

day, 25 change sets of 5-8 classes are applied. On average, there will be a<br />

class change conflict every week. There is also duplication of work if you<br />

do not resynchronise images. A large change can be hard to remerge (he<br />

speaks from experience). It is better to decompose your changes into small<br />

units and release them day by day.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 71<br />

Prerequisites: the Kapital rule is to make Envy happy. Envy by nature is<br />

very grumpy and complains a lot.<br />

A final reason for rebuilding your image every day is to discover unknown<br />

dependencies, much better than ifDefinedDo: [...] which is a recipe<br />

for hard-to-track silent problems.<br />

Envy holds code in Applications and Configuration Maps. It also versions<br />

classes and methods, its unit of granularity. To build the Kapital image,<br />

they load the top-level map, which loads everything else (or maybe<br />

sometimes fails and carries on having told you on the rapidly-scrolling past<br />

Transcript). Then they validate the build. They run SUnit-style code-driven<br />

tests to verify specific methods work. Then the do data-driven end-to-end<br />

testing and checking that the results are as expected. This is called the<br />

SmokeTest. These smoke tests include deep scope tests - compute today’s<br />

value of every product in Kapital - and wide scope tests - verify in detail<br />

some functions for selected trades only.<br />

It takes 40 minutes to build an image and then 2 hours to validate it.<br />

The Kapital launch command gets today’s image and loads your current<br />

unreleased working code into it, ensuring that if some specific action is<br />

needed to make your image work, it’s absence will be revealed.<br />

Q(Arden) Development or production? Development: production release<br />

process is formal in a bank!<br />

Saving an image, common in <strong>Smalltalk</strong> generally, is doable but not often<br />

done in Kapital. They prefer saving code to Envy and loading new each<br />

day.<br />

Breaking the build will happen. The first thing to do is identify the issue:<br />

failing tests, uncompleted build, successful build but will not load. Tests<br />

can fail for good reasons - someone released a test as I released my code -<br />

or for understandable reasons - not enough time to run all tests before<br />

rushing out this fix.<br />

Uncompleted build: you find the offending code change. Most often it is<br />

prerequisite issue; a method not yet introduced or a class or variable not yet<br />

declared.<br />

Successful build but failed load means that Envy does not load all the way.<br />

It got so far, raised a warning e.g. it tried to do a code override which Envy<br />

will not tolerate), then does the save and testing anyway.<br />

If the build failed, that means that yesterday’s code changes are not<br />

validated and today’s are beginning to accumulate so you must fix as fast<br />

as possible.<br />

Failures can be because your method is not yet there (e.g. an initializer uses<br />

the with:with:with:with:with:with: extension, not yet loaded) or


72 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

clashing code because Kapital loads class versions, following Envy.<br />

Q.Make Envy do reduced conflict merging of class definitions and method<br />

defs rather than whole classes? Yann preferred to keep Envy happy as is.<br />

Q.How do developers get their code into the fresh image? The developers<br />

put their modified class images into a system (called FDPs) and they load<br />

their current one(s) into the fresh images.<br />

<strong>Smalltalk</strong> Standards <strong>Report</strong>, Bruce Badger<br />

I only caught the end of this. See http://smalltalk.gnu.org/wiki,<br />

http://lists.openskills.org/ and click on ANSI-<strong>Smalltalk</strong>.<br />

There was discussion of tests. Do we need tests for every STEP: Bruce is<br />

recasting the ANSI-<strong>Smalltalk</strong> syntax as BNF and that would be a review or<br />

social use thing rather than a testable thing. But generally, yes.<br />

Q(Dale) The rubber meets the road when a STEP is implemented and the<br />

vendors say, “We support that step.” Bruce agreed.<br />

Syslog, Bruce Badger<br />

RFC 3164 is a BSD ‘standard’ for logging. “For the self-aware organic<br />

units...” says the spec but no it is for computers, not us or aliens,<br />

specifically for sockets. Messages are 1024 octets in length with PRI,<br />

header and message. The Device sends messages, the Collector receives<br />

them and stores them and a Relay will filter and route them (and acts as a<br />

Collector and a Device as well).<br />

OskSyslog implements this (in VW), is in the public store, and can be used<br />

by anyone. He typed logger hello, world on the command line and saw it<br />

echoed. Then he did the same in OskSyslog. Nothing happened because by<br />

far the majority of syslog servers are not listening on UDP by default. They<br />

mostly listen on local *nix sockets. So when developing this stuff, by<br />

aware you will need to add a -r and restart the logger.He then executed the<br />

<strong>Smalltalk</strong> code - and met the usual demo hiccough - he was sending it to<br />

the wrong IP. Finally, it echoed.<br />

OpenSkills runs many http servers on Gems and they all get attacked with<br />

bogus requests and these get logged to local log files and it is a lot of work<br />

to review them. Now he can access any syslog device. You can log through<br />

TCP instead of UDP, (at lower throughput, of course) but ask yourself, if I<br />

cannot afford to lose a message or three, am I really doing logging?<br />

This listens on port 514 so you must run as root or use iptable to redirect<br />

traffic from 514 ti a port with number > 1024.<br />

Only one syslog server can listen on a port at a time so you must switch off<br />

your machines syslog server on that port in order for your OskSyslog to<br />

take its place. He did this and saw some messages on the Transcript.<br />

A Collector receives messages and does something with them: writes them


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 73<br />

to a file or a database or counts them or whatever.<br />

There are heaps of tools out there for analysing syslog messages. Syslog<br />

can be added to Toothpick or whatever as a source or as a sink, so<br />

Toothpick can do the logging and syslog then converts these to let you do<br />

extra-image things with the logged events using all these tools.<br />

VMs and <strong>Smalltalk</strong> Environments<br />

Keynote: Cog Back to the Future part 2, Eliot Miranda<br />

The motive for seeking a better VM is better server performance and better<br />

user experience in virtual world apps and similar.<br />

Why called cog? Well it is a small cog in Squeak, it can mean cognomen,<br />

it suggests a logo (and it let him show the Honda Accord ‘when things just<br />

work’ film; afterwards he showed the follow-up film on how it was made:<br />

six months of trying to make it work - which Eliot felt was exactly like a<br />

programming experience.)<br />

The VM is being built in baby steps: block closures solved (so goodbye<br />

BlockContext)<br />

tempVector := Array new: 1 ... do:<br />

[... tempVector at:...<br />

is easier than<br />

| next |<br />

...do: [:each | next := each binaryBlock...<br />

^next<br />

It is easier to keep the ‘tempVector’ around than manage that the temp<br />

‘next’ can outlive the method that declares it and must have closure refs.<br />

The task is to do a VW-style JIT. He has added closureOrNil.<br />

MethodContext<br />

instvars: ‘method ... closureOrNil receiver’<br />

There are five new byte codes. Eliot uses a trick to have 2 opcodes in one<br />

byte code for pushNewArrayOfSize:/pushConsArrayWithElements: and<br />

four other combinations.<br />

The image wants to use the context for everything: Seaside, the debugger,<br />

etc. Mapping the context to the stack is complex when you terminateTo:<br />

and don’t want to figure out the context-stack sizes for all the stuff you’re<br />

throwing away. Andreas suggested to him do an interpreter with the same<br />

context organisation as the JIT as a first stage. It may well coexist in the<br />

final system because then you do not have to JIT huge methods: those can<br />

be given to the interpreter.<br />

A stack frame (see slide) records the caller, receiver, caller context,<br />

method, flags and so on. A JIT knows the receiver and numArgs at compile<br />

time but an interpreter does not, so the interpreter has to fetch the numArgs<br />

and subtract along to get an arg. Thus in the interpreter argument access is<br />

slower.


74 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

This is implemented and has underwhelming performance: some<br />

benchmarks are 10% faster, occasionally 68% faster but the end-user<br />

experience is not improved (maybe even poorer).<br />

Eliot has hacked together a VM profiling tool which they have lacked in<br />

Squeak for a long time and he will develop it further.<br />

Eliot hopes to have an x86 fast JIT in April 2009. It will have a two-word<br />

object header to allow the same representation in 32 and 64. It takes six<br />

instructions to construct an arbitrary 64bit literal, needed to load a class, so<br />

in VW 64bit, Eliot stored a 20bit index into a table of 2 20 classes. In<br />

Squeak, he will use a 3 byte index to 2 24 table. Except when method lookup<br />

must traverse the class hierarchy, the two-word object header will suffice.<br />

A class’ id hash is its classTableIndex so you no longer lookup because its<br />

hash is its index. Eliot would love other systems to use this.<br />

Newspeak will have a different bytecode set from Squeak so he would like<br />

to make the decoding of bytecodes not a big switch statement as in<br />

conventional VMs but a table of functions so the bytecode set can be<br />

pluggable, with pluggable generators. This is what Eliot means by an open<br />

JIT and he hopes it will be used by Croquet and Newspeak as well as<br />

Squeak.<br />

The target is good floating point performance: AOStA - adaptive<br />

optimisation - has been renamed Speculative Inlining - SIStA - since it is<br />

optimising optimistically with guards. He will reify the PIC state, count the<br />

conditional branches... The PICs provide type information that an imagelevel<br />

optimiser can use to e.g. just add two SmallIntegers without worrying<br />

about type and overflow, just do at: aSmallInteger without<br />

checking. This causes you to create much bigger basic blocks between<br />

sends. Thus it may be that low-level VM optimisers may be able to<br />

optimise these large blocks; recently, he met the guys at Apple who do<br />

LLVM and they agreed.<br />

Q. LLVM is C++ technology? Eliot _thinks_ if the separation is done right<br />

it will be usable.<br />

The next stage, the quick (not just fast) JIT will be 2010 or 2011, earlier if<br />

you will help. :-)<br />

In questions, Eliot explained how he find it satisfying to figure out the<br />

shortest possible sequence of instructions - like playing solitaire. The<br />

difference between Squeak and Dolphin when doing fibonnacci is 5, and<br />

Dolphin is a really well-written interpreter. Between Squeak and VW it is<br />

a factor of 20.<br />

Eliot is very focused on where he wants to reach - a solid fast VM for<br />

Quack and the Squeak community. He is not doing research.<br />

Q. Multi-core? There is an emerging consensus that conventional multithreading<br />

programming does not scale; people are looking for alternatives.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 75<br />

Squeak is looking at hydra: many images, one per core, with fast interprocess<br />

communication. Eliot takes from this the decision that it makes no<br />

sense for him to try and solve the multi-threading problem in the VM. He<br />

will instead make sure his VM plays well with hydra.<br />

This is the first product Eliot has been able to blog about as he works on it.<br />

He enjoys doing so and the comments he gets. He will discuss offline with<br />

Pharo re getting stuff used early.<br />

Cincom <strong>Smalltalk</strong>: Present, Future & <strong>Smalltalk</strong> Advocacy, Thomas<br />

Arden, Cincom<br />

In Spring, Cincom released VW7.6 aimed at application developers,<br />

ObjectStudio 8.1 for business analysts systems and a maintenance release<br />

of OS 7. OS8.1 is the only Vista-certified <strong>Smalltalk</strong> (vista-certification<br />

needed a lot of work; they had to write a new installer). It supports Seaside<br />

(as VW does of course).<br />

VW76 has new-look refactoring browsers. It supports Seaside, OpenTalk<br />

for Seaside, the Glorp O-R mapping framework (GLORP) and MySQL.<br />

Hashing is much improved. VW76 also improves the OSX VM greatly (he<br />

sees a lot of Macs in the room so this is good news and you can rely on<br />

continuing effective support on Mac platform). When they cancelled<br />

Widgetry, they nevertheless moved over the grid widget and some other<br />

stuff.<br />

Where is Cincom going? Arden’s aim is to provide improvements but<br />

always ensure that if a change forces customers to port then it makes their<br />

effort worth it. Thus the emphasis is on incremental change and backward<br />

compatibility where reasonable. It is also about making noticeable<br />

improvements in areas that you can show, or at least explain, to managers.<br />

Cincom wants to grow <strong>Smalltalk</strong>. Continued investment helps that on<br />

itself, as does advocacy. Embracing new exciting technologies like Seaside<br />

(and adding to them: Web Velocity).<br />

They get ideas of where to go next from Customers, internally (engineers,<br />

the star team, marketing) and the community. Arden asked for ‘9 for 09’:<br />

three things to fix, refine or replace, three things to add, three things to<br />

remove (and then he added three areas to innovate).The results were:<br />

• make the UI look modern.<br />

• Store performance in large installations needs to improve. Store also<br />

wants more robust merging and better config management. [Niall: I<br />

assume this means line-ups.]<br />

• Fonts need improving and more internationalisation is wanted so<br />

customers can penetrate more markets. They are looking at a CLDR<br />

solution.<br />

• VMasDLL lets VW be a (better) part of a larger solution. The C<br />

interface speed and tools should also be improve.<br />

Multi-core CPUs are becoming common so we must leverage them; this


76 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

really resonates with customers. Some solutions are easy, some are hard<br />

and controversial.<br />

What made it: CLDR, 64bit VM, Graphics (Cairo), GUI Infrastructure,<br />

Graphics Designers.<br />

Q. Reinout? Look nice and be usable can differ, especially when you<br />

employ professional graphic designers; he speaks from experience. The<br />

debugger icons have changed and had to be relearned. Arden notes the<br />

point; it has not started yet.<br />

OS8 will have a GUI update too, and the classic modelling tool will be<br />

enhanced.<br />

What else made it: shadow-loading, atomic loading, DLLCC speed, highload<br />

thread safety when communicating with sockets, etc. They will also<br />

introduce posix compliance on delays (e.g. handle when long process goes<br />

past daylight saving change deadline).<br />

Multi-core made the list: something will be done there.<br />

Advocacy: one of their aims is giving current customers information to<br />

help them justify using <strong>Smalltalk</strong>. They give customers slides and info so<br />

they can argue it is a safe powerful choice. Another is to let past users know<br />

it is safe to return.<br />

Perception of <strong>Smalltalk</strong> is changing. He showed a Gartner group <strong>report</strong><br />

(not in readable-size font, sorry). Prior to this December 2007 <strong>report</strong><br />

<strong>Smalltalk</strong> was listed as ‘elderly’ (not a good rating: means, “flee from<br />

this”). Gartner has now listed <strong>Smalltalk</strong> as ‘mature’: (means, “it is safe,<br />

move up to the current release”). Big organisations use Gartner. He is also<br />

very pleased with the number of people at this conference.<br />

There is a whole new generation of managers and developers who do not<br />

know where <strong>Smalltalk</strong> came from. Now that <strong>Smalltalk</strong> is having its second<br />

surge, we must tell them. Look at the computer in front of you: its mouse,<br />

icons, drag-drop. It was all invented at Xerox Parc in <strong>Smalltalk</strong> ‘The<br />

Technology that invented the future’. The office metaphor (desktop, files,<br />

etc., also came out of Xerox Parc). It was invented by a group that<br />

reinvented the language every two years.<br />

Q. Stephane noted that while this is impressive to people who care about<br />

history, some modern Python developer often says, “yeah, great but that’s<br />

history man. What’s the relevance today?” Arden suggested emphasising<br />

that it did not just invent one thing but all the things that developer uses,<br />

and that a modern version of it is around today.<br />

<strong>Smalltalk</strong> is a general-purpose high-productivity tool. It is portable,<br />

accessible (full source code etc.) and fun (which for managers means better<br />

employee retention). It is also an education: many developers will say, “It<br />

was not till I learned <strong>Smalltalk</strong> that I really learned OO.”


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 77<br />

“<strong>Smalltalk</strong> was ahead of its time”. <strong>Smalltalk</strong> still is ahead of its time. Other<br />

languages borrowed the obvious things from <strong>Smalltalk</strong>. They missed the<br />

subtle things. Steve Jobs visited Xerox Parc (quote is from ‘Triumph of the<br />

nerds’): “They showed me 3 things: I was so blinded by the first I ignored<br />

the other two” (one of which was <strong>Smalltalk</strong>). Others, like Steve, are so<br />

blinded by raw OO they miss other things in <strong>Smalltalk</strong>. They miss closures:<br />

other languages add control structures; <strong>Smalltalk</strong> can add any it needs.<br />

<strong>Smalltalk</strong> reflection is first class and so allows incremental exploration of<br />

it. The syntax is a jewel in <strong>Smalltalk</strong>: simple, consistent, expressive, robust.<br />

Alone of computer languages it was designed to be easy to read, which is<br />

why it looks unlike other languages. Arden showed my Memo example. If<br />

you are talking to an audience that may be disposed to think <strong>Smalltalk</strong><br />

syntax hard to read, show them a purpose-of-talk slide in English:<br />

Memo<br />

to: Ruby user group<br />

from: Niall Ross<br />

date: 2 sep <strong>2008</strong>.<br />

<strong>Smalltalk</strong> syntax<br />

is easy to read;<br />

is not weird.<br />

Then show them the same slide in <strong>Smalltalk</strong>:<br />

Memo<br />

to: ‘Ruby user group’<br />

from: ‘Niall Ross’<br />

date: (2 sep: <strong>2008</strong>).<br />

<strong>Smalltalk</strong> syntax<br />

isEasyToRead: true;<br />

isWeird: false.<br />

Having been able to parse and understand the first text easily (because they<br />

knew it was English, not code) they will have a hard time claiming they<br />

cannot parse and understand the second, and you can explain <strong>Smalltalk</strong>’s<br />

use of colon, semi-colon and full stop (period) easily by referring to their<br />

analogous meanings in the English version.<br />

Developers in other languages hate having to work in the debugger. For<br />

<strong>Smalltalk</strong>ers, it’s fun. And snapshotting the image is like putting your<br />

notebook to sleep.<br />

Cincom is seeing significant <strong>Smalltalk</strong> growth: customers are buying new<br />

licences and new customers are appearing.<br />

He ran out of time so could not say much about Web Velocity: VW +<br />

Seaside + Glorp + .... It is not targeted at you: it is targeted at a sister<br />

department in your company (or wherever) who want to write web apps but<br />

are not developers. Use this to grow <strong>Smalltalk</strong> in your organisation.<br />

Changing languages prompts a lot of debate: choosing a web framework<br />

causes much less.


78 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Gemstone, Martin McClure, Gemstone<br />

Martin is not enthusiastic about the Gemstone product because he works<br />

there; he works there (for 10 years) because he is enthusiastic about the<br />

product. Gemstone is a <strong>Smalltalk</strong> implementation. Most of it is the same as<br />

any other <strong>Smalltalk</strong>. Martin will talk about what is different.<br />

GemStone is a server smalltalk. You deploy by having a web browser talk<br />

via Seaside to a GemStone server or having a client <strong>Smalltalk</strong> talk via GBS<br />

to the server.<br />

It is multi-user. Image-saving is a single-user model of persistence.<br />

GemStone is as-if you could save your changes and have them be merged<br />

with other users’ changes. This is done in Transactions: begin updates<br />

your view of the shared image (‘repository’); you now see all the changes<br />

committed to that point. You will not now see further committed changes.<br />

This property - read consistency - is only per select statement in many<br />

RDBs but in GemStone you will keep your consistent view until you<br />

decide to update it. abort discards your changes and updates your view as<br />

begin did. commit merges your changes and updates your view to that<br />

merged result.<br />

Merging always creates the possibility of conflict. Optimistic concurrency<br />

detects conflict at commit time and fails the commit, letting you handle the<br />

result (typically by aborting the transaction and redoing the work).<br />

Pessimistic concurrency gets locks to objects. You are now sure you can<br />

commit changes to that object.<br />

Gemstone’s units of conflict are usually objects - two changes to the same<br />

object is a conflict. Logically, changing an employee’s address and salary<br />

do not conflict but will be treated as a physical conflict by GemStone and<br />

happens rarely enough that it does not matter. However adding two new<br />

employees to the same collection may happen often, so GemStone offers<br />

reduced conflict classes, usually collection classes, named Rc... .<br />

Not all objects are persistent. Objects that are reached from the Transient<br />

roots (which are the session state array and the stack) will be transient: they<br />

will live in your VM but noone else’s (just as standard <strong>Smalltalk</strong> GC<br />

collects objects not reachable from the root(s) of persistence such as the<br />

Squeak system dictionary). Persistent objects are those reachable from the<br />

root of persistence, whose name is AllUsers.<br />

Most <strong>Smalltalk</strong>s are limited by memory. GemStone is not. It can handle<br />

billions of objects, hundreds of gigabytes of data, collections with millions<br />

of objects (so they offer an indexing and querying system).<br />

GemStone is not an object database. It includes an object database but it is<br />

a <strong>Smalltalk</strong> implementation. Because the OODB part is so tightly bound, it<br />

is much easier to use than an RDB (which is why he changed his talk title;<br />

at first it was ‘GemStone for dummies’ but in fact it’s the RDBs that are for<br />

dummies :-).


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 79<br />

Migration in a <strong>Smalltalk</strong> image when you change a class takes a few<br />

hundred milliseconds. In GemStone that can be a much longer time; too<br />

long to do always immediately. So GemStone allows you to have versions<br />

of classes and migrate between them at your schedule. ClassHistory is an<br />

ordered collection of classes that lets aFoo(1) isKindOf: Foo(2)<br />

return true.<br />

Q(Christian) Can you live with ten versions of the class? Yes. If you add an<br />

instance variable, you may migrate all your instances to have it and then<br />

add code that uses it. Or you may have the old instances’ class return a<br />

default value where the new method is a true accessor.<br />

Multi-user <strong>Smalltalk</strong> has to address security. A VM must access the<br />

repository just as an ordinary <strong>Smalltalk</strong> must access the image, so<br />

repositories have login and password. Some 10 privileges can be assigned<br />

in various combinations to various users: can alter other users’ passwords,<br />

can save methods, etc. They have object access policies (actually called<br />

‘segments’ but ignore this name; it confuses everyone, so they are thinking<br />

of changing it). There are read and write permissions, like UNIX<br />

permissions, where read can do anything that does not attempt to assign to<br />

an instVar.<br />

Non-namespaced <strong>Smalltalk</strong>s resolve names in the <strong>Smalltalk</strong> system<br />

dictionary. GemStone has multiple system dictionaries which are held in a<br />

symbol list. Bindings are searched for in each dictionary in the list in order.<br />

Each user has a symbol dictionary (so an object can be hidden from a user<br />

by removing its dictionary from their list but this is a mild form of security;<br />

they may be able to get a reference to the object in some other way). In the<br />

old days, Gemstone repositories were heavyweight things and not every<br />

developer had their own, raising issues of making the symbol list suit all<br />

users. Today, machines are more powerful and every developer has their<br />

own repository just as they have their own image in other <strong>Smalltalk</strong>s. The<br />

main use of symbol lists is namespacing.<br />

GemStone is not entirely headless. He executed code in VW to popup a<br />

GemStone window from the COLA project that Ian Piumarta is doing. It<br />

did simple UI stuff - type in box, click button, etc.<br />

Q? SQL tools on a GemStone database? SQL assumes your data is<br />

relational. It is hard to do something generic, though you could certainly do<br />

something on specific data. GemStone is 25 years old and has not needed<br />

it yet. GemConnect lets you connect to other SQL databases. (Bruce<br />

Badger: the PostgreSQL drivers have been ported to GemStone so you can<br />

emit SQL to dump data to PostgreSQL.)<br />

Q. Speed v. RDB? In SQL the tables have (generally) fixed size rows and<br />

use foreign keys to do lookups. A multiple join will be effortlessly beaten<br />

by a GemStone pointer-following for most object graphs. The OR mapping<br />

layer will also add some performance cost. A recent customer post said that<br />

their Gemstone system was doing 700 transactions per second and their<br />

RDB was doing 70 transactions per second on 3-4 times the hardware.


80 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

However you can always construct RDB-oriented examples which would<br />

show them ahead.<br />

MagLev: Ruby that Scales, Monty Williams, GemStone<br />

Monty is one of the founders of GemStone; he’s been there since 1982. He<br />

wants to get <strong>Smalltalk</strong> technology into as many hands as possible. To some<br />

<strong>Smalltalk</strong>ers, this talk should be called Ruby with Scales - how does it help<br />

<strong>Smalltalk</strong>.<br />

MagLev is a way to run Ruby code in a 64-bit GemStone/S VM. So why<br />

should we care? Well, because it runs <strong>Smalltalk</strong> too. The more people who<br />

run <strong>Smalltalk</strong> the better for all; there are a lot of rubyists. Monty went to<br />

RailsComp in May this year. Obe Fernandes CEO of HashRocket gave a<br />

talk about the worst rails code he’d ever seen (includes 3000-line methods)<br />

and stated, “If you really want to know how to make stuff better, find<br />

someone who has been doing <strong>Smalltalk</strong> for the last ten years.” There were<br />

2500 people at that conference.<br />

Why should Rubyists care about MagLev? Because it is a lot of things that<br />

Ruby isn’t. MagLev is fast (Ruby is not as slow as people say, but...). It is<br />

stable. It is scalable (there are some large Ruby apps on twitter, but ...). It<br />

is distributed. It is persistent. It replaces a bunch of components such as<br />

mongrels that you would see in a Ruby app with a single thing whose<br />

components all work together. Above all, it is turtles all the way down. A<br />

user saw a 15 times speed up going from Rails to MagLev.<br />

We should each befriend 100 Rubyists and show them Seaside.<br />

He showed Journal On Software (well known blog) quotes from two clients<br />

about GemStone’s superior performance. A shipping company managed 70<br />

transactions in Java on three times as much the h/w as managed ten times<br />

as many transactions in GemStone (see February 16th <strong>2008</strong> post).<br />

He showed the MagLev architecture: it is the GemStone/S architecture plus<br />

some MagLev smalltalk extensions, then on top of that the usual Ruby<br />

(Ruby core library, Ruby gems, etc.). They are trying to rewrite more Ruby<br />

in Ruby (actually, in <strong>Smalltalk</strong>) to slim this.<br />

He showed a side-by-side demo. He fired-up, opened a Squeak-tools view<br />

and showed a GemStone browser with Ruby stuff in it. A demo to keep<br />

rubyists happy types into the topaz interface: he typed <strong>Smalltalk</strong> code, then<br />

Gemstone code. At the Rails conference, some people were simply (and<br />

some were literally :-)) incredulous about what he did next: he ran the YAR<br />

benchmarks that Rubyists use to compare side by side. Normally he starts<br />

the Ruby then starts the stone of the MagLev to let the Ruby have a bit more<br />

time and help reduce their incredulity (but not enough; some frankly<br />

asserted MagLev couldn’t be actually doing anything to finish so fast; they<br />

could not believe that they could build such a system in 100 days).<br />

He then ran the short YAR again on the Ruby side (if he ran the long one it<br />

would take the whole talk) and then went to the MagLev and ran the long


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 81<br />

one which took very little longer than the short one which took almost no<br />

time at all.<br />

Q(Stephane) Method dispatch; Ruby can add methods to individual<br />

objects, make methods private? MagLev does not do method privacy. They<br />

handle object methods by adding lightweight singleton classes.<br />

Q(Stephane) if the Ruby people have a fast virtual machine, will it bring<br />

people to <strong>Smalltalk</strong>? Only consultants and book writers make money in<br />

Ruby. They say they are trapped in the web ghetto by stability and<br />

scalability issues.<br />

Q(Reinout) will there be a Ruby calling <strong>Smalltalk</strong>, <strong>Smalltalk</strong> calling Ruby?<br />

We have not decided. It is not technically hard to do. Ruby people like the<br />

idea of hit a button and reload all your classes, so will they excuse<br />

<strong>Smalltalk</strong> classes from that. (Follow-up Seaside on Rails? Ugh!)<br />

Ruby has thousands of tests that are the best spec for what Ruby is (there<br />

is no real language spec). They hope to give it to 10+ companies a limited<br />

private beta and circa RubyComp (November 4th) a public beta. Pivotal<br />

labs are redoing twitter; they are talking to them.<br />

VA<strong>Smalltalk</strong> 8.0 and Beyond, John O’Keefe, Instantiations<br />

I’ve incorporated all the material, discussions and questions from John’s<br />

StS and <strong>ESUG</strong> presentations into his most recent one at Frankfurt.<br />

A Moribund <strong>Smalltalk</strong> still alive and kicking: The APIS<br />

Visual<strong>Smalltalk</strong> IDE, Thomas Brey, Heiko Wagner, Jan Kaiser,<br />

Andreas Rosenberg<br />

Jan summarised the history of VSE. Digitalk published Methods in 1984.<br />

He showed a screenshot of what it looked like then (“Now we understand<br />

why Squeak looks the way it does”). In 86, they published <strong>Smalltalk</strong> V. In<br />

1995, ParcPlace and Digitalk merged; just before they did, Digitalk<br />

published VSE 3.1. No release has occurred since so it has been a challenge<br />

to keep it running on newer platforms.<br />

In 1999, VSE’s rights were sold to Cincom to support it and to Seagull who<br />

own the code. Cincom released VSE3.2 as a maintenance release. Other<br />

help was viral mailing lists. Raimondo in Argentina and others shared bug<br />

fixes and tips.<br />

VSE has no web technology features, no common controls, no unicode, no<br />

multithreading support. (Discussion with Eliot, Georg and others: S# does<br />

what Strongtalk does which is have one thread running at a time and<br />

callouts to others. <strong>Smalltalk</strong> MT does have multithreading support and the<br />

old ObjectStudio also has it but no more. Lesser <strong>Smalltalk</strong> also does it. But<br />

it looks like VSE is hardly unique in not having it.)<br />

Since many users have modified the base classes to deal with making it run<br />

on recent platforms and with the above, integrating fixes between users can<br />

be hard.


82 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

APIS provides Risk and Quality management tools. He showed some<br />

screens, oriented towards dividing systems into components and thinking<br />

about how these components can fail, how these failures could interact<br />

with each other, etc.<br />

They added a refactoring browser and a unit test browser. They tweaked<br />

their code pane to do code highlighting, formatting, autocomplete (similar<br />

to Vassili’s class search box). There is also in-place renaming of temps:<br />

rename the var in the temp list and that is a rename refactoring applied to<br />

the code. (If the method is in an incomplete state so that it cannot do a<br />

refactoring, it silently fails to do the rename.) They have a configurable<br />

formatter. These are not unusual in modern <strong>Smalltalk</strong>s but it is of interest<br />

that a such an old <strong>Smalltalk</strong> can look so modern.<br />

Their Java Standard Edition 6.0 integration was developed independently<br />

from JNIPort and JavaConnect. The used proprietary APIS enhancements<br />

and some VM enhancements. It creates wrapper classes from .jar files and<br />

lets you use the classes in <strong>Smalltalk</strong>, calling the Java machine to process<br />

whatever calls the Java received. They find it useful to be able to use Java<br />

libraries to get many features (e.g. Unicode) and integrations (to<br />

frameworks, databases, etc.) that are not in VSE.<br />

They use JNI for communication,. The <strong>Smalltalk</strong> VM had to add IEEE-754<br />

floats and 64 bit integers.You create a <strong>Smalltalk</strong> SSL from any .jar file. You<br />

can view, edit and compile Java methods and classes within the <strong>Smalltalk</strong><br />

IDE.<br />

He opened a tree browser on a file with some Java classes, imported them<br />

and checked for consistency (and refs in these classes to others not<br />

available) and exported an SSL created from these. He called it and ‘hello<br />

world’ appeared on the transcript. It could also say hello from named<br />

objects.<br />

He then opened a more complex example. It took a few seconds to open<br />

and then showed a long list of icon-distinguished (for public/private)<br />

Swing classes. He named a package to hold them. Running consistency<br />

would indicate references to other classes in other packages that you would<br />

need to import.<br />

He then opened a hyperbolic application browser. He had created the SSL<br />

previously so just had to install it and (deal with usual demo hiccough by<br />

also loading the <strong>Smalltalk</strong> class that calls it and)<br />

HyperbolicApplicationBrowser new open<br />

opened Java UI code using <strong>Smalltalk</strong> data in a <strong>Smalltalk</strong> window. It ran<br />

perfectly. He clicked and explored in the <strong>Smalltalk</strong> class browser.<br />

APIS bought the code from Seagull, so are able to do these VM changes<br />

and so on.<br />

Thomas Brey and Heiko Wagner did most of the work.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 83<br />

Q. Typing? The datatypes are matched: Java string to string and so on.<br />

They are wrapped, not replaced by <strong>Smalltalk</strong> objects. The VM does the<br />

translation.<br />

Q(Dan Poon and Reinout) Performance? Pretty good; the code runs on the<br />

Java VM and of course there is the wrapper overhead.<br />

Q. <strong>Smalltalk</strong> or Java? If we can do it in <strong>Smalltalk</strong>, we do it in <strong>Smalltalk</strong>. If<br />

a library for e.g. XML parsing exists and is tested and robust, we use the<br />

Java.<br />

Q(Dab) VM mods? Mostly for the type conversion.<br />

Aida and Seaside<br />

Aida, Janko Misvek, Eranova<br />

Alan Kay suggested in 1997 that every object should have a URL. Janko<br />

knows noone else who has implemented that. anObject printString<br />

is basic to <strong>Smalltalk</strong>. anObject printWebPage is basic to Aida.<br />

Q(Stephane) Recursion? Primitives? On the web you can go from one page<br />

to a second page and back to the first page; so when navigating a graph of<br />

objects. We do not have URLs for primitives.<br />

Aida supplies starter applications: Blog, Wiki, general Site. It runs on<br />

Swazoo over VW.<br />

He showed some Aida websites. (Some old sites are hard to put into<br />

<strong>Smalltalk</strong> because they do not have clean CSS/content separation.) Dirk<br />

Verleysen did a Belgian football team site. Nicholas Petton did a<br />

Talking<strong>Smalltalk</strong> site and Blog plugin. He also created a <strong>Smalltalk</strong> project<br />

management system. BiArt is a commercial quality management system<br />

supplied by Eranova (see Janko’s talk last year) and Scribo from this<br />

product is open-source. eLogis is another process management system they<br />

supplied. The Slovenian gas pipeline operator also uses them for their site.<br />

Scriblets are embedded components. The Aida slogan is an edelweiss<br />

flower. It implies that their system is very resistant to harsh conditions and<br />

that they cover the web from sea level right to the top.<br />

Aida/Web 6.0 and Aida/Scribo 1.0 have just been released. It runs on<br />

Squeak, GemStone/GLASS, VisualWorks, and Dolphin. They plan to run<br />

on <strong>Smalltalk</strong>/X (will be supported in 1 month) and GNU <strong>Smalltalk</strong> (gets<br />

them closer to the Linux community).<br />

There are 60+ on mailing list, 2 core developers, tutorials in French and<br />

Spanish (and English).<br />

In future, they will support tree-like navigation as well as graph-like. Major<br />

domains are graph-like but tree-like is good for yes/no dialogs and similar<br />

decision workflows. Thus graphs will have tree subgraphs. This will be<br />

their way of doing some things for which Seaside would use continuations.


84 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Aida MVC separation usually puts actions into separate methods but they<br />

are thinking seriously of onSubmitDo: [self observee save] i.e.<br />

allowing block callbacks, avoided before for fear of breaking MVC and<br />

getting spaghetti code. Thus they may allow verification code but not<br />

general code in such blocks.<br />

Internationalisation is important: they have Japanese in their group. The<br />

simple solution, largely in place, is to have the same web page structure<br />

with different content for the different languages. In-place translation is<br />

being thought of. Translations can be saved in methods.<br />

They are producing a book (in French at first, in English soon) and making<br />

some old Squeak sites (SqueakMap) look more modern to make things<br />

more accessible to non-<strong>Smalltalk</strong>ers.<br />

Magritte Blitz, Lukas Renggli<br />

This talk told us what Magritte is not, what Magritte is and what Magritte<br />

can do, then demoed.<br />

Magritte is not trying to model UML. It does not use code generation, just<br />

visitors that walk the classes. And above all it has no fundamental link to<br />

Seaside. a Plugin generates Seaside UI from Magritte descriptions but that<br />

is just one application.<br />

Magritte is an enhancement of <strong>Smalltalk</strong>’s reflection capabilities to define<br />

an instVar as being e.g. a String with a label, etc. Magritte is extensible and<br />

described in itself. Magritte editors can be used to edit Magritte<br />

descriptions to alter e.g. a web application on the fly. It runs on VW,<br />

GemStone, Squeak, Pharo and most recently GNU.<br />

Magritte can build viewers, editors, validators and <strong>report</strong>ers (the Seaside<br />

plugin provides all these for Seaside). In <strong>Smalltalk</strong>, you must write<br />

initialize methods or you can instead use Magritte to define initial values<br />

for your objects. You can use Magritte to decide what to copy and what to<br />

omit when copying a graph of objects. It can be used to document your<br />

classes. It can be used for DBs, XML and query generation, JSON. And it<br />

can be used for end-user customisation.<br />

Lukas opened Pier and edited it using Magritte web-rendered edit page.<br />

Then he opened Squeak browser and showed a very similar looking form<br />

generated by Magritte using the Squeak renderer instead of the Seaside<br />

renderer.<br />

He then added a ’ToDo’ field, again using a Magritte-rendered form (back<br />

in the web) and gave it a label, set its options, etc., and saved. Then he<br />

edited the page again and had the ToDo field appear in various different<br />

ways.<br />

Q(Christian) connecting between attributes? That is the weakest part of<br />

Magritte. There is some code but he also finds he needs to add glue code<br />

by hand.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 85<br />

Q. The new state for the ToDo field goes where? In a dictionary.<br />

Q(Niall) Visitor subclassing, delegating? The edit layout that was the same<br />

between Morphic and Seaside is a general layout superclass with Morphic<br />

and Seaside subclasses. No more general subclassing or delegating pattern<br />

has been needed so far.<br />

Hands-on Pier, Tudor Girba<br />

(Tudor’s slides still had bullets but he apologies for that.) The Pier CMS is<br />

easy, cool and free. Lukas Renggli built Smallwiki, then Magritte and then<br />

he built Pier as an application of Seaside and Magritte. Others then joined<br />

in, including Tudor. He is speaking because he uses Pier and because Pier<br />

is cool and is free; making such products more used is good for <strong>Smalltalk</strong>.<br />

He opened a Safari browser on Pier. It shows the title of the whole app,<br />

some text and the Seaside toolbar. He browsed around: the usual info,<br />

licence data plus blog - and you can login (admin, pier).<br />

More buttons appear: _Environment _User Management and so on. He<br />

changed the title and saw it twice - on the current page and as part of the<br />

wrapping environment page - the metapage. He went to the environment<br />

page: it showed normal html for the overall page. ‘class title class’ means<br />

that the title of the current page appears at the top. Instead he put ‘logo’ and<br />

then got a red link (no logo yet) and clicked on it. He is prompted to define<br />

the link type which he made a file, selected his logo file and saw the logo.<br />

However it is not clickable. Pier uses an extension of the swiki syntax. He<br />

converted logo to *+logo+>root* and now clicking the logo takes you to<br />

the root of all pages.<br />

Thus he can edit normal pages and administrator pages.<br />

Web UIs are often rather clumsy in forcing you to use the mouse all the<br />

time so he did CTL-E (was in edit page) changed some text and pressed<br />

CTL-S and there he saw it. (This works for Pier whatever web browsers<br />

you are viewing it in, but may use different keys on some platforms.)<br />

On any page, he can do CTL-D (edit design) to be editing the environment<br />

page. CTL-D also shows the CSS file. He made .a have colour green,<br />

showed it, then edited it back and redisplayed (no change) and did refresh<br />

(saw change); that is Seaside 2.8.2 extreme caching in action.<br />

The structure of Pier is inspired by the Unix file system. There is a root and<br />

a hierarchy. This if you go to CSS, you see ...root/..../css. So which<br />

environment does a given page get. The root page has settings environment<br />

and environment/css. Go to the information page and press CTL-D and you<br />

see nothing: the page inherits from its parent (the root). Add CSS and your<br />

page will show the inherited root CSS overridden by whatever you have<br />

added. The environment of the environment is also environment.<br />

He made a blog post, then decided he wanted a summary of the blog in a


86 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

main page. He added to the environment page, which is good practice - it<br />

makes an added element more manageable - but is not essential. He added<br />

a +postticker+ and added it as a component. There is a component for this<br />

and he set its values to show the last two posts and so on.<br />

He does not want to see this on all pages, so he wants all other pages to have<br />

a different environment. He creates a new environment called _Main<br />

Environment (the underscore prefix is Tudor’s convention to know what is<br />

a meta page and what is a normal page). The code in main environment<br />

points to things like logo and so on that should be in Main Environment but<br />

are not. He opened it and edited its html to have absolute paths for e.g.<br />

environment/logo.<br />

However the much easier thing is to go to the old environment and say<br />

‘copy’, changing the title to _Main Environment. When in a recursive<br />

page, look at the first part of your URL. That tells you where you are. He<br />

then made the other pages use _Environment, leaving the _Main<br />

Environment to show the postticker. This was done as an environment<br />

example. He could of course have added the postticker just to the main<br />

page. He did not merely because he wanted to use explicit html to place it<br />

and it is a pattern to keep that to environments and only use wiki-style<br />

markup in the normal pages.<br />

Q(Thorsten) versioning? Click changes to see what you have done. You<br />

cannot see differences yet.<br />

He browsed the Unix-stye permissions. He added the logo under<br />

environment which is owned by administrator and can only be viewed by<br />

the group. He wants everyone to see the logo so changed its ‘other’<br />

permissions. (He had the usual demo hiccough; at first, he changed<br />

permissions to the wrong thing.)<br />

[Niall: when presenting Pier, start with set up environment and show how<br />

it works, then do administrator. Stephane said the same. Presenting it in the<br />

order Tudor used was as if one presented <strong>Smalltalk</strong> from the metaclass<br />

diagram, and risked confusing the audience before they saw the power of<br />

the approach.]<br />

Tudor showed examples: moose.unibe.ch and www.esug.org (has just<br />

moved to Pier). There will be a movie and documentation. There are<br />

components for Citezen (bibliography tool), Blueprint, LightBox,<br />

Randomiser (have you noticed that the Seaside slogan on www.seaside.st<br />

changes), Top Feed, Twitter, etc.: all these are listed on the main page.<br />

Blueprint shows 24 lightly-shaded stripes, offering a grid for arranging<br />

your page. You can use these in layout. The environment can say where an<br />

item starts and how many it scrolls over. This example is a fixed size but<br />

they offer two fixed sizes and you could also make it scale it to the window.<br />

A Pier Structure has children and subclasses Page and File. Structure<br />

knows its Contexts which relates to a Command (such as Edit and Login).


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 87<br />

A Structure has a Kernel which knows about Persistency.<br />

So far is general: a Structure has an environment which is a Page. Seaside<br />

is exploited by the fact that another subclass of Structure is Component<br />

which lets you add any Seaside application. Context subclasses to View<br />

which subclasses to Browse and Changes views. A Page has an<br />

environment Structure.<br />

Persistency: you can use image persistency as he and Lukas do (cron job<br />

saves image regularly). You can also use File persistency or GemStone<br />

persistency.<br />

Lastly, Pier on the iPhone (“Good” - “No, it’s not good, it’s cool; this is<br />

about making <strong>Smalltalk</strong> cool”). He opened the simulator, and showed how<br />

the pages had been laid out to make them useable. (He could not show the<br />

environment pages, probably because of a problem with the rights.)<br />

Walking round the pages was fairly straightforward. It took 100 lines of<br />

code to make it work on the iPhone. He also showed just browsing the<br />

pages as if on a web browser but the iPhone layout is more useful for a user<br />

making a quick edit to the site.<br />

Q(Torsten) indexing PDF indexing when adding docs? Not by default.<br />

Web Velocity, Jim Robertson, Cincom<br />

Jim showed three pictures as metaphors of the developer without<br />

<strong>Smalltalk</strong>, the developer with <strong>Smalltalk</strong> and the developer with Web<br />

Velocity. The pictures were taken from the social event. (Yann was the<br />

‘developer without <strong>Smalltalk</strong>’; he assured me the appearance of his having<br />

raised his hand toward his mouth only to notice suddenly that it did not<br />

contain a glass of beer was a pure artefact of the moment at which Jim<br />

snapped the shot. :-)<br />

Jim had a long discussion with Avi in 2004 explaining why Seaside was a<br />

bad idea. He has changed his mind since. :-)<br />

Web Velocity tries to avoid the flow breaks that occur when you work in<br />

browser and debugger but present in Web browser.<br />

He started WebVelocity in Firefox. The left side shows list of repositories:<br />

the Cincom Open Repository, Jim’s local one on SQLLite, etc. Under that<br />

is a list of apps. The bottom left is a list of libraries; things implemented in<br />

Seaside that are not yet loaded; he can click one and see a lightbox with an<br />

expandable list of the blessing comments.<br />

Next he went to the page that walks you through how to build your web<br />

velocity. The target audience is people who do not know <strong>Smalltalk</strong>, so they<br />

have made the documentation part of the environment.<br />

Next James clicked to create an app, typed ‘Hello World’ for its title.<br />

He saw a page with left list of items some in red (e.g. Overview was red


88 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

because we’ve not yet written some documentation for it, Databases was<br />

red because we’ve not configured any for it, etc.).<br />

Jim got the standard demo hiccough at this point: “This worked last night”.<br />

He worked on sorting it. James Foster turned off the network that could<br />

have been confusing the system and Jim got a new build but it still did not<br />

work. Eventually, after the talk, Jim worked out the issue: the combination<br />

of a particular new Firefox 3 version (3.01 IIRC) plus the specific network<br />

setup at CMI plus WebVelocity was causing the problem. It ran fine on<br />

Safari, Firefox 2 and other browsers. Meanwhile, the demo perforce had<br />

more discussion and screenshot than intended.<br />

He opened the Hello app:<br />

renderContentOn:<br />

super render..<br />

html text: ...<br />

The browser shows him the syntax error highlighted in red. The Seaside<br />

walkback debugger opened, highlighting where the problem was. He can<br />

open an inspector in the debugger. He fixed and (would have but for the<br />

demo hiccough) resumed.<br />

He loaded an existing app and looked at Glorp mappings to the database.<br />

aTable createFieldname: ‘id’ type: ...<br />

He opened a very basic blog app, provided as a suggested start point for<br />

users building blogs and similar system. He showed the drop-down list of<br />

components available and the methods for one.<br />

WebVelocity is building migration code. He discussed recreateTables<br />

(again, demo hiccough meant he could not show it). Arden offered his<br />

computer, on which the build was working. Jim created a new application,<br />

then selected New Web Component from drop down. The main pane<br />

showed its instance and class methods. He clicked to invoke<br />

renderContentOn: html<br />

html text: ‘hello there’<br />

He can open several methods in the page and not have to accept the first<br />

before editing the second. This is a non-modal method-editing system. He<br />

ran it, then wrote an error and attempted to run, thence saw the debugger in<br />

the web browser, fixed it and resumed.<br />

Q. Are you eating your own dogfood? The Web Velocity website will be<br />

written in this. The Cincom <strong>Smalltalk</strong> site will be transition to it as well<br />

(but not the blogs as their code is stable already).<br />

Q. Licence? There will be a non-commercial version and an online<br />

commercial version to make it easy to acquire.<br />

Q. Headless server? Just type visual.exe -nogui myimage.im


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 89<br />

Q. When you save, that saves all the methods? No, just the one whose<br />

context you are in when you save.<br />

Lastly, he created a new application database.<br />

Michael’s blog shows WebVelocity movies, as does the main <strong>Smalltalk</strong><br />

site.<br />

Q(Christian) this will feed back into VW? Seaside 2.8 is in VW7.6. A lot<br />

of the pieces of WebVelocity will ship in the standard release. Database<br />

migration will be part of Glorp.<br />

Q(Tim) WebVelocity final name (confusion with Java Velocity<br />

framework)? We’ve settled on WebVelocity as final name.<br />

Q. How are databases set up? If you populate an empty database using the<br />

defaults, you get a pattern similar to Rails’ active record. If the tables exist,<br />

it will read their metadata from the database and create the connection<br />

code.<br />

Seaside Evolution; things you never knew you could do, Julian Fitzell<br />

Julian is co-inventor of Seaside with Avi. Seaside has been through the<br />

Experimentation, Stabilisation, now Optimisation phases and Adoption is<br />

where we’re going.<br />

WebObjects was a good framework in Objective-C but moved to Java so<br />

Avi wrote IOWA in Ruby as a fairly close port.<br />

class Main < Iowa::Component<br />

def all_people<br />

Person.fetchAll()<br />

...<br />

and in the html<br />


90 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

UML, and embedding code in HTML and so on; that was the architecture<br />

of Seaside 0.9 - there wasn’t any. Everything depended on everything else<br />

- the session on the components on the ...<br />

So they made a major rewrite to Seaside 2.x (called Borges, after a quote<br />

from ‘The Garden of Forking Paths’). They found templates just got too<br />

big, too ‘magical’ and too hard to manage. (It got ported to Ruby, went in<br />

a different direction and is still around somewhere). Seaside 2.0 added<br />

callbacks for blocks and an html renderer. Seaside 2.3 moved the rendering<br />

to the top of the architecture layers so other things did not depend on it.<br />

After 2.3 they got into the stabilisation phase. Initially all component state<br />

was backtracked and no session state was. Stabilisation reworked this. It<br />

also reworked the rendering to the Canvas API so no longer having all the<br />

combinations exponentially growing (button, anchor, anchorWithButton).<br />

At around this time, Julian got a full time job and stopped working on<br />

Seaside. Around 2005 Avi stopped working on Seaside in favour of using<br />

it (to build Dabble DB) and Lukas and Philippe took it over. They worked<br />

on optimisation and refactorings for flexibility, pluggability and so on.<br />

Julian now feels we are entering the adoption phase with GLASS, Pier,<br />

seaBreeze, WebVelocity. Documentation remains weak but there are books<br />

and much on the web. To help documentation along, Julian will now<br />

discuss architecture, metaphors and pluggability aspects that are less<br />

known.<br />

Slide of Seaside 2.9 architecture. Tests, examples and development tools<br />

can be loaded or not. The core is the render loop and the components that<br />

have them. Components use the Painter which uses the Canvas, and<br />

Components use the Session Management. It sits on Request Handling<br />

which converts Comanche or whatever requests to Seaside requests and<br />

vice versa using a Server Handler of the appropriate type.<br />

Q. Why Seaside request? Mostly it is for portability, to use Seaside with<br />

any webserver.<br />

The Painter is a place to hold html rendering code when you don’t have<br />

session state. Earlier, there was a stateless component and he is thinking of<br />

putting it back. Components likewise do not have to use the render loop but<br />

normally will.<br />

Q(Christian) Why do you make the html by way of a stream rather than as<br />

a tree of objects.<br />

WAHtmlTreeDocument is an alternative canvas to<br />

WAHtmlStreamDocument but the latter is used for performance (and may<br />

not work as a replacement at the moment although it should). Most<br />

browsers will display stuff as it arrives so streaming gives the user a<br />

significantly different, faster feel.<br />

The metaphor is:


main(){<br />

root = new root component<br />

while(1){<br />

render(root);<br />

process_callbacks(root);<br />

redirect();<br />

}}<br />

CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 91<br />

WARenderLoopMain<br />

WARenderLoop<br />

WARenderContinuation<br />

WARedirectContinuation<br />

The redirect is to a new page that shows HTML so if you refresh you are<br />

not resubmitting.<br />

Julian listed some areas where they thought people would plugin but which<br />

have not been so used. Configuration was one. Another was custom error<br />

handling, e.g. to send an email to yourself or to save an image snapshot to<br />

explore the error later. A request Handler could implement REST API<br />

using the Canvas but ignoring other Seaside stuff. A session expiry handler<br />

could be done. Toolbar and Halo are also pluggable.<br />

Configuration (in 2.9; 2.8 is different): subclass WASystemConfiguration,<br />

implement describeOn:. Optionally implement parents to inherit from<br />

other configurations. Then go to the config screen, add your config. Ensure<br />

your names are globally unique.<br />

describeOn: config<br />

(config string: #myappSoapHost)<br />

label: 'SOAP Host';<br />

comment: 'My App SOAP server hostname'.<br />

(config list: #myappTheme)<br />

label: 'Theme';<br />

options: [self allThemes].<br />

config at: #sessionClass put: MySession.<br />

Similarly, to create your own Error handler, subclass WAErrorHandler,<br />

implement handleError:, optionally also handleWarning: and<br />

internalError:. Then select this error handler in your config.<br />

handleError: anError<br />

session := WACurrentRequestContext session.<br />

self<br />

sendEmailForSession: session<br />

error: anError.<br />

self forkAndSaveForDebugging.<br />

A RequestHandler subclasses WAEntryPoint. It needs to override<br />

handleRequest:. (Optionally, implement your own configuration and<br />

add it as a parent in defaultConfiguration.) Add an instance of the<br />

subclass to a dispatcher.<br />

Session expiry handler is similar: subclass WAExpiredSessionKeyHandler<br />

and override handleRequest: (to return a response).<br />

Q(Annick) Any XForms implementation? Not that I know of.<br />

Q. Scripts and CSS? SeaBreeze does that. In Seaside 0.9 parsing the<br />

templates needed modelling the entire HTML 0.4 spec which was brutal.<br />

Those syntaxes are large. (Niall: Michael did it in WithStyle.)


92 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Q(Stephane) sometimes successful technologies become less successful as<br />

technology changes around it; any such things upcoming? Not that he sees,<br />

but the biggest risk is non-adoption. We must grow Seaside while people<br />

are watching.<br />

Q(John O’Keefe). How do you decide when 2.9 is done? It will be done<br />

soon. Lukas and Philippe worked on 2.9 all the way through, he has just<br />

been in the last few months, so they will decide. They just have some bugs<br />

to fix.<br />

Q(Annick) Browser-specific canvasses? They have avoided that and hope<br />

they can continue. Of course if you modelled CSS then you would have to.<br />

Glass: share everything, Dale Heinrichs, GemStone<br />

Dale has been working on Seaside in GemStone for 2 years. GLASS uses<br />

Monticello for source code control and OmniBrowser for development<br />

tools. It is easy to move.<br />

“The Applicance” is VMWare configuration running an instance of<br />

GLASS with 3 seaside VMs, 1 Maintenance VM, and etc.<br />

‘Share nothing’ could be characterised as ‘Hit the database every time you<br />

need anything.’ This is well suited to when the web server is stateless and<br />

the model is simple. Scaling is limited only by how much electricity you<br />

have (and h/w and ...)<br />

<strong>Smalltalk</strong> is share everything: everything is in the image. GemStone/S<br />

handles very large images on multiple VMs; it lets you share everything<br />

with share-nothing scalability.<br />

GLASS started with a single VM serving all sessions. After two months<br />

they dropped that in favour of shared session state: let any VM server any<br />

session. Finally they made _k and _s optional.<br />

They abort start on session, commit if you changed during session. They<br />

use apache to round-robin requests to a number of VMs, with persistent<br />

session state meaning do not have to synch VM to session.<br />

However every request changed persistent session state. 10 - 100 commit<br />

per session (10 million requests per day) will drives you to sophisticated<br />

hardware rather than commodity hardware. So he aimed to avoid saving<br />

‘unnecessary’ session state. Seaside creates a continuation for every page<br />

(WARender, WARedirect, c.f. Julian’s talk) but you may not need them to<br />

persist. By not doing so, he did an experiment and reach 7k sessions per<br />

second on a commodity hardware config (7 machines, 72 CPUs, 128 VMs)<br />

whereas if he saved every request he dropped back to 200 seconds.<br />

The third option is session affinity. You could then use temporary memory.<br />

Two years ago, Dale thought, ‘One VM per session? No way’, but now he<br />

thinks, ‘we could’. This is a two week old idea they have explored to ensure<br />

it has no killing drawbacks. It will be a strategy, chosen for its trade-offs.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 93<br />

Q(Eliot) Hydra? Gemstone is exactly like hydra. Hydra will minimise the<br />

memory footprint of multiple Squeak images. Gemstone does similar<br />

things, uses nmap and so on.<br />

So you have 150 VMs running on 7 machines; how to debug? They<br />

autocommit: a saved method gets saved to all the VMs immediately to<br />

simulate the experience of working in a single VM environment. You<br />

would never want to look at 150 logs or 150 Transcripts for where your<br />

show: appeared so the object log acts as the transcript. Breakpoints<br />

likewise are distributed to all 150 VMs so any one of them can be the one<br />

getting the bug. Click on profiling: the VM that gets the request is the one<br />

that profiles.<br />

He opened the ObjectLog in the web browser. The startup lists the VMs<br />

and the pid they start on. Entries have priorities so you can sort on these<br />

fields. The oop is shown (useful for saving your having to do == and --<br />

checks). You click on objects to see more details.<br />

He opened the counter app. and also opened the Squeak image that was<br />

connected to GemStone. Transcript show: ‘Hello World’ was executed in a<br />

VM in the appliance. The object log shows that ‘Hello World’. The<br />

Transcript showed an array and so it was in the object log.<br />

Q. The GemStone VM serving the Squeak image is running where? On the<br />

appliance.<br />

He then opened a Seaside walkback. It has a remote debug link. Clicking<br />

on it creates a resumable continuation (showed it to us in the object log).<br />

He continued the continuation then went back to the walkback in the web<br />

browser and clicked the resume button. If he’d clicked it before it would<br />

just have told him he had not continued the continuation and so come back<br />

around but now it completes the web request. He looked in the object log<br />

and saw the same continuation, still there but now no longer saying it is a<br />

resumable continuation,.<br />

So, in summary, when you reach the error handler it snaps off the<br />

continuation and saves it. A resume sticks the persisted process back in the<br />

continuation and resumes.<br />

He toggled profile and in his web browser could see ‘profiling’ and the pid<br />

of the VM that got the profile request. He tried to bring up the profile and<br />

got ‘11 is too many retries’ so this demo hiccough became a demo of<br />

debug. He had FastCGI errors; he’d had a timing error in the profiler that<br />

made it pick up a reference to a semaphore, which could not be persisted.<br />

The ‘11 is too many retries’ is because they try 10 times.<br />

He almost forgot (Christian reminded him) when he’d finished explaining<br />

this to bring up the profiler (by just doing back-button and retry, and it<br />

appeared). The profile tabulates the receiver class, the implementor and the<br />

data. You can step back from line to line in the call stack path. Clicking on<br />

the implementor shows it source code.


94 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Q Licence? Size of DB 4Gb and a single server. That is free. The next step<br />

up is $7000 but they are looking at other models. They may break the steps<br />

into the two axes of number of hits and size of data: do you need more<br />

CPU, more shared memory or more disk? They may make more disk space<br />

cheaper than more CPUs.<br />

Q. Tuning? Seaside is a known application which means they can work in<br />

the lab on what to tune and how to tune. A greenfields application would<br />

be harder because GemStone would not have that experience of the app, so<br />

they can supply an appliance with good tuning choices and good advice on<br />

what to look at.<br />

Maglev and Gemstone 3.0 are the same product.<br />

Seaside, Lukas Renggli<br />

The seaside-dev list is for developers not users, people who contribute<br />

code. (So why are there 80 members? Perhaps just people interested to see<br />

what is coming.) They were using the Mantis bugtracker but they did not<br />

get enough bugs so switched to the Google bug tracker. 250 people per day<br />

are visiting seaside.st. 800 people are on the seaside list. Go there if you<br />

want to ask questions.<br />

They had 10,000 downloads of the one click-image last year! It got a lot of<br />

attention from blogs and outside the <strong>Smalltalk</strong> community and was one<br />

peak on the graph. The other was their April 1st joke that got mentioned<br />

widely. (They pretended they wanted to port Seaside to Java.)<br />

They are running on Squeak and Pharo (which Lukas uses for<br />

development). Seaside is also on VW, GemStone and on Dolphin (up-todate<br />

there) and on VA<strong>Smalltalk</strong> soon (see John’s talk tomorrow morning).<br />

Lukas wants to thank Dale (Dale: “you guys make it real easy”) and others.<br />

Syntax for portability: do not use underscore. Do not use {1 2} brace<br />

arrays. GemStone also has array constructors and they don’t use them<br />

either. Do not use ByteArrays [1 2 3]. Do not use variable bindings like<br />

Core.Object. Do not use GemStone selection blocks {:i | i.is.permanent}.<br />

Avoid ifNotNil: and ifNotNilDo: which are incompatible with other<br />

<strong>Smalltalk</strong>s. Other syntax can be used. Pragmas, e.g. are<br />

OK (see seaside.st).<br />

Do not compare collections, Collection>>= differs between dialects. Use<br />

keysAndValuesDo: not withIndexDo: Do not use pairsDo: since it<br />

is not dialect consistent. 1 to: aCollection size by: 2 do: works<br />

everywhere.<br />

Strings: Symbol is not a String in all dialects. String>>match: is totally<br />

broken in Squeak for UTF-1 and is not consistent generally. Converting via<br />

asString has the problem that VW breaks if you implement asString<br />

on object. displayString is also used so they now propose to use<br />

toString. (Bruce: Kapital uses toString already; Reinout: it is in a<br />

couple of libraries; suggest to use asSeasideString). They also avoid


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 95<br />

IO since platforms are very different for file handling and so on.<br />

Rather than make everyone remember that, they added new rules to Lint to<br />

target Seaside problems. Slime (<strong>Smalltalk</strong> Lint ...). These also address e.g.<br />

html div with: ‘Hello World; id: ‘message’<br />

with: is not the last to be sent; it should be.<br />

html updater<br />

id: ‘message’;<br />

callback: [:r | html byte: ]<br />

The callback should use r in the block, not html (the parameter is there for<br />

a reason; use it).<br />

renderContentOn: html<br />

a := self call: WACounter new.<br />

Do not call when rendering: we have tasks for that. Do not change<br />

component state when rendering or create components while rendering:<br />

refresh will invoke it.<br />

Slime also looks at style issues: calling div with: instead of div:, or<br />

div: [html text: ... ] .<br />

He showed the tests bar for 2.8 and earlier, then asked where are 2.9 tests:<br />

“Not enough space on this slide to fit them in.”. They had 131 in 2.8 and<br />

are nearly at 400 already in 2.9.<br />

In Squeak they use Monticello for versioning. Cincom reads the Squeak<br />

file-out into their image, similarly for other dialects. GemStone, by<br />

contrast, implements Monticello and Lukas strongly recommends that<br />

vendors implement Monticello2. It is the future of <strong>Smalltalk</strong> interchange.<br />

Dale agreed: whenever he saved to the repository, Lukas and Philippe<br />

would respond to his work without his having to push. The effort to port<br />

was one month to get Monticello working and one month making zip-file<br />

work. Lukas stressed Monticello 2 will be much easier.<br />

They do not use Sport. They have a SeasidePlatformSupport package.<br />

Q(Bruce) why? Discussion of some things they needed which were not in<br />

Sport which can then be moved to the standard. The aim of Sport is to kill<br />

Sport and get things move to the standard.<br />

Only the core code should contain WA-prefixed classes so please others do<br />

not reuse this in your applications and in Vendor specific code.<br />

They would like people to use Google bug tracker but if not please use a<br />

public bug tracker. Please use Monticello 2 to reconcile your changes to the<br />

main branch so they can see them.<br />

They want to support multi-CPU. Squeak hydra project will be supporting<br />

this.


96 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

They want a better GUI.<br />

The Seaside sprint followed the conference starting Friday afternoon and<br />

running on through Saturday to Sunday morning. The location was initially<br />

a cafe near the rail station but then moved to the new Amsterdam library<br />

which proved to be ideal.<br />

Download the iPhone Pier from source.lukas-renggli.ch/isea (iSqueak<br />

came 3rd in the <strong>ESUG</strong> <strong>Smalltalk</strong> Awards).<br />

He opened his iPhone simulator. It will run on any WebKit browser. Lukas<br />

browsed some methods and edited one.<br />

Q.(Torsten) Documentation? Class comments are much improved.<br />

Modelling Tools and Methods<br />

MBA <strong>Smalltalk</strong>: to manage your objects, Mathieu van Echtelt,<br />

CosmoCows<br />

In 2001, they started work in Squeak with pre-dot-com-crash plans that<br />

they found they had to revise. In 2002, they did consultancy work in<br />

<strong>Smalltalk</strong> for a US company, so remained solvent. In 2003-4, they started<br />

a product ‘the ultimate contract and invoice management system’. They<br />

presented this in Brussels.<br />

In summer 2004, they got a customer in a rather unusual way. A VAR who<br />

was aware of their system saw news <strong>report</strong>s about the Dutch fire brigade<br />

needing to manage their authorisation of whether businesses, e.g. pubs,<br />

were fire-regulation-compliant. Such regulation compliance has<br />

similarities to a contract between the pub and the fire brigade. They<br />

therefore visited to present their ideas - and discovered that the fire brigade<br />

had a much more urgent issue: they needed to manage training their people<br />

to ensure that e.g. first aid refresher course requirements were met and so<br />

on. Their product was a framework that could be transformed into solutions<br />

to this. From it, they built two business administration systems: ‘Ready’<br />

and ‘Status’. The created another company AGS to sell these. The more<br />

conservative name was better, as was the all-Dutch company website.<br />

Ready is used by the fire brigade and heath care institutions to train and<br />

assign rewards for training. It is a web app. He logged in and showed some<br />

screens. ‘Status’ managed scrum-like sprints. He logged in, created a<br />

ticket, assigned the <strong>report</strong>er and so on.<br />

Mathieu created the name ‘MBA <strong>Smalltalk</strong>’ for this conference to explain<br />

the framework. A typical ‘software street’ has people responsible for Java<br />

client, for system code, for database and so on such that adding a date field<br />

can take a week. Their aim is to free the modellers who use MBA smalltalk<br />

from having to think about persistency, GC, etc.<br />

In MBA <strong>Smalltalk</strong>, an editor lets users manipulate model description<br />

language, from which a generator creates <strong>Smalltalk</strong> code. (At first, they<br />

had an interpreter that ran model description language directly. However


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 97<br />

the interpreter was too slow and they were successful in getting contracts<br />

to create models rather than selling the tool to managers to create their own<br />

models directly.) A renderer creates the web output from this, with styles,.<br />

Automatic tools aid configuration and line-ups, and make deployment a<br />

one-click process.<br />

<strong>ESUG</strong> 2005 showed the first version of the system. The second version still<br />

had a web-based development UI. The third version, inspired by Squeak<br />

Morphic, let you go directly to code from web widgets. In the latest version<br />

they provided a <strong>Smalltalk</strong> UI for development and used Store as their<br />

repository. A fifth version is in development. The web output retains the<br />

morphic ability in development mode: widgets have task bars with ‘inspect<br />

subject’, ‘pick slot’, etc.<br />

Their modified refactoring browser has a SchemaSource tool: left pane<br />

shows instance variables, right pane shows source. They use many<br />

pragmas.<br />

He logged in on the web. In <strong>Smalltalk</strong>, he browsed a demo class<br />

EsugMenuBox. He created a contract allocating modules that included the<br />

<strong>ESUG</strong> module. He started with three empty schemas for person,<br />

organisation and <strong>report</strong>.<br />

In <strong>Smalltalk</strong> he created a name method for Person with type and dataType<br />

pragmas, resynchronised and showed the string field on the web page. He<br />

then added more pragmas for #label, #isMandatory,<br />

#isVisible. Making it mandatory displays a red dot icon by the field.<br />

Q(Stephane) Resynch? Generates <strong>Smalltalk</strong> code from pragmas.<br />

Q(Stephane) Validation? Simple validation is done via pragmas. Complex<br />

ones (e.g. Dutch ‘flex’ contracts) are done in <strong>Smalltalk</strong> code.<br />

Q(Christian) You mix presentation and data model elements? Yes. One<br />

typical working style is to set up screens and agree with customers, then<br />

evolve data model behind it. They find they can live without a model-view<br />

separation. What would that buy them except a doubling of the number of<br />

business concept objects from 600 (their current state) to 1200.<br />

Properties can be assigned styles and these styles can be filtered.<br />

(At this point he had the usual demo hiccough; he had stripped an existing<br />

system for demo purposes and needed something he had removed. He fixed<br />

in the debugger.)<br />

He showed various slot types (checkboxes and so on) and the connection<br />

to low level process decisions. Collections are handled: a slot can be shown<br />

once or many times. He then showed code generation by putting a break in<br />

the debugger. Resynching calls addMethodPlansTo: aClassPlan which<br />

calls addMethodPlanTo: and so on. A hierarchy of builders handles<br />

generation of getters and setters, choices, collections, etc.


98 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

Q(Stephane) should we have a slot object, not just data? (There is a VW<br />

package that does slots.)<br />

Fame: MetaModelling at Runtime, Adrian Kuhn, Univ of Berne<br />

You can download the metamodelling framework FAME from<br />

smallwiki.unibe.ch/fame. Fame grew out of Moose. His talk example was<br />

to model an eternal beer store, i.e. one that need never be shut down to<br />

update it. Fame lets you update your metamodel at runtime. As your<br />

business changes, your metamodel must change. Today, the store sells beer.<br />

As it grows, it may start to sell speakers or cars or ... But at start, it sells<br />

beer. We model beers as objects, instances of a class Beer with slots name,<br />

alcoholic volume, price and size slots. This in turn is an instance of Fame-<br />

Class with slot properties. (He will call such metaclasses Fame-Class to<br />

distinguish them from <strong>Smalltalk</strong> host classes.) Fame-Classes are<br />

metaclasses, instances of metametaclasses. Our business is modelled by a<br />

model which conforms to the Fame metamodel which conforms to the<br />

Fame metametamodel. The metametamodel is hardwired into the host<br />

<strong>Smalltalk</strong> system and the same for all metamodels and models.<br />

He showed their file format, which is a <strong>Smalltalk</strong> literal with the initial #<br />

character removed. (They started by using the <strong>Smalltalk</strong> parser and now<br />

use a dedicated parser so noone can inject executable code.)<br />

Q. The alcohol content of the beer value increased in the last slide; is that<br />

a metamodel feature? No, it is because Adrian was drinking beer while<br />

doing the slides. :-)<br />

Fame classes have corresponding <strong>Smalltalk</strong> classes. Pragma processing<br />

sets up the Fame classes from the <strong>Smalltalk</strong> classes. Refactoring modifies<br />

host classes when Fame class changes requires it. In the metamodel, a<br />

hardwired bootstrapping generates the Fame metamodel as instances of<br />

host <strong>Smalltalk</strong> classes.<br />

Time to demo. He opened a Squeak image with the latest Fame version<br />

loaded.<br />

t := FMTower new.<br />

Exploring the tower opens a browser, with tree of model elements. Now we<br />

have a tower with only the topmost layer populated. He created a new<br />

tower to import the Beer model (Squeak-implementation is partially<br />

ported; in VW, you would reuse the tower you just created but a few<br />

Squeak things are to port; on the train coming here he was finishing this,<br />

fixing bugs, etc.; it is just done).<br />

tower := FMTower new.<br />

tower metamodel importString: ....<br />

He browsed (and noticed another bug to fix: the annotation string<br />

replacement had mistaken pragma brackets for replacements; it works for<br />

all the other generated methods). He opened a Squeak browser on the HNK<br />

(HeiNeKen beer model) package.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 99<br />

Q. Methods have type pragmas. What happens when I add a string to a slot<br />

with type Number? Nothing at first since they do not generate any<br />

validation checks on setters. If you then verified the model, the wrong<br />

instance would <strong>report</strong> a mismatch with its Fame model.<br />

FMManySlot handles two-way update of slot and back-reference-slot, thus<br />

modelling associations. He browsed the model data, adjusting alcoholic<br />

volume and price to please the audience.<br />

Q. Change <strong>Smalltalk</strong> code: automatic update? Not in Squeak. Adrian has a<br />

VW version that does this.<br />

Q. Map existing <strong>Smalltalk</strong> classes into Fame how? Set a pragma on the<br />

class side and on accessors that you wish to become slots. It can be easier<br />

to generate a skeleton, and read it in again.<br />

Q. EMOF? They implemented it in Moose 3 years ago but found they never<br />

use it. EMOF has a metametamodel of ~ 30 classes instead of Fame’s 4.<br />

Fame can generate UIs, including for metamodels it did not know about at<br />

starting, since all ultimately works from the metametamodel.<br />

Q.Extend at runtime; what happens to existing data? They do not handle<br />

migration of instances yet, You just get new slots being nil and so on. He<br />

has not yet had a client of Fame that requires more.<br />

Using the Meta-Environment for Model-Driven Engineering, Tijs van<br />

der Storm<br />

Tim works at CWI and also teaches at the University of Amsterdam. His<br />

meta-environment is a programming environment for languages, just as<br />

Squeak is a programming environment for <strong>Smalltalk</strong>. Algebraic<br />

Specification Formalism and Syntax Definition Formalism are two parts.<br />

He explained his environment by making analogies with <strong>Smalltalk</strong>. In<br />

<strong>Smalltalk</strong>, everything is an object. In His ASF +SDF Meta-Environment<br />

(the MetaEnvironment) everything is a term, their name for an item of<br />

parsed source code. Terms are parse trees: Abstract Syntax Trees plus<br />

layout (i.e. comments, whitespace, etc.). He showed the (large :-) parse tree<br />

of<br />

foo^self<br />

SDF is similar to EBNF (but its productions are reversed - historical<br />

reasons for this). It does GLR parsing of arbitrary context-free grammars.<br />

It offers disambiguation constructs since ‘arbitrary context-free grammars’<br />

includes ambiguous grammars.<br />

All <strong>Smalltalk</strong> computation occurs through messages. In the<br />

MetaEnvironment, all computation is transformation of parse trees by<br />

applying rewrite rules. The rules match ASF expressions and construct<br />

transformations of them. This is purely functional computing.


100 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

The language is the environment in <strong>Smalltalk</strong>. In the MetaEnvironment,<br />

languages are environment contracts. The environment knows about some<br />

specific languages such as one for errors, one for formatting, one for<br />

formatting. To add another, you must define it in SDF and define a GUI<br />

plugin that consumes it.<br />

As Adrian explained in his talk, systems conform to models which conform<br />

to a metametamodel which also conforms to it(self).<br />

He demoed a trivial language for markup called ‘Waebric’, writing<br />

expressions such as<br />

module Hello<br />

def main<br />

layout(“Hello”){<br />

h1 “Hello World!”;<br />

p “Home”;<br />

}<br />

end<br />

def layout(title){<br />

head title title;<br />

body yield;<br />

}<br />

end<br />

and others for recursive menus and so on. He opened the tool set and<br />

browsed the graph of modules used to construct Waebric. An error pane<br />

lists issues with the grammar. He showed the parse tree of the code above,<br />

which was large and grew larger when he added a comment /* bla */ to the<br />

text. He ran and showed the HTML produced. The errors showed a non-<br />

XHTML 1.0 tag and the tool took him to its cause in the tree(main layout).<br />

He showed the error syntax grammar. There is also a Java grammar, done<br />

by another group who use the SDF part of the tool.<br />

Q(Reinout) Changes in last three years (when he used it and found it hard<br />

to use)? It is now more stable<br />

Q(Niall) Comparison to OMeta: OMeta only parses a restricted class of<br />

grammars, thus avoiding ambiguity but forcing what Tijs feels is an<br />

awkward way of describing the grammar. This restriction also blocks<br />

applying OMeta to legacy cases that do not fit it. OMeta allows parsing<br />

actions in a dynamic language: the MetaEnvironment, as noted, restricts<br />

strictly to rewriting. The two are therefore aimed at their different domains.<br />

Modelling and Mapping Tools, ObjectStudio, Dirk Verleysen, Cincom<br />

(I missed Dirk’s talk at <strong>ESUG</strong>; the following is an extract from a demo he<br />

gave me four months earlier.)<br />

The ObjectStudio modelling tool has 3 explorers: design, use case and<br />

CRC.


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 101<br />

Use Case: (re)name model then create Actors for your new model. An<br />

Actor can do use cases, e.g. an Administrator can enter new employees. A<br />

use case is just text saying what it does; it has no formalism greater than<br />

formatting this text. You can select items in the text and identify them to<br />

the tool as domain objects in the application. Other text could be made into<br />

a use case association e.g. ‘check zip code’ is another use case referenced<br />

in this one.<br />

CRC explorer. You give objects responsibilities and collaborators,<br />

identifying more domain objects in the process. For example, a Company<br />

collaborates with Person in adding new employees.<br />

Design Tool: this is the principle part of the tool. Domain objects appear as<br />

boxes and are defined: attributes / instance variables (an attribute can have<br />

various settings) and relationships: inheritance, aggregation and<br />

association. Detailed tabs let you specify an association’s overall data and<br />

its LeftDetail and RightDetail (cardinality, traceability - can my far end<br />

walk back to me or not, etc.). A description tab lets you document the<br />

relationship’s purpose.<br />

Synchronise creates classes mapping these descriptions. If you are using<br />

the tool in OS7, you generate .cls files. From a list you select which kinds<br />

of methods are generated (accessors, initializers, releasers, events, dragdrop<br />

methods - called template*). The design browser then shows these<br />

classes (and methods but here there was the usual demo hiccough or it<br />

might be the tool needs resynch of model after generation, but that seems<br />

inappropriate). The design tool’s diagram properties can be set to e.g. not<br />

show methods, and it can switch between various OO diagram notations.<br />

You can also edit the objects to highlight certain things, etc. Printing to .rtf<br />

gives you a basis for documentation.<br />

Q.Georg (discussions) Old code, pre-exception-handling in OS, leads to<br />

code like ... onError: [^error].<br />

Changes to a method, whether made in debugger or class browser, now get<br />

reflected back in the model immediately you save the method. This works<br />

in some OS7 configs and is ported to OS8 along with the rest of this tool.<br />

Dirk then built a UI for the model he had constructed. This was a<br />

straightforward putting of boxes on canvases and connecting to model<br />

elements.<br />

Q(Georg) when Dirk was an OS consultant, what was the tool used for?<br />

They did the entire system for a customer in the tool and always kept it in<br />

memory so they could always print out the current state. These diagrams<br />

were used in discussion of what work was to be done. Eduard found it<br />

useful at project starting and after a six-month break in development.<br />

ADvance shows two lines for binary relationship which makes large<br />

diagrams much harder to read. It is a much smaller thing than the OS tool<br />

with no synchronisation. Its sole virtue is that it is very lightweight and


102 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

unobtrusive; you can have a few diagrams if you want them and ignore it<br />

otherwise. ADvance is an aid to documentation and to brief design<br />

activities within an XP approach. A project that wants a full modelling<br />

solution will use the ObjectStudio tool, not ADvance.<br />

Q(Georg) Porting to OS8; what was that like? The hard part was mainly<br />

testing. It is all UI so you have to create and assess them. Dirk also<br />

uncovered some bugs that were in 7 as well as 8.<br />

Meta-Modelling Panel, Lukas Renggli, Mathieu van Echtelt, Adrian<br />

Kuhn, Tijs van der Storm<br />

Reinout asked the panellists to summarise their systems in terms of round<br />

trip engineering. (One context for this question is fitting projects to legacy<br />

engineering.) Tijs has effectively no support for it and doubts the value of<br />

modifying generated code. Lenses are a way to formalise reversible<br />

transformations but they are harder to use and restrictive. Mathieu’s system<br />

lets you change code and they do but the description will not change.<br />

Magritte is just objects in the image. (Niall: but you could map the ToDo<br />

field of the last talk back into an instvar and serialize its Magritte objects<br />

into <strong>Smalltalk</strong> code. Glorp ActiveRecord uses a similar approach to read<br />

database schema into mapping objects and then serialise them into code.)<br />

I asked about collection classes (see my <strong>ESUG</strong> 2005 Design Discussions<br />

talk). Mathieu reimplements (some of) them, which is the standard but<br />

imperfect solution for this problem. FAME assume all collections are<br />

OrderedSets, so has a single subclass, the convenient solution (the clients<br />

have not complained yet): slots are a subclass of OrderedCollection that<br />

override add: and remove:. Magritte has a OneToMany description and<br />

uses the standard collection classes. Lukas has noted that complex relations<br />

are hard to handle, prompting much handcoding. This may be related to not<br />

having meta-enabled collection classes.<br />

Christian played devil’s advocate: it’s better to write specific <strong>Smalltalk</strong><br />

code; defend your use of meta systems. Mathieu would be two years of<br />

effort behind if he had had to write HTML and SQL instead of generating<br />

all that stuff. Yes his users must forgo hand-crafted interfaces but they are<br />

accepting this, perhaps because Mathieu’s competitors are even worse or<br />

because they get something that works in a time they like at a cost they can<br />

pay. Very rapid changes are also possible because they change in one place<br />

and then the web UI and the database conform. Ten handcrafted pages are<br />

OK, 100 are not, 500 are so very much not. Magritte is not closed:<br />

handcraft all the Seaside pages you want and use Magritte for the rest.<br />

Is <strong>Smalltalk</strong> special when it comes to implementing self-described system?<br />

Adrian has ported FAME to Python and Java. In Java, it cannot connect to<br />

classes, OK if you are a pure meta-model app, a problem if you want to mix<br />

meta and ordinary code. Magritte uses class extensions so would be hard<br />

to port to a language without them.<br />

Show us your projects: ten-minutes presentations<br />

A late afternoon session on Tuesday allowed a range of projects to make


CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong> 103<br />

10 minute presentations. Those not included in other sections are here.<br />

Pharo: help people to invent their future, Stephane Ducasse<br />

See www.pharo-project.org. They will rework the Squeak build to provide<br />

a clean and lean open-source <strong>Smalltalk</strong>, removing junk, sorting out<br />

dependencies, eliminating uninitializable old code and so on.<br />

Simple Web Apps with HttpView2, Giovanni Corregida<br />

This web app framework was built by Goran Krampe for the SqueakMap<br />

server in 2003. Noone else is using it.<br />

HVHelloWorld>>default<br />

^’HelloWorld’<br />

and there you have a website. A small website is quicker to build in HV2<br />

than in Seaside. It uses old-style Seaside-like methods h1:, etc. (now<br />

Seaside has moved to Canvas, Giovanni will move HV2 to canvas too).<br />

It is HTTP-compliant: get, post, put, delete. Giovanni wants to evolve it to<br />

a RESTful web-services application (no point competing with Seaside).<br />

See squeaksource.com/HttpView2.<br />

Kerala, Alexandre Bergel<br />

He wants to check architecture conformance, coverage, etc. He showed a<br />

rectangle-merging test and broke it down into various calls on rectangle,<br />

making up a history of calls on the tested rectangle. Thence he looked at a<br />

graph of unique class name references in his tests execution. He showed<br />

these graphs for several tests. He opened a Pier image and made the<br />

subclasses of a test known to Kerala. Then he ran tests and opened a graph<br />

of moments in the test, picking a colour map; each moment was shown in<br />

a column whose squares were coloured. “Please don’t ask me what these<br />

are good for; I don’t know.” :-)<br />

Seaside XUL, Michael Davies<br />

He opened Squeak and showed the usual appearance. They have written an<br />

application to give a client a more standard look and feel and have opensourced<br />

this theme. The controls looked more Mac-like. Then he showed<br />

some other themes. You can tab between fields, see better where the current<br />

focus is, scroll via the mouse wheel without disturbing your focus which is<br />

also remembered when you switch between windows.<br />

He showed a <strong>report</strong>-building application used for their clients, with dropdown<br />

lists, checkboxes and menus, all the familiar controls. He showed<br />

using it to edit a labelling file, with its barcode, routing text and so on,<br />

setting border colours and all the usual stuff. It is all done in morphic using<br />

various subclasses of ImageMorph to support translucency.<br />

SeaBreeze, Karsten Kusche, Georg Heeg<br />

SeaBreeze is the UI builder for Seaside. He opened a Seaside website. He<br />

clicked the toolbar editor link to open the left-hand-side widgets (also<br />

written in seaBreeze so you can edit the layout of the tool in itself). Select


104 CS13 and <strong>ESUG</strong> 16, Amsterdam, August 23rd - 29th, <strong>2008</strong><br />

a Seaside element, set its basic attributes, its CSS, its layout and its dragdrop<br />

behaviour. You can click to open a refactoring browser on a callback<br />

method. He showed making an element redraw without redrawing the<br />

page, making another element toggle, and using simple one-line method<br />

calls to get AJAX effects. It also shows a palette of elements you can add.<br />

Q. On Squeak? Not yet, just VW.<br />

Q. Cost? For non-commercial it will definitely be free. Commercial is<br />

TBD.<br />

StakePoint<br />

Stakepoint is a general purpose planning program using Glorp and Cairo in<br />

VW. The UI shows resources on the left, timelines on the right. Linear<br />

equations are solved in the image and a revised plan written in a single<br />

transaction to the database. You can drag-drop to add documents, emails,<br />

etc., directly to the tasks.<br />

Q. Can you import MSDocument data? He can feed a task into an<br />

MSProject database.<br />

Q. Why use this tool instead of MSProject? Many people can work together<br />

on the same document, thanks to the transactional behaviour.<br />

Q(Bruce) Capture actual data from contractors actually doing the work?<br />

Not yet protected with capability-based login and etc., for that but yes it is<br />

multi-user so the contractor could be given access.<br />

Demo can be downloaded from the <strong>ESUG</strong> website.<br />

Nikolay<br />

A new Squeak and Seaside-based disk has been released in Russia. One<br />

disk with Squeak, Seaside and content for a webserver is given to e.g. a<br />

school, installed on many computers and then updated over the internet.<br />

Other Discussions<br />

The UK smalltalk user group has a new website uksmalltalk.org, set up by<br />

Bruce Badger and Giovanni Corregida.<br />

Georg announced that SeaBreeze will be available on the MIT licence.<br />

Heeg will also sell a supported commercial licence. They will publish<br />

SeaBreeze to the public store “as soon as the comments are written.”<br />

Leandro announced the second <strong>Smalltalk</strong> conference in Argentina. It is free<br />

to attend! The coffee and cakes are also free! Last year they had 200<br />

attendees. There will be three tracks, one for education, one for interest and<br />

one for research. Andrés Valloud will be running his mentoring course.<br />

I talked to a GLASS user, Otto Behrens of FinWorks, who deal with<br />

retirement wealth management / insurance. Their system supports monthly<br />

investments into voluntary pension products, from employees whose


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 105<br />

employers offer the schemes to the brokers who invest the monies. All<br />

parties get a central point in their system to save them from forever having<br />

to reconcile their data. The system displays info regarding unit trusts:<br />

classifications, trading currencies, fund domicile, etc. The FirstRand group<br />

has 3 entities: MomentumLife (80Gb Gemstone64 database), RMB<br />

International (does a similar business to FinWorks but working backward<br />

from employees not onward to monthly payments) and Rand Merchant<br />

Bank Treasury, whose system is similar to Kapital but is specifically for<br />

bond valuations. They use VisualWorks on Sybase. RMB International also<br />

run Seaside in VisualWorks for asset statements for RMB customers with<br />

large cash positions. FinWorks came out of RMB in the sense that Otto and<br />

others worked for RMB previously and FinWorks does work for them.<br />

FinWorks have PDF generation from Seaside: they build the Seaside html<br />

page, then add special tags like page break, page number, landscape or<br />

portrait, then run a commercial tool (www.princexml.com, $3000 licence)<br />

that produces PDF from the page. They also generate pre-populated PDF<br />

forms this way which a user can fill in the rest of and have a customer sign.<br />

They are converting to Magritte: a pain here and there, but generally<br />

working and helping.<br />

<strong>ESUG</strong> has prepared a PDF of a fold-out flyer describing <strong>Smalltalk</strong>. See it<br />

at daniel.cassou.free.nl and/or get copies from <strong>ESUG</strong> for conferences.<br />

The perils of being the local organiser: Adriaan had to pay when Noury<br />

arrived with a large party of guests at a restaurant - and then discovered he<br />

had forgotten his wallet. :-)<br />

CosmoCows are hiring. Good designers wanted, knowing <strong>Smalltalk</strong> or<br />

willing to learn it.<br />

VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

Travel to Frankfurt was painless, despite my change being at the notorious<br />

Heathrow terminal 5. My hotel room could have slept 5 with ease - except<br />

that none of them could have slept while the overnight trains passed with<br />

incredible noise on the tracks outside. The forum’s coffee and cakes were<br />

on a generous scale.<br />

Summary of Projects and Talks<br />

Joachim introduced himself and ObjectFabrik. ObjectFabrik is preparing<br />

<strong>Smalltalk</strong> training material and courses.<br />

Instantiations Market Perspectives, Nicholas Gilman, Instantiations<br />

Instantiations teamed up with Joachim two years ago and have found it a<br />

very effective working relationship. John came to Instantiations a year and<br />

a half ago after 40 years with IBM. (I told John he did not look old enough<br />

to have 40 years with IBM; he told me it was six months short of that. :-)<br />

Instantiations is committed to <strong>Smalltalk</strong>. VA<strong>Smalltalk</strong> is an important part<br />

of their business. They have sold new licences into all major country


106 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

markets in Europe this year and they expect to be using <strong>Smalltalk</strong> for many<br />

many years. Nick is responsible for the world outside North America but<br />

the overwhelming majority of his time is focused on Europe.<br />

Q.(Christian) Size of market in Europe v. North America? The market is<br />

smaller but not significantly smaller. The US has some mega-installations<br />

(100 - 200+ seats) whereas Europe does not have that scale, but it is still a<br />

significant proportion. (Louis asked who they were; they are in the<br />

insurance market. Nick might be able to provide Louis with specific details<br />

for internal use only.)<br />

If you want to influence the product, be the squeaky wheel (like NSF :-)).<br />

Louis mentioned discussions in the VA forum. Niall described how easy<br />

(for NSF) was being interviewed (by John O’Keefe) leading to an article<br />

that was placed by Marta; if it was as easy for Instantiations as it was for<br />

us then other users should talk to us today about it and maybe do the same.<br />

Q. Young <strong>Smalltalk</strong> employees can be hard to find. Potsdam and Paderborn<br />

universities teach OO in <strong>Smalltalk</strong> but they use Squeak or VW. The<br />

questioner knew of a major real-time user of <strong>Smalltalk</strong> who went away<br />

from it because their <strong>Smalltalk</strong> team was aging and not renewing itself.<br />

VA<strong>Smalltalk</strong> and today’s trends in IT, Joachim Tuchel, ObjectFabrik<br />

IT today is complex, the more so because of the history a typical IT<br />

department will have. Old systems and databases have complex<br />

interactions. The idea of having only one database, only one OS and so on<br />

is often raised. In response to this idea, some IT shops have eliminated<br />

<strong>Smalltalk</strong> but elsewhere <strong>Smalltalk</strong> has survived, often because replacement<br />

projects have failed (after spending much money) for various reasons,<br />

some of them technical. Such experience teaches (some!) managers that<br />

business value is more important than having the ‘right’ (fashionable)<br />

technology.<br />

After being neglected for several years, <strong>Smalltalk</strong> shops now find<br />

themselves with a lower budget than five years ago but told to continue<br />

providing, and usually also improving, business value. Integrating with<br />

other technologies is also a frequent requirement.<br />

Presentation is another area of current interest. Today, there is a mix of<br />

sometimes going onto the web (“lets concentrate everything in the<br />

browser”) and sometimes going back from it to rich clients again. IT shops<br />

want to avoid installing things on the client. Companies want a strong<br />

company-branded presence through a single portal. Global availability and<br />

platform neutrality are wanted.<br />

Why do others not want to go to the web? The web limits interactions, can<br />

make complex tasks too challenging, raises the problem of how / where to<br />

save local data, etc. Rich clients give you platform-drag&drop, faster<br />

feedback and a generally snappier feel to the app.<br />

Of course, a rich internet application is a possible best-of-both-worlds. You


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 107<br />

can have active elements (e.g. sliders, drag&drop) without page reload.<br />

They combine client technologies (AJAX, Javascript, ActionScript,<br />

Adobe) and server technologies (<strong>Smalltalk</strong>, Java, Ruby). AJAX is an XML<br />

HTTP request that uses Java script to update the DOM of a page on the fly.<br />

VA<strong>Smalltalk</strong> offers various web interfaces. VAWebConnection is a legacy<br />

product (it was sort of a prototype for Java Server Faces). Server <strong>Smalltalk</strong><br />

is a stronger and newer product. It is stable (ten years of use), scalable<br />

(multi-threaded, multiple images) and combines an HTTP/S server with<br />

Java-servlet-compliance on the client. VA<strong>Smalltalk</strong> gives XML support,<br />

SAX and DOM-Parser and <strong>Smalltalk</strong>-XML mapping.<br />

Q. Native multi-threading on Linux? Not supported on any platform for<br />

<strong>Smalltalk</strong> threads. Calls out from the VM, e.g. to a database, are OSthreaded<br />

but not in-image processing. A single image running multithreading<br />

will significantly increase the complexity, so you are trading<br />

memory against complexity.<br />

Q.(Christian) Air, XOOL, Silverlight? Seaside has projects to offer but<br />

nothing else is in the works. It is all XML so one can do it at that level.<br />

Rich client platforms: Eclipse has a huge set of tools to let you drive SWT<br />

and suchlike GUI frameworks to build rich clients. VA<strong>Smalltalk</strong> has been<br />

used to build rich clients for 10+ years. There are many parts and powerful<br />

builders (composition editor, WindowBuilder Pro). The result is a native<br />

application. However the default look and feel is now a bit old and OS2ish.<br />

We need new parts: pluggable toolbars (with tear-off), ribbons, etc. These<br />

abilities are there but are not as usable.<br />

<strong>Smalltalk</strong> web start is Joachim’s preferred ‘most needed’. By ‘web start’,<br />

he means we should be able to have an image check on start-up for updates<br />

from a server and get the new image or the new code to load. Joachim<br />

would also like to see Windows CE/mobile and Mac OSX added to the<br />

platforms’ list, but that is not an announcement!<br />

Web services use HTTP POST for transport and XML messages for<br />

content in SOAP envelopes. Web services can easily become very<br />

complex. VA<strong>Smalltalk</strong>’s web services were provided in VA5.5 and have<br />

been improved in every version. You expose a <strong>Smalltalk</strong> object as a<br />

service.<br />

RESTful web services are not the same as Web Services! REpresentational<br />

State Transfer is about creating a resource, not an operation, on a remote<br />

server. The URL is its unique name. It is (supposed to be - not every<br />

implementation actually is) totally stateless on the server side; cookies and<br />

all are managed by the client. A resource can be like a business object, e.g.<br />

a customer, a message, a flight booking, and, in more esoteric senses, a<br />

database transaction or a dataset. The mapping between your business<br />

objects and your resources may be direct or may group them into single<br />

XML messages (e.g. the customer and their address) or be more complex<br />

still. The basic create, read, update and delete operations are all


108 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

implemented by server smalltalk (it implements the whole standard). These<br />

operations have a usefully detailed set of result codes.<br />

Why do we care? Web Services are quite complicated and RESTful web<br />

services are quite simple. RESTful also has some useful advanced features:<br />

if-modified-since, last-modified. Cache control is supported: have readonly<br />

objects or manage infrequently-changing objects. You can use a<br />

cursor-like accept-range: get the first 100 objects, then get the next 100,<br />

etc.<br />

Usage is growing. The storage mechanism of Lotus notes has put a<br />

RESTful web service in front of it.<br />

Joachim showed the code for his PRESTON client:<br />

getResourceNamed: aURI {queryParameters: aDictionary}<br />

postResource: anObject toResourceNamed: aURI<br />

...<br />

PRESTON provides proxies for hyperlinks and other useful features. He<br />

demoed, opening a browser on the Yahoo traffic service (alas, Frankfurt is<br />

not one of the supported cities) to explain it and then calling it from code.<br />

He used the normal xmlMappingSpec: shipped with VA<strong>Smalltalk</strong> to map<br />

between his business object and the XML in the queryParameters. He<br />

brought up a simple UI on it showing the traffic situation in New York and<br />

Jacksonville (quite light at 05:50 their time). He set a breakpoint and<br />

showed the request going out with its query parameters, and the mapping<br />

spec. (A VA<strong>Smalltalk</strong> goodie converts .xsd to a mapping spec. Joachim<br />

downloaded the .xsd from Yahoo - it’s part of the overall message - copied<br />

and pasted it into the goodie and got his mapping spec.). He then used the<br />

Firefox plugin to show the structure of the message: a collection of results<br />

each of which is a traffic message (‘Holland tunnel is blocked due to<br />

construction work’ and suchlike).<br />

Q. Why would a transaction be a resource? Suppose the customer is<br />

thinking of buying a flight? They may go on to buy, or search for another<br />

time, or stop and abandon the purchase. This is a business case transaction.<br />

It is worth knowing how to handle such things as resources.<br />

He walked on through the browser and (made the screen bigger and :-))<br />

opened the response object, looking at its header (an<br />

SstHttpResponseHeader). The status code of the response which came<br />

back is checked, so if it is not 200 OK it will throw an exception; thus you<br />

can have rich client behaviour around this. He walked the object in the<br />

‘dom’ instVar, which was just an XML DOM as in any other language.<br />

Thus all this is simple in VA<strong>Smalltalk</strong>. The basic VA<strong>Smalltalk</strong> is very<br />

robust and simple. PRESTON provides an API that looks like a standard<br />

RESTful API.<br />

Q. (Louis) the XML mapping generation goodie will be in the next version<br />

of the product? (John O’Keefe) yes, and we will be doing more with this.<br />

(Joachim) downloadable (in two versions) from Instantiations’ web site.


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 109<br />

Joachim asked who uses Web Services. Three groups raised their hands for<br />

doing it in VA<strong>Smalltalk</strong> and Christian was also doing Web Services in<br />

another dialect.<br />

SST offers you a session manager which Joachim thinks useful even if<br />

RESTful purists think it should not be needed in a RESTful world. Using<br />

this and the other SST building blocks (e.g. naming service) Joachim built<br />

the PRESTON client. He then demoed another example of using it, called<br />

Todomatic, (a ToDo list manager). Serving a resource is serving an XML<br />

file and that is what a servlet does so the API is very similar; he inspected<br />

the PrestonServer and showed that its applicationContext object was<br />

just the same as for a servlet. He showed posting a <strong>Smalltalk</strong> object (a new<br />

user) to a resource (the list of users).<br />

postResource: aUser toResourceNamed: usersURI<br />

A put request updates a specific existing object. A post request adds a new<br />

resource to a list of resources and to access it later you must know its name,<br />

which will be returned by the response.<br />

He then stopped the server and restarted it to show making the user list only<br />

support posting to it, as an example of controlling what operations were<br />

permitted. He showed how he built up the structure of resource managers.<br />

The system has a database connection where the todo data is stored and a<br />

session manager (useful if not strictly necessary). After he made the<br />

change, clients could no longer get the list of users though the server could<br />

still see them.<br />

Q. A viable alternative to RMI? Yes. He mentioned a product (a database)<br />

that only offers a RESTful interface. You could use this to make it easier to<br />

interface with e.g. a Java app without needing an RMI library, avoiding<br />

RMI version issues.<br />

Q(Niall) Can we browse this code to give us examples. Joachim is thinking<br />

about it; yes, he would like to make some of the code available.<br />

Q(Christian) Collections? At <strong>ESUG</strong> in 2002, Alison Dixon gave a talk that<br />

noted the rules then needed (e.g. using Arrays not OrderedCollections). An<br />

issue is that a result needs a rootTag and if you just return a list you may<br />

not have it. This is a general issue, not specific to <strong>Smalltalk</strong>, so most public<br />

service providers have probably solved it, e.g. wrapping their returned list<br />

in a resultList-tagged object.<br />

Most of these high-faluting web technologies we hear about today are just<br />

based on HTTP with XML and mapping these to objects on the server side<br />

makes them much easier to use. VA<strong>Smalltalk</strong> is ready to handle all of them.<br />

Portrait of an Agency System, Martin Elässer and Steffan Müller,<br />

Versicherungskammer Bayern<br />

The talk was in German but the slides were in English. Their organisation,<br />

Versicherungskammer Bayern, is a company of Sparkassen Finanzgruppe.<br />

Their business is health insurance, life insurance and composite products


110 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

for individuals, institutions, etc. They handle 2.8 million claims a year<br />

(1500 per working hour). They pay out 17 million euros per day in<br />

insurance payments. They have many sales channels: brokers, agencies,<br />

savings banks and direct sales over the internet.<br />

The are big in Germany and also have a branches in Hungary, the UK and<br />

elsewhere. They started in 1811 and have a long history of growth,<br />

mergers, etc. Currently they have just under 7000 employees. and have a<br />

recent history of steady growth, making them the prime insurers in<br />

Germany.<br />

Martin then handed over to Steffan. Steffan uses <strong>Smalltalk</strong> to support all of<br />

this. Their system must serve customers, sell products, support acquisitions<br />

and provide a range of services to the sales and marketing departments.<br />

The customer service function has no selling purpose. It must be a word<br />

processor, a scheduler and many many other things. The sales process<br />

needs these functions too and to manage the claims history etc. When the<br />

grow by acquiring the products of the new partner must be data-filled into<br />

the system and/or their existing systems liaised to by the system. Last but<br />

not least, sales and marketing need a help system to explain the data they<br />

are seeing, etc., etc.<br />

The system was begun with some 50 employees of VkB, IBM, Inverso and<br />

external companies. It started in 1997 and went live in 1999 using <strong>VAS</strong>T<br />

4.0 and DB2, Lotus Notes as the CRM system, with C, Cobol and Java for<br />

some calculation modules. By <strong>2008</strong> they were on VA<strong>Smalltalk</strong> 7.5 and had<br />

moved the calculation engine to an offline Java application to which they<br />

communicated via web services. Another Java app provided a web frontend.<br />

There were 4000 clients and over 1000 local servers.<br />

The flow of data is complex (see slide). Customer and contract data is held<br />

in distinct back-office systems. Insurance contracts are automatically<br />

generated, logged in the DB and sent. He launched the <strong>Smalltalk</strong><br />

application and walked round its various functions.<br />

He also showed the Java app in a web browser (IE with a browser plugin<br />

so it looks like a native window) and walked round a standard submission<br />

in the browser, showing in fat client its effect on the <strong>Smalltalk</strong> side. The<br />

Java agent uses Java Server Pages and Java Beans in a Tomcat web server.<br />

It talks via web services to the <strong>VAS</strong>T server. It has the usual behaviour:<br />

request a contract with bad data, see some fields in red appear in your<br />

browser, fix and carry on.<br />

Customer relationship management is becoming more important and that<br />

is where <strong>Smalltalk</strong> effort will be put, so the <strong>Smalltalk</strong> UI is likely to remain<br />

and grow. The users like the powerful <strong>Smalltalk</strong> forms and Steffan<br />

certainly hopes they will remain. As for the web client, perhaps they will<br />

replace it with Seaside in a few years; they have hopes. :-)


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 111<br />

VA<strong>Smalltalk</strong> 8.0 and beyond, John O’Keefe, Instantiations<br />

(This write-up includes material from, and questions asked at, <strong>Smalltalk</strong><br />

<strong>Solutions</strong> <strong>2008</strong> and <strong>ESUG</strong> <strong>2008</strong>.) John O’Keefe has a long history with<br />

<strong>Smalltalk</strong>. He first saw (Digitalk) <strong>Smalltalk</strong> in 1987 and was a founding<br />

member of the <strong>Smalltalk</strong> team at IBM. He was very glad to forge a<br />

relationship with Instantiations when IBM retired from <strong>Smalltalk</strong> a year<br />

and a half ago. He leads the development team at Raleigh, North Carolina.<br />

Instantiations’ co-founders developed the first version of <strong>Smalltalk</strong> in 1984<br />

at Tektronix. Instantiations has been born, bought, sold, born again and has<br />

always had a major <strong>Smalltalk</strong> focus.<br />

For the last two years, Instantiations have maintained and sold<br />

VA<strong>Smalltalk</strong> which was formerly VisualAge <strong>Smalltalk</strong> at IBM. They<br />

released VA<strong>Smalltalk</strong> 7.5.0, 7.5.1 and 7.5.2 during that time, focused on<br />

tool integration and improvements to the product. Now in VA<strong>Smalltalk</strong> 8.0<br />

they are adding some key things and also taking some things away. Seaside<br />

and its friends appear. Browsers are enhanced. Web services are enhanced.<br />

After a long time in which the inherited documentation had fallen behind<br />

the product, they are now investing in new documentation and improving<br />

the documentation system. They have also made some small changes.<br />

The 8.0 work had four main requirements from customers. Customers want<br />

Seaside. They say the browsers look tired. They want ANSI compatibility<br />

in full, which means ANSI exceptions (all else is already there) and<br />

internationalisation. Lastly, they want performance, which 8.0 has<br />

improved under the covers.<br />

Last year in Lugano, John said they were looking at Seaside. Since then,<br />

they have ported both 2.8.2 and 2.9 but have now quiesced 2.8 in favour of<br />

2.9 (John is grateful for the Seaside project’s refactorings that make porting<br />

easier in 2.9.) Scriptaculous has also been ported. A Seaside porting layer<br />

has been developed and will be used to provide functionality in three ways:<br />

• Parts of it will move into the base. They are generally useful.<br />

• Other parts will move into a common porting layer shared with the RB<br />

and SUnit. They are useful whenever some <strong>Smalltalk</strong> utility is worth<br />

porting into VA<strong>Smalltalk</strong>.<br />

• Other parts will remain in a Seaside porting layer.<br />

Q(Christian) Sport? John has worked on sport and talked to Bruce Badger.<br />

It was not aiming at exactly the same purpose so was not suited to their use.<br />

Q(Joachim) use this (the third layer especially) to port other Squeak tools?<br />

It has only what Seaside and Scriptaculous needs, so would surely need<br />

additions, but could certainly be used as a base for such ports and John is<br />

thinking about doing so.<br />

Continuations were (and are) the thorn in their side. One-shot<br />

continuations (i.e. simple Seaside call-answer protocol) are working today<br />

and beta code will be released as soon as these are robust. They also have<br />

the web inspector and debugger working and are working on the class<br />

browser. Full continuations need VM changes and these are under way.


112 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

Alas, VA<strong>Smalltalk</strong>’s process model is quite different to those of other<br />

vendors’ <strong>Smalltalk</strong>s and this is what has delayed full Seaside. Seaside 2.9-<br />

jf.183 is running. Seaside-Tests-Unit 2.9-pmm.156 run 95% green.<br />

Q(Eliot) Architecture? The architecture will not be changed. The main<br />

need is to expose method contexts which at the moment can be read but not<br />

written, not through read only mechanisms but actually blocked in VM.<br />

Process copying is also blocked and must be enabled.<br />

Toolbars and Halos and the Inspectors work. The browser is being<br />

developed; he showed a screenshot from his test system.<br />

Browser look and feel: John showed the old, then the new with tabs. These<br />

tabs are native, not VA ones (and so they must accept platform<br />

dependencies). You will be able to choose standard browsers (1980 look),<br />

the VAAssist browsers (colour coded and features) and, based on the<br />

VAAssist browsers, these new ones.<br />

These tabs are on the method pane but that will be replaced by a tabular<br />

form. You can switch between tabs without having to save the content: e.g.<br />

change a class method definition and a method that will use the changed<br />

definition at the same time. They want to make them dynamic (changing<br />

tab colour to show ‘changed but not saved’, ‘content missing’, etc.) using<br />

tab icon and colour. They want to make the method pane a sortable list,<br />

sorting on public/private or on method name or whatever. They will also<br />

offer a tabbed workspace; John showed it.<br />

Seaside made John want to look at byte codes so a byte code browser will<br />

be available in 8.0. John showed it. (He will make it not too obvious how<br />

to turn it on lest geeks spend all their time in it. :-)<br />

Web services are of interest to large enterprise customers (and few others?).<br />

They have customers with 10,000-50,000 bytes of WSDL in each of many<br />

files, containing multiple nested schemas. A new style of WSDL called doc<br />

literal wrapped has come in during the last two years. They will support the<br />

wrapped doc literal style in 8.0. Their insurance example will be greatly<br />

enhanced; it was supposed to show everything you would want to do with<br />

web services but did not and/or no longer does. They will offer<br />

documentation to show patterns for using them: there will be examples and<br />

a cookbook, giving step-by-step instructions. This will also explain<br />

debugging techniques; it is easy enough to do once you know how but there<br />

was no explanation of how. They will guide how to manage deployment<br />

descriptors, explaining how to set their configuration parameters and<br />

where they are stored.<br />

The old web-presented VA documentation was ugly and the source for it<br />

has been unavailable for several years (long story). This is partly why the<br />

documentation has not changed since 6.0. They will completely revamp the<br />

documentation. The documentation server will go; they will instead use<br />

WebWorks. Search and all other features will work both locally and<br />

through the web, not just locally as it does at present. CSS will be used for


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 113<br />

formatting. New PDFs will be written. John showed the appearance of a<br />

page in the prior system and in the new WebWorks system.<br />

Q(Christian) You can select and execute code examples in this browser?<br />

No, you must copy and paste to a workspace. You can tell what changed?<br />

John is keen to have a when-last-updated field at the foot of the page. It is<br />

hard to show change bars in a document. There will be a what’s-changed<br />

frontpiece but that will be a highlights summary, not a complete list.<br />

ANSI exceptions are fully supported. Their old instance-based exception<br />

system is integrated with them in 8.0. You can now use the ANSI on:do:<br />

(class-based) or when:do: (instance-based) or a mix of both. John has<br />

switched the SUnit preload over to use ANSI: the rewrite was a useful test.<br />

Q(James Foster) do you have a conflict between Error class and global<br />

Error? No, Error class has been there for years. Discussion clarified the<br />

different thing James was thinking of. Seaside drove this; it makes<br />

extensive use of class-based exceptions.<br />

They will improve serialization to support the wrapped literal style which<br />

has become popular in the .Net domain. The standards are rather vague in<br />

some cases so they have studied how this works and should work and will<br />

provide working examples.<br />

Windows Themes are supported on XP (available as a patch now). There<br />

is full support for UTF-8 locales. Most Linux platforms now use UTF-8 is<br />

their default out-of-the-box so it was a problem even to install without it.<br />

They will complete their support for UTF-8 locales.<br />

OS/2 will not be supported in VA<strong>Smalltalk</strong> 8. Instantiations has never<br />

formally supported OS/2 but till now has kept it running there. However<br />

7.5.3 will be the last such version. John guarantees 8 will not run on OS/2.<br />

Q(Louis) 7.5.3? That is the version with Windows Theme support. It was<br />

never actually released (they decided instead to focus on 8.0) but if you<br />

need Windows Theme support (or OS/2), email him and you’ll get it.<br />

A beta is planned for October <strong>2008</strong>; John guarantees it will be the last day<br />

in October, or maybe October 35th. Release will be announced on the<br />

Instantiations’ website. The planned date for general availability is three<br />

months after the beta which should be 4Q<strong>2008</strong>, but it might be December<br />

35th. (John stressed that plans can change and do not usually change to be<br />

earlier.)<br />

After 8.0, they will look at Seaside, Web Services, IDE Enhancements,<br />

Installation and other things (looks like the 8.0 list).<br />

Seaside will be continued; if 2.9 is not code-complete when V8 ships, it<br />

will have a a backported 2.8 but they will certainly ship a 2.9 as soon as<br />

possible. Porting Magritte, Pier and RSS needs to be done and they may not


114 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

have all the resources to do it themselves. (In the past, people have<br />

remarked that Instantiations do not have a code repository. John is thinking<br />

of a Monticello-2 bridge so he can publish changes between an internal<br />

Envy repository and the outside world.) They will help people port Seaside<br />

add-ons. They themselves will keep Seaside and Scriptaculous up-to-date.<br />

Web Service tools will be improved. An XML editor, better <strong>Smalltalk</strong><br />

class-XML translation, etc.<br />

Q(Vincent) will these changes apply to e.g TrailBlazer? (Question was<br />

asked earlier but deferred to now.) VA<strong>Smalltalk</strong> has a plethora of browser:<br />

the base browsers, TrailBlazer, the Refactoring Browser, and VAAssist that<br />

sits on top of all of this. They will integrate all useful functions to a single<br />

browser (leaving the others there to use but putting their useful functions<br />

in the main branch browser). Tabs will let them steal useful features from<br />

other browsers, e.g. the version graphical relationships tool from<br />

TrailBlazer will become a tab. The other browsers will be deprecated, or at<br />

least quiesced: TrailBlazer will no longer be loaded automatically when<br />

you load the server workbench.<br />

Consolidating the IDE branches was in last year’s list but Seaside took<br />

their time plus they feel the changes they are doing in the browser will be<br />

a better base for the consolidation.<br />

They ship tons of examples that people never find. They have the example<br />

launcher to expose a few of them; all the others will be exposed in it too.<br />

Installation needs to be improved. This failed to make it into 8.0 so will be<br />

done in 8.x. Their installer works well on Windows, not quite so well on<br />

Vista and needs a little manual intervention on UNIX / Linux. They have a<br />

<strong>Smalltalk</strong> installer which is good and bad - they understand it but they have<br />

to maintain it. They must decide whether to evolve that or to go instead to<br />

using a commercial installer.<br />

They will probably use Glorp as an OR mapping layer; their own<br />

framework ObjectExtender is so disused it is now a goodie.<br />

They support many web APIs, some very old and creaky. They have<br />

deprecated Netscape server API and the IBM communication server API.<br />

That only leaves IIS or CGI, and CGI is slow, often because it is not<br />

persistent, so they will use FastCGI. TCP/IP v6 is not much demanded at<br />

the moment but they aim to be ready when it is (US government<br />

installations are starting to require it). Some Windows CommonControls<br />

need to be added (DatePicker for example). Windows services should not<br />

need a special start-up executable. (John confessed it was he who wrote it<br />

that way; he now sees they should be written in <strong>Smalltalk</strong>.) It needs two<br />

weeks of effort to do and will make Windows services more flexible to use<br />

and to debug, and easier to run as an app or a service.<br />

Q(Adriaan) How do you port from Squeak to VA? John has developed a<br />

custom file-out package exporter. He is happy to make it available.


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 115<br />

Q. Louis has spent time looking at deploying multiple images on one<br />

server. The load-balancer goodie on Instantiation’s website is not industrial<br />

strength. Louis figured out how to do it with Apache but would have much<br />

liked documentation; will you add? Good idea; yes, we will.<br />

Q. Experience migrating to 8.0? None as yet since noone has but now they<br />

have a new documentation mechanism they will update the migration<br />

guide. John is going through all the changes and noting what might be a<br />

problem. In fact Adriaan did some experiments porting to 8.0 and then to<br />

Seaside. Significant extensions have occurred and a class, IdentitySet, so<br />

where these are already added by an applications own base extensions<br />

these must be loaded. Niall suggested advising people on Envy behaviour<br />

when loading clashing code. Adriaan mentioned he had found it easier to<br />

get everything loaded by loading his application first then Seaside.<br />

Q. AbtTimestamp change? The previous change had a severe performance<br />

impact so they rewrote it again.<br />

Q. Seaside support needs VM tests? 95% of Seaside tests run with no VM<br />

changes but the last little bit, which is important - continuations and utf-8<br />

- do require VM changes.<br />

Q. If in future there is cog, would VA run on it? Eliot and John discussed<br />

that a few years ago. The VA VM is much larger than other dialects’ VMs.<br />

There is a good deal of primitive function exposed that is not in other VMs.<br />

Eliot: “It is a small part of the problem but I hope I will provide enough<br />

function for you to consider it.”<br />

Q. IBM Eclipse work? John is pleased it happens. It reproduces some of<br />

the Black Knight project which never was released for various technical,<br />

legal and political reasons. John approves supporting <strong>Smalltalk</strong> availability<br />

in that environment. Would he personally like having a checkin/checkout<br />

environment in <strong>Smalltalk</strong>? He does not know. However Eric and John have<br />

agreed that Instantiations’ website will have a link to the download for it.<br />

Q. MQ and Tivoli? MQ series support remains. We’ve had requests for<br />

JMS support that we think we could do via MQ; that is the only MQ work<br />

envisioned in the immediate future.<br />

Q Java Servlet interface? Yes, that remains. (John forgot to mention it in<br />

the list.)<br />

John offered additional demos of Seaside during the breaks.<br />

Seaside, Joachim Tuchel, ObjectFabrik<br />

This talk did not aim to be a Seaside tutorial. After a short introduction to<br />

Seaside, Joachim demonstrated various aspects of using Seaside,<br />

especially the similarities to and differences from fat client. Moving from<br />

fat client to Seaside is an adventure but easier than any other technology<br />

for webifying fat clients that he knows.


116 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

Seaside was created by Avi Bryant and is now maintained by Lukas<br />

Renggli and Adrian Lienhardt and many others. He listed some Seaside<br />

sites (see slide) and recommended looking at CMSBox if you only visit<br />

one.<br />

Seaside is different (Avi calls it the heretic framework). It is different not<br />

for the sake of being different but for the sake of being better. There are<br />

components, not web pages, no templates (you can have them if you want<br />

them but they will only constrict you), etc. Seaside is pure <strong>Smalltalk</strong>. You<br />

write <strong>Smalltalk</strong> to define your components and your control flow, and you<br />

debug in <strong>Smalltalk</strong> (can be interesting if you debug continuations but when<br />

Seaside is running as it should - which it usually does - you do not debug<br />

continuations).<br />

Components subclass WAComponent. They hold state. They render<br />

themselves in renderContentOn:. They hold subcomponents in<br />

children. In the Java world, you may have to rewrite a component you<br />

reuse just to have a different name for the tag; not needed in Seaside. He<br />

showed the WAStoreCartView>>renderContentOn: method, explaining<br />

various items, the html canvas, the div tag (important for identifying<br />

things to CSS styling and to AJAX and other Javascript utilities), the<br />

with: block to define what goes in the div, the cart instance variable<br />

(components have state), the anchor brush which provides a callback:<br />

whose block will be executed when the user returns to the server. Thus we<br />

do not parse HTTP requests or handle Javascript directly or anything; we<br />

just write <strong>Smalltalk</strong> code.<br />

Components generate valid XHTML only. CSS files style this. Ideally, the<br />

code is written by a developer and a web designer creates your CSS (you’ll<br />

see an example of why a web designer is needed presently; Joachim did not<br />

have a designer for his demo. :-).<br />

So much for ‘what is Seaside’. Joachim then compared Seaside<br />

Components to VA Visual Parts. Parts execute their callbacks as soon as<br />

e.g. the button is clicked. Components respond when the refresh cycle is<br />

triggered so the callback cycle is longer. (Joachim repeated the standard<br />

warning about not calling renderContentOn: yourself; call render:).<br />

Joachim compared abtWhenPrimitive: #clicked perform: ...<br />

to Seaside methods such as<br />

html submitButton<br />

callback: ... ;<br />

with: ‘Refresh’<br />

“or”<br />

html textInput<br />

callback: [:txt | self name: txt];<br />

value: self name.<br />

“or short form of the above, using helper method,”<br />

html textInput on: #name of: self.


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 117<br />

Differences:<br />

• in fat client, the typical feedback cycle is instant (type in a field, get<br />

validation) whereas in Seaside it is only on submit (submit page, get all<br />

fields validated)<br />

• Seaside has no GUI builder out of the box; you generate your HTML<br />

and style it in CSS.<br />

Q. Generate Seaside from composition editor (it can generate raw HTML)?<br />

Not in 8.0 or 8.1 and probably never because they find that people always<br />

want to change generated HTML. The composition editor never generated<br />

attractive pages and this is so for all such fat client generators because<br />

(Christian) the web model flow is not the same as the fat client’s. (Also, a<br />

professional page will usually be designed by someone who uses a product<br />

like Adobe Photoshop anyway.)<br />

Q. Can you draw widget connections a la composition editor? No you can’t<br />

but code is faster.<br />

In general you will not generate UIs that exactly resemble the fat client<br />

because to do that would need a div tag for every element in the UI. It is<br />

usually more natural to live with what HTML renderers do by default in<br />

some areas and accept that the UI looks a little different. There are two<br />

projects to build Seaside GUI editors. (One is SeaBreeze from Heeg which<br />

they have open-sourced under MIT with encouragement to port to other<br />

dialects.)<br />

Tasks are subclasses of WATask and use go to control flow e.g. to ensure<br />

login is requested where needed.Components and Tasks can call: and<br />

answer:. The call: receiver component is replaced by the parameter<br />

component; when the latter receives answer: it returns a result (the<br />

parameter) and control to the caller. It is the calling component, not the<br />

whole page, that is replaced by the callee. A Seaside application has a task<br />

that calls components just as a fat client has MVC, so writing a Seaside<br />

application is very like writing a model GUI application.<br />

AJAX is the most popular approach to writing rich internet applications<br />

(others are AIR, Silverlight, XOOL). AJAX lets you exchange a small<br />

amount of information between server and client to change a small part of<br />

a page. Script.aculo.us sits on top of Prototype and both are Javascript<br />

libraries. Prototype handles all the browser differences. Scriptaculous<br />

provides clever widgets and effects. Seaside wrappers them so that<br />

developers write <strong>Smalltalk</strong> and Javascript is ‘rendered’ in <strong>Smalltalk</strong>.<br />

html updater<br />

id: ‘myelement’“CHECK CORRECT NO ; HERE’<br />

callback: [:r | self renderNewStuffOn: r].<br />

Then he demoed (“This is early beta: be prepared to see a debugger.”). He<br />

opened a YahooTrafficComponent that rendered a table, an image and an<br />

internal table with some scriptaculous html effect ... code to show<br />

a drop down list appearing and disappearing below a button being clicked.


118 VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong><br />

html evaluator<br />

id: #result;<br />

on: #renderEvaluatorOn: of: self.<br />

He showed the very small amount of code required and then opened and<br />

demoed, invoking these effects, expanding drop-down lists, drag-dropping<br />

data from one component in the page to another, etc. He could not show the<br />

debugger in the browser (answer: has a bug at the moment), so instead<br />

showed the debugger on the server (opening it even quicker than he<br />

expected because he got the answer: bug the John is analysing at the<br />

moment whereby the result loses its stream every now and then :-).<br />

Q. Does a developer of this need to know Javascript. Not to call it. Joachim<br />

advises understanding the Javascript flow of control. Instantiations will<br />

support Prototype and Scriptaculous? They will support ensuring you can<br />

call it from <strong>Smalltalk</strong> easily and will feed back any bugs found in it to its<br />

authors (but discovering a bug is unlikely, since it is in heavy use).<br />

What must you change when moving from a fat client to a Seaside app. A<br />

fat client will manage persistency, presentation and business logic. In a web<br />

app, the browser has a small presentation layer of HTML and Javascript,<br />

and it is the server that has the presentation layer (serving the browser), the<br />

business logic and the persistence. Fat clients use their database to<br />

synchronise data; clients do not know about other clients, just about what<br />

the database tells them. In the web app, the server may have several copies<br />

of a persistent object, one per session. A web server will need connection<br />

pooling, parallel transactions, multi-threading and isolation in the image.<br />

The situation is similar when you access other back-end systems such as<br />

CICS, host programs, etc. Your requests must not block the server, so if<br />

your current system has problems with that, look at replacing your current<br />

middleware with TCP/IP comms.<br />

Since server round-trip validates at different times than the instant handling<br />

of fat client events, you must rework your validation model. In some fat<br />

clients, authentication is easy: ‘If I can login to the database, I’m authorised<br />

for the whole system.’ The server will want a separate authentication for<br />

itself as it uses connection pooling, so does not have a connection per user.<br />

Server <strong>Smalltalk</strong> and Seaside can handle several hundred requests per<br />

second on a normal PC. Joachim is confident overall performance will be<br />

determined by the application.<br />

Scheduling downtime for maintenance tasks (installing fixpacks, DB<br />

migration, etc.) is more important when you move to a web app. If your<br />

browsers talk through Apache to a number of Seaside images, you will<br />

want sticky sessions to ensure a user gets the same image through a session.<br />

Joachim sees no problem with these though he knows some people dislike<br />

them; he is unclear why.<br />

Q. Security? Server <strong>Smalltalk</strong> handles HTTP/S but it may be wiser to let<br />

that be handled by Apache whose builders know a lot about it (Louis: or


VA<strong>Smalltalk</strong> Event, Frankfurt, September 23rd, <strong>2008</strong> 119<br />

you could buy a hardware load balancer, which will usually have security).<br />

To start the project, use 3 or 4 developers to build a proof of concept using<br />

a few dialogs of your app (some easy and at least two of the most complex<br />

ones). Let it run for two months with fixed check points at 4 and 6 weeks<br />

and a hard ‘that ends the prototype’ in 8 weeks. Why convert at all? Well<br />

you reuses your <strong>Smalltalk</strong> code and skills while looking like all the other<br />

corporate apps and making your team’s strengths visible.<br />

Q. Security in Seaside specifically? Seaside avoids many issues that other<br />

frameworks face due to its non-RESTful URLs; an attacker cannot guess<br />

what the next URL would be from the one they get. Your page elements<br />

also have generated names. Thus you have security by obfuscation.<br />

Seaside is fun: you can motivate your <strong>Smalltalk</strong> developers a lot if you give<br />

them Seaside.<br />

Q(Christian) Seaside lacks documentation (your presentation adds to the<br />

documentation; thanks); will you add more? The Potsdam tutorial is good.<br />

Lukas and Adrian plan to write a book and a good deal is being recorded<br />

on the wiki as part of 2.9.<br />

Closing Discussions<br />

Why choose VA<strong>Smalltalk</strong>? Test-drive it and see. (I mentioned Envy<br />

robustness; refactoring may be harder than in some other <strong>Smalltalk</strong> CM<br />

systems but it is a solid mature CM system.)<br />

Q(Louis) grow support staff? Nick cannot make these decisions. They are<br />

pursuing a business case within the company for expanding and they hope<br />

and expect that it will be approved.<br />

Q.(John O’Keefe and Joachim) anyone use VA Generator? noone. Anyone<br />

still on <strong>VAS</strong>T? One or two; very few.<br />

Q(Christian) next forum? Last year people said have a forum each year or<br />

when a new version is upcoming and now looked like the right time. They<br />

have not decided when the next one will be but they tend to think one per<br />

year. September is close to <strong>ESUG</strong> and autumn is the busiest time of year in<br />

Germany so maybe May is better (provided we do not clash with StS).<br />

Other Discussions<br />

Die Mobiliar’s <strong>Smalltalk</strong> system is still going strong. It provides web<br />

services to Java front-ends. With luck, they may be able to experiment with<br />

a Seaside front-end soon.<br />

A VA user wants to replace TopLink with Glorp.<br />

An Irish company has web portal ERM product (mapping from web to<br />

independent back offices): Java web skin to <strong>Smalltalk</strong> system. They want<br />

to hire fresh <strong>Smalltalk</strong>ers: see the smalltalk jobs database for contact info.


120 Conclusions<br />

Conclusions<br />

My tenth <strong>ESUG</strong>, my seventh <strong>Smalltalk</strong> <strong>Solutions</strong> and my second <strong>VAS</strong>UG:<br />

• Seaside just keeps growing<br />

• Being respected by adherents of now-fashionable Ruby makes a<br />

pleasant change from being rejected by adherents of no-longerfashionable<br />

Java.<br />

• <strong>Smalltalk</strong>’s second surge was much in evidence.<br />

Written by Niall Ross (nfr@bigwig.net) of eXtremeMetaProgrammers Ltd<br />

* End of Document *

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!