Merci pour l'article. Je pense qu'un tel câble pourrait me rendre bien service. Par contre, je ne trouve que des USB-A vers USB-C magnétique chez Kuula. J'aimerai mieux un USB-C vers USB-C magnétique car mon hub USB et mes chargeurs USB sont plutôt USB-C. Vous avez une idée de pourquoi je n'en trouve pas ?
Condition
ifTrue: quelque chose
ifFalse: autre chose
Condition est un objet de type booléen à qui on envoie deux messages (ifTrue et ifFalse, avec à chaque fois un bloc comme argument).
En fait, ifTrue:ifFalse: est une méthode de la classe abstraite Boolean avec une implémentation différente dans les sous-classes concrètes True et False. Voici l'implémentation de la méthode dans la classe True:
True>>ifTrue: trueBlock ifFalse: falseBlock
^ trueBlock value
La première ligne est la signature de la méthode ifTrue:ifFalse: qui prend 2 arguments (trueBlock et falseBlock). La deuxième ligne est l'implémentation qui retourne la valeur du premier argument. Dans la classe False, l'implémentation est la même sauf que c'est la valeur du deuxième argument qui est retournée. Grâce à ça, le langage n'a pas besoin de if/then/else.
Dans le code de l'article, un seul messageifTrue:ifFalse: est envoyé à l'objet Condition pour que la méthode du même nom soit exécutée, et non pas deux.
BankID réclame à chaque démarrage que les services Google soient installés même si elle semble fonctionner en leur absence. De plus l'application Android est propriétaire et n'est disponible à ma connaissance que sur le Play Store. Pour moi, c'est pas l'idéal non plus cette solution.
Cet article arrive à point, j'allais justement passer commande chez Nitrokey. Je me demande maintenant si je ne vais pas plutôt passer par la FSF même si le prix est quand même bien supérieur ($50 à la FSF, 29€ pour la NitroKey Start). Pourquoi avoir pris la clé de la FSF plutôt que la Start ? Referais-tu ce choix aujourd'hui ?
J'aimerai mettre ma clé primaire sur un token aussi pour que ma clé ne soit jamais accessible. Est-ce que ça vaut le coût de payer un deuxième token (surtout s'il coûte $50) ?
Super article. Je recommande chaudement Nix et NixOS (ou GuixSD que je n'ai pas essayé mais qui utilise Nix). GNU/Linux Mag leur avait consacré un article dans le numéro 203.
C'est plutôt intéressant de pouvoir constater tout ça tout seul, et le modifier après.
c'est une des grandes forces de Pharo (ainsi que des autres Smalltalk et des Lisp) : tout son code est sous le nez, tout le temps et il est modifiable !
Tu demandes à la méta-classe de Transcript (obtenue via le message class de Transcript) […]
bien tenté mais en fait non :-). Transcript n'est pas une classe, c'est une variable globale, unique instance de ThreadSafeTranscript.
(SystemWindow allInstances size > 1)
ça ne suffit pas car il pourrait y avoir d'autres instances de SystemWindow qui ne serait pas des transcripts. Une solution possible est de ne compter que les instances dont le label est Transcript. Dans tous les cas, je recommande d'utiliser la méthode #detect:ifFound:ifNone: qui évite à la fois les parenthèses, la comparaison entre la taille et le nombre 1 et le #ifTrue:ifFalse: qui suit.
c'est plus que bienvenu ! Il suffit de récupérer le livre et de faire des pull requests avec les changements. Envoie moi un email pour plus de précisions.
dommage que les livres "Pharo par l'exemple" soient un peu périmés, d'ailleurs
Nous en sommes bien conscient et le livre Updated Pharo by Example va dans ce sens (en cours de mise à jour).
C'est peut-être pas le meilleur endroit pour ça, mais personne ne parle alors je pose ma question.
ça fait vivre le post, merci !
Mon but c'était d'être sûr qu'on ouvrirait au plus un seul Transcript. Seulement voilà, quand je sauvegarde et que je clique sur les fenêtres de ma GUI, plusieurs Transcript s'ouvrent.
Transcript est un singleton : unique instance de la classe ThreadSafeTranscript. De plus, Transcript représente le modèle, i.e., l'objet qui reçoit le texte à afficher. Il faut le distinguer de la vue (instance de la class PluggableTextMorph) qui offre une représentation graphique du modèle. Le code Transcript open augmente le nombre d'instances de PluggableTextMorph mais pas le nombre d'instances de ThreadSafeTranscript qui reste à 1.
Pour faire ce que tu veux, je te conseille de n'utiliser que la méthode show: dans ton code. Quand tu le souhaites, tu ouvres un transcript depuis le World menu (en cliquant sur le bureau).
C'est une bonne remarque. Pour le moment, Pharo reste monolithique : soit tu prends tout (langage et outils) soit rien. Cependant, nous travaillons à la séparation des deux, notamment avec le projet Coral que l'on relance. On manque de bras, toute aide est la bienvenue.
Tu as tout a fait raison. Pharo est un héritier de Smalltalk dont la tradition a toujours été de fournir un environnement englobant. Je ne connais pas bien l'histoire, mais je suppose que ça vient de la vision d'Alan Kay autour du Dynabook et de l'OLPC qui devaient être utilisés par les enfants. L'interface de Squeak (projet duquel Pharo provient suite à un fork) devait fournir un environnement complet pour l'éducation : manipulation d'objets divers, dessin, programmation…
De nos jours, nous sommes nombreux à penser que ça n'est plus forcément très raisonnable et certains travaillent à une nouvelle couche graphique (appelée Mars) qui permettrait d'utiliser les widgets natifs et les fenêtres du système hôte.
Il est tout à fait possible de déployer une application graphique, console ou web dans une version restreinte de Pharo. Pour les applications graphiques desktop, il est possible d'utiliser XUL par exemple (grâce au framework Phobos).
Effectivement, on peut voir Pharo comme une implémentation du standard Smalltalk avec son environnement de développement et ses bibliothèques de code. Cependant, nous avons décidé d'arrêter de dire ça car le standard Smalltalk n'évolue plus alors qu'on améliore Pharo en permanence.
Ça signifie qu'on s'autorise à ne pas être compatible avec le standard. Par exemple, Pharo possède la notion de trait (un mécanisme d'héritage multiple de méthodes) alors que le standard ne le prévoit pas. De même, dans la prochaine version de Pharo, on n'utilisera plus de chaînes de caractères pour déclarer les variables d'instances car on utilisera à la place les Slots (un mécanisme beaucoup plus poussé qui permet d'avoir différents types de variables d'instances avec des comportements différents). Là encore, on s'éloigne du standard Smalltalk. Enfin, le standard définit une API qu'on s'autorise à remplacer petit à petit par une autre plus moderne.
Pour toutes ces raisons, on parle maintenant de Smalltalk-inspired et plus d'implémentation de Smalltalk.
La première ligne permet de définir la méthode. Le nom de la méthode est model:. Cette méthode possède un paramètre dont le nom est aModel. On ne connaît pas le type du paramètre ni le type de retour de la méthode. La deuxième ligne affecte la valeur de l'argument aModel à la variable d'instance model. Cette méthode est donc tout simplement un setter.
onClassMoved: anAnnouncement
définition d'une nouvelle méthode dont le nom est onClassMoved: et qui prend un paramètre nommé anAnnouncement.
| class oldPackage |
déclaration de 2 nouvelles variables temporaires. En Smalltalk on doit déclarer toutes les variables que l'on utilise.
class := anAnnouncement theClass.
assignation à la variable temporaire class de la valeur résultante de l'envoie du message theClass (sans argument) à l'objet anAnnouncement.
oldPackage := anAnnouncement oldPackage.
même chose.
(oldPackage = self model selectedPackage or: [
class package = self model selectedPackage ])
expression qui retourne un booléen. L'expression est un OR entre 2 égalités.
ifFalse: [ ^ self ].
ifFalse: est un message envoyé au booléen (de la ligne précédente) qui prend un block en paramètre. Le block n'est évalué que si le booléen vaut false. L'accent circonflexe ^ signifie "return". Ici, on retourne l'objet courant (self = this en Java). C'est donc pareil que return this en Java. En Smalltalk, toutes les méthodes retournent un objet, et self est retourné par défaut. Donc, si la condition est fausse, on quitte la méthode.
La première ligne définie une condition. Si la condition est vraie, on envoie 2 messages à self (= this). Le premier message est selectedItem: avec un argument à nil (= null). Le deuxième message est selectItem: avec un argument à nil. Il faut noter l'utilisation du ; qui permet d'envoyer plusieurs messages à un même objet.
self setItemsForSelectedPackage.
self refresh
Ici on envoie 2 messages à self, aucun ne prenant d'argument. On aurait pu utiliser un ; ici aussi.
Pour la première question sur les 2 environnements, je ne sais pas trop. Avec Amber, toute la partie graphique du site est rendue dynamiquement et il n'y a donc pas un fichier HTML qui représente la charte. Je pense que c'est la problème avec beaucoup de technologie web modernes (comme JQuery) qui manipulent le DOM HTML.
En ce qui concerne la qualité du code, je vais être beaucoup plus affirmatif : oui, le code peut rester propre même pour les très grosses applications, il suffit juste que ça soit un des objectifs des développeurs. Regarde par exemple le code d'Helios ou celui du compilateur.
La syntaxe s'apprend vraiment vite car il n'y a quasiment rien à savoir. Toute la syntaxe (+ des infos sur l'environnement de développement Pharo) tient sur un flyer.
Côté serveur, n'importe quoi qui fait du REST convient. Pharo par exemple avec Zinc ou Seaside. JSON est parfaitement supporté côté client et côté serveur. Voir par exemple la documentation de Zinc .
# Uniquement de l'USB-A à l'autre bout chez kuula ?
Posté par Damien Cassou . En réponse au journal J'ai testé pour vous: un câble USB magnétique. Évalué à 2 (+1/-0).
Merci pour l'article. Je pense qu'un tel câble pourrait me rendre bien service. Par contre, je ne trouve que des USB-A vers USB-C magnétique chez Kuula. J'aimerai mieux un USB-C vers USB-C magnétique car mon hub USB et mes chargeurs USB sont plutôt USB-C. Vous avez une idée de pourquoi je n'en trouve pas ?
[^] # Re: Excellente initiative !
Posté par Damien Cassou . En réponse à la dépêche L’installation et la distribution de paquets Python (1/4). Évalué à 3.
J'ai adoré l'article, merci !
# Petite correction sur l'envoie de message
Posté par Damien Cassou . En réponse à la dépêche Pharo : quoi de neuf ?. Évalué à 4.
En fait,
ifTrue:ifFalse:
est une méthode de la classe abstraiteBoolean
avec une implémentation différente dans les sous-classes concrètesTrue
etFalse
. Voici l'implémentation de la méthode dans la classeTrue
:La première ligne est la signature de la méthode
ifTrue:ifFalse:
qui prend 2 arguments (trueBlock
etfalseBlock
). La deuxième ligne est l'implémentation qui retourne la valeur du premier argument. Dans la classeFalse
, l'implémentation est la même sauf que c'est la valeur du deuxième argument qui est retournée. Grâce à ça, le langage n'a pas besoin deif/then/else
.Dans le code de l'article, un seul message
ifTrue:ifFalse:
est envoyé à l'objetCondition
pour que la méthode du même nom soit exécutée, et non pas deux.[^] # Re: Il est où l'APK ?
Posté par Damien Cassou . En réponse à la dépêche Firefox 80 Quantum et Daylight sont sortis !. Évalué à 3.
J'utilise ça depuis un moment. Mais j'avoue m'y perdre avec tous les "Firefox" disponibles :
# Excellent article pour un excellent gestionnaire de paquets
Posté par Damien Cassou . En réponse à la dépêche Gestion de paquets évoluée avec Nix : cachix, overlays et home‑manager. Évalué à 5. Dernière modification le 26 novembre 2019 à 07:25.
Très bel article, beau travail. Nix est vraiment en gestionnaire de paquets hors du commun.
[^] # Re: BankID
Posté par Damien Cassou . En réponse au journal Lettre ouverte à La Banque Postale. Évalué à 2.
BankID réclame à chaque démarrage que les services Google soient installés même si elle semble fonctionner en leur absence. De plus l'application Android est propriétaire et n'est disponible à ma connaissance que sur le Play Store. Pour moi, c'est pas l'idéal non plus cette solution.
[^] # Re: Petites typos
Posté par Damien Cassou . En réponse à la dépêche Gnuk, NeuG, FST-01 : entre cryptographie et matériel libre. Évalué à 3.
Je pense que cette ligne
$ sudo ./neug_upgrade.py ../../gnuk/regnual/regnual/bin ../../gnuk/src/build/gnuk.bin
devrait être corrigé pour contenir
../../gnuk/regnual/regnual.bin
plutôt que../../regnual/regnual/bin
.# Comment choisir ?
Posté par Damien Cassou . En réponse à la dépêche Gnuk, NeuG, FST-01 : entre cryptographie et matériel libre. Évalué à 5.
Excellent article encore. Merci
Cet article arrive à point, j'allais justement passer commande chez Nitrokey. Je me demande maintenant si je ne vais pas plutôt passer par la FSF même si le prix est quand même bien supérieur ($50 à la FSF, 29€ pour la NitroKey Start). Pourquoi avoir pris la clé de la FSF plutôt que la Start ? Referais-tu ce choix aujourd'hui ?
J'aimerai mettre ma clé primaire sur un token aussi pour que ma clé ne soit jamais accessible. Est-ce que ça vaut le coût de payer un deuxième token (surtout s'il coûte $50) ?
# Nix et NixOS sont top
Posté par Damien Cassou . En réponse à la dépêche Le gestionnaire de paquets Nix en version 2.0. Évalué à 3.
Super article. Je recommande chaudement Nix et NixOS (ou GuixSD que je n'ai pas essayé mais qui utilise Nix). GNU/Linux Mag leur avait consacré un article dans le numéro 203.
# Container Firefox 57 vs. Test Pilot
Posté par Damien Cassou . En réponse au journal Firefox 57 - onglets contextuels et autres joyeusetés. Évalué à 1.
La fonctionnalité
always open in
n'est pas (encore) dans Firefox 57. On la trouve dans le Test Pilot : https://testpilot.firefox.com/experiments/containers.# Article Nix/NixOS dans le GNU/Linux Magazine du mois
Posté par Damien Cassou . En réponse à la dépêche NixOS, collection printemps‐été 17. Évalué à 1.
Le GNU/Linux Magazine du mois (numéro 203) a un article présentant Nix et NixOS. Je vous le recommanderais chaudement si je ne l'avais pas écrit :
http://www.gnulinuxmag.com/mettez-en-place-un-systeme-de-reconnaissance-faciale/
Bonne lecture
[^] # Re: Data mining
Posté par Damien Cassou . En réponse à la dépêche Sortie de Pharo et de son environnement de développement en version 4.0. Évalué à 1.
Qu'est-ce que tu cherches exactement en terme de fouille de données ?
[^] # Re: Un peu embêté...
Posté par Damien Cassou . En réponse à la dépêche Sortie de Pharo et de son environnement de développement en version 4.0. Évalué à 3.
c'est une des grandes forces de Pharo (ainsi que des autres Smalltalk et des Lisp) : tout son code est sous le nez, tout le temps et il est modifiable !
[^] # Re: Un peu embêté...
Posté par Damien Cassou . En réponse à la dépêche Sortie de Pharo et de son environnement de développement en version 4.0. Évalué à 2.
bien tenté mais en fait non :-).
Transcript
n'est pas une classe, c'est une variable globale, unique instance deThreadSafeTranscript
.ça ne suffit pas car il pourrait y avoir d'autres instances de
SystemWindow
qui ne serait pas des transcripts. Une solution possible est de ne compter que les instances dont le label estTranscript
. Dans tous les cas, je recommande d'utiliser la méthode#detect:ifFound:ifNone:
qui évite à la fois les parenthèses, la comparaison entre la taille et le nombre 1 et le#ifTrue:ifFalse:
qui suit.[^] # Re: Un peu embêté...
Posté par Damien Cassou . En réponse à la dépêche Sortie de Pharo et de son environnement de développement en version 4.0. Évalué à 2.
c'est plus que bienvenu ! Il suffit de récupérer le livre et de faire des pull requests avec les changements. Envoie moi un email pour plus de précisions.
[^] # Re: Un peu embêté...
Posté par Damien Cassou . En réponse à la dépêche Sortie de Pharo et de son environnement de développement en version 4.0. Évalué à 5.
Nous en sommes bien conscient et le livre Updated Pharo by Example va dans ce sens (en cours de mise à jour).
ça fait vivre le post, merci !
Transcript
est un singleton : unique instance de la classeThreadSafeTranscript
. De plus,Transcript
représente le modèle, i.e., l'objet qui reçoit le texte à afficher. Il faut le distinguer de la vue (instance de la classPluggableTextMorph
) qui offre une représentation graphique du modèle. Le codeTranscript open
augmente le nombre d'instances dePluggableTextMorph
mais pas le nombre d'instances deThreadSafeTranscript
qui reste à 1.Pour faire ce que tu veux, je te conseille de n'utiliser que la méthode
show:
dans ton code. Quand tu le souhaites, tu ouvres un transcript depuis le World menu (en cliquant sur le bureau).[^] # Re: think IDE and OS rolled into one
Posté par Damien Cassou . En réponse à la dépêche Sortie du langage Pharo et de son environnement de développement en version 3.0. Évalué à 4.
C'est une bonne remarque. Pour le moment, Pharo reste monolithique : soit tu prends tout (langage et outils) soit rien. Cependant, nous travaillons à la séparation des deux, notamment avec le projet Coral que l'on relance. On manque de bras, toute aide est la bienvenue.
[^] # Re: Un phare isolé ?
Posté par Damien Cassou . En réponse à la dépêche Sortie du langage Pharo et de son environnement de développement en version 3.0. Évalué à 1. Dernière modification le 07 mai 2014 à 11:19.
Un avantage de contrôler l'ensemble de l'environnement est de pouvoir faire des choses comme ça : https://www.youtube.com/watch?v=uKhXLOu_DBU
[^] # Re: Un phare isolé ?
Posté par Damien Cassou . En réponse à la dépêche Sortie du langage Pharo et de son environnement de développement en version 3.0. Évalué à 7.
Tu as tout a fait raison. Pharo est un héritier de Smalltalk dont la tradition a toujours été de fournir un environnement englobant. Je ne connais pas bien l'histoire, mais je suppose que ça vient de la vision d'Alan Kay autour du Dynabook et de l'OLPC qui devaient être utilisés par les enfants. L'interface de Squeak (projet duquel Pharo provient suite à un fork) devait fournir un environnement complet pour l'éducation : manipulation d'objets divers, dessin, programmation…
De nos jours, nous sommes nombreux à penser que ça n'est plus forcément très raisonnable et certains travaillent à une nouvelle couche graphique (appelée Mars) qui permettrait d'utiliser les widgets natifs et les fenêtres du système hôte.
Il est tout à fait possible de déployer une application graphique, console ou web dans une version restreinte de Pharo. Pour les applications graphiques desktop, il est possible d'utiliser XUL par exemple (grâce au framework Phobos).
[^] # Re: Inspiré de Smalltalk?
Posté par Damien Cassou . En réponse à la dépêche Sortie du langage Pharo et de son environnement de développement en version 3.0. Évalué à 10.
Effectivement, on peut voir Pharo comme une implémentation du standard Smalltalk avec son environnement de développement et ses bibliothèques de code. Cependant, nous avons décidé d'arrêter de dire ça car le standard Smalltalk n'évolue plus alors qu'on améliore Pharo en permanence.
Ça signifie qu'on s'autorise à ne pas être compatible avec le standard. Par exemple, Pharo possède la notion de trait (un mécanisme d'héritage multiple de méthodes) alors que le standard ne le prévoit pas. De même, dans la prochaine version de Pharo, on n'utilisera plus de chaînes de caractères pour déclarer les variables d'instances car on utilisera à la place les Slots (un mécanisme beaucoup plus poussé qui permet d'avoir différents types de variables d'instances avec des comportements différents). Là encore, on s'éloigne du standard Smalltalk. Enfin, le standard définit une API qu'on s'autorise à remplacer petit à petit par une autre plus moderne.
Pour toutes ces raisons, on parle maintenant de Smalltalk-inspired et plus d'implémentation de Smalltalk.
[^] # Re: semble sympa.
Posté par Damien Cassou . En réponse à la dépêche Sortie d'Amber 0.11.0. Évalué à 5.
La première ligne permet de définir la méthode. Le nom de la méthode est
model:
. Cette méthode possède un paramètre dont le nom estaModel
. On ne connaît pas le type du paramètre ni le type de retour de la méthode. La deuxième ligne affecte la valeur de l'argumentaModel
à la variable d'instancemodel
. Cette méthode est donc tout simplement un setter.définition d'une nouvelle méthode dont le nom est
onClassMoved:
et qui prend un paramètre nomméanAnnouncement
.déclaration de 2 nouvelles variables temporaires. En Smalltalk on doit déclarer toutes les variables que l'on utilise.
assignation à la variable temporaire
class
de la valeur résultante de l'envoie du messagetheClass
(sans argument) à l'objetanAnnouncement
.même chose.
expression qui retourne un booléen. L'expression est un OR entre 2 égalités.
ifFalse:
est un message envoyé au booléen (de la ligne précédente) qui prend un block en paramètre. Le block n'est évalué que si le booléen vautfalse
. L'accent circonflexe^
signifie "return". Ici, on retourne l'objet courant (self
=this
en Java). C'est donc pareil quereturn this
en Java. En Smalltalk, toutes les méthodes retournent un objet, etself
est retourné par défaut. Donc, si la condition est fausse, on quitte la méthode.La première ligne définie une condition. Si la condition est vraie, on envoie 2 messages à
self
(=this
). Le premier message estselectedItem:
avec un argument ànil
(=null
). Le deuxième message estselectItem:
avec un argument ànil
. Il faut noter l'utilisation du;
qui permet d'envoyer plusieurs messages à un même objet.Ici on envoie 2 messages à
self
, aucun ne prenant d'argument. On aurait pu utiliser un;
ici aussi.[^] # Re: semble sympa.
Posté par Damien Cassou . En réponse à la dépêche Sortie d'Amber 0.11.0. Évalué à 2.
Tu as des exemples de code à montrer ? As-tu regardé le flyer ?
[^] # Re: semble sympa.
Posté par Damien Cassou . En réponse à la dépêche Sortie d'Amber 0.11.0. Évalué à 2.
Pour la première question sur les 2 environnements, je ne sais pas trop. Avec Amber, toute la partie graphique du site est rendue dynamiquement et il n'y a donc pas un fichier HTML qui représente la charte. Je pense que c'est la problème avec beaucoup de technologie web modernes (comme JQuery) qui manipulent le DOM HTML.
En ce qui concerne la qualité du code, je vais être beaucoup plus affirmatif : oui, le code peut rester propre même pour les très grosses applications, il suffit juste que ça soit un des objectifs des développeurs. Regarde par exemple le code d'Helios ou celui du compilateur.
[^] # Re: Cool
Posté par Damien Cassou . En réponse à la dépêche Sortie d'Amber 0.11.0. Évalué à 3.
La syntaxe s'apprend vraiment vite car il n'y a quasiment rien à savoir. Toute la syntaxe (+ des infos sur l'environnement de développement Pharo) tient sur un flyer.
Côté serveur, n'importe quoi qui fait du REST convient. Pharo par exemple avec Zinc ou Seaside. JSON est parfaitement supporté côté client et côté serveur. Voir par exemple la documentation de Zinc .
[^] # Re: Cool
Posté par Damien Cassou . En réponse à la dépêche Sortie d'Amber 0.11.0. Évalué à 1.
Le bug est connu. Il paraît que ça marche avec d'autres navigateurs, mais je n'ai pas essayé.