lundi 28 juillet 2008

Forgotten Ruby methods

Ou plutôt les méthodes que je n'utilise pas assez... Sur les tableaux, les chaînes de caractères et quelques autres petites choses très mignonnes comme l'opérateur ternaire, l'affectation multiple (à consommer avec modération...) et le ||. 21 autres choses très intéressantes dans cet article.

Petit mot sur la méthode extend : d'un point de vue POO, elle permet en quelque sorte "d'instancier un module". Si une classe étend un module Mod, les "méthodes d'instance" de celui-ci seront transmises à la classe en tant que méthode de classe. Si l'on étend Mod avec un simple objet (bon, d'accord, une classe est un objet... mon explication précédente reste valable.), celui-ci se comportera comme une instance de Mod, avec les méthodes qui vont avec... Deux bonnes sources sur le sujet : [Ruby's Cube, :fr] et [Juixe TechKnow, :en].


### Multiple affectation  and || ###
a, b = nil, 10
#=> [nil, 10]
a || b
#=> 10

### On Arrays... ###
a = [0,"111",2,3,3,3,3]
a.class
#=> [0,"111",2,3,3,3,3]
a.delete 3
#=> 3
a
#=> [0,"111",2]
a.delete_at 1
#=> "111"
a
#=> [0,2]
a.insert(1,"1")
#=> [0,"1",2]
a += [3,4,5]
#=> [0,"1",2,3,4,5]
a.inspect
#=> "[0,\"1\",2,3,4,5]"
a.map!{|v| (v.is_a? Numeric)? v : v.to_i}
#=> [0,1,2,3,4,5]
a = a.join "-"
#=> "0-1-2-3-4-5"
a = a.split '-'
#=> ["0", "1", "2", "3", "4", "5"]
a | ["1", "6", "7"]

#=> ["0", "1", "2", "3", "4", "5", "6", "7"]


### And Strings... ###
str = " trop d'espace tue l'espace... "
#=> " trop d'espace tue l'espace... "
str = str.strip
#=> "trop d'espace tue l'espace..."
str.crypt "Oz" # "Oz" est le 'sel'
#=> "Oz2SDpLQ4HL02"
str.count "e"
#=> 5

### Finaly, the Object#extend method ###
module Mod
def homerize
p "Doh!"
end
end

class Simpson
extend Mod
end

Simpson.homerize
# "Doh !"
#=> nil

bart = Simpson.new
# bart can't homerize, unless...


bart.extend Mod
bart.homerize
# "Doh !"
#=> nil

jeudi 24 juillet 2008

Algorithme Rho de Pollard en Ruby

L'algorithme Rho de Pollard permet de décomposer un entier en son produit de facteurs premiers. Cet algorithme se base sur une fonction dite aléatoire f, permettant d'obtenir une suite cyclique :

xi+1 = f(xi) % n


avec n l'entier à décomposer.

Attention, si :

pgcd(|xi - x2i|, n)

prend n pour valeur, l'algorithme produit une boucle infinie (il faudrait (y a qu'à...) alors changer la fonction f ou aller se faire cuire un steak de soja) : dans mon code, je lève une erreur, en l'occurrence.
Sinon, beaucoup de récursion...

Code prime.rb :
(Ruby 1.8.6 : $ prime.rb [integer])

def pgcd m, n
(n==0)? m : pgcd(n, m%n)
end

def f x, n
(x**2 + 1) % n
end

def x i, n
(i==0)? 2 : f(x(i-1,n), n)

end

class Integer
def is_prime?
res = true
if self < 2 then
res = false
else
for i in 2..Math.sqrt(self).to_i
if i.is_prime? and (self%i == 0) then
res = false
end

end
end
res
end
end

def pollard n
r = []

if n.is_prime?
r.push n
elsif n != 1
i, p = 0, 1
while p == 1
i += 1
p = pgcd((x(i,n)-x(2*i,n)).abs, n)
end

raise "Pollard Algorithm: Cycle FAIL" if p==n

if p.is_prime? then
r.push p
else
r.push pollard(p)
end

r.push pollard(n/p)
end
r.flatten!
r
end

input = ARGV[0].to_i
pollard(input).each {|x| puts x}

mardi 22 juillet 2008

Ruby : Plus ou Moins en moins de 100

