vendredi 30 novembre 2007

Comment faire dériver un troll...

L'article de l'autre jour sur les améliorations en performances de Ruby pour sa version 1.9 était un commentaire de cet article, mini-troll gentil dans le combat récurrent opposant Ruby vs Python. Apparemment, l'article de départ d'Antonio Cangiano a soulevé beaucoup de réactions, un peu dans tous les sens... Pour aboutir à une comparaison (plus ou moins fo1reuse...) entre Haskell et LISP !!!

Dans le même ordre d'idée, sur le Site du Zéro, un jeune inconscient demande conseil pour apprendre un autre langage que le C++ (ce type de topic partant systématiquement en gros troll bien gras et velu sans l'intervention d'un modo avant sa création ^^)...


D'abord une belle attaque du C++ contre le Python avec Qt, suivie d'un tacle commun Ruby et Python contre la plate-forme .NET, (petite interlude Libre contre Microsoft), petite percée de C# et Mono, Python vs Ruby avec une parenthèse pour des claques en Ocaml contre F# (kezakel ce truc ???)...

En ce moment, après la frite entre développeurs web Ruby et Java, ça fait pas mal de trolls très velus mais marrants.


A noter que le choix d'un langage de programmation est une décision reposant sur énormément de facteurs... Les performances ne sont pas tout. Je me permets de citer mon philosophe calendaire favori :

Sans maîtrise, la puissance n'est rien,
Pirelli.

Les images de cet article sont sous license libre.

jeudi 29 novembre 2007

2 Jeux de Quizz sur le Web

Moi qui suis pas tellement fan de jeux de questions, en ce moment, je m'amuse assez avec 2 jeux Web de quizz :



Studio Quizz

Studio Quizz est né de la collaboration de la Motion Twin et de Prizee, deux équipes françaises de jeux en ligne. L'ambiance graphique générale ne dépaysera pas trop les habitués des autres jeux de ces teams.

Le jeu lui-même est en revanche assez captivant. Par groupe de 8, les joueurs s'affrontent le temps de 10 questions, en essayant de répondre le plus rapidement possible. Les questions sont posées par le petit présentateur télé que vous pouvez voir à côté. Et les réponses ? Elles sont tapées au clavier, dans une petite barre servant également pour le chat' entre candidats. Pas de panique pour les fautes de frappes et autres erreurs, vous pouvez fournir autant de réponses que vous le désirez : il suffit d'appuyer (vite !) sur entrée. Les 5 premiers à répondre juste gagnent des points.
Du coup, le jeu est très rapide, et assez stressant, mais les questions ne sont généralement pas difficiles... Beaucoup sur la télé, le sport, les départements, des gens connus... Le public visé est assez jeune, mais les vétérans non-habitués au rythme de frappe type MSN pourraient être surpris !

Les points gagnés lors d'une partie (entre 0 pour les pabons et 30 pour les Ômondieukecetommébon!) sont cumulés à chaque partie : ensuite, on peut aller les jouer aux enchères pour gagner des cadeaux allant du stylo Studio Quizz (il sont mimis ^^) à la PS3 en passant par les CD, DVD, jeux et iPods. A noter que les enchères sont assez rapidement abordables et il me parait assez facile de gagner des petits cadeaux au bout de quelques semaines de jeu régulier (1 partie gratuite par jour, possibilité d'en acheter davantage).

