Ça peut être bien pour de l'entre soit, mais au moment où la communauté Linuxienne est tant décriée notamment à cause de Stallman et de certains autres Linuxiens peu aimables
C'est vraiment le cas ? J'ai plus l'impression que tout le monde s'en tape de Stallman et Linus ; je n'en entends jamais parler ailleurs qu'ici (par exemple dans les réseaux tournés autour du Jeu Vidéo où je traîne, j'entends parler de drama nuls du JV, dont 99% des gens se fichera aussi en dehors de cette sphère). La communauté n'a peut-être plus vocation a grandir énormément, c'est comme ça, ce n'est pas comme si 50% des gens en avaient quelque chose à faire du logiciel libre (c'est dommage mais les sujets passionnants ne manquent pas).
faut au contraire s'ouvrir et accepter la critique. Et les critiques sont souvent mal notées…
Je n'en suis pas vraiment sûr (mon avis n'est pas arrêté, mais j'aimerai au moins des exemples). Autant il est plus facile de récolter un +10 pour un jeu de mot que pour une critique argumentée, autant les fameuses critiques géniales qui se prennent des -10 ne sont géniales que la tête que leur auteur de ce que je vois depuis 20 ans ici. Et même si parfois le problème est plus dans la forme que dans le fond (par exemple insulter tout le monde n'aide pas vraiment à ce qu'on vous lise de manière rationnelle), ça restent des messages qui se prennent un -10 pour une bonne raison (c'est-à-dire pas parce qu'ils révèlent des réalités dérangeantes, n'en déplaise à leur auteur).
Le principe d'ownership ne sort effectivement pas de nulle part ; en revanche Rust a permis d'uniformiser plusieurs concepts de recherche en un seul concept cohérent, qui va plus loin et qui fonctionne sur des vrais programmes ambitieux. Quant à trouver comment écrire un borrow checker performant la communauté Rust est face à un défi nouveau (et d'autres langages seront ravis de copier ça, ce qui est très bien).
article qui est initialement libre puisque publié sur linuxfr
C'est peut-être un raccourci de ta part, mais les articles LinuxFR ne sont pas forcément libres. Ils sont par défaut en CC-By-SA dans le formulaire de rédaction (c'est un site orienté libre, donc c'est un choix que les gens acceptent de manière générale) mais l'auteur peut choisir une autre licence, même non libre, dans l'absolu.
je reprends en partie le contenu de ce journal
Il est toujours possible, lorsque l'ensemble des ayants droit sont d'accord, de changer la licence d'une œuvre. C'est pourquoi il serait compliqué de changer la licence de Linux (qui a des milliers de contributeurs/auteurs) par exemple, mais quand tu es l'unique auteur tu peux re-licencier à ta guise. En admettant que LinkedIn t'impose une licence ça ne pose pas de problème (quelle que soit la licence originelle sur LinuxFr, rien à voir avec le libre).
Je doute que LinkedIn demande nécessairement du contenu original (et si c'est le cas, rien à voir avec la licence sur LinuxFr, là encore).
Merci !
Faire du prosélytisme me met mal à l'aise, mais parler de mon travail de manière technique me fait très plaisir. Je laisse donc lâchement mes collègues communiquer sur les réseaux "classiques" (et heureusement qu'ils le font—merci à eux) et je me concentre sur notre forum et les dépêches LinuxFr.
Tu ne respectes pas trop le style de programmation Python (au niveau des la gestion des espaces surtout), ce qui à la limite n'est pas hyper grave, mais en plus le style n'est pas cohérent ; un coup il y a des espaces après les parenthèses d'appel d'une fonction, un coup non.
Je n'ai rien contre le code en français dans un objectif d'apprentissage de la programmation (même si bon les petits français font de l'anglais dès l'école primaire—il y a plus de 30ans j'en ai fait à partir du CM2—et le vocabulaire nécessaire est assez basique: array, list, draw, flag, width…), mais là encore ce n'est pas cohérent ; placer_drapeau() côtoie input_config_valid().
J'imagine qu'on en est pas à la première leçon (il y a des fonctions, classes, boucle imbriquées…) du coup je pense que les élèves savent que cases = list() peut s'écrire cases = [].
À plusieurs endroits la gestion des boucles est plus C que Python ; par exemple
Ta demande n'est pas très claire (c'est une demande utilisateur normale ne t'inquiète pas haha). Souhaites-tu créer les formulaires via une interface graphique ou bien y aura-t-il un seul formulaire codé en dur ? Souhaites-tu garder les réponses des utilisateurs (genre pour faire des statistiques par exemple) ? etc…
En fonction de ce que tu veux ça changera de beaucoup le temps de développement. Et tout dépend de ce que tu appelles "simple". En quelque mois de développement un développeur peut pondre un truc un peu sympa mais pas super ambitieux non plus ; mais quelque mois de développement ça représente selon les cas un petit ou un énorme investissement.
En voyant le titre je m’apprêtais à écrire un Nᵉᵐᵉ commentaire sur le fait qu'il n'y a que le moteur et pas les assets, je suis donc agréablement surpris. Je ne suis aps un spécialiste du genre mais le jeu avait l'air de très bonne qualité. Et la Direction Artistique est clairement de toute beauté (les sprites sont petits mais marchent très bien).
Je n'ai pas l'impression que le dépôt GitHub contienne les assets graphiques & audio (il semble qu'il manque un répertoire "pool/" qui les contiendrait). Si j'ai raison, dire que le jeu est open-source est faux (seul son moteur l'est).
(je n'aurai rien contre que les assets soient libérés une fois le jeu rentabilisé, mais je n'ai rien vu qui laisse entrevoir une telle possibilité ; et dans tous les cas il n'est pas open-source là tout de suite)
Un gentil contributeur cette année m'a fait découvrir qu'à partir du moment où on utilise from __future__ import annotations, on peut déjà remplacer Union[List[Element], int] par list[Element] | int par exemple (testé sur Python 3.7 et suivant).
À noter que str.join() prend juste un itérable, et donc "\n".join([repr(m) for m in monkeys.values()]) peut s'écrire plus simplement "\n".join(repr(m) for m in monkeys.values()).
Même remarque avec deque().
J'imagine que pour trier, il faut charger toutes les données, donc pas d'intérêt de retourner un itérateur.
Oui certainement, ça serait hypocrite de faire croire que la fonction arrive à travailler 'en flux' (sans tout charger) alors que ce n'est pas possible. Et derrière si tu veux un itérateur sur la liste retournée c'est très peu coûteux de te le faire (alors que le contraire est moins vrai).
À l'époque, j'ai eu quelques temps une extension rigolote qui (en référence aux nombreux changements de nom) générait un nom aléatoire au démarrage, genre "Ice Armadillo".
Mettre ton titre tout en majuscule dans l'espoir d'augmenter la visibilité de ton message a sûrement été juste vu plus comme un manque de respect qu'autre chose (la Nétiquette toussa).
Si tu es directeur logistique, tu as mieux à faire que de coder un logiciel. C'est un métier, et visiblement pas le tien ; payes des professionnels pour le faire. Primo coder un logiciel ça ne consiste pas juste à l'écrire à l'instant T, il faut ensuite un suivi (corriger les bugs—il y en a toujours --, gérer les demandes d'évolutions, gérer les mises à jours des bibliothèques sous-jacentes…) et tu ne seras pas le premier à te rendre compte que tu n'as pas le temps. Deuxio écrire un bon logiciel ça demande plus de compétence que juste connaître un langage (de la même manière qu'écrire un bon roman ce n'est pas juste connaître la grammaire) ; c'est pour ça que ça prend des années (que ce soit à l'école ou à côté).
Je pense qu'avec une classe Case et une liste de liste d'instances de cette classe on aurait un code un peu plus joli. Autant l'unpacking (ex: a, b, c = foobar ) est une fonctionnalité cool de Python, autant là ça ne me semble pas très pertinent ; en effet vous passez votre temps à unpacker des tuples (il faut bien se rappeler de la sémantique de chaque élément du tuple), à avoir des variables inutiles (tous les éléments du tuple ne sont pas utiles à chaque fois), et à reconstruire des tuples (vu qu'ils sont immuables).
Hop une f-string pour la route: print( "Sur les",nbombes, "bombes, il vous en reste",nbombes-nbdrapeaux, "à trouver.")
peut s'écrire plus simplement: print(f"Sur les {nbombes} bombes, il vous en reste {nbombes - nbdrapeaux} à trouver.")
je ne vais pas faire une PR GitHub (je ne saurai pas tester que je n'ai rien cassé). Mais comme j'aime bien relire du Python, je me permets quelques petites remarques, parce que le code est plutôt de bonne facture.
À beaucoup d'endroits (pas partout) on trouve des logging.debug("Log in %s" % logfile) ; il est préférable d'écrire logging.debug("Log in %s", logfile) car l'interpolation de chaîne ne sera faite que si le message est affiché (le niveau est DEBUG ou moins dans cet exemple).
logging.debug("ici: %i %s", i, cmd[i]) j'imagine que le "ici" est un reliquat.
if type(tunnel) == AutoTunnel: je pense qu'un if isinstance(tunnel, AutoTunnel): est plus propre (même si au final tester les types c'est pas très élégant, et genre une méthode/propriété "is_auto", par exemple, serait plus appropriée je trouve).
if t.status != 'ESTABLISHED' and t.status != 'LISTEN': => if t.status in ('ESTABLISHED', 'LISTEN'):
Il y a beaucoup d'utilisation de eval() qui gagneraient à être remplacées par des getattr() ; outre le caractère sécurité, on évite aussi de reparser du code à chaque fois (eval() est vraiment à éviter ; je doute m'en être servi en presque 20 ans de Python).
Dans la mesure où Python 3.8 est requis, tu peux utiliser à moult endroits les f-strings qui sont vraiment super sympathiques.
Il y a beaucoup de double-recherches dans les dictionnaires, quand une recherche simple sera plus efficace et souvent plus compacte.
On utilise .extend() et une generator expression pour éviter d'avoir N appels à append() tout en étant plus court:
def__repr__(self):reps=[self.header]# Remarque 1: pas besoin de mettre une autre paire de parenthèses car le generator est le seul paramètrereps.extend(str(tunnel)fortunnelinself.tunnels.values())# Remarque 2: version alternative avec map()# reps.extend(map(str, self.tunnels.values()))return"\n".join(reps)
Avec les nouvelles fonctionnalités d'unpacking de Python 3, on arrive à ce résultat qui a un petit goût de programmation fonctionnelle plutôt cool:
L'illustration (très jolie par ailleurs), aussi utilisée en page d'accueil sur https://yunohost.org, parle de Owncloud, mais visiblement le projet est passé à son fork NextCloud. Une petite mise-à-jour serait de mise j'imagine.
C'est vraiment important de garder l'exclusivité sur ce genre de petite merveille, il doit sûrement y avoir plein de gens prêts à acheter des goodies Clippy.
[^] # Re: effet pervers
Posté par GuieA_7 (site web personnel) . En réponse au journal Suggestion : supprimer complètement les notes du site. Évalué à 10.
C'est vraiment le cas ? J'ai plus l'impression que tout le monde s'en tape de Stallman et Linus ; je n'en entends jamais parler ailleurs qu'ici (par exemple dans les réseaux tournés autour du Jeu Vidéo où je traîne, j'entends parler de drama nuls du JV, dont 99% des gens se fichera aussi en dehors de cette sphère). La communauté n'a peut-être plus vocation a grandir énormément, c'est comme ça, ce n'est pas comme si 50% des gens en avaient quelque chose à faire du logiciel libre (c'est dommage mais les sujets passionnants ne manquent pas).
Je n'en suis pas vraiment sûr (mon avis n'est pas arrêté, mais j'aimerai au moins des exemples). Autant il est plus facile de récolter un +10 pour un jeu de mot que pour une critique argumentée, autant les fameuses critiques géniales qui se prennent des -10 ne sont géniales que la tête que leur auteur de ce que je vois depuis 20 ans ici. Et même si parfois le problème est plus dans la forme que dans le fond (par exemple insulter tout le monde n'aide pas vraiment à ce qu'on vous lise de manière rationnelle), ça restent des messages qui se prennent un -10 pour une bonne raison (c'est-à-dire pas parce qu'ils révèlent des réalités dérangeantes, n'en déplaise à leur auteur).
# Quelques petites coquilles
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Entretien avec Kannagi à propos de NGDK. Évalué à 6.
=> ils contiennent les sprites du jeu
=> on peut fusionner les sprites niveau hardware et les contrôler comme s’il n’y en avait qu’un seul !
=> les sprites zoomés n’étaient que des gros sprites qu’on dézoomait !
Et merci pour l'interview, hâte d'avoir des nouvelles des autres projets (moteur 3D & CPU) !
[^] # Re: Au sujet du « Ça marche du premier coup »
Posté par GuieA_7 (site web personnel) . En réponse au journal Intégration d'une fenêtre de debug live en Rust 🦀. Évalué à 6.
Le principe d'ownership ne sort effectivement pas de nulle part ; en revanche Rust a permis d'uniformiser plusieurs concepts de recherche en un seul concept cohérent, qui va plus loin et qui fonctionne sur des vrais programmes ambitieux. Quant à trouver comment écrire un borrow checker performant la communauté Rust est face à un défi nouveau (et d'autres langages seront ravis de copier ça, ce qui est très bien).
# Plusieurs choses
Posté par GuieA_7 (site web personnel) . En réponse au message Droits des articles linuxfr/linked. Évalué à 5.
C'est peut-être un raccourci de ta part, mais les articles LinuxFR ne sont pas forcément libres. Ils sont par défaut en CC-By-SA dans le formulaire de rédaction (c'est un site orienté libre, donc c'est un choix que les gens acceptent de manière générale) mais l'auteur peut choisir une autre licence, même non libre, dans l'absolu.
Il est toujours possible, lorsque l'ensemble des ayants droit sont d'accord, de changer la licence d'une œuvre. C'est pourquoi il serait compliqué de changer la licence de Linux (qui a des milliers de contributeurs/auteurs) par exemple, mais quand tu es l'unique auteur tu peux re-licencier à ta guise. En admettant que LinkedIn t'impose une licence ça ne pose pas de problème (quelle que soit la licence originelle sur LinuxFr, rien à voir avec le libre).
Je doute que LinkedIn demande nécessairement du contenu original (et si c'est le cas, rien à voir avec la licence sur LinuxFr, là encore).
Et sinon oui Tanguy a bien répondu au dessus.
[^] # Re: Des dépêches depuis 2013
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Sortie de Crème CRM en version 2.4. Évalué à 5.
Merci !
Faire du prosélytisme me met mal à l'aise, mais parler de mon travail de manière technique me fait très plaisir. Je laisse donc lâchement mes collègues communiquer sur les réseaux "classiques" (et heureusement qu'ils le font—merci à eux) et je me concentre sur notre forum et les dépêches LinuxFr.
En revanche c'est depuis 2011: https://linuxfr.org/news/sortie-de-creme-crm-en-version-10
Mais cette dépêche (ainsi que https://linuxfr.org/news/sortie-de-creme-crm-en-version-1-2 ) sont étiquetés avec un étrange "creamecrm".
[^] # Re: Savon à raser
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Sortie de Crème CRM en version 2.4. Évalué à 6.
N'hésite pas à lancer ton fork CaRaseMerveilleusementCRM.
# Quelques améliorations
Posté par GuieA_7 (site web personnel) . En réponse au journal 50 mauvais conseils de codage pour développeur C++. Évalué à 9.
Utilisez des macros imbriquées partout
Utilisez des nombres en dur (? directement? littéraux?).
Utilisez le moins possible d'accolades et de sauts de ligne.
N'utilisez pas la bibliothèque standard du langage.
Si les sauts (passages?) de ligne et l'indentation sont insignifiants […]
# Quelques remarques du coup
Posté par GuieA_7 (site web personnel) . En réponse au message Démineur agréable avec tkinter . Évalué à 7.
placer_drapeau()
côtoieinput_config_valid()
.cases = list()
peut s'écrirecases = []
.pourrait être plus joliment écrit en :
# Super initiative !
Posté par GuieA_7 (site web personnel) . En réponse au lien annonce de la libération de la collection Ludomire chez PVH éditions. Évalué à 4.
Je sais vers où je chercherai mes prochains bouquins de fantasy ;)
[^] # Re: Pas vraiment un compilateur
Posté par GuieA_7 (site web personnel) . En réponse au lien Java Grinder : un compilateur Java pour PS2, N64, Megadrive, Amiga, C64.... Évalué à 6.
"Un compilateur source à source, transpileur ou transcompilateur est un type de compilateur […]" ( source )
(je pinaille mais merci des informations)
# Simple...
Posté par GuieA_7 (site web personnel) . En réponse au message site web simplissime, CSM type algo?. Évalué à 4.
Ta demande n'est pas très claire (c'est une demande utilisateur normale ne t'inquiète pas haha). Souhaites-tu créer les formulaires via une interface graphique ou bien y aura-t-il un seul formulaire codé en dur ? Souhaites-tu garder les réponses des utilisateurs (genre pour faire des statistiques par exemple) ? etc…
En fonction de ce que tu veux ça changera de beaucoup le temps de développement. Et tout dépend de ce que tu appelles "simple". En quelque mois de développement un développeur peut pondre un truc un peu sympa mais pas super ambitieux non plus ; mais quelque mois de développement ça représente selon les cas un petit ou un énorme investissement.
# Incroyable !
Posté par GuieA_7 (site web personnel) . En réponse au lien Duelyst open sourced. Évalué à 6.
En voyant le titre je m’apprêtais à écrire un Nᵉᵐᵉ commentaire sur le fait qu'il n'y a que le moteur et pas les assets, je suis donc agréablement surpris. Je ne suis aps un spécialiste du genre mais le jeu avait l'air de très bonne qualité. Et la Direction Artistique est clairement de toute beauté (les sprites sont petits mais marchent très bien).
Merci aux créateurs pour cette belle initiative !
# Assets ?
Posté par GuieA_7 (site web personnel) . En réponse au lien Un jeu vidéo indé, RPG post-apocalyptique, open-source, multi-plateformes, et qui sort sur Steam. Évalué à 7.
Je n'ai pas l'impression que le dépôt GitHub contienne les assets graphiques & audio (il semble qu'il manque un répertoire "pool/" qui les contiendrait). Si j'ai raison, dire que le jeu est open-source est faux (seul son moteur l'est).
(je n'aurai rien contre que les assets soient libérés une fois le jeu rentabilisé, mais je n'ai rien vu qui laisse entrevoir une telle possibilité ; et dans tous les cas il n'est pas open-source là tout de suite)
[^] # Re: En Pypthon
Posté par GuieA_7 (site web personnel) . En réponse au message Avent du Code, jour 13. Évalué à 2.
Un gentil contributeur cette année m'a fait découvrir qu'à partir du moment où on utilise
from __future__ import annotations
, on peut déjà remplacerUnion[List[Element], int]
parlist[Element] | int
par exemple (testé sur Python 3.7 et suivant).[^] # Re: À la chasse aux singes, j'envoie le Python !
Posté par GuieA_7 (site web personnel) . En réponse au message Avent du Code, jour 11. Évalué à 4.
À noter que
str.join()
prend juste un itérable, et donc"\n".join([repr(m) for m in monkeys.values()])
peut s'écrire plus simplement"\n".join(repr(m) for m in monkeys.values())
.Même remarque avec
deque()
.[^] # Re: python, on oublie toute dignité
Posté par GuieA_7 (site web personnel) . En réponse au message Avent du Code, jour 11. Évalué à 2.
Oui certainement, ça serait hypocrite de faire croire que la fonction arrive à travailler 'en flux' (sans tout charger) alors que ce n'est pas possible. Et derrière si tu veux un itérateur sur la liste retournée c'est très peu coûteux de te le faire (alors que le contraire est moins vrai).
[^] # Re: python, on oublie toute dignité
Posté par GuieA_7 (site web personnel) . En réponse au message Avent du Code, jour 11. Évalué à 2.
sorted
renvoie déjà une liste: https://docs.python.org/3.8/library/functions.html#sorted[^] # Re: En même temps
Posté par GuieA_7 (site web personnel) . En réponse au lien Ralentissement de la productivité française : un déficit de compétences en mathématiques ?. Évalué à 7. Dernière modification le 16 octobre 2022 à 14:10.
Et pourtant, sacrées chevilles :)
[^] # Re: Firebird
Posté par GuieA_7 (site web personnel) . En réponse au lien Il y a 20 ans sortait Phoenix 0.1 – Coup d'œil dans le rétro. Évalué à 4.
À l'époque, j'ai eu quelques temps une extension rigolote qui (en référence aux nombreux changements de nom) générait un nom aléatoire au démarrage, genre "Ice Armadillo".
# 2 conseils pour le prix d'un
Posté par GuieA_7 (site web personnel) . En réponse au message MEILLEURE FORMATION PYTHON. Évalué à 7.
# Quelques remarques du coup
Posté par GuieA_7 (site web personnel) . En réponse au message Un démineur pour apprendre.... Évalué à 7.
Je pense qu'avec une classe
Case
et une liste de liste d'instances de cette classe on aurait un code un peu plus joli. Autant l'unpacking
(ex:a, b, c = foobar
) est une fonctionnalité cool de Python, autant là ça ne me semble pas très pertinent ; en effet vous passez votre temps àunpacker
des tuples (il faut bien se rappeler de la sémantique de chaque élément du tuple), à avoir des variables inutiles (tous les éléments du tuple ne sont pas utiles à chaque fois), et à reconstruire des tuples (vu qu'ils sont immuables).Avec des instances, ce code :
deviendrait par exemple :
Hop une f-string pour la route:
print( "Sur les",nbombes, "bombes, il vous en reste",nbombes-nbdrapeaux, "à trouver.")
peut s'écrire plus simplement:
print(f"Sur les {nbombes} bombes, il vous en reste {nbombes - nbdrapeaux} à trouver.")
Bonne nuit !
[^] # Re: Petite revue de code
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Moniteur de tunnels SSH Tunnelmon en version 1.1 . Évalué à 4.
Oui tout à fait, erreur d’inattention toussa.
# Petite revue de code
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Moniteur de tunnels SSH Tunnelmon en version 1.1 . Évalué à 10.
Bonjour,
je ne vais pas faire une PR GitHub (je ne saurai pas tester que je n'ai rien cassé). Mais comme j'aime bien relire du Python, je me permets quelques petites remarques, parce que le code est plutôt de bonne facture.
logging.debug("Log in %s" % logfile)
; il est préférable d'écrirelogging.debug("Log in %s", logfile)
car l'interpolation de chaîne ne sera faite que si le message est affiché (le niveau est DEBUG ou moins dans cet exemple).logging.debug("ici: %i %s", i, cmd[i])
j'imagine que le "ici" est un reliquat.if type(tunnel) == AutoTunnel:
je pense qu'unif isinstance(tunnel, AutoTunnel):
est plus propre (même si au final tester les types c'est pas très élégant, et genre une méthode/propriété "is_auto", par exemple, serait plus appropriée je trouve).if t.status != 'ESTABLISHED' and t.status != 'LISTEN':
=>if t.status in ('ESTABLISHED', 'LISTEN'):
eval()
qui gagneraient à être remplacées par desgetattr()
; outre le caractère sécurité, on évite aussi de reparser du code à chaque fois (eval()
est vraiment à éviter ; je doute m'en être servi en presque 20 ans de Python).Il y a beaucoup de double-recherches dans les dictionnaires, quand une recherche simple sera plus efficace et souvent plus compacte.
peut s'écrire simplement
self.forward = self.forwards.get(forward, "unknown")
.De la même manière le bout de code suivant est intéressant (car plusieurs améliorations sont possibles)
On utilise
.values()
vu qu'on n'a pas besoin de la clé:On utilise
.extend()
et une generator expression pour éviter d'avoir N appels àappend()
tout en étant plus court:Avec les nouvelles fonctionnalités d'unpacking de Python 3, on arrive à ce résultat qui a un petit goût de programmation fonctionnelle plutôt cool:
==> raddr, rport = c.raddr or (None, None)
En espérant avoir été utile.
Bon week-end !
# Owncloud ?
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Sortie de YunoHost 11.0 (Bullseye). Évalué à 7.
L'illustration (très jolie par ailleurs), aussi utilisée en page d'accueil sur https://yunohost.org, parle de Owncloud, mais visiblement le projet est passé à son fork NextCloud. Une petite mise-à-jour serait de mise j'imagine.
Merci pour la dépêche, le projet semble soigné.
[^] # Re: Pas Clippy!
Posté par GuieA_7 (site web personnel) . En réponse au lien Microsoft passe Clippy en Open Source !. Évalué à 2.
C'est vraiment important de garder l'exclusivité sur ce genre de petite merveille, il doit sûrement y avoir plein de gens prêts à acheter des goodies Clippy.