[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 ), 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 - En Ruby tout est objet
→ 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
- String, Array, Hash, Integer (Fixnum, Bignum), Float,
(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) => riresdef edit(id)
id = 10
endmon_id = 5
edit(mon_id)
mon_iddef save(flush=true)
end
savedef 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 - modèle d’héritage simple
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
- Si un objet marche et fait coin-coin alors Ruby le voit
-
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.)
- blocs incontournable en Ruby
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
- Ruby 1.9 expérimental avant 2.0
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
…
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 ?
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.