Smalltalk voor kinderen (nogmaals)

November 16, 2006

Ik kwam een video van Scratch tegen. Een applicatie gebouwd in Squeak dat zich richt op jongeren. Het is een omgeving om te leren programmeren met animaties en multimedia. Ik zag nog het logo van Computer Clubhouse in de video langskomen, waar Emilia haar stage heeft gelopen.
Het idee is denk ik vergelijkbaar met wat Stephan Ducasse probeert met zijn boek over programmeren met robots, maar de gui van Scratch ziet er wat gelikter uit.
Het is misschien wel een idee om hiermee een cursus voor de naschoolse opvang of het computer clubhuis op te zetten samen met Emilia.

Aha momenten

November 14, 2006

Ik merkte vandaag weer hoe procedureel we aan het programmeren waren in ons java project. Het komt met name doordat we een applicatie aan het uitbreiden zijn door ant tasks te schrijven. Het zijn in wezen ook sequentiele acties die je achter elkaar uitvoert heb je gauw de neiging procedureel te denken. Voor code reuse gebruiken we dan methodes in utility classes. Ik begin nu in te zien dat dit een code smell is.

We gebruiken bijvoorbeeld een writedocument methode dat een xml DOM document naar een bestand schrijft:

public static void writeDocument(Document doc, File file)
{
    ....
}

Naar wie stuur ik de boodschap als ik deze methode gebruik? Wat stelt util voor? Util stelt niets voor en is gewoon een module zoals we dat met Pascal hebben leren gebruiken. Het is een manier om code te organiseren en niet om iets te modelleren.

Een object georienteerd model zou zijn dat we classes hebben die een DOM document als storage gebruiken welke we kunnen serializen naar het file systeem. Je kunt de writedocument boodschap sturen naar een instantie van deze class. Die weet wat zijn DOM document is en hoe het weggeschreven moet worden. Code reuse vind dan plaats door te generalizeren naar een super class.

Ik zit dan wel nog met het probleem dat je in Java single-inheritance hebt en en dan is zo een generieke super class niet echt geschikt. Je wilt uiteindelijk toch domein objecten hebben en geen generieke objecten waar alles in past. Een OO oplossing in Java zou dan iets met interfaces en dependency injection zijn denk ik. En dan is een util class misschien toch the simplest thing that could possibly work.

Ik begin nu dan ook de elegantie van Ruby mixins te begrijpen. Je kunt hiermee generieke utility functionaliteit toch bij je object onderbrengen. Wat de juiste manier in Smalltalk is moet ik nog uitzoeken, maar ik vermoed dat je met codeblocks functionaliteit kunt injecten in een object, net zoals je met de collection classes doet.

Ruby op de Smalltalk VM

Avi Bryant de maker van Seaside loopt al een tijdje rond met het idee om ruby op de smalltalk vm te laten draaien. Gisteren plaatste hij zijn eerste poging op zijn blog en er volgde een interessante discussie dat resulteerde in een mailing list.

Het is me zelf nog niet helemaal duidelijk wat het precieze nut is, behalve dat Ruby dan sneller gaat draaien, maar ik ben benieuwd of het wat wordt. Op zijn minst denk ik dat het Smalltalk wat extra publiciteit zal geven. Het lijkt me in elk geval wel interessant om zoiets vanaf het begin te volgen.

Update:
Wat leuk commentaar over dit onderwerp.

Saush.com over Seaside

November 12, 2006

Op saush.com staat een uitgebreide post waarin het verschil tussen Seaside en andere webframeworks in java en ruby wordt uitgelegd. De schrijver belooft nog meer artikelen over Seaside te schrijven, dus wel een blog om even in de gaten te houden.

Seaside application generator

I have used the code I got from Ramon Leon for my seaside application generator. I have extracted a createWelcomeMessageOn method, in which I will put some simple “what to do next” instructions.
Next I want to automatically create a simple folder structure on the file system to hold the style sheets and implement the rest of the “convention over configuration” paradigm into the script.
I am still looking for the standard conventions in seaside though. Just like in rails I want to have unittest classes and a fixture setup automatically created with my models.


Object subclass: #Ocean
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'My-Utilities'

