Mon blog déménage !
17 septembre 2007 by bioskopNouvelle adresse : http://nico.bioskop.fr.
Pensez à mettre à jour vos lecteurs de flux :
http://nico.bioskop.fr/?feed=rss2.
Nouvelle adresse : http://nico.bioskop.fr.
Pensez à mettre à jour vos lecteurs de flux :
http://nico.bioskop.fr/?feed=rss2.
Gary Chambers vient de mettre sur Universe et SqueakSource le résultat de son travail sur l’apparence de Morphic. Les améliorations de l’interface sont nombreuses : l’apparence est thémable, de nombreux widgets ont été ajoutés, comme une barre des tâches et un sélécteur de fenêtres. Trois thèmes sont fournis, mais il est tout à fait possible d’en créer d’autres.
Pour l’installation, ouvrez Universe Package Browser (menu World>>open) et installez les deux paquets de la catégorie “User Interface”.
Bravo à Gary pour le travail accompli, et surtout merci de le partager avec la communauté !
Quand on écrit une application web avec Seaside, on se soucie en général peu des urls, et pour cause, celles-ci représentent l’état de l’application, et non le chemin pour accéder à une ressource.
Comment faire alors si l’on veut construire des urls bookmarkables?
Cette question est souvent posée sur la mailing-list, bien que la solution soit relativement connue, j’ai donc décidé d’écrire un article sur le sujet.
Il suffit pour cela de surcharger deux méthodes : #initialRequest: et #updateUrl: dans votre composant principal par exemple. WABrowser utilise cette technique, je vous conseille donc de regarder son fonctionnement.
Imaginons que l’on ait deux composants, MYMainComponent et MYSubComponent :
MYMainComponent>>initialRequest: aRequest
super initialRequest: aRequest.
aRequest fields at: ‘contents’ ifPresent: [ :contents | self setContents: contents]
MYSubComponent>>updateUrl: aUrl
super updateUrl: aUrl.
aUrl addParameter: ‘contents’ value: self uri
MYSubComponent>>uri
^’subcomponent’
Vous obtiendrez ainsi des urls du type :
http://foo.bar/maincomponent/?contents=subcomponent
Suivant le type d’url que vous recherchez, pouvez utiliser la methode #addToPath:.
MYSubComponent>>updateUrl: aUrl
super updateUrl: aUrl.
aUrl addToPAth: self uri
L’url obtenue ressemblera à ceci :
http://foo.bar/maincomponent/subcomponent
Noubliez pas d’adapter #initialRequest: à vos besoins.
Concernant le problème de la validité des liens après l’expiration de la session, je vous recommande cet article de Ken Treis.
J’ai récemment fait l’acquisition du livre “Smalltalk Best Practice Patterns” de Kent Beck, une vraie petite merveille, à mettre dans (presque) toutes les mains, et pas seulement celles des développeurs Smalltalk. Ce livre explique les bonnes pratiques de la programmation objet : le nommage des méthodes, la documentation du code, l’utilisation des collections, etc., il passe en revue tout ce qu’il faut savoir pour bien programmer en Smalltalk.
Attention tout de même avant de vous jeter sur votre bookstore favori, le livre est en anglais et je ne l’ai trouvé qu’en import (trop cher donc…).
Lorsque l’on écrit des composants Seaside, il arrive souvent que l’on veuille qu’ils communiquent ou interagissent entre eux. On peut alors se demander comment procéder pour éviter de les coupler explicitement, et qu’ils restent réutilisables.
Il existe une solution pratique et élégante à ce problème : les annonces. Plusieurs implémentations existent en Squeak, j’ai choisi d’utiliser celle fournie avec OmniBrowser, pour sa simplicité.
L’idée est simple : créer un annonceur dans la session, un composant peut déclencher l’annonce, et un autre y répondre.
WASession subclass: #MySession
instanceVariableNames: ‘announcer’
classVariableNames: ”
poolDictionaries: ”
category: ‘Announcement-Demo’
MySession>>announcer
^announcer ifNil: [announcer := OBAnnouncer new]
Il ne faut pas oublier d’initialiser correctement le composant principal de l’application :
MyMainComponent class>>initialize
(self registerAsApplication: ‘Announcement-Demo’)
preferenceAt: #sessionClass put: MySession
Il faut ensuite créer une annonce, sous-classe de OBAnnouncement :
OBAnnouncement subclass: #MyAnnouncement
instanceVariableNames: ”
classVariableNames: ”
poolDictionaries: ”
category: ‘Announcement-Demo’
Tout composant intéressé par cette annonce peut alors le spécifier lors de son initialisation, et prévoir une action à effectuer lors de son annonce :
MyFirstComponent>>initialize
super initialize.
self session announcer observe: MyAnnouncement send: #action to: self
MyFirstComponent>>action
“Do something when MyAnnouncement is announced.”
Et un autre composant peut l’annoncer :
MySecondComponent>>renderContentOn: html
html anchor callback: [self announceAction]; with: ‘do something’
MySecondComponent>>announceAction
self session announcer announce: MyAnnouncement
Vous pouvez donc très facilement faire interagir plusieurs composants de cette manière, avec différentes annonces, et ainsi garder des composants réutilisables.
Quel Squeaker ne s’est jamais retrouvé submergé par une multitude de workspaces et browsers ? C’était souvent mon cas, avant que je ne découvre Tamaris, un outil de développement Squeak particulièrement utile.
Tamaris est un explorateur d’objets très complet qui permet de naviguer et de les classer suivant des taxomonies (vues en arbres d’objets). Si son utilisation paraît complexe et peu intuitive au premier abord, elle se révèle par la suite très efficace. Outre l’intégration des outils habituels (browsers, workspace et transcript, …), Tamaris offre de nombreuses possibilités :
L’installation est très simple : ouvrez SqueakMap Package Loader (menu world>>open…>>SqueakMap Package Loader) et installez Tamaris ou Tamaris for Squeak 3.9 suivant l’image que vous utilisez. Les utilisateurs qui utilisent déjà la version 3.10 devront installer la dernière version de Tamaris depuis SqueakSource.
Notons qu’une documentation[1] au format PDF (en anglais) est télechargée automatiquement lors de cette installation.
Un screenshot pour la route :
[1] Quoique claire, la documentation mériterait d’être plus détaillée.
Squeak est un environnement Smalltalk fascinant qui mérite d’être plus connu qu’il n’est aujourd’hui.
Comme pour tout avec Squeak, les polices (qui, il faut bien l’avouer, sont assez laides) peuvent être changées facilement : ouvrez le menu World>>appearence>>System fonts…
Si comme moi vous n’êtes pas satisfait du jeu de polices fourni par défaut, vous pouvez en ajouter. J’ai choisi par exemple les polices Freetype, disponibles en archive Squeak ici. Pour l’installer ouvrez le menu world>>open…>>file list, séléctionnez l’archive, puis cliquez sur install.
L’archive semble contenir un bug, que vous pouvez corriger en ajoutant ce bout de code :
FT2Font>>displayString: aString on: aBitBlt from: startIndex to: stopIndex at: aPoint kern: kernDelta baselineY: baselineY
“Draw the given string from startIndex to stopIndex
at aPoint on the (already prepared) BitBlt.”
aBitBlt displayFT2String: aString
from: startIndex
to: stopIndex
at: aPoint
strikeFont: self
kern: kernDelta.
Le tour est joué, vous n’avez plus qu’à séléctionner les polices Freetype dans le menu System fonts.
Le résultat en images, la première avec les polices par défaut et la deuxième avec la police Freetype :
EDIT : Si vous utilisez une version 3.9 ou 3.10 de l’image, vous pouvez installer le package Freetype Plus disponible dans Universe.