Ventury Networks’ Blog

“If it walks like a duck and quacks like a duck, I would call it a duck.”

Créer un objet à partir d’une chaine de caractère


La syntaxe de Smalltalk définit un bloc de la manière suivante :

bc := [ :a | a traitements. a.].

Ici, le bloc est paramétré. Lors de l’execution du bloc, le message “traitements” est envoyé au paramêtre. Le bloc renvoie la dernière valeur évalué. Ici, il s’agit explicitement de a.

Pour évaluer le bloc, je peux faire :

monObjet := MonObjet new.
bc value: monObjet.

Très bien. Admettons maintenant que je dispose de la chaine de caractère suivante :

' [ :a | a traitements. a.]‘

Je souhaite en faire un bloc comme précédemment (en quelque sorte, compiler le code). Et bien, il suffit pour cela d’appeler la méthode readFromString: de Object :

bc := Object readFromString: '[ :a | a traitements. a.]‘.
monObjet := MonObjet new.
bc value: monObjet.

Et voilà. Je vous invite à essayer la même chose avec les lignes suivantes (faites un “inspect” dessus pour voir ce que cela donne) :

Object readFromString: '34'.
Object readFromString: 'coucou'.
Object readFromString: '''coucou'''.
Object readFromString: 'a := String new.'.
Object readFromString: 'a := ''coucou''. b:= 5. '.

Note : dans une chaine de caractères, le caractère spécial ‘ (guillemet simple, ou “simple quote”), est échappé par son doublage. Ainsi, au sein d’une chaine de caractères entourées par des guillemets simples, ”  ( ‘ suivi de ‘, et non “) représente un guillemet simple (et non la terminaison de la chaine).

Tags :

Créer un fichier avec VisualWorks Smalltalk


On souhaite créer un fichier, et y écrire du contenu. Le code suivant permet de créer le NOUVEAU fichier “test.txt” et d’y écrire un mot :

| file |
file := 'test.txt' asFilename.
file exists ifFalse:
	[ | ws |
	ws := file writeStream.
	ws nextPutAll: 'coucou'.
	ws close.]

Pour lire le contenu, on peut faire :

| file contenu |
file := 'test.txt' asFilename.
file exists ifTrue: [ | rs |
	rs := file readStream.
	contenu := rs contents.
	rs close.].
^contenu
Tags :

Le Turing Award est français !


Le Turing Award 2007 a été décerné à Joseph Sifakis, directeur de recherche au laboratoire Verimag du CNRS à Grenoble. Ce prix récompense ses travaux sur le Model Checking. C’est la première fois qu’un français reçoit cette distinction.

apple2.jpgAlan Turing fut, pendant la seconde guerre mondiale, l’un de ceux ayant décrypté la machine de codage Enigma, permettant ainsi aux alliés d’obtenir un avantage stratégique capital. Condamné par la justice britanique pour “indécence manifeste et de perversion sexuelle” (il était homosexuel), il est condamné à la castration chimique. Déprimé, écarté de tout projets, sa carrière brisée, il se suicide deux ans plus tard en croquant une pomme empoisonée avec du cyanure. Le logo d’apple serait un hommage à cet homme et à son tragique destin.

Le Turing Award est le plus prestigieux prix en informatique, considéré souvent comme le prix Nobel des informaticiens. Le Turing Award 2003 a quand à lui été attribué à Alan Kay pour ses travaux sur les langages de programmation objets (Il a participé à la création du langage Smalltalk).

Joseph Sifakis partage son prix avec des américains (Edmund Clarke et Allen Emerson) qui ont travaillé sur les mêmes sujets à la même époque (mais indépendament).

Alan Turing

Tags :

Projet MNT - 5


vue 3D colorée Trielen

Un petit peu moins découpé à la serpe que les le précédent, non ?

Tags :

Smalltalk et les blocs multi-paramétrés


La problématique est la suivante : comment passer trois paramètres à un bloc, provenant d’une collection (Array, OrderedCollection, ou tout autre …).

monTab := #(1 2 'add').
monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].