newSeasideApp: aName
  | appCategory configCategory prefix appClass sessionClass |
  appCategory := (aName , '-App') asSymbol.
  configCategory := (aName , '-Config') asSymbol.

  prefix := aName
        select: [:each | each isUppercase].

  SystemOrganization addCategory: appCategory;
     addCategory: configCategory.

  appClass := WAComponent
        subclass: (prefix , aName) asSymbol
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: appCategory.

  self createWelcomeMessageOn: appClass name: aName.

  sessionClass := WASession
        subclass: (prefix , aName , #Session) asSymbol
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: configCategory.

  (self confirm: 'Register this in Seaside Admin as an application?')
    ifTrue: [(appClass registerAsApplication: aName withFirstCharacterDownshifted)
                         preferenceAt: #sessionClass put: sessionClass;

        in: [:it | it libraries add: SULibrary]].
  Browser fullOnClass: appClass

createWelcomeMessageOn: appClass name: aName
  |welcomeMessage|
  welcomeMessage := 'Congratulations, you''''ve landed on Seaside: ', aName.
  appClass compile: 'renderContentOn: html' , String cr , String tab ,
                                                        'html heading: ''' , welcomeMessage , ''''.

Can the blogosphere “save” Smalltalk?

November 9, 2006

Even though this blog is in dutch (except for this post) it did catch the attention of some non-dutch readers and I even got some useful code as feedback. So I guess this blogosphere thing is really working. I am wondering if it can be powerful enough to get smalltalk back into the mainstream, without the support of the big software companies or the arrogance of someone like DHH. Let’s find out.

Rails combineren met Seaside

November 5, 2006

Het is moeilijk om in Seaside van start te komen vanwege het gebrek aan goede tutorials. In tegenstelling tot DHH, hebben de makers van Seaside de instap vrij hoog gehouden voor newbies. Met rails heb je in vijf minuten je eerste applicatie zonder zelfs een idee te hebben wat de technologie inhoud. Met Seaside moet je er eerste behoorlijk in duiken. Ik zit me wel af te vragen of het niet anders kan en of je niet zoals in rails snel een basis applicatie kunt genereren en van daaruit verder werken. Aan de taal zal het niet liggen: wat in ruby kan, moet in smalltalk ook lukken.
Ik ben dus begonnen wat code te schrijven voor het opzetten van een standaard Seaside applicatie.


WAComponent subclass: #RailsRoot
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Rails'

renderContentOn: html
html heading: 'Hello World ', self className level: 1.

Object subclass: #Rails
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Rails'

generateApp: appName
| appClass |
appClass:=RailsRoot subclass: appName
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: appName.
  appClass registerAsApplication: appName.
Met het volgende commando vanuit de workspace wordt dan een basis applicatie opgezet en opgestart.

Rails generateApp: 'Demo'

Dit is heel triviaal en met het handje heb je het bijna net zo snel gedaan, maar het is gewoon het uitzoekwerk dat mensen afschrikt. Ik moet het een en ander nog bullet proof maken en uitbreiden, maar het is een start.

Seaside blog engine project

Om wat beter thuis te raken in webdevelopment met seaside ben ik begonnen aan een blog engine. Tegenwoordig maken we in plaats van een uren registratie systemen liever een cms als pet project. Als we over twintig jaar terug kijken watvoor toepassingen het meest gebouwd zijn dan zullen uren registratie en content management systemen wel boven aan de lijst komen.
Ik wilde eerst het sudoku spel afmaken met een webinterface, maar dat was toch beperkt als het om een web applicatie gaat.
Ben vandaag zo ver gekomen dat ik een lijst met posts kan tonen. Ik doe het nog zonder database en gebruik een soort fixtures om te testen. Ik zit eraan te denken om helemaal geen database te gebruiken en alles in de image op te slaan. Intussen begin ik ook al aardig thuis te raken in het css gebeuren.

Chad Fowler over de non-innovations van rails

November 2, 2006

Ik heb vandaag op een door Logica-CMG gesponserde avond een presentatie gevolgd van Chad Fowler over Ruby on Rails en waarom het zo succesvol is. Als je het een en ander al een tijdje volgt was er weinig nieuws, maar toch wel een leuke presentatie. Hij had het nog even over het verschil tussen Seaside en Rails. Het belangrijkste verschil zat hem erin dat Seaside te innovatief was en dat het daardoor moeilijker te begrijpen is dan Rails dat bestaande “oude” concepten gebruikt die iedereen al kent. Ik ben het er hier gedeeltelijk mee eens. Voor web developers zijn Rails concepten inderdaad bekender dan Seaside, juist omdat je hebt leren leven met de beperkingen van web development. Als je zoals ik minder een web development achtergrond hebt, vind ik Seaside juist weer beter passen bij mijn beeld van applicaties ontwikkelen. Dat ik nog wat moeite met Seaside heb komt omdat Smalltalk nog nieuw voor me is en er gewoon heel weinig documentatie is.

Nog meer indrukken van deze sessie op Agile Dovadi en Willey Boerland.

Ruby vs Smalltalk discussie

November 1, 2006

Onsmalltalk heeft een post over de voordelen van Smalltalk ten op zichte van Ruby voor het schrijven van domain specific languages (DSL’s). Dit is misschien een open deur als je nagaat hoe minimaal smalltalk zelf is: er bestaan zelfs geen if then else constructies, dit is ook onderdeel van de library. De taal extenden voor een specifiek domein is dus vrij triviaal. Het zal wel niet voor niets zijn dat smalltalk in het financiele domein nog wel sterk aanwezig is. Ik denk het gebruik van DSL’s daar zeker heeft geholpen. De post heeft in elk geval een discussie in de comments, waarin rubyisten het pragmatische van Ruby verdedigen t.o.v. het pure karakter van Smalltalk (hoewel smalltalk zelf niet puur genoeg is volgens een van de commentaren). Ik ben altijd wel voor het pragmatische, maar vind hybride talen toch minder om een bepaald concept te leren. Als ik met OO leren met smalltalk was begonnen had ik het veel sneller opgepikt. Net zo als het werken met codeblocks. Dit is in ruby in wezen een optionele feature die je als programmeur kunt gebruiken. In smalltalk ben je verplicht ermee te leren omgaan en ik begrijp het nu ook beter net als anonymous innerclasses in java.

Get free blog up and running in minutes with Blogsome | Theme designs available here