Blog

User blogs

Romain GEORGES

Tag cloud

test Rubygems Ultragreen GemCutter public Rails Ruby Apache Module Passenger Meta-programmation Streamlined plugin callbacks hooks divers humeur subversion FreeBSD nsswitch xkcd self describe humour comic GTD outils Ruote Openwferu rools BPM workflow engine gaming 3D moteur Codemasters EGO Engine perl rakudo fake ratage Ruby rules chat OSX restaurant japonais bon plan Paris bd Design patterns adapter code plugins index best practices aviation décorateur voiture parking RVM video Singleton classe variable de classe economie Union Européenne Espagne ordinogramme duck typing Actu virus guerre electronique logement Forwardable sarkozy criminalité manifs design pattern Itérateur Kerviel TGI Amendes surf mascaret gendarme ricard Drb parallelisme javascript emulateur gameboy alfresco java activiti mobile telephone scheduling timesheet gem business time usine à gaz bug Redmine I18N Freenode IRC scientologie J2EE jRuby Glassfish defined hashage SSL mod_ssl mod_gnutls 1.8 ActiveLDAP LDAP SEGFAULT rspec mock expectation ioc couplage tdd bdd DI dependency Injection inversion de controle micon require autoload operateur affectation full object méthode opérateur CVS SVN migration sources Ports class const_missing surcharge snake_case LISP langage impératif langage fonctionnel s-Exp lambda expression Flip Flop syntaxe garbage collector zip benchmark schéma Urbanisme deadlock Methodic threads processus POSIX UNIX fibers slideshow Array Check etoile style convention dust method private privee scope Test::unit ruby ruby2 refinement refine module meta-programmation réimplémentation methode mots clef définition freebsd fs partition gpart installation

POST #77Gpart : label de partition

Added by Romain GEORGES 9 months ago

Usage de label à la place de nom de disque

Principe

Merci à Olivier COCHARD, pris sur cette page :

http://olivier.cochard.me/bidouillage/installation-et-configuration-de-freebsd-comme-poste-de-travail#TOC-FreeBSD-Installer

En considérant que les partitions sont labélisees, à la création lord de l'installation de FreeBSD
Voici comment les utilisers dans votre fstab pour avoir les avantages suivants:

Si vous déplacez vos disques, cela n'impactera pas le fstab
C'est plus lisible

Affichez les labels que vous avez déclaré pour vos disques:


root@laptop:/root # gpart show -l
=>       34  490234685  ada0  GPT  (233G)
         34        128     1  (null)  (64k)
        162  480247680     2  ROOT  (229G)
  480247842    8388608     3  (null)  (4.0G)
  488636450    1598269        - free -  (780M)

re-labeliser des FS non labelisés

Dans cet exemple, la partion gpt n°1 de 64k (le boot-loader FreeBSD), et la partition n°3 de 4G (un swap) n'ont pas de label.
Commencer par leur en poser un:


gpart modify -i 1 -l BOOTLOADER ada0
gpart modify -i 3 -l SWAP ada0

Puis vérifier la prise en compte:


root@server:/ # gpart show -l
=>       34  490234685  ada0  GPT  (233G)
         34        128     1  BOOTLOADER  (64k)
        162  480247680     2  ROOT  (229G)
  480247842    8388608     3  SWAP  (4.0G)
  488636450    1598269        - free -  (780M)

Inutile d'aller vérifier dans le /dev/gpt la présence de ces labels: Ils apparaîtront qu'après un reboot une fois votre fstab modifié.
Modifier ensuite le fstab existant qui a cette forme:

Edition du /etc/fstab


# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     /               ufs     rw      1       1
/dev/ada0p3     none            swap    sw      0       0

Par:


# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/gpt/ROOT   /               ufs     rw      1       1
/dev/gpt/SWAP   none            swap    sw      0       0

Reboot

Puis re-démarrer pour vérifier que vous n'avez pas fait d'erreur…

POST #76Les mots clefs de Ruby 2.X

Added by Romain GEORGES 10 months ago