Je veux executer monBloc avec le contenu de monTab comme paramètres. L’utilisation de do: n’est ici pas appropriée : do: est un message compris par une collection, pas par un bloc. Et pourtant, la réponse est dans cette réponse : un bloc est un objet, comme tout en smalltalk. Il existe donc un message permettant de donner un paramètre à un bloc. Ce message est value: :

monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].
monBloc value: 1 value: 2 value: 'add'.

Pour obtenir les éléments de monTab, je propose l’utilisation d’un ReadStream. Cependant, un acces direct aux éléments est aussi possible. Voici les deux solutions :

monTab := #(1 2 'add').
monBloc := [:op1 :op2 :op3 | duCode. ^unResultat].
" Accès direct aux éléments "
monBloc value: (monTab first) value: (monTab at: 2) value: (monTab last).
" Une seconde solution : "
monStream := monTab readStream.
monBloc value: monStream next value: monStream next value: monStream next.

Et voilà !

Tags :

Projet MNT - 4


Vue 3D colorée Trielen

 

 Le grain est ici de l’ordre du metre. Le plus compliqué va être de constituer une palette élégante.

Tags :

Projet MNT - 3


Vue 3D Filaire Trielen

Tags :

Projet MNT - 2


Points Ile Trielen

Tags :

Projet MNT - 1


Photo Aerienne de l’ile de Trielen

Tags :

Installer un Store Repository pour VisualWorks


Introduction

Le développement d’un application peut ammener à “faire des essais” pouvant conduire à une perte de fonctionnalité. La possibilité de “revenir en arrière” dans le code, c’est à dire, retrouver le code source précédent, peut avoir des intérêts non négligeables.

Le fait de stocker son code de façon séparée de son image de développement, dans le cas de Smalltalk/VisualWorks, permet aussi de s’assurer de sa consistance. A partir d’une image vierge, il est possible de recharger uniquement le code développé, et s’assurer ainsi que celui ci fonctionne, sans dépendre de packages qui ne seraient pas chargés.

VisualWorks dispose d’un outils nommé “Store” s’interfaçant avec une base de données pour stocker le code. Simple d’emploi, celui ci permet la publication/récupération de versions de codes, un peu à la manière de svn ou cvs. Pour le mettre en fonctionnement, il suffit d’avoir sous la main une base de données.

Store prend en charge les bases de données suivantes : Oracle, SqlServer, PostgreSQL, DB2, Intervase, MSAccess. Les deux premières sont supportées par Cincom, les autres proviennent de contributions extérieures. Cependant, Store fonctionne très bien avec PostgreSQL, et c’est d’ailleurs celle base qui sera utilisée.

PosgreSQL WebSiteInstaller PostgreSQL

Pour installer un serveur PostgreSQL sur linux, il faut exécuter

# yum -y install postgresql postgresql-server

sous Fedora ou

# apt-get install postgresql postgresql-client

pour une distribution Debian. Pour les autres distributions, utilisez votre gestionnaire de paquetage préféré, ou partez des sources de PostgreSQL.

Ajouter deux utilisateurs

Les commandes suivantes permettent la création des utilisateurs de la base de donnée :

# su – postgres
$ createuser -a -d -P BERN
$ createuser -A -D -P user

Le premier utilisateur (BERN) aurra le droit de créer des bases de données (-d) et des utilisateurs (-a). Le second n’aurra pas le droit de créer desbases ni des utilisateurs (-D -A).

Ajouter une base

Pour créer une base de donnée, on éxécutera la commande suivante :

$ createdb store

Ecouter les interfaces réseau

Par défaut, PostgreSQL n’écoute que l’interface réseau de loopback. Si l’on souhaite utiliser cette base depuis l’extérieur (i.e., si la base se trouve sur une autre machine que celle de développement), il faut modifier le fichier de configuration de postgreSQL, situé dans /etc/posgresql/XX/main/postgresql.conf pour une distribution Debian, où XX est la version de PostgreSQL installée.