Une ambiance sympa donc (possibilité d'applaudir les autres concurrents !), jeune et des cadeaux accessibles à tous (rectification : à tous ceux qui savent que Flaubert n'est pas un karateka et que le président français n'est pas "Bouch" --> véridique).

Mon Légionnaire

Attention les pitchounes, là ça se gatte ! Sec ! Mon Légionnaire s'adresse d'emblée à un public beaucoup plus... adulte. Ou tout du moins, le niveau de culture générale y est bien plus costaud. Le site est extrêmement riche, il n'existe pas moins de 6 modes de jeu :



  • La Question
  • L'Assaut
  • Le Défi
  • L'Usurpation
  • Le Momentum
  • Le Crescendo
Je vous laisse découvrir petit à petit car c'est vraiment très prenant. Pour résumer, chaque jour, vous avez droit à 2 tentatives à la Question et 1 au Momentum. La Question est un quizz seul de 12... questions avec 4 réponses possibles (20s maximum par question). Une seule est juste et surtout, il ne faut JAMAIS répondre faux !!! Le momentum se présente comme une course entre 6 joueurs dans une arène romaine : 12 questions, une bonne réponse donne de l'accélération, une mauvaise entraîne une chute rarement rattrapable...

Je ne vous parle pas des autres modes, soit il faut s'y qualifier, soit payer (Crescendo). Ici encore, des parties peuvent être achetées, mais aussi gagnées dans certains cas...

Pour vous donner une idée du niveau de jeu, les bons joueurs de Mon Légionnaire sont assez régulièrement les vainqueurs de l'émission Question pour un Champion... ça calme.

Vraiment sympathique aussi, mais beaucoup plus difficile que Studio Quizz, hormis pour la vitesse de frappe (on a quand même souvent l'impression d'être le dernier des bouseux quand on voit ses scores mais bon...).

~~~~

Voilà, 1+1=2 jeux sympas donc : amusez vous bien !

PS : pour info, Ghandi a bien participé à la Guerre des Boers, un spécialiste des mollusques n'est pas un molluscologue, et ce n'est pas Hilbert qui a démontré que N est un espace complet ! VOILA !

Fusionner 2 tableaux en les triant

Un peu d'algorithmique, ça fait toujours du bien... La question du jour était "Comment prendre 2 tableaux triés par ordre croissant (de tailles différentes éventuellement), et les fusionner en 1 seul tableau également trié ?". C'était une question d'algo, pas de code. Du coup, j'ai fait une petite fonction en Ruby, appelons la melt, qui fait ça (désolé pour le code pas indenté aujourd'hui, des balises récalcitrantes traînent dans le coin...).

def melt list1, list2
cur1 = 0
cur2 = 0
pt = 0
result = Array.new(list1.size+list2.size)

while ((cur1 < list1.size) and (cur2 < list2.size))
if (list1[cur1] < list2[cur2]) then
result[pt] = list1[cur1]
cur1 +=1
else
result[pt] = list2[cur2]
cur2 +=1
end
pt +=1
end

if cur1 < list1.size then
for i in (cur1...list1.size)
result[pt] = list1[i]
pt += 1
end
elsif cur2 < list2.size then
for i in (cur2...list2.size)
result[pt] = list2[i]
pt += 1
end
end

result

end


Alors c'est du classique qu'on voit à l'école avec les pitits curseurs qui se baladent, tout ça. Puis, par curiosité, j'ai voulu réécrire ce code en "vrai Ruby", soit :

def melt list1, list2
result = list1 + list2
result.sort!
end

Le gain de place me ferait presque rire si je ne m'étais pas tapé l'autre avant... Des méthodes préexistantes, un + sur des tableau : que demande le peuple ? Puis, histoire de rigoler, j'ai voulu comparer le temps d'exécution de chacun...

Time0 = Time.now
for i in (0...1000)
a = [1,2,6]
b = [0,3,6,12]
puts melt(a,b)
end
puts "Temps : #{Time.now - Time0} "


And the winner is................. VRAI RUBY !!!

Avec 0.469 s contre 0.515 s.

La différence n'est pas monstrueuse (mon algo est pas si moisi en fait... Contrairement à mon benchmark !), mais ça justifie le fait de ne surtout pas s'emm3rder d'essayer de faire les choses plus vite que le langage.

mercredi 28 novembre 2007

Programmation poétique - Chapitre II : La traque du premier Bignum

Dirty Harry, "le crade", fixait le fond de son verre de whisky vide, enfoncé dans son canapé miteux. Dans sa gueule de bois habituelle, il ressassait. Trois jours. Trois foutus jours que les petits gangers Fixnum disparaissaient dans la ville rouge... Le Ruby, ce quartier où tout se trouve sous les lampadaires écarlates des bouges puants et des claques luxueux. Harry avait déjà fait hurler son 44 dans ce secteur auparavant... "La Disparition des Pointeurs" titrait la presse à cette époque. Un certain Matz était à l'origine du coup : aujourd'hui on pourrait admirer un coucher de soleil à travers son thorax...

Harry se leva, faisant craquer ses genoux cagneux. Il fallait qu'il trouve une solution, et vite. Les Bignumz commençaient à avoir une emprise malsaine sur le quartier, trimballant leur graisse dans d'énormes SUV avec vitres fumées... Il savait qu'ils étaient à l'origine du coup. Quand un gang commence à décliner, cherche celui qui grossit. Harry connaissait ses classiques. Il lui fallait le boss. Le numéro 1. Le premier des Bignumz.

Il avait déjà commencé à chercher. Fifty, vielle balance Fixnum lui en avait dégotté un bien gras avec un énorme "1500456000" tatoué sur le torse... son matricule en taule à Detroit. Dirty Dirt n'avait pas le temps d'interroger tous les pouilleux de la création dans ce quartier de dingues : il fallait faire vite. Alors il eut une idée...

def who_the_fuck_is_Bignum down, up
min = down
max = up
dist = max - min
while dist > 1
mid = (max + min)/2
if mid.class == Bignum then
max = mid
elsif mid.class == Fixnum then
min = mid
end
dist = max - min
end
puts max.to_s
end

who_the_fuck_is_Bignum 50, 1500456000


Il tenait son homme. 1073741824. Un autre matricule d'ex-ex-taulard s'il ne bougeait pas... Il bougea. L'acier hurla une fois de plus dans la main de Dirty Harry.

Plus tard au bar, l'inspecteur sirotait son énième verre d'alcool d'homme pour oublier la perspective de nettoyer sa moquette imbibée de sang en rentrant chez lui. Alors qu'il venait de raconter de sa voix rocailleuse, à moitié ivre, son enquête à un autre paumé se désintégrant à côté de lui au comptoir, l'inconnu se leva et gueula :

Mais pourquoi t'as pas regardé la DOC CONNARD !!!

Moralité :
  1. La dichotomie est plus rapide que la recherche exacte.
  2. Les entiers sont des Fixnum en dessous d'un bit (2**30), et deviennent Bignum au dessus. Ruby le gère de façon transparente pour l'utilisateur.
  3. Read The F*cking Manual.

At the Speed of Life...

La semaine dernière, on parlait de la relative lenteur de Ruby... Et bien, je vous encourage à aller voir ça (d'ailleurs allez sur ce blog : c'est du bon).


Pour les petits malins qui refusent de lire en Anglais, ya grosso modo un petit test benchmarkant la version de Ruby actuelle, la prochaine 1.9, et la 2.5.1 de Python. J'annonce tout de suite : pas de troll sur Python, ce qui est intéressant, c'est que sur ce petit test tout naze (Fibonnacci récursif), on a un temps d'exécution, avec Ruby 1.9 :

13 fois inférieur !!! (environ)

Alors ok, on est encore loin du C, Fortran et compagnie. Ok, c'est sur un mini-test très ciblé. Ok. Mais quand même, c'est ultra encourageant, même si je ne comprends pas trop comment ils peuvent optimiser le langage sur un script aussi simple...

mardi 27 novembre 2007

Exemple de gestion d'erreurs en Ruby

Allez, un petit exemple de gestion d'erreurs en Ruby. Qu'est-ce que la gestion d'erreurs ? C'est un synonyme pour gestion d'exceptions (merci Wikipédia !!!). Cela permet de produire des codes plus sûrs car ceux-ci "sauront" intrinsèquement répondre à différents types d'erreurs (ou exceptions).


def diviser_1_par a
begin
puts "on commence"
unless ( a.is_a? Numeric ) then
raise "On divise par un nombre en general..."
end
puts "a priori, pas d'erreur cette fois."
c = 1.0 / a
rescue
puts "il y a une erreur, re-essayons !"
a = 2.0
retry
ensure
puts "Dans tous les cas, on affichera c : "
puts c.to_s
end
end


Le bloc à vérifier débute par le mot-clef begin. Raise permet de soulever une exception et d'y associer un message (ici, une erreur de type : a doit être un nombre). Comme une erreur est détectée, on passe dans rescue pour "sauver" l'exécution (ici, on attribue effectivement une valeur numérique à a). Le retry indique à l'interpréteur qu'il doit recommencer au niveau du begin (avec la nouvelle valeur de a). Enfin, le bloc ensure "assure"un passage obligé pour le code.

On peut tester cette méthode avec le petit code suivant (un cas où tout va bien, et un cas avec erreur) :

puts "1er cas : "
diviser_1_par 3.33
puts " "
puts "2eme cas : "
diviser_1_par "toto"

Ruby est assez riche dans sa partie gestion d'erreurs (classe Exception, possibilité de lier un rescue à un type d'erreur, comme SyntaxError par exemple...), il ne s'agit ici que d'un petit exemple pour commencer à réaliser des codes plus "sûrs".

mercredi 21 novembre 2007

Ruby en sciences

Étant scientifique (mon excuse habituelle pour utiliser le Fortran...), je me suis posé la question suivante l'autre jour : Ruby est-il utilisé par la communauté scientifique (dans l'industrie et/ou dans la recherche) ?