Suite à cet article rigolo (tiré d'un blog tout à fait intéressant au passage), essayons de faire le jeu du "Plus ou Moins", en Ruby avec le moins de caractères possibles...

Code :
n=(100*rand).to_i;loop{d=gets.to_i;(d==n)?(puts "bravo !";break):puts((d>n)?"lower":"greater")}

Désolé, ça dépasse encore un poil... (ctrl ou pomme + molette)

95 caractères donc... mais pas top lisible. Je regrette surtout que ce ne soit pas "vraiment" en une ligne (objectivement, là, il y en a 3), mais on ne peut pas tout avoir...

jeudi 17 juillet 2008

Dummydgets pour Shoes : Bulles

Allez hop, deux petits programmes profondément inutiles faits avec les pieds, pour Shoes. Dans ces deux là, j'utilise le bloc motion{} qui permet d'effectuer une action en fonction de la position courante du curseur. La syntaxe est la suivante :


motion do |x,y|
foo(x)
bar(y)
foobar(x,y)
# etc...
end
Dès lors, le code contenu dans ce block (ici les méthodes foo, bar et foobar) sera exécuté dès que la position du curseur (désignée par x et y) change. Attention, l'axe Y est dirigé vers le bas (il serait plus rigoureux d'écrire |left,top| plutôt que |x,y|).

J'utilise aussi la méthode move(x,y) qui permet... de déplacer sa cible à la position (x,y). Easy, isn't it ?

Bubbles

Dans celui-ci, la fenêtre contient une dizaine de bulles qui se déplacent selon des fonctions plus ou moins complexes qui donnent une impression assez "chaotique"... mais en fait non.

Bubbles (pointeur non-représenté)

Le code est disponible ici, et l'image de fond ici (penser à modifier le chemin dans votre code).

Gogle Head

Là, le "dude" suit le curseur du regard lorsqu'on le déplace. Les trajectoires de mouvement des yeux sont simplement des cercles (attention, trigonométrie !). J'ai laissé en commentaire quelques lignes qui facilitent l'ajustement des caractéristiques des trajectoires, si certains veulent s'amuser en changeant l'image de fond (de préférence au format PNG).

Gogle Head (pointeur en haut à droite de la fenêtre,
non-représenté)


Le code est disponible ici, et l'image de fond ici (penser à modifier le chemin dans votre code).

Liens :

jeudi 10 juillet 2008

ShoesFests


Demain, Vendredi 11/07/2008 à partir de 8am GMT (soit 21H en France, Belgique, Suisse et Luxembourg ou 15H à Québec) pendant 24H, est organisée la ShoesFests sur le chan #shoes du réseau IRC Freenode (irc.freenode.net) ! Il s'agit de découvrir Shoes, le curieux toolkit de GUI de Why's The Lucky Stiff pour Ruby, d'écrire et partager de petits programmes avec Shoes en s'amusant, le tout en présence de Why's et d'autres rubyistes sympas. Cet event a pour but de tester et diffuser ce programme, tout en identifiant les problèmes de documentation et de clarté. Une seconde édition est prévue est prévue aux mêmes horaires le Vendredi 25 Juillet.

Après ça, on ne pourra plus dire que "Nobody Knows Shoes" !

Je vais essayer d'y passer demain soir, ça a l'air prometteur !


L'annonce chez :
More :

mercredi 9 juillet 2008

Omniscientificoclasme : 1 - Les langages de programmation

Je hais les omniscientifiques. Ceux qui croient tout savoir avec un aplomb digne de Chuck Norris : "Peu importe tes arguments, ma foi en mon propre savoir leur est supérieure.". Ceux qui gaspillent leur énergie à étaler leurs connaissances incomplètes. Ceux qui promeuvent leur culture et leur expériences seules, snobbant tout ce qui ne fait pas partie du cercle de leur "sélection" d'items de valeur. Ceux qui sont constamment blasés de tout (puisqu'ils l'ont déjà vu, lu ou fait, ou qu'ils connaissaient il y a déjà des lustres).


Les omniscientifiques ne sont pas omniscients : ils croient l'être.

Les omniscientifiques ne sont pas scientifiques : ils veulent l'être.


Il est temps de détruire cette engeance malfaisante. Et pour cela, il existe un moyen simple : détruire leur foi en leur savoir faussement complet. Comment ? En mettant en évidence les "trous", les "hiatus" et autres "manques" à leur connaissance, pour enfin faire renaître l'objectivité, l'humilité et la curiosité dans leur esprit biaisé.

