Blog

User blogs

Romain GEORGES

Tag cloud

POST #65Rubyzip (zip/zip) vs zipruby gem

Ajouté par Romain GEORGES il y a presque 5 ans

très interressant, surtout sur les stats du Garbage Collector

http://huangzhimin.com/2012/10/02/avoid-using-rubyzip/

POST #63Ruby est un LISP acceptable

Ajouté par Romain GEORGES il y a presque 5 ans

un vieux lien mais je trouve très intéressant alors je partage.

http://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp

POST #62const_missing, autoload V2, convention plutot que configuration

Ajouté par Romain GEORGES il y a presque 5 ans

je viens de tomber sur un post de Noah Gibbs sur Rubyflow [[http://www.rubyflow.com/items/8222-no-more-requires-autoload-classes]] et je trouve le concept intéressant, et utilisé intelligemment, (j'ai juste un peu enrobé l'affaire):

On peu régler les pbms de require une bonne fois pour toutes en faisant une surcharge de const_missing sur l'Object Ruby.

tel que :

# test_const_missing.rb
class Object
  def self.const_missing(c)
    require "./plugin" 
    Plugin
  end
end

Plugin.new.print_test

Et le code du plugin :

# plugin.rb
class Plugin
  def print_test
    puts "test!" 
  end
end

On peu généraliser, respectant le paradigme très Ruby, "Convention plutôt que configuration" :

de l'usage du snake_case (MonModuleGenial => mon_module_genial.rb), on crée ou ajoute dans sa/ses lib(s) utilitaire(s) :

# utils/to_underscore.rb
def to_underscore(string)
  string.gsub(/::/, '/').
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
  tr("-", "_").
  downcase
end

puis (je referai un post sur un solution complète d'init/utils avec recherche dans un Gem):

require "utils/to_underscore" 
# utils/override_object.rb
class Object
  def self.const_missing(c)
    if c =~ /^Plugin.*$/ then 
      plug_file = to_underscore(c.to_s).sub("_",'s/')
      require plug_file
      Object.const_get(c)
      puts "Loading plugin : #{c.to_s}" if $VERBOSE
     else
        STDERR.puts "Missing constant: #{c.inspect}!" 
     end
  end
end

le code d'un plugin :

# plugins/mon_module_genial.rb
class PluginMonModuleGenial
  def print_test
    puts "test!" 
  end
end
  1. dans le code de l'appli
PluginMonModuleGenial.new.print_test

POST #61FreeBSD / CVS la fin d'une histoire

Ajouté par Romain GEORGES il y a presque 5 ans

Après le code source de FreeBSD, les ports ont migrés, cette été, (j'avais pas vue, d'ou le post tardif) sur SVN, il ne doit plus rester beaucoup de projets, (gros projets) sur CVS.
La fin d'une époque..

http://blogs.freebsdish.org/portmgr/2012/07/16/ports-tree-has-been-migrated-to-subversion/

POST #60Full object ?

Ajouté par Romain GEORGES il y a presque 5 ans

On vient de le demander ce que signifie 'Full Objet' et la différence avec un langage Orienté Objet.

J'ai été joueur et j'ai répondu :

p titi = 12.+(45).*(2)' 
  => 114
p titi = (12 + 45) * 2' 
  => 114

quand on comprend ça, on fait le différence entre un opérateur et une méthode d'un objet, alors on comprend donc qu'en Ruby sauf de très rare mot clef du langage tout est objet et méthode d'un objet, dit différemment des messages envoyés et réçu d'objet vers d'autres objets, tel que

titi.message

est identique à :

titi.send :message

POST #59||= ou comment casser sa pipe

Ajouté par Romain GEORGES il y a presque 5 ans

Je viens de lire ça : http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html,
et je sais pourquoi je ne monadise pas !!!

POST #58Autoload => qui se traduit par chargement différé ...

Ajouté par Romain GEORGES il y a plus de 5 ans

autoload

En regardant micon (post précédant), je suis tomber sur un verbe Ruby que je ne connaissais pas!
On peut faire du Ruby depuis 10 ans et être passé à côté de ça ? et bien oui !
autoload qui d'ailleur est un faux ami,
Vous voyez le AUTOLOAD (démoniaque) de Perl, et bien "ça na rien à voir!"(c) zj, ic, prae(s) et ... ça me rajeunit pas tout ça...
il ne s'execute pas comme un pre-hook au require d'un fichier, mais il fait autre chose, "c'est comme Gif-sur-Yvette, c'est différent..." (c) les mêmes, (spéciale dédicace pour Ic, je suis nostalgique moi en ce moment....)

Explication

En fait le autoload Ruby, c'est bien ! surtout quand on code modulaire et que potentiellement certains modules ne sont pas exploités ou rarement mais qu'on veut pas se faire _ pendant l'initialisation de l'application, je m'explique par l'exemple :

Exemple :


$ vi mon_module_optionel.rb
--


module MonModule

  def MonModule::init
    puts 'initialisation'
    # init code
  end

  # methods ...
  def self.test
    #nop
  end

end

MonModule::init


test via irb

Avec require

irb(main):001:0> require 'mon_module_optionel'
initialisation
=> true

Avec autoload

irb(main):001:0> autoload :MonModule, 'mon_module_optionel'
=> nil
irb(main):002:0> include MonModule
initialisation
=> Object

Observation

On voit bien que le load réel (interpretation) est différé, mais le compilateur n'hurle pas de NameError, car il "s'attend" a trouver un namespace (module,classe) avec comme nom la Constante fournit à autoload.
en gros on enregistre le symbole du namespace :MonModule est on y l'associe à un wrapper qui va faire le require qui va charger le code, détachant le wrapper au profis du module ou de la classe voulue. c'est beau !

Dans l'exemple j'ai fait un include, mais MonModule.test aurait fournit le même résultat, jouer avec un classe aussi en faisant un new.

POST #57Micon : Injection de dépendance version Ruby => simple

Ajouté par Romain GEORGES il y a plus de 5 ans

Injection de dépendances et Ruby

j'ai parler dans mon dernier post de IoC : Design pattern Inversion of Control et de l'application : l'injection de dépendance, je vais pas rééxpliquer ici, mais je vais vous donner une solution,
très Ruby, très simple :

https://github.com/alexeypetrushin/micon

h3.comment ça s'installe ?

$ sudo zsh
# gem ins micon

Comment ça s'utilise ?

require 'rubygems'
require 'micon'
require 'logger'

micon.register(:logger){Logger.new STDOUT}

class Application

  inject :logger

  def run
    logger.info 'running ...'
    p logger 
  end
end

class Application2
  inject :logger

  def run
    logger.info 'running twice...'
    p logger
  end
end

Application.new.run

Application2.new.run

Le résultat

I, [2012-03-20T18:16:38.799969 #8203]  INFO -- : running ...
#<Logger:0xb72d776c @progname=nil, @logdev=#<Logger::LogDevice:0xb72d7730 @shift_size=nil, @shift_age=nil, @filename=nil, @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb72d7708 @mon_entering_queue=[], @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[]>, @dev=#<IO:0xb7468568>>, @level=0, @default_formatter=#<Logger::Formatter:0xb72d7758 @datetime_format=nil>, @formatter=nil>
I, [2012-03-20T18:16:38.800144 #8203]  INFO -- : running twice...
#<Logger:0xb72d776c @progname=nil, @logdev=#<Logger::LogDevice:0xb72d7730 @shift_size=nil, @shift_age=nil, @filename=nil, @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb72d7708 @mon_entering_queue=[], @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[]>, @dev=#<IO:0xb7468568>>, @level=0, @default_formatter=#<Logger::Formatter:0xb72d7758 @datetime_format=nil>, @formatter=nil>

Constat

Au passage j'ai fait deux Application avec deux injection pour bien vous montrez que mon component logger est bien un singleton

Remarque

Micon offre plus que la DI, mais aussi de la distribution de config et plein d'autres petites choses élégantes, dans un monde de pierres précieuses...

1 2 3 4 ... 8 (11-20/74)

Formats disponibles : Atom RSS