Il faut décommenter l’une des premières lignes positionnant la variable tcpip_socket et lui affecter la valeur “true”

# - Connection Settings -
tcpip_socket = true
...
port = 5432

Le port par défaut est le port 5432. Si vous en changez, il faudra en tenir compte plus loin.

Autoriser les accès

Il faut maintenant autoriser les utilisateurs à acceder à cette base. L’ajout, à la fin du fichier , situé dans le même repertoire que le fichier postgresql.conf, de la ligne suivant, autorise tout les utilisateurs à accéder à la base store depuis n’import quel machine, avec un mot de passe chiffré par md5 :

host    store    all    0.0.0.0    0.0.0.0    md5

La seule chose à modifier sur cette ligne est le nom de la base, ici “store”. La syntaxe est la suivante :

TYPE    DATABASE    USER    IP-ADRESS    IP-MASK    METHOD

Cette configuration est un peu permissive, et doit être adaptée à vos contraintes de sécurité. Pensez également à adapter les règles de votre pare-feu en conséquence.

Construire le Store

Une fois la base et les utilisateurs en place, ouvrez une image vierge de VisualWorks. Vérifiez que le parcel StoreForPostgreSQL est bien chargé, via le Parcel Manager (System->Parcel Manager, onglet Suggestion, dossier “Store Tools”). Puis, dans un workspace, évaluez l’expression suivante :

Store.DbRegistry installDatabaseTables

Dans la fenêtre de connexion, renseignez les champs comme suit :

Interface: PostgreSQLEXDIConnection

Environment: ipDeLaMachine_store

User Name: BERN

Password: (à votre avis ?)

Table Owner: BERN

Attention : si vous avez utilisé un autre port pour PostgreSQL, vous devez le préciser dans le champ environment. Par exemple : ipDeLaMachine:15432_store. Vous pouvez par ailleurs remplace l’ip de la machine par son nom d’hôte.

A la question “installer les tables”, répondez OK.

A la question “install user management tables”, répondez NO.

Voilà, c’est terminé.

Store ConnectUtiliser le Store

Dans votre image de développement, connectez vous au store via le menu Store->Connect to repository. Utilisez cette fois ci le nom d’utilisateur sans privilèges crée précédement (le second, nommé ici “user”).

Interface: PostgreSQLEXDIConnection

Environment: ipDeLaMachine_store

User Name: user

Password: (à votre avis ?)

Table Owner: BERN

Dans le browser, un clic droit sur un package vous permet d’accéder au menu “publish…” qui vous permettra de publier le package sur le store. Une fois le package publié, vous pouvez le retrouver/recharger via le menu Store->Published Items. Choisissez alors la version qui vous interesse.

Cincom SmalltalkInformations complémentaires

N’importe quelle installation de PostgreSQL fonctionnelle permet l’utilisation de Store, et cela quelque soit la plateforme sur laquelle celle ci est installée (Linux, Windows …).

L’utilisation de Store, et de tout les outils associés (notament l’outils de fusion, Merge Tool), est décrite dans le document Source Code Management Guide (SourceCodeMgmtGuide.pdf), situé dans le repertoire doc/ de votre installation de VisualWorks.

VisualWorks est un IDE Smalltalk téléchargeable et utilisable gratuitement pour un usage non commercial ou académique.

Tags :

Comme j’aime cette image …


SUnit

Tags :

Binary Object Stream Service


VisualWorks propose un Parcel nommé BOSS, pour Binary Object Stream Service. Celui ci permet le stockage d’instances sous la forme d’un fichier binaire. Ce parcel est normalement chargé dans l’image de départ de VW 7.5, mais le cas échéant, il peut être chargé via le parcel manager (”System” -> “Parcel Manager”). Il se trouve dans l’onglet suggestion, et le dossier “Application Developpement”.

Le code suivant permet d’utiliser BOSS :

myWriteStream := 'monFichier.dat' asFilename writeStream.
bos := BinaryObjectStorage onNew: myWriteStream.
"on suppose qu'il existe anObject, une instance de classe quelconque..."
[bos nexPut: anObject] ensure: [bos close].