Vous aussi, soutenez l'Omniscientificoclasme !


Allez, après la jolie intro, en avant Guingamp !

VOUS NE CONNAISSEZ PAS
TOUS LES LANGAGES DE PROGRAMMATION :


Vous ne connaissez pas GOTO++

GOTO++ est un langage exotique complètement loufoque. Son paradigme est "orienté goto" (vous avez bien lu !). Le GOTO++ doit son nom à l'instruction GOTOGOTO qui va à une étiquette "au pif" dans une liste donnée... Ses types de variables privilégiés sont les étiquettes, les chances, les pingouins, les troupeaux de pingouins, les bergers et les machines à pingouins. A noter qu'il y a aussi une tortue pour faire du dessin à la Logo.

Vous ne connaissez pas Scratch

Scratch est un langage de programmation développé par le MIT, spécifiquement pour les enfants. Basé sur Squeak (une implémentation dérivée de Smalltalk), il a principalement un but éducatif et est très visuel. Un point intéressant est que le langage est dans la langue maternelle de l'enfant (une vingtaine de langues européennes disponibles selon Wikipedia). Il est aussi assez orienté "multimédia" pour encourager le tout jeune hacker. Une guideline à noter (et approfondir peut-être) également est le principe du "Imagine-Programme-Partage" que l'on retrouve notamment dans Hackety Hack (dont on reparlera sans faute !).

Vous ne connaissez pas Factor

Factor est un langage dynamique basé sur la pile (dans la ligné de Forth donc). Il supporte également l'orientation objet, les macros à la LISP et les continuations. Mais ce n'est pas pour autant un langage exotique : toute plate-forme (sauf Solaris apparemment ?), bindings pour OpenGL, Cocoa, X11 ou Win32, client et serveur web, parser XML et autres, support de plusieurs BDD... Un "vrai" langage donc, encore moins connu que Io... avec un logo classe.

Dans notre lutte objective contre les omniscientifiques, ce n'est qu'une première bataille.
D'autres suivront !


NOTA : les images de cet articles appartiennent à leurs auteurs respectifs (Danil Kryvoruchko pour la première et probablement un propagandiste nord-coréen sans droit d'auteur pour la seconde).

mardi 8 juillet 2008

Règles de codage, mes amours

Il n'est pas rare d'avoir quelques règles de codage dictées lors du développement d'un programme dans une entreprise, ou dans un projet en général. En soi, c'est plutôt bien, ça rend souvent le code plus homogène, lisible ou maintenable. Certaines règles se justifient pour les besoins de performances, de documentation ou de fiabilité. Mais parfois...


  • Pas de ligne de plus de 131 caractères. Moral, mais pourquoi pas 132 ou 130 ?
  • Minimiser les boucles, mais maximiser leur portée. Hein ?
  • Pas d'identifieur (nom de classe, variable ou package) de plus de 31 caractères. Si ça parait évident, attendez de voir la suivante... (et celle d'après !)
  • Les noms des identifieurs doivent être clairs et représenter l'objet identifié. Par exemple, "Initialize_Space_Craft_With_One_Pilot" et non pas "Init_SC_with1_pilot". Hahahaha !!!
  • Interdiction d'utiliser use. RHAHahahaha... BANG!
  • Pas d'appel récursif. Boom.
  • Pas de condition IF sans ELSE. Peut se justifier par des raisons de fiabilité (le codeur a effectivement envisagé le cas contraire et écrit exlicitement null, avec commentaires dans le ELSE).
  • Dans les CASE-WHEN, interdiction d'utiliser when others. Moral pour la fiabilité (Ada95 plante si l'on omet un cas possible), parfois très pénible en pratique (heureusement que l'Ada admet les OR dans les CASE, parce qu'avec des litéraux de 15 à 20 entrées...).
  • Les variables doivent être déclarées dans l'ordre d'apparition dans le code. Dumbest rule ever.
J'en passe et des meilleures. L'important est surtout de mettre au point ces normes avant de commencer l'implémentation... Dommage pour certains, pas vrai ?

Mais quelles sont les règles de codage indispensables en réalité ? Celles qui apportent effectivement la lisibilité, la fiabilité et la maintenabilité ?

lundi 7 juillet 2008

iRant

Une fois n'est pas coutume, déversons un peu de bile contre un acteur important de l'informatique mondiale : Apple.