Il est clair que le Ruby, en tant que langage interprété, est plutôt lent, ce qui pourrait être un frein majeur à son utilisation dans ce domaine. Mais j'ai quand même réussi à trouver 2 petites références intéressantes :

SciRuby : portail de la communauté scientifique employant le Ruby
ACS : Art of Computational Science

SciRuby est particulièrement intéressant, avec des tonnes de références vers des projets, des gens, des interviews, des libs... C'est dans des sites comme ça qu'on apprend, entre autre surprise, que la NASA utilise le Ruby dans le cadre de calculs CFD, couplé au Fortran (tiens, tiens !!!).

Le second est un peu plus obscur, mais on y retrouve l'idée de départ :
Le langage Ruby est-il assez rapide ?

Non, le langage Ruby en lui-même est trop lent pour des simulations scientifiques sérieuses. Toutefois, il est acceptable de remplacer quelques lignes critiques en temps de calcul par du code C, accélérant ainsi le code Ruby originel à une vitesse approchant celle d'un code C sans trop de problème. Voir Vol. 12: Speedup pour des exemples détaillés.

On y parle également de la modélisation de problèmes N-corps, réputés particulièrement gourmands en ressources...

J'ai donc bon espoir d'utiliser un jour Ruby dans le cadre professionnel. Entre nous, les scientifiques auraient tort de se priver de ce joli langage : ceux que la programmation gonfle coderont plus vite avec, les autres se feront un plaisir de le lier au C, C++, LISP et/ou au Fortran pour compenser sa relative lenteur.

