[Paris on Rails 2006] Introduction a Ruby : notes

[Salut. Je vais essayer de poster mes notes, il y a peut-être des
erreurs de transcription ou d’interprétation (en plus des fois je ne
comprends pas ce que j’ai écrit :slight_smile: ), vous pouvez commenter.
Mes remarques personnelles sont indiqués NdU i.e. Note d’Underflow_.
Bonne lecture, – Jean-François. ]

Paris on Rails, vendredi 17 novembre 2006.

== Ouverture de la conférence - Richard P.

Un classique “Merci d’être venu et je tiens à remercier
nos partenaires”

== Présentation IBM - Michel Lara

IBM et l’open source :

  • Eclipse
  • offre Rational
  • developerWorks
  • softs gratuits : DB2 Express C, Websphere Application Server Community
    Edition
  • solutions IBM Software on Download

exemple d’article sur developerWorks : tutorial sur RadRails
(NdU:
http://www-128.ibm.com/developerworks/opensource/library/os-ecl-radrails/
)

9h48

== Introduction à Ruby - Laurent J.

Rails basé sur Ruby : choix pas innocent, couplage fort.

  • Ruby c’est quoi ?

historique. (Matz, Principe Of Least Surprise → langage très
orthogonal)
mariage réussi de plusieurs courants : SmallTalk, Lisp, Perl…
lisible : se lit comme l’anglais.

  • Installer Ruby

    • Windows : One click installer, Instant Rails.

    • Linux : dans les distros
      configure; make; make install; gem install rails

    (NdU: manque une étape, installer RubyGems, qui peut-être sera intégré
    dans Ruby mais pas pour le moment.)

    • Mac OS X
      • Leopard : livré avec ou via Locomotive.
  • Partout des objets et des messages

    • En Ruby tout est objet
      • un appel de méthode → envoi de message
      • tout objet : oui, mais : des conventions de nommage
        et des notations implicites pour pouvoir faire court

    “Ruby”.size
    [1, 3, 5, 7].reverse
    5.succ
    -10.abs
    puts “salut !”
    STDOUT.methods.grep(/print/)
    STDOUT.methods.grep(Regexp.new(‘print’)) ← NdU : manquait une
    parenthèse

→ approche classique script (on peut écrire en procédural)
ou approche objet

  • Quelques classes de base
    • String, Array, Hash, Integer (Fixnum, Bignum), Float,
      FalseClass, TrueClass, NilClass
      instance : true, false, nil
      gotcha : nil, false, 0, “” sont différents

(piège pour les devs PHP)

  • Conventions de nommage

    • NomDeClasse : LivrePoche
    • nom_methode, nom_variable : un_livre
    • methode_qui_questionne? : existe?
      → participe à la lecture
    • methode_dangereuse! : detruire!
    • @variable_d_instance : @titre
    • @@variable_de_classe : @@nb_de_livres
    • $variable_globale ou $VARIABLE_GLOBALE : $LOAD_PATH
    • CONSTANTE
  • Classes et méthodes

déclaration de classe
nom de classe
déclarations méthodes, variables d’instance, accesseurs,
constantes, classes imbriquées (rares)

class Avion
@@avion_fabriques = 0
attr_reader :moteurs
attr_accessor :altitude
def initialize(moteurs)
@@avions_fabriques +=1
end

delf self.quantite
@@avions_fabriques
end
end

zingue = Avion.new(2)
zingue.moteurs
zingue.altitude = 33000
Avion.quantite

  • Espace de nommage
    imbrication de déclarations de classe, ou de modules

les modules : pour structurer l’espace de nommage (hiérarchie de noms)
- permettre le mixin (voir héritage plus loin)
modules non instantiables.

(NdU : remarque : on ne peut pas instancier depuis un module mais
on peut instancier des modules depuis Module)

module ActiveRecord
class Base

end