Cet article fait suite à l'achat par Lefty d'un câble alimentation pour son iBook, pour la modique somme de 75€ (français, nouveaux, TTC). Hahahahahurfff...

Apple fait de supers produits, certes. Jusqu'à il n'y a pas si longtemps, le matos était plutôt résistant, de bonne qualité, et surtout Apple était surtout un OS à toute épreuve : MacOS. Réputé sans virus, spyware et autres joyeusetés informatiques... Hélas...

Le fruit de la discorde : un logo trop cher.

Once upon a time, Macintosh c'était de drôles de PC avec des fenêtres, à l'époque ou Big Bilou jouait encore avec son caca sous DOS. Dans mon maigre souvenir, ces ordinateurs étaient très accueillants, simples et "ludiques". Et pourtant...


In the good old days...
-- Abraham Simpson

Le problème actuel d'Apple vient peut-être de cet aspect "ludique" présent dès le départ : jouant sur le côté design, "innovation technologique bien pensée" et se reposant beaucoup sur ses "fan-boys", la pomme commence à vraiment faire des erreurs.
L'iPod a révolutionné les lecteurs MP3 (entre autre avec l'AAC, touss touss...) mais la robustesse des différents modèles est assez relative. L'iPhone est sans doute un bon produit mais à quel prix ? Celui d'un cadre très supérieur qui n'a jamais les doigts gras (c'te chance !) et que ça ne dérange pas de devoir payer son abonnement très cher, chez un fournisseur unique (dans un premier temps). Quid du MacBook Air, horriblement cher pour ses perfs avec port Ethernet en option pour 29€ (???) et batterie non amovible ?



iButton, simplicity for Human Kind ($299,95)
-- Steve Jobs

Du côté logiciel, il y a aussi flottement... J'aime beaucoup iTunes, mais pas ses pµT4iN$ de processus (genre "Helper" !!!) qui tournent en permanence sans aucun raison. La suite bureautique iWork, à sa sortie, était assez ridicule avec tous ses formats uniquement accessibles en lecture et écriture par elle seule... Safari n'est pas un mauvais navigateur web, loin de là : il est basé sur WebKit (fork du moteur web de Konqueror (KHTML), logiciel génial de KDE sous Linux). Mais au niveau fonctionnalités c'est pas toujours pratique (pour les flux notamment), la sécurité est relative (pas mal de failles qui trainent trop longtemps ces derniers mois) , la sortie Windows ridicule dans ses premières versions et finalement assez peu personnalisable.


iHam: for real Apple fan-boyz mouf' (only $/kg 200)


A ce sujet, l'attitude d'Apple face au libre est assez ambivalente... Le projet Darwin semble assez poussif (même si pas inintéressant de base). Pareil pour ce qui est de l'ouverture des API, c'est pas franchement fabuleux... (et le format de sauvegarde disque, GRRR !!!)

Mais au niveau logiciel, ce qui est peut-être le plus gênant, c'est l'OS en lui même. MacOS X.5 ne me séduit pas vraiment. Tout comme Vista (la convergence entre les 2 OS étant de mise depuis le départ, malgré ce qu'on peut entendre là-dessus...), il me parait de plus en plus orienté vers l'"effet visuel", le widget et le "Oh-mon-Dieu-qu-il-est-beau-ce-doc-qui-brille-!!!". Bouffe ta RAM mec, fais toi plaisir... Pour ce qui est du fait que les Mac sont davantage touchés qu'avant par les virus, failles et autres, il faut reconnaître que le nombre croissant d'utilisateurs y est pour quelque chose, mais aussi l'utilisation bien plus intensive d'Internet qu'il y a quelques années seulement.


Tu retourneras poussière !
- Océdar

Bon allez, on en crâme un et on s'arrête là. C'est vrai que c'est cruel : Micro$oft, Sony ou Acer (et bien d'autres) méritent sans doute un châtiment bien pire pour leur pratiques et productions respectives. D'autant qu'au départ j'aime bien les Mac ! Mais au final, je ne risque pas de m'en payer un...



Nota : les images de cet article ne sont pas à moi, ni à Apple. Le vieil Apple II vient du blog de Giles Bowkett, l'iButton et l'iHam je ne sais plus, iSuck on s'en fout, et le "burnin' iBook" du site de Ratpoison. Enfin, le logo modifié est l'oeuvre du designer Mario Amaya.