On pourrait tout aussi bien utiliser le message “nextPutAll: aCollection” pour stocker un ensemble d’instances. La construction [aBlockClosure] ensure: [anAction] retourne la valeur retournée par le premier block, mais, avant cela, évalue le second bloc.

Pour récupérer des instances d’objets, le problème n’est pas plus compliqué :

myReadStream := 'monFichier.dat' asFilename readStream.
bos := BinaryObjectStorage onOldNoScan: myReadStream.
[myObjects := bos contents] ensure: [bos close].

Il est également possible de stocker des définitions de classes, avec le message “nextPutClasses: anArray” (anArray doit contenir les classes à enregistrer). Pour les récupérer depuis la sauvegarde, le message nextClasses fera l’affaire ;-)

BOSS est capable de détecter les changements dans la définition des classes lors du chargement d’instances depuis un fichier BOSS. Ainsi, vous pouvez diffuser un patch contenant les nouvelles classes oou les modifications apportées à votre logiciel, tout en assurant la rétro-compatibilité des sauvegardes des utilisateurs. Il suffit pour cela de définir deux méthodes dans la nouvelle version de la classe : une méthode d’instance nommée “binaryRpresentationVersion”, qui retourne la version de la classe (1, 2, 3… etc), et une méthode “binaryReaderBlockForVersion: oldVersion format: oldFormat” qui se charge de convertir l’anciene instance objet sous sa nouvelle forme. Le reste est fait automatiquement par BOSS.

BOSS est largement décrit dans le guide du développeur d’applications VisualWorks (AppDevGuide.pdf) situé dans le repertoire “doc” de votre installation VisualWorks. Ce billet en est d’ailleurs largement inspiré.

Avec un tel outils, imaginez la quantité de difficultés levées lors du developpement d’applications : sauvegarde aisée des éléments produits par l’applications, et mise à jour facile … Un bonheur.

Je crois (mais je n’en suis pas certain) qu’il est possible d’utiliser BOSS sur autre chose qu’un Stream sur un fichier. Une connexion TCP par exemple ? Je vérifierais, mais je n’ai pas encore en tête “l’application qui tue” d’une telle possibillité. Si vous avez des idées …

Tags :

Le Dojo XP : Retour sur … La Smalltalk Party 2007 (2)


Je vous en ai parlé dans le post précédent : lors de la Smalltalk Party 2007, j’ai eut l’occasion de découvrir ce qu’était un Dojo XP. Je vais essayer ici d’expliquer en quoi cela consiste.

Sur le wiki XP-France, voilà ce qu’on peut lire au sujet du Dojo XP :

Le constat de départ est que trop de développeurs utilisent uniquement leur travail (et leurs réalisations professionnelles) comme terrain d’entraînement pour parfaire leurs techniques. L’idée serait donc de mettre en place et d’offrir à des développeurs une opportunité d’apprendre et d’améliorer leur technique de programmation, en dehors des projets qu’ils doivent livrer.

Dans la pratique, les participants savent programmer, et disposent chacun d’expériences différentes. L’idée n’est pas de mettre ensemble uniquement des programmeurs chevronnés, mais plutôt un panel de gens différents, aux idées et pratiques diverses.

Une feuille de route est donnée : des petits scénarios/cas d’utilisations relativement courts, décrivant telle ou telle fonctionnalité d’un logiciel. Les différents scénarios vont être traités dans l’ordre.

Un premier binôme commence alors à traiter le sujet, en adoptant un Test Driven Developpement. D’abord, on écrit un test unitaire vérifiant la fonctionnalité demandée. On vérifie ensuite que le test ne passe pas. Puis, on écrit ce qu’il faut pour que le test passe (on crée les classes qui vont bien, avec les méthodes qui vont bien). Et cela, jusqu’à ce que le test précédement écrit passe. S’ensuit une phase de refactoring où l’on améliore éventuellement ce que l’on vient d’écrire, tout en vérifiant que les tests sont toujours au vert. Une fois cela terminé, on passe à la fonctionnalité suivante, en écrivant un nouveau test unitaire.