class Livre < ActiveRecord::Base
end
ar = ActiveRecord::Base.new

  • Méthodes et paramètres
    passage de paramètres par référence
    valeur par défault
    paramètres nommés (détournement de Hash) => rires

    def edit(id)
    id = 10
    end

    mon_id = 5
    edit(mon_id)
    mon_id

    def save(flush=true)
    end
    save

    def modifier(args)
    puts args[:nb_pages]
    puts args[:auteur]
    end

    @livre.modifier(:nb_pages => 300…)

  • Héritage

    • modèle d’héritage simple
      classe Object : ancêtre de toutes les classes

    class MonControleur < ApplicationController
    def initialize
    super
    end
    end

c = MonControleur.new

#metaprogrammation
c.ancestors
c.respond_to? :delete
c.kind_of ? Object
“la faire courte”.send(“size”)
Marshal.dump(c, file)

  • ducktyping / typage à la canard
    • En Ruby, les paramètres ne sont pas typés

      • en pratique pas d’erreur de typage
      • sauf sur nil et c’est une bonne chose (valeur indéfinie)
        programmation avec erreurs de type
    • Ruby juge un objet sur ce qu’il est capable de faire pas
      sur un type défini statiquement.

      • Si un objet marche et fait coin-coin alors Ruby le voit
        comme un canard.
      • Un objet se définit par ses attributs et les opérations
        qu’il est capable d’accomplir, pas par un nom de type

Blocs et itérateurs

  • Blocs
    • blocs incontournable en Ruby
      {}
      do/end
      C’est un objet de la classe Proc
      Bloc : un bout de code Ruby avec un contexte d’exécution
      (NdU: mmmh, si ma prise de notes est correct, LJ dit qu’un bloc
      de code, c’est un objet Proc, ce qui est faux : un bloc de
      code (block) n’est pas un objet. Mais si on souhaite manipuler
      le block comme un objet, oui on passe par Proc avec une
      instanciation.)

b1 = Proc.new { puts 99 }
b1.call
b2 = Proc.new { |x,y| x+y }
b2.call(55, 45)

tableau = [1, 3, 10, 7, 11]
tableau.find_all { |elt| elt > 7 }

  • Itérateurs

upto
each
sort
arr.sort { |a,b| a.to_i <=> b.to_i }

transaction
for,while => itérateurs

  • closure
    bloc de code avec tout son contexte préservé

    File.open

    b1 = Button.new(“Start”) { transaction }

bloc s’exécute (il passe sur yield)

  • Classes intégrées

    • Type de Base : Object, String, Array, Hash, Range, Numeric…
    • Fichiers : IO, File, FileTest, Dir, Errno
    • Math
    • Autres
      Kernel, Exception, Process, Signal, Thread, ThreadGroup,
      Time, GC, Marshall, TrueClass, False, NilClass
  • Classes standards

    • database : dbm, gdbm…
    • protocoles réseau : Net Http… OpenSSL
    • Web/XML : REXML, SOAP, Yaml…
    • concurrence/distribution : dRuby, Rinda
      Thread, Mutex, Monitor
      SOAP = module le plus élégant SOAP sur le marché
    • Math : Complex, Rational, mathn, Matrix
    • Lib externes
    • Et beaucoup d’autres…

Ruby sait faire autre chose que des applis web.

  • Autres modules : les gems
    gems : packages logiciels de Ruby : dépendances,
    mises à jour, lib, exécutables et doc
    gem search active
    gem install pdf-writer
    gem_server : doc

  • Rails sur Ruby : pourquoi ?

    • syntaxe extensible
      has_many, has_one semble faire partie du langage Ruby → raccourcis

    • très forte capacité d’introspection et de réflexion
      évite les répétitions : lisibilité, expressivité des variables
      d’instance d’un modèle pour les rendre visibles dans la vue

    • instrospection des méthodes pour générer automatiquement
      le WSDL d’un service Web

    • création automatique d’accesseurs pour les modèles