Ruby 2.X apporte les mots clef dans les méthodes ( en passant je vais devoir le prendre en compte avec Methodic http://rubygems.org/gems/methodic ;) )

du coup voici un bout de code pour bien comprendre la puissance que l'on a avec Ruby 2.X pour définir une méthode et son prototypage :

require 'pp'

class TestMotsClef
  def methode(requis, requis2,
         optionnel = "titi", optionnel2 = optionnel.upcase,
         *lereste,
         motclef: 'hello', motclef2: autre_methode(optionnel2, motclef),
         **autresmotsclef,
         &bloc)

    puts "requis : #{requis}" 
    puts "requis2 : #{requis2}" 
    puts "optionnel : #{optionnel}" 
    puts "optionnel2 : #{optionnel2}" 
    puts "lereste : " 
    pp *lereste
    puts "motclef : #{motclef}" 
    puts "motclef2 : #{motclef2}" 
    puts "optionnel : #{optionnel}" 
    puts "autresmotsclef :" 
    pp autresmotsclef.to_h
    puts "bloc :" 
    pp bloc.to_s
  end

  def autre_methode(a,b)
    return "#{a}_#{b}" 
  end

end

titi = TestMotsClef::new
pp TestMotsClef.instance_method(:methode).parameters
#=> [[:req, :requis],
#    [:req, :requis2],
#     [:opt, :optionnel],
#     [:opt, :optionnel2],
#     [:rest, :lereste],
#     [:key, :motclef],
#     [:key, :motclef2],
#     [:keyrest, :autresmotsclef],
#     [:block, :bloc]]

titi.methode("toto","tutu", "tata", "tyty",'touttou','tete',test: "test") do puts 'titi' end
# requis : toto
# requis2 : tutu
# optionnel : tata
# optionnel2 : tyty
# lereste : 
# "touttou" 
# "tete" 
# motclef : hello
# motclef2 : tyty_hello
# optionnel : tata
# autresmotsclef :
# {:test=>"test"}
# bloc :
# "#<Proc:0x000008019c10e0@ruy.rb:36>" 

titi.methode("toto","tutu",test: "test") do puts 'titi' end
# requis : toto
# requis2 : tutu
# optionnel : titi
# optionnel2 : TITI
# lereste : 
# motclef : hello
# motclef2 : TITI_hello
# optionnel : titi
# autresmotsclef :
# {:test=>"test"}
# bloc :
# "#<Proc:0x000008019c7490@ruy.rb:37>" 

POST #75J'aime le rafinnement

Added by Romain GEORGES 10 months ago

Il est souvent utile de modifier, pour un cas précis, une classe standard pour les ajouter des fonctions précises, on modifie la classe car on va devoir en faire plusieurs instances.

Typiquement dans le code de methodic http://rubygems.org/gems/methodic, j'avais besoin d'un push qui accepte les merges de tableau, tel que :

titi = []
titi.push [1,2]
titi.push [3,4]
p titi #=>[[1,2][3,4]]

class Array

  def push(*value)
    super(value)
    self.flatten!
    self.uniq!
    return self
  end

  def <<(*value)
    super(value)
    self.flatten!
    self.uniq!
    return self
  end

end

toto = []
toto.push [1,2]
toto.push [3,4]
p toto #=>[1,2,3,4]

je n'ai pas fait cette ré implémentation, car je n'aime pas trop modifier des objets aussi standards que Array.
J'ai donc fait un anti-pattern que j'assume, j'ai hérité Array en List et utilisé List dans mon code, ce que réduit certes l'opérabilité de methodic (type control, validation d'input, etc...), mais qui me met a l'abri des effets de bords d'une éventuelle réécriture par un autre gems :


class List < Array

  def push(*value)
    super(value)
    self.flatten!
    self.uniq!
    return self
  end

  def <<(*value)
    super(value)
    self.flatten!
    self.uniq!
    return self
  end

end

Avec Ruby 2.1, j'aurai fait différemment ( je le ferai probablement d’ailleurs dans une future version, dès que Ruby 2.X sera démocratisé) :


module ArrayExt

  refine Array do
    def push(*value)
      super(value)
      self.flatten!
      self.uniq!
      return self
    end

    def <<(*value)
      super(value)
      self.flatten!
      self.uniq!
      return self
    end

  end
end

titi = []
titi.push [1,2]
titi.push [3.4]
p titi #=>[[1,2][3,4]]

module Methodic
  using ArrayExt
  [...] 
  toto = []
  toto.push [1,2]
  toto.push [3.4]
  p toto #=>[1,2,3,4]
  [...]
end

Ce qui limite ma ré-implémentation à l'espace de nom de methodic, cqfd.

POST #74Tester une methode privée sur un objet

Added by Romain GEORGES 10 months ago

je viens de lire un article sympa
http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html
sur la méthode la plus clean pour tester une méthode privée.

il en site d'abord une avec un wrapper public mixé à l'object sur http://jasonrudolph.com/blog/2007/11/02/evan-phoenix-on-testing-private-methods-in-ruby/, c'est
intéressant (de toute façon toutes les méthodes sont altératrice de l'objet), mais ici on ne teste pas le méthode de l’extérieur mais le wrapper en fait.

Mais il propose ensuite un approche par plubicisation globale :

require 'rubygems'
require 'dust'
require 'test/unit'

class Ninja
  private
  def kill(num_victims)
    "#{num_victims} victims are no longer with us." 
  end
end

class Class
  def publicize_methods
    saved_private_instance_methods = self.private_instance_methods
    self.class_eval { public *saved_private_instance_methods }
    yield
    self.class_eval { private *saved_private_instance_methods }
  end
end

unit_tests do
  test "kill returns a murder string" do
    Ninja.publicize_methods do
      assert_equal '3 victims are no longer with us.', Ninja.new.kill(3)
    end
  end
end

Mais on pourrait éviter de tout publiciser à chaque fois, tel que :

require 'rubygems'
require 'dust'
require 'test/unit'

class Ninja
  private
  def kill(num_victims)
    "#{num_victims} victims are no longer with us." 
  end
end

class Class
  def publicize_method(meth)
    self.class_eval { public meth }
    yield
    self.class_eval { private meth }
  end
end

unit_tests do
  test "kill returns a murder string" do
    Ninja.publicize_method :kill do
      assert_equal '3 victims are no longer with us.', Ninja.new.kill(3)
    end
  end
end

du coup on altère le moins possible et on test bien la méthode elle-même

POST #73Toujours coder mieux

Added by Romain GEORGES 12 months ago

Toujours s'améliorer, de la bonne lecture (sans coloriage) :

http://gaslight.co/blog/resources-for-building-robust-rails-applications

POST #72Promis j'arrête de coder salement !

Added by Romain GEORGES about 1 year ago

Vu sur rubyflow.com :

http://batsov.com/articles/2013/06/28/the-elements-of-style-in-ruby-number-3-make-sure-something-is-an-array/

je traduis pour les non-anglophones :

C'est vrai qu'on voit souvent, dans mon code aussi :

paths = [paths] unless paths.is_a? Array
paths.each { |path| traitement(path) }

alors qu'un judicieux :

[*paths].each { |path| traitement(path) }

ou

Array(paths).each { |path| do_something(path) }

fait bien mieux l'affaire ... c'était simple pourtant ;)

Merci à l'auteur de se post luminothérapeutique.

POST #71Bonne lecture sur Ruby Processus, Threads, fibers ...

Added by Romain GEORGES over 1 year ago

trouvé sur rubyflow.com.

de la très bonne lecture, précise, conscise, tout comme il faut:

http://speakmy.name/2013/04/22/processes-threads-and-ruby/

POST #69Ruby : Classe Singleton (again) et RSpec

Added by Romain GEORGES over 1 year ago

j'avais déja parlé des classes singleton dans un post précédant : POST 26

tel dans test.rb, une classe Singleton :

class Test
     private_class_method :new
     @@inst = nil
     def Test.instance(*args, &block)
       @@inst = new(*args, &block) if @@inst.nil?
       return @@inst
     end
 end

executer :

  $ ruby -e "require 'test'; p test1 = Test.instance; p test2 = Test.instance" 
  #<Test:0xb72bbf80>
  #<Test:0xb72bbf80>
  $
le démontre bien, mais le démontrer via RSpec c'est plus sioux, mais pas plus dure :

Dans le fichier spec_test.rb :

require 'test'

describe Test do
  it "should be a Singleton" do
    test1 = Test.instance
    test2 = Test.instance
    test = (test1.inspect == test2.inspect)
    test.should be_true
  end
end

on exécute et ça donne :

$ rspec -fd spec_test.rb                                                                               0 13:59:36
#<Test:0xb72f2684>
#<Test:0xb72f2684>

Test
  should be a Singleton

Finished in 0.00155 seconds
1 example, 0 failures

CQFD

POST #68Methodic, and be methodic

Added by Romain GEORGES over 1 year ago

Bonjour, je viens de finir une nouvelle version de methodic suffisamment mature, une librairie Gem Ruby pour assister la gestion des arguments d'une méthode avec un hash d'options.
J'en suis certes le premier(seul) client, mais elle me rend de grands services.

voir :

a installer via :

  1. gem ins methodic

sur toute bonne Ruby-ready (so happy) machine

1 2 3 ... 8 (1-10/74)

Also available in: Atom RSS