Le dojo fonctionne en Randori, c’est à dire que toutes les n minutes, l’un des membre du binome cède sa place à un membre de l’assistance. Les membres de l’assistance peuvent suivre ce qui se fait via un vidéoprojecteur connecté à la machine de travail.

L’idée est aussi de discuter autour de certains points qui parraissent annodins, mais qui en fait sot souvent pleins de sens. Par exemple, lors de ce dojo XP, nous avons eut l’occasion d’échanger des points de vues sur la necessité (ou non), de systématiquement acceder aux attributs d’une classe par des accesseurs. Il s’agit bien là d’avoir une discussion pragmatique autour de ce genre de questions, et d’arriver à un consensus.

Tags :

Retour sur … La Smalltalk Party 2007 (1)


Difficile de résumer en quelques mots les impressions succitées par cette journée de Samedi. Pas loin de 9 heures de rencontres, d’écoutes, de découvertes…

Je crois vraiment que ce fut une expérience très enrichissante. Une constatation cependant : j’ai vraiment l’impression que ce qui pêche dans la “communauté” Smalltalk, c’est la communication. Il semblerait que beaucoup de gens soient à la recherche de smalltalkiens, mais sans doutes manque-t-il la diffusion de l’information.

C’est bien dommage, car les personnes que j’ai pu rencontrer étaient, je le crois, d’une grande qualité.

Le point fort de cette journée fut sans nuls doutes le Dojo XP. J’avoue que je ne m’attendais pas du tout à la forme que celui ci a pris. Je crois que dans l’heure et demi qu’à duré ce Dojo (car, a dire vrai, celui ci a commencé avec un peu de retard), les échanges m’ont apporté plus que beaucoup d’heures passées à l’université.

Tags :

Petite présentation de Smalltalk


Smalltalk est un langage de programmation, entièrement objet, créé en 1972. Ainsi, il à peu près le même age que le langage C, mais est largement moins répandu (sans doutes à tord). Développé à l’origine par Xerox, il reste cependant le langage objet par excellence. De nombreux Smalltalks sont multi-plateformes.

Smalltalk est un langage objet pur, c’est à dire que tout, en Smalltalk, est objet. Tout, en Smalltalk, est modifiable, à la volée. Il est ainsi possible de modifier en cours d’execution, le contenu du programme, l’ensemble des classes, les méthodes associées, ou le fonctionnement même de Smalltalk, sa pile d’execution, sa methode d’allocation mémoire … le tout, éventuellement, de façon programmée, et sans necessiter d’arrêt dans l’exécution du programme.

Smalltalk est à l’origine du concept de Design Pattern, et se prête particulièrement à l’implémentation de ceux ci. L’utilisation d’un pattern visitor, ou d’un pattern composite, est une opération particulièrement aisée en Smalltalk, de par sa structure purement objet.

eXtreme Programming trouve aussi ses origines au sein de la communauté de developpeur Smalltalk. En effet, un code Smalltalk permet sa modification de manière simple et rapide. A ce titre, le Refactoring est un concept évident en Smalltalk. D’ailleurs, dans les IDE Smalltalk les plus courrant existent des outils permettant d’effectuer de manière sures et efficaces du refactoring, mais aussi du deboggage à la volée, avec un outil Debugger permettant l’arret, la correction, et la reprise à chaud de l’exécution d’un code.

Il est courant d’affirmer que la syntaxe de Smalltalk tiens sur une carte postalle. En serrant un peu les lettres, ca devrait passer ;)

Smalltalk dispose pour “avatar” d’un ballon captif, ou, c’est selon, d’une mongolfière. Cette image laisse penser, à juste titre, que Smalltalk est un langage de (très) haut niveau. Actuellement, plusieurs implémentations de Smalltalk sont disponibles. Cependant, je parlerais principalement de l’environnement VisualWorks, developpé par Cincom, et dans une moindre mesure, de l’environnement libre Squeak.

Tags :