User.find_by_name_and_passwd

  • Le Monde de Ruby

    • outils de développement

      • irb
      • debugger
        ruby -r debug
        pas à pas, point d’arrêt, pile d’appel
        (NdU: ruby-debug remplacement)
    • profiler
      ruby -r profile
      (ruby-prof remplacement 5x + rapide)
      rcov

    • outils de développement
      Emacs, vi, TextMate, RadRails : basé sur Eclipse
      FreeRide (écrit en Ruby)
      ArachnoRuby, Komodo

  • Futur de Ruby
    actuellement 1.8.5
    très stable release mineure tous les 6 à 8 mois.

    • Ruby 1.9 expérimental avant 2.0
      changement de syntaxe mineur
      des ajouts, des clarifications
      tout UTF-8 (auj ça pourrait être mieux)
      Machine virtuelle YARV récemment fusionnée

devrait 2.0 qq part en 2007
(tacle : machine virtuelle avec Perl)

bruit sur adaptation des VM existantes (JVM…) → JRuby, Ruby.NET

  • Références

rubyfrance.org


ruby-lang.org
RAA
RubyForge
Java : 10 things every Java prog should know about Ruby
http://onestepback.org/articles/10things

  • Livres
    Programming Ruby
    Ruby Way
    Ruby for Rails
    Ruby on Rails/Eyrolles

pas grand chose si vous allez en librairie
mais on a moins besoin de bouquins qu’en Java
(il y avait une photo qui comparait la pile de bouquins Java vs Ruby)
(NdU:

mais la photo date un peu, maintenant on pourrait rajouter les Ruby et
Rails cookbooks, les Rails Recipes…)

  • Questions du public
  • La grosse différence par rapport à Smalltalk / Seaside ?
    ce qui fait que c’est mieux ?

(NdU: Seaside framework Web basé sur les continuations écrit en
Smalltalk)

On n’est pas dans la même cour. On est plus grand public.
Java / C# c’est en gros la même chose. Mais quand vous arrivez
sur Smalltalk, faut passer le pas.
Smalltalk sur machine virtuelle (NdU: bien avant Java !), env
Pour interfacer avec du C : pas simple
Smalltalk, c’est super mais (NdU…mais quoi ? :slight_smile:
Java : verbosité en moins

  • Par rapport à Objective C ?

Que des choses biens
Cocoa → OpenStep, interface Step
techniquement rien à dire.
ça n’a pas percé mais C++ oui.
S’il fallait être bon techniquement dans le monde aujourd’hui…
Si Ruby décolle, c’est grâce à Rails.

  • lang intéressante
    travail sur la documentation à améliorer encore
    Unicode / UTF8 : ça pourrait être plus clean

  • Thread pas natif : avantages / inconvénients ?
    threads natif dans 2.0 ?
    (NdU: pas sûr que les green threads soient dispo dans 1.9.1)
    ça marche native threads

    – Jean-François.

Juste une remarque par rapport à “En Ruby, les paramètres ne sont pas
typés” qui peut porter à confusion : en Ruby tous les objets ont un type
(qui est déduit du contexte cf duck typing). Etant donné que ce ne sont
que des notes, je ne sais pas exactement ce que tu as voulu dire par
là.
++

yk

Jean-François a écrit :

Yann :

Juste une remarque par rapport à “En Ruby, les paramètres
ne sont pas typés” qui peut porter à confusion : en Ruby tous
les objets ont un type (qui est déduit du contexte cf duck typing).
Etant donné que ce ne sont que des notes, je ne sais pas exactement
ce que tu as voulu dire par là .

Ou plutôt ce que Laurent a voulu dire par là . si mes souvenirs sont bons
il parlait des arguments d’une méthode, exemple def hello(nom),
tu ne sais pas ce qu’est nom. Après comme tu dis, tu ducktypes
ou tu vérifies la classe. Et c’est la même chose pour les paramètres
d’un block, pourrait-on ajouter.

Maintenant, si on regarde les slides de Laurent (page 14), mes notes
sont plutôt corrects.

– Jean-Fraçois.