En attendant, je vais essayer de me lancer dans un petit générateur de documentation de code en Ruby, pour du Fortran 90.

lundi 19 novembre 2007

Tableau 2D en Ruby

Aujourd'hui, je vous propose une classe implémentant des tableaux bidimensionnels. Les tableaux sont très bien gérés en Ruby, mais j'ai déjà eu besoin de quelque chose d'à la fois simple à utiliser et assez évolué pour des applications scientifiques par exemple.

Le fichier Table.rb contenant la classe est un peu long pour l'exposer ici : je vous propose de le télécharger ici (150 lignes environ).

Passons le rapidement en revue (petite astuce pour générer la doc associée : placez vous dans le répertoire où il se trouve et en ligne de commande tapez : rdoc. Cela génèrera automatiquement sa doc en HTML.).

Hormis les fonctions de base (initialisation, copie, accès aux cases du tableau, to_string et affichage console), il y a 3 méthodes un peu spéciales :

  • write_to_f génère 2 fichiers de sortie : un similaire à l'affichage console (.dat), et un autre destiné à être lu par gnuplot (ou éventuellement un autre programme de courbes acceptant ce format) dans le cas d'un tableau contenant des variables numériques.
  • Les BC (pour Boundary Conditions = Conditions aux limites en français) qui jouent sur la fonction suivante.
  • neighbours renvoie la liste des cellules "voisines" de la cellule ciblée. Le terme "voisin" dépendant des conditions aux limites.
Au départ, j'avais créé cette classe pour des applications avec automates cellulaires (jeu de la vie, etc...) : cette fonction y est très utile pour modéliser les différents types de BC. Pour résumer, en Ruby, par défaut, les tableaux sont cycliques (ou "périodiques"), exemple :

a = [0, 1, 2, 3]
a[-1]
#=> 3
Et donc par défaut, les BC transmettent les infos d'un bord à l'autre. Mais on peut vouloir envisager son tableau comme une boîte fermée (:closed) ou comme une carte du monde (:realistic_map ; on transmet en Est-Ouest, mais pas en Nord-Sud).

Pour tester rapidement cette classe :
require 'Table'

a = Table.new 3, 4, 45

a.[]=(1,1,2)

a.print

puts a.BC.to_s


On crée un tableau de 3 lignes et 4 colonnes rempli de 45. Puis, on affecte à la case de la seconde ligne et seconde colonne la valeur 2 (en Ruby comme en C et C++, les premières cases sont indexées par 0, par défaut.). On affiche le tableau, puis ses conditions aux limites.

La classe n'est pas optimisée, ni totalement sécurisée, et beaucoup de méthodes utiles sont envisageables (produit matriciel, min, max...). L'intérêt c'est qu'elle est facilement modifiable et utilisable tout de suite pour de petites applis.

