lundi, septembre 14, 2009

Zlib::BufError et repository de gems down

J'ai aidé aujourd'hui quelqu'un qui n'arrivait pas à installer watir sous windows, pourtant il faisait tout comme il faut ?! (install ruby one click installer + "gem install watir")
Il avait toujours le message d'erreur suivant: Zlib::BufError buffer error
En essayant sur ma machine, qui avait déjà watir installé, je me suis rendu compte que j'avais le même problème!
C:\>gem update watir --debug
Exception `NameError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:161 - uninitialized constant Gem::Commands::UpdateCommand
Exception `Gem::LoadError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:827 - Could not find RubyGem test-unit (>= 0)

Updating installed gems
Exception `Gem::LoadError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:827 - RubyGem version error: sources(0.0.1 not > 0.0.1)

Exception `Zlib::BufError' at c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:578 - buffer error
ERROR:  While executing gem ... (Zlib::BufError)
    buffer error
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:578:in `read'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:578:in `gunzip'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:165:in `fetch_path'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:219:in `load_specs'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:192:in `list'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:188:in `each'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:188:in `list'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/spec_fetcher.rb:123:in `find_matching'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/commands/update_command.rb:169:in `which_to_update'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/commands/update_command.rb:161:in `each'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/commands/update_command.rb:161:in `which_to_update'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/commands/update_command.rb:75:in `execute'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/command.rb:257:in `invoke'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:132:in `process_args'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:102:in `run'
        c:/ruby/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:58:in `run'
        c:/ruby/bin/gem:21
Je me suis douté que le serveur de gems était down même si le message d'erreur n'est pas clair du tout!
J'ai trouvé une astuce! On peut transformer sa machine en serveur de gem (mirroir) en lançant la commande:
gem server
On peut voir le résultat aux addresses suivantes:
L'autre personne a juste eu à faire:
gem install watir --source http://xxx.xxx.xxx.xxx:8808/
où xxx.xxx.xxx.xxx est l'ip de la machine où "gem server" a été lancé
Rem: je n'ai pas trouvé l'url que rubygems utilise mais je pense qu'il s'agit de http://gems.rubyforge.org/ et effectivement http://gems.rubyforge.org/gems renvoie une 403 forbidden :(
Technorati tags:

mardi, septembre 08, 2009

Javascript: Orienté Objet

J'ai enfin trouver le temps de regarder comment "bien" programmer en Javascript :)

Je ne suis pas sûr que ça me serve beaucoup, je suis plutôt un "script kiddies" du javascript. Générallement je récupère une lib, je fais quelques lignes de javascript pour faire un petit effet (fade...) et c'est tout!

Mais par curiosité personnelle, je voulais voir comment Javascript gérait l'héritage etc...

En fait c'est assez simple, il suffit de définir une classe et d'utiliser le mot clef "prototype" pour dire que la classe fille hérite de la classe mère.
Je trouve que le concept d'héritage en Javascript ressemble beaucoup à ce qui se passe en ruby avec le mot clef "include".

En tout cas je vous conseille le tutorial que j'ai fait et que je trouve très bien:

Technorati tags:

mercredi, août 26, 2009

Disparition de why et Ma présence online

Je viens de découvrir que why (un fameux codeur ruby) a "disparu".

Il aurait apparemment supprimé ses comptes en ligne (twitter, blogs etc...) http://ejohn.org/blog/eulogy-to-_why/


J'y pense de plus en plus également pour une raison assez simple: je sens que j'ai de moins en moins la maîtrise de ce qui est publié sur moi.

J'ai toujours choisi de parler de sujet "professionnel" mais avec l'avènement de réseaux tels que facebook, google social api, web semantic... font que les "fuites" sur ma vie privée sont de plus en plus nombreuses.

Typiquement je n'ai pas envie de voir ma famille, mes amis ou même mes vacances sur internet...
Globalement ces informations sont noyées dans la masse mais si on veut on peut trouver déjà beaucoup (trop) de choses sur moi...

Tout comme simon, j'essaye de dissocié au maximum vie privée / vie publique

En plus ces informations peuvent être obsolète ou même completement fausse comme par exemple sur 123people, cf mon post sur le sujet.

mardi, juillet 21, 2009

Découverte de Python

Cela faisait un petit moment que je voulais apprendre les bases de python... Quelques remarques que j'ai notées pendant que je déroulais le tutorial officiel
Général
  • Le nom Python vient des 'Monthy Python' pas du serpent > ce qui rend le laguage tout de suite plus sympatique ;)
  • Ca semble s'inspirer assez du C
    Ex: le print() me rappelle le print du C avec des améliorations
  • Utilisation de l'indentation plutôt que les {}...
    pourquoi pas, au moins ça évite les troll interminables sur les { à la fin d'une ligne ou au début de la ligne suivante :p
    Troll qui a dû au moins me prendre 2 journées de ma vie si on cumule toutes les discussions inutiles
  • Les types de base : list (qui sont aussi des stack, queue), set, dictionary (alias map en java) mais je n'ai pas compris la difference avec les tuples
  • Je trouve étrange d'introduire les complexes (i) dans le tutorial ?! Même si cette fonctionnalité est intéressante, elle ne sert pas tout les jours (jamais ?!)
Les plus
  • List/Tableau = même combat
    Contrairement à Java ou les 2 types de classes sont clairement séparées
    En Python ou Ruby la différence à beaucoup moins d'importance et c'est mieux
  • On peut itérer dans les chaines de caractères comme dans un tableau:
b = 'azerty'
for x in b:
print(x)
  • String indice ou slice
    Un peu surpris au début par la manipulation de chaines avec les indices (slices) mais on s'y habitue bien :)
    Et même ça me semble assez puissant ! (a voir si c'est lisible dans un programme plus complexe ou écrit par quelqu'un d'autre...)
>>> word = 'Help' + 'A'
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'
>>> word[:2]    # The first two characters
'He'
>>> word[2:]    # Everything except the first two characters
'lpA'
  • Une boucle for peut avoir un else
    Ca semble intéressant mais si je ne vois pas bien l'utilité (cas où il y a un break dans le for)
for x in range(2, n):
if n % x == 0:
  print(n, 'equals', x, '*', n//x)
  break
else:
  # loop fell through without finding a factor
  print(n, 'is a prime number')
Les moins
  • Pas de switch / case mais if ... elif ... elif ...
    Je trouve que les switch/case (même si je ne les utilise pas souvent) expriment mieux ce qu'on veut faire dans ces cas là et la synthaxe est plus concise...
    En java j'ai tendance à considérer pleins de elseif comme un code smell qu'il faudrait autre chose: un switch/case dans le cas les plus simple ou un pattern type builder ou command pour les cas les plus complexe
    Peut-etre juste un habitude à prendre
  • Ruby semble plus orienté object, exemple taille d'une chaine de char
python: len('azerty')
ruby: 'azerty'.size

mercredi, juin 17, 2009

Résistance sociale & langage de script

Justement en lisant cet article: "Why ? Language Archaelogy..." de Bruce Eckel, ça fait écho à ce que disait dans mon post précédent à propos de la résistance sociale lié au langage de script:
Like Smalltalk, everything in Ruby is fungible (this is the very thing that makes dynamic languages so scary to folks who are used to static languages)

lundi, juin 15, 2009

Ruby at ThoughtWorks

Excellent article (comme presque toujours) de Martin Fowler: Ruby at ThoughtWorks
Le sommaire devrait suffire pour vous donner envie de le lire:
Contents
    * The Shape of Our Projects
    * Questions About Ruby
          o Was Ruby the Right Choice?
          o Is Ruby More Productive?
          o Is Ruby Slow?
          o Is a Ruby Code-base Hard to Understand?
          o Is Ruby a Viable Platform
    * Some Development Tips
          o Testing with Active Record
          o Active Record Leaks
          o Long Running Requests
          o Deployment
          o Controlling Gems
          o Schedule Time for Updates
          o Developing on Windows
Les points qui m'ont interessé au vue de mon expérience avec ruby:
  • Développer sous Windows, c'est faisable mais pas évident (c'est d'autant plus frustrant lorsqu'on a fait beaucoup de java et que globalement toutes les lib en java sont indépendantes de l'os).
    la plus grande partie des problèmes que j'ai rencontré vient de l'utilisation dans des scripts Rake de commande système qui n'existent que sous *nix (ssh, etc...).
    Oui il y a cygwin mais bof
  • Le problème de l'adoption de ruby en entreprise est lié à 2 facteurs:
    langage de script perçu comme impossible à maintenir par rapport à un langage compilé (alors que j'ai tant de fois vu des programmes java impossible à maintenir tellement ils sont mal écrit...) et
    résistance sociale au changement (peur de se lancer dans une techno s'il n'y a pas eu déjà 200 articles dans "01 informatique")

lundi, mai 18, 2009

Ruby sous PSPad

J'utilise PsPad comme éditeur de fichier, il y en a pleins d'autres mais j'aime bien celui-là, je trouve qu'il marche bien ;)
Par contre je n'avais pas la coloration syntaxique pour ruby mais en fait tout est déjà fait, il suffit juste de l'activer!
L'explication est disponible sur le forum de PsPad.
En images ça donne :






mercredi, mai 13, 2009

Railsconf 2009 (Trop ?)

En regardant cette vidéo résumant la Railsconf 2009, j'ai plusieurs impressions contradictoires...
Les positives:
  1. il y a beaucoup d'activité dans la communauté rails
  2. il y a plein de sujets très variés qui sont adressés (donc l'argument comme quoi java possède plus de librairies que ruby s'effrite de plus en plus)
  3. La communauté grandit de plus en plus et donc les chances de faire du ruby tous les jours au boulot augmente
Les négatives:
  1. Ca part dans tous les sens
  2. Tout le monde essaye d'inventer son framework pour avoir un peu de gloire
  3. La plupart des frameworks/lib présentés vont tomber dans l'oubli dans l'année qui arrive
  4. Je n'ai pas le temps (et pas l'envie) de suivre tout ce qui se passe
  5. On est plus a l'époque des pionniers où il fallait créer soit même les librairies de base; ce temps est révolue (nostalgie)
En résumé, il y a trop de choses et je n'ai pas le temps / l'envie de suivre tout ça...

Je vais me limité à ce que je fais actuellement c'est à dire suivre les sujets qui m'intéressent au moment où j'en ai besoin pour me libérer du temps pour autre chose que l'informatique ;)

Sinon la video est bien mais un peu trop longue (34 min)

Un sujet qui a attiré mon attention un peu plus est jruby sur google app engine.

mardi, mars 31, 2009

PragDave@github

Je viens juste de découvrir qu'un de mes "guru" favori a un compte sur github ;) Hop "Follow" ! Je sens qu'il va s'y passer des choses intéressantes: "comments as rake desc" :)

lundi, janvier 26, 2009

Différences entre exec et system

Je n'aime pas trop la notation qui utilise les `` pour lancer une commande système parce que:
  • c'est facile de passer à côté et de les confondre avec un ' normal
  • parce que pour un novice c'est difficile à comprendre
  • etc. ...
Jusqu'à présent j'utilisais exec mais en voulant l'utiliser dans une boucle je me suis rendu compte que mon programme ruby s'arrêtait juste après l'exécution (sous windows mais je pense que c'est pareil sur d'autres os).
Dir["folder/foo_*.txt"].each do |path|
    cmd = "echo #{path}"
    exec(cmd)
end
Si on veut que le programme ruby ne soit pas interompu (la plupart du temps) il faut en fait utiliser system.
Dir["folder/foo_*.txt"].each do |path|
    cmd = "echo #{path}"
    system(cmd)
end