dimanche 18 novembre 2007

Fortran must die !

Amusant...

Je suis tombé sur un article signalant une pétition "pour l'abandon du fortran" (ici, depuis une discussion sur Framasoft elle-même issue de linux.org). Avec des avis et réactions assez variés.

Que reproche-t-on au Fortran ?

  • Vieux, archaïque.
  • Verbeux.
  • Pas objet (sauf depuis 95, et encore...).
  • Pénible à apprendre, et peu clair.
Pourquoi utiliser une bouse, pardon, un langage des années 50 ?

Le Fortran date à peu près des années 50, c'est l'un des premiers langages "non-assembleurs" avec le SIMULA, orienté sciences (FORTRAN = FORmula TRANslating language...). Ces versions majeures sont, hormis les arcaniques, 77, 90, (à la limite 95 avec l'objet...) et 2003.

Il se trouve que les scientifiques, race étrange et à priori rare, ont rapidement adopté ce langage, à l'époque si "clair", pour coder leurs petites applis persos, en particulier dans le monde ésotérique de la recherche. Mais comme chacun le sait (enfin, chacun d'un peu sensé...), le monde de la recherche, c'est le monde de demain. Du coup, des petites applis "persos" issues de labos de recherche obscurs se sont construites (en grande partie grâce à l'émergence des réseaux) des bibliothèques de codes significatives, notamment en mathématiques, physique et chimie. Du coup, le fortran (77 par défaut) est devenu le standard de la programmation pour le scientifique de base de tout les pays, quelque soit sa couleur et sa religion...

Cependant, le fortran a vieilli, et en 89, face à l'apparition de langages "modernes" comme le C++, il a du se renouveler avec la version f90 (toujours pas objet cependant). Et aujourd'hui, malgré la version 2003, force est de reconnaître que ce langage paraît antique.

MAIS il est toujours employé, majoritairement sous les versions 77 et 90. Pourquoi ? Parce que dans le monde assez fermé des sciences "dures", le développement de codes de calcul s'étale sur des décennies (au sens propre). Les questions de portabilité sont complètement ignorés (UNIX-only...) et la conversion de code (j'entend, d'un langage à un autre) n'est généralement pas envisagée. On se retrouve donc à travailler actuellement sur des codes de 10, 20 ans en fortran 77 et/ou 90 qui paraissent complètement obsolètes. Et "informatiquement" parlant ils le sont. Mais les objectifs ne sont pas ceux du dernier logiciel en Java...

Mon modeste avis :

Le Fortran est vieux. Non seulement il est "démodé", mais de plus, l'absence de POO (sérieuse) est un frein considérable au développement d'applications fiables et maintenables. Cependant, les old-timers existent toujours, et la conversion de codes de millions de lignes ne se fait pas si facilement (l'expérience le prouve, les contraintes scientifiques étant parfois très strictes sur la non-régression du code...). Il faut donc maintenir et continuer à développer les vieux codes Fortran.

CEPENDANT : il me paraît complètement irresponsable de lancer de nouveaux projets d'envergure en Fortran aujourd'hui. Le problème majeur résidant selon beaucoup dans la non-normalisation du langage. C'est à dire que les compilateurs n'effectuent pas nécessairement les différentes opérations dans le même ordre, augmentant par ailleurs les effets de bords, etc... On se retrouve donc avec des outils scientifiques fournissant des résultats significativement différents selon le compilateur utilisé (lf95, gfortran de gcc, etc...) !!! Les temps ont changé, et le C++ paraît acceptable pour beaucoup de cas, la vitesse d'exécution étant assez comparable sur les machines actuelles, et le coût de maintenance (en temps) étant bien moindre (pour une application équivalente).

Conclusion :

Vous êtes scientifique ? Le fortran vous servira probablement, et vous apprendra le respect des anciens qui devaient écrire leurs codes de la colonne 6 à 75 sur les les fiches perforées. Sinon, laissez tomber (comme le COBOL du reste...) et faites du moderne.

jeudi 15 novembre 2007

Bien débuter en Ruby

En attendant un article plus complet sur de nombreux liens utiles pour la programmation en Ruby, voici déjà quelques liens vers des tutoriaux ou documents, en Français, que j'ai trouvés biens pour débuter en Ruby :


Le premier est vraiment basique, et est probablement le plus adapté pour les débutants en programmation (il commence par quelques manipulations avec irb, l'interpréteur en ligne de Ruby). Chaque chapitre se termine par une section "Écrire de bons programmes" qui est toujours instructive. Une petite aide pour l'installation sur de nombreux OS est également présente.

Le tutorial de Loktar s'adresse à mon avis à des gens ayant déjà des notions de programmation dans un autre langage. Il est en cours de construction mais propose déjà l'essentiel pour commencer à coder. Il contient une partie avancée sur l'utilisation d'irb, des symboles et des méthodes ainsi qu'une introduction au framework Ruby on Rails (RoR pour les intimes).

Enfin, le troisième document, par Titoumimi, est plus technique : après une brève introduction des bases du langage (la syntaxe, les structures de contrôle...), sont présentés des notions très pratiques et professionnelles : procédures, gestion des erreurs, manipulation de fichiers et exemple de BDD avec MySQL. Idéal pour utiliser rapidement Ruby dans un cadre professionnel.

A chacun de choisir par où commencer selon son niveau et ses objectifs. Bonne lecture et bon codage !

mercredi 14 novembre 2007

Kadokado v2 : mieux ?

Depuis Lundi dernier, Kadokado a fait peau neuve : cette nouvelle version apporte un nouveau design, et pas mal d'autres modifications... qui ne satisfont apparemment pas tout le monde (doux euphémisme pour dire que ça gu3ule pas mal...). Une première pour les créateurs du site (Motion Twin), habitués aux éloges.



Quoi de neuf en somme ?
  • Le design
  • Le système de clans
  • Le système de gains de points Kadokado
  • Un forum
  • Autres petites modifs (messagerie, fréquence sur certains jeux...)
Sur le design, à chacun de se faire une opinion : il est clairement plus moderne que le précédent, un peu plus flashy, mais peut-être un peu moins clair (à moins que ça ne soit uniquement une question d'habitude).

Je passe la main sur le système de clan : je ne l'utilise pas plus maintenant qu'avant...

Pour les points kadokado, on en gagne toujours en cas de contrat de réussi mais exit les Jackpots (tant mieux selon moi, les scores étaient souvent disproportionnés...) et le ticket des 12 étoiles (vertes, oranges ou rouges). A présent, on peut gagner ses points en fin de période sur chacune des étoiles remportées (pas limité à 12) et en changeant de niveau.

Changer de niveau ? Oui : en se classant correctement sur un jeu donné dans une période, on peut potentiellement passer au niveau supérieur et ainsi gratter quelques points.

A noter l'effort fait pour renforcer le côté "communautaire" (très très à la mode...) du site, jusque là peu marqué, avec l'apparition d'un forum. Cela dit, il faudra débourser 200 points Kado pour y avoir un accès illimité (sous réserve de ne pas s'en faire bannir).

Pour finir, quelques modifications mineures : amélioration du système de messages privés, apparition de statistiques, notion de joueur VIP, possibilité de centrer le jeu sur la page...

Bah alors pourquoi que ça râle ???

D'abord pour le design... Chacun a ses goûts, mais force est de reconnaître que l'ambiance graphique a un accueil mitigé (depuis à peu près le premier jour de la beta-test, un bon gros quart du forum était rempli de messages désobligeants à ce sujet...). C'est intéressant de noter l'attachement des joueurs à un design auquel il sont très habitués depuis plusieurs années. Sans le trouver fantastique, je le trouve un peu plus "actuel" que le précédent, mais peut-être un peu moins clair.

Pour le système de clan aussi, il y a des mécontents, mais comme j'y connais rien : museau.

Les nouvelles règles de gain de points soulèvent également des objections, souvent basées sur des calculs un peu savants. Le principe de passage de niveau me semble intéressant : à voir sur la durée.

Le coup du forum... Sans doute LE TRUC qui fait le plus grincer les dents. Effectivement, c'est la première fois que je vois un site de jeu qui propose un forum "payant" (les points kadokado ne pouvant être considérés comme de la monnaie : pas d'échange possible entre joueurs). C'est vrai que ça fait à peine commercial... d'autant qu'il a été mis en place pendant la beta !!! Super intelligent pour permettre aux testeurs de rapporter les bugs, vraiment !
La raison avancée par Motion Twin est cependant intéressante : fermer les portes du forum aux infâmes flooders qui officient habituellement sur les sites de cette équipe... Et c'est vrai que c'est une catastrophe en général (café-jeu particulièrement...). Plusieurs remarques :

  • Si on a pas toujours le public qu'on mérite, on a souvent celui que l'on cible.
  • C'est gratuit un modo ? Monter un site c'est bien, l'entretenir, c'est pas mal non plus.
  • Cette solution n'est pas efficace : pour preuve l'état actuel du forum...
Pour ma part ya quelques petites choses que je trouve gênantes. La disparition de la fonction "cadeaux correspondants à mes points" : la section est un peu fouillie. La désagréable impression que les contrats rapportent moins. Le site perd un peu en clarté générale, et l'aide est un peu juste. Et surtout la communication de MT avec les joueurs, et ce, dès la beta-test.

Conclusion :

Kadokado v2 est un bon site malgré tout. Si on s'intéresse plus au fond que la forme, c'est qu'on aime les jeux, et eux n'ont pas changé. Les joueurs, dont je suis toujours, ont bien raison de s'opposer à certains changements (forum, finition ratée, ...). Moins pour d'autres.

Si vous ne connaissiez pas, allez vous faire une idée sur le site : chacun des 47 jeux a sa première partie libre, et l'inscription est gratuite. Pour un aperçu des autres productions Motion Twin, c'est par .

Les images de cet article sont la propriété de Motion-Twin

mardi 13 novembre 2007

Liste des charactères ASCII

En Ruby, les objets de types entier (Integer, donc les Fixnum et Bignum) possèdent une méthode bien pratique : chr. Celle-ci renvoie le charactère ASCII correspondant à l'entier (compris entre 0 et 255) sous forme de String. Pour se faire la liste rapido :
for i in (0..255)
puts i.to_s + " : " + i.chr
end

Pratique, non ?
A noter que la méthode concat pour les Strings, si on lui donne un entier entre 0 et 255 va ajouter le charactère ASCII correspondant :
"turlutut".concat 117
#=> "turlututu"
Et non pas turlutut117...

Argument optionnel en Fortran 90

Le fortran est l'un des langages informatiques pionniers. S'il peut paraître archaïque par rapport à nombre de langages modernes, il reste encore très utilisé dans l'industrie et en recherche (souvent sous la version fortran 90) de par l'existence de nombreux "gros" codes et bibliothèques éprouvés depuis de (très) nombreuses années.

"Y en a un qui bouge au fond de la classe !"

Le code que je vous propose ici montre comment implémenter un argument optionnel dans une procédure Fortran 90. Si ce genre de fonctionnalité est très simple à coder dans un langage moderne, il nécessite un certain effort ici.
"Dis donc Machin ! Le tableau c'est devant, pas par la fenêtre !"

Le code :

SUBROUTINE reprimande(mot1, mot2opt)
IMPLICIT NONE

CHARACTER(LEN = 8), INTENT(in) :: mot1
CHARACTER(LEN = 8), INTENT(in), OPTIONAL :: mot2opt
CHARACTER(LEN = 8) :: mot2

IF (PRESENT(mot2opt)) THEN
mot2 = mot2opt
ELSE
mot2 = "Machin !"
END IF

PRINT*, mot1//" "//mot2

END SUBROUTINE reprimande

PROGRAM instit
IMPLICIT NONE

INTEGER :: i
CHARACTER(LEN = 8) :: a, b

INTERFACE
SUBROUTINE reprimande(mot1, mot2opt)
CHARACTER(LEN = 8), INTENT(in) :: mot1
CHARACTER(LEN = 8), INTENT(in), OPTIONAL :: mot2opt
CHARACTER(LEN = 8) :: mot2
END SUBROUTINE reprimande
END INTERFACE

DO i = 1, 3
a = "Dis donc !"
b= "Toi !"
CALL reprimande(a,b )
a = "KESTUFAY "
CALL reprimande(a)
END DO

END PROGRAM instit


Discussion :

Plusieurs éléments du code (toujours aussi inutile soit dit en passant...) sont indispensables pour avoir effectivement un argument facultatif :

  1. L'option OPTIONAL dans la déclaration de la variable d'entrée mot2opt.
  2. La présence d'une seconde variable mot2.
  3. La structure de contrôle testant la présence de l'argument avec PRESENT.
  4. Enfin, une interface pour la procédure en question dans le programme principal.

Il est clair que ça ne donne pas envie de rendre des arguments facultatifs vu la quantité de lignes pour une fonctionnalité aussi "basique". Mais ça peut servir occasionnellement.

Pour info, en Ruby c'est plutôt simple :

def reprimander (qui, comment = "")
puts "#{qui}, je te reprimande #{comment}"
end

reprimander "Maxime"
reprimander "Kevin", "SEVEREMENT !"

lundi 12 novembre 2007

Programmation poétique - Chapitre I : La paquerette

Très inspiré par le Why's (Poignant) Guide to Ruby, je vous propose un petit code Ruby qui ne sert qu'à faire vibrer la corde sensible des geeks les plus romantiques.


Il illustre la grande lisibilité d'un code Ruby de base.

Le code :

class Paquerette

attr_reader :petales

def initialize
@petales = 15 + rand(5)
end

def enlever_petale
@petales -= 1
end

end

class Amoureux

def initialize nom
@nom = nom.to_s
puts @nom + " est amoureux."
@fleur = Paquerette.new
end

def enleve_petales
puts "Il cueille donc une paquerette et l'efflore : "
i = 0
while (@fleur.petales > 0) do
i += 1
@fleur.enlever_petale
case i%5
when 1
comment = "un peu."
when 2
comment = "Beaucoup"
when 3
comment = "Passionnement !"
when 4
comment = "A LA FOLIE !!!"
when 0
comment = "pas du tout...?"
end

puts " Elle m'aime " + comment
end
end

end

un_amoureux = Amoureux.new "Ernest"
un_amoureux.enleve_petales


PS : à l'attention des geeks qui seraient tentés d'offrir ce bout de code à leur dulcinée pour Noël... NE LE FAITES PAS !!!

Script Ruby auto-reproducteur


Alors, alors ! Voici un premier petit code en Ruby.


Que fait-il au juste ?

Ce script se clone lui même 20 fois à l' identique, hormis son numéro de version qui est utilisé afin de nommer le fichier ainsi généré. Ensuite, le script ainsi généré est lancé dans un thread parallèle. On considère un clone mort lorsqu'il ne peut plus se reproduire.

On obtiens donc un système qui s'auto-reproduit de façon exponentielle (clon0 génère clon1 - clon0 génère clon2 pendant que clon1 génère clon3 - ... etc ...).

Quel intérêt ?

On peut se demander quel usage faire de ce petit script... A priori aucun. Au mieux (au pire ?), il pourrait s'agir d'un ver (pas longtemps solitaire...) si on ne limite pas le nombre de reproductions (remplacer "20" par l'infini : dans ce cas, les clones sont "immortels", et le processus est stoppé lorsque le disque (ou le quota) est plein...). A mes yeux, son principal intérêt réside dans le fait qu'il illustre assez bien les possibilités de la méta-programmation en Ruby, et peut être une base pour des programmes "intelligents" : c'est à dire capables
d'évoluer en se modifiant eux-mêmes. Éventuellement applicable pour des modèles d'intelligence artificielle ?

Le code : (fichier clon0.rb)

version = 0

puts "Birth of clone n " + version.to_s

for i in (0...20)
filou = "clon" + i.to_s + ".rb"
if (File.exist?(filou)==false) then
phyl = File.new(filou, "w")

phyl.printf "version = #{i}" + "\n"
puts "clone n #{version} creates clone n #{i}"
me = File.new("clon" + version.to_s + ".rb")
scratch = (me.readline.delete("\n", "^n")).to_s
line = ""
for j in (2..27)
line = (me.readline.delete("\n", "^n")).to_s
phyl.printf line + "\n"
end
phyl.close
procs = false
Thread.new do
procs = system("ruby clon" + i.to_s + ".rb") #
end

end
end

puts "Death of clone n #{version}"

dimanche 11 novembre 2007

Test pour sobe session

Ce post n'est là que pour m'aider à tester des petites choses sur le blog... N'y faites pas trop attention ^^


Baptême du feu

Et voilà : moment toujours émouvant, la naissance d'un nouveau blog dont on peut déjà dire que l'intérêt global est tout à fait discutable.

Le lecteur intéressé peut dores et déjà quitter cette page pour se rendre dans le temple du savoir et de la connaissance à l'adresse suivante : TEMPLE.

Ceux préférant rester dans le coin peuvent à loisir admirer l'image suivante, intitulée "Bulletproof".


Dans l'idéal, ce blog devrait par la suite traiter de :

  • Programmation informatique (Ruby, autre...)
  • BD
  • Jeux en ligne par navigateur