jeudi 13 juin 2013

[Ruby] duel de méthodes : send vs instance_eval

Ces derniers jours je me suis retrouvé confronté aux méthodes #send et #instance_eval d'une instance d'un objet ruby quelquonque.

A priori ces méthodes font la même chose : elles exécutent du code passé en paramètre.

Pour la suite de l'article, nous utiliserons la classe suivante :

class Jedi

   def initialize
       @action = "t'harponner"
   end

   def slice
       "J'utilise mon sabre laser, écarte toi !!"
   end

   def use_force action
      "Je vais te #{action} avec la force!"
   end

end
Pour #send, il s'agit de passer le nom du message sous forme de symbole ou chaîne de caractère, suivi des paramètres.
Jedi.new.send :slice   #=> "J'utilise mon sable laser, écarte toi !!"

Jedi.new.send :use_force, 'persuader'   #=> "Je vais te persuader avec la force!"
Pour #instance_eval, il s'agit de passer du code à évaluer avec une chaîne de caractère ou un bloc.
Jedi.new.instance_eval 'slice'   #=>"J'utilise mon sable laser, écarte toi !!"

Jedi.new.instance_eval ' use_force "persuader" '   #=> "Je vais te persuader avec la force!"

Jedi.new.instance_eval { use_force "persuader" }   #=> "Je vais te persuader avec la force!"
La différence entre les deux méthodes vient de leur portée.

#intance_eval exécute le code dans le contexte de l'objet recevant la méthode #instance_eval.

Alors que #send exécute le message dans le contexte dans lequel il est appelé.

Des exemples sont bien plus parlants :
  irb > jedi = Jedi.new
  irb > @action = "Dark Vador-iser"

  irb > jedi.send :use_force, @action
  => "Je vais te Dark Vador-iser avec la force!"

  irb > jedi.instance_eval { use_force @action }
   => "Je vais te t'harponner avec la force!"
Alors convaincu ?!


Et merci à Greg pour avoir vérifier tout ça dans irb :)

lundi 2 avril 2012

Paramétrer Debian sur batterie avec laptop-mode-tools

Pour gérer le matériel lors du changement d'état de la batterie, laptop-mode-tools est indispensable.

Mais il faut encore le paramétrer aux petits oignons.

Sur le Lenovo Thinkpad X220 Tablet, j'avais un lag sur l'écran tactile uniquement lorsque j'étais sur batterie.
Cela parce que laptop-mode-tools, par défaut, mets les périphériques usb en veille.

Egalement, quand je travaille sur batterie, je n'ai pas besoin du bluetooth.

Passons aux choses sérieuses : le paramétrage.

Les différents fichier de configuration pour le matériel se trouve dans /etc/laptop-mode/conf.d.

un petit ls montrera que l'on peut agir sur pratiquement tout le matériel.

Prenons mes besoins : le bluetooth et mon écran tactile, un périphérique usb.


# cd /etc/laptop-mode/conf.d


Bluetooth


# vi bluetooth.conf


Pour le désactiver automatiquement au passage sur batterie, il suffit de mettre d'avoir la ligne :


BATT_ENABLE_BLUETOOTH=0


USB

L'usb est un peu moins simple à gérer. Car on ne veut pas activer/désactiver l'ensemble des périphériques usb.
On ne veut pas non plus supprimer la mise en veille automatique (au bout de 2s) du paramétrage par défaut.

Le fichier à éditer est avec les éléments suivants :


# vi /etc/laptop-mode/conf.d/usb-autosuspend.conf



AUTOSUSPEND_USE_WHITELIST=0


pour utiliser la blacklist de matériels : ceux à ne pas suspendre automatiquement.

Ensuite il faut les déclarer dans cette blacklist.
La configuration de laptop-mode permet de déclarer les périphériques usb par leur id ou leur nom.

avec l'id du périphérique usb :


AUTOSUSPEND_USBID_BLACKLIST="056a:00e6"


On obtient cet id avec la commande suivante :


$ lsusb
Bus 001 Device 001: ...
...
Bus 002 Device 003: ID 056a:00e6 Wacom Co., Ltd


En effet, l'écran tactile est un périphérique usb de type Wacom ;)

Pour déclarer le périphérique usb avec le nom de son driver, il faut renseigner ce dernier au niveau de la ligne :

AUTOSUSPEND_USBTYPE_BLACKLIST=""

En commentaire, il est écrit ceci :


# The list of USB driver types that should not use autosuspend.  The driver
# type is given by "DRIVER=..." in a USB device's uevent file.
# Example: AUTOSUSPEND_USBID_BLACKLIST="usbhid usb-storage"


Mais je n'ai pas su trouver comment obtenir le nom du driver d'un périphérique usb.
N'hésiter pas à mentionner comment faire dans un commentaire...

Il est également possible de lancer ou d'éteindre des programmes selon les événements de la batterie dans le fichier start-stop-programs.conf .

Laptop-mode permet également de lancer des scripts au changement d'état de la batterie : débranchement ou rebranchement du câble d'alimentation électrique.

Ces scripts sont à mettre selon la nécessité dans les répertoires de /etc/laptop-mode :

  • batt-start → ensemble de scripts à exécuter quand on entre en mode batterie
  • batt-stop → ensemble de scripts à exécuter quand on sort du mode batterie
  • lm-ac-start → ensemble de scripts à exécuter quand on entre en mode sur secteur
  • lm-ac-stop → ensemble de scripts à exécuter quand on sort du mode sur secteur
  • nolm-ac-start → ensemble de scripts à exécuter quand on entre en mode sur secteur au repos
  • nolm-ac-stop → ensemble de scripts à exécuter quand on sort du mode sur secteur au repos
Je vous laisse découvrir les nombreuses autres possibilités qu'offre cet outil complet qu'est laptop-mode-tools.

En commentaire, n'hésitez pas à dire quelle configuration vous avez réalisé sur votre machine ;)

source: http://doc.ubuntu-fr.org/laptop-mode-tools

mardi 20 décembre 2011

Rails 3.* : Routes avec un param automatique

En travaillant sur les urls d'une application Rails 3 et particulièrement sur les namespaces, j'avais besoin du côté de mes controllers d'un paramètre à exploiter.

Cependant ce paramètre devait être complètement transparent tant pour les controllers que les vues de l'application. En fait il devrait dépendre complètement de mes urls.

Ruby on Rails, en tant que framework nous offre de nombreux moyen.

Pour cet article, nous travaillerons exclusivement dans le fichier config/routes.rb

Prenons comme exemple le cas d'une application pour gérer mon magasin de vente d'articles divers.
Aussi, il me faut une interface pour gérer les stocks et une autre pour les commercialiser.

Donc dans mon application, je vais avoir de la sorte deux 'namespaces' : Stock et Vente qui se traduiront au niveau des url par /stock/articles et /vente/articles

Pour cela nous allons utilisé les namespaces ou scopes dans le routage de Rails :

namespace :stock do
resources :articles
end

namespace :vente do
resources :articles
end
Le problème de cette solution est que dans mes controllers, je ne sais pas aisément dans quel namespace je suis à moins de parser mon url.
D'autre part ce n'est pas très DRY.

Pour savoir systématiquement et aisément dans quel namespace je me trouve, 'stock' ou 'vente', le mieux est d'utiliser le hash params, bien connu quand on traite des données transmises par formulaire.

Nous utiliserons donc params[:namespace] que l'on retrouvera à chaque fois que nous aurons une url de la forme /stock/articles ou /vente/articles. Celui-ci aura la valeur 'stock' ou 'vente'. Rails offre deux possibilités. Celle que l'on trouve dans tous les guides utilise le scope :
scope ":namespace", :module => 'stock', :as => 'stock' do
resources :articles
end
Ainsi à chaque fois que l'on appelera l'url /stock/articles, on aura un params[:stock]='stock'. Les options :module et :as permettent d'avoir le même comportement qu'un namespace. Avec :module il ira chercher le controllers dans app/controllers/stock/articles_controller.rb. Et avec :as il créera les helpers stock_articles_path et stock_articles_url.

C'est vérifiable avec la commande rake routes.

Cela n'étant pas très élégant, on écrira ces routes avec namespace et lui définir un params par défaut qui existera systématiquement dans ce namespace.
namespace :stock, :namespace => :stock do
resources :articles
end
Et voilà avec 2 options en moins et une meilleure lisibilité de notre fichier de route, nous avons le même comportement.
Ensuite on fait la même chose sur 'vente' ou on boucle sur un Array [:stock, :vente].

Cette fonctionnalité ouvre de nombreuses portes.
En effet quelque soit le type de routes écrites avec 'match', 'get' et tout autre verbe RESTFul, on peut définir un params par défaut pour celle-ci en ajoutant
:nom_du_param => valeur_du_param.
Voilà pour la petite astuce, en espérant qu'elle soit utile au plus grand nombre.

jeudi 1 septembre 2011

Panne générale de mon site web

Je fais face à une grosse panne internet !
C'est la raison pour laquelle mon site web www.sebthemonster.homelinux.com est indisponible depuis 1 grosse semaine, et le sera encore jusqu'au 15 Septembre.

Je suis vraiment désolé.

Cependant rassurez-vous, si vous avez fait preuve de patience jusque là, endurez encore un peu, car les courses que vous avez manquées seront rattrapables dès le retour à la normale.

Merci à tous pour votre fidélité !

mardi 2 novembre 2010

Android 2.1 "Eclair" tethering sur Linux Ubuntu avec Proxoid

Me voilà passer sous Android, venu de l'iPhone... et comme sur l'iPhone... la première chose à faire, c'est l'utilisation de ces téléphones high-tech comme modem.

Après, on paye bien un forfait internet illimité (dans la limite du fairway évidemment :( )
Tout d'abord, je précise que je suis sous Ubuntu 10.10. Mais cela devrait fonctionner tout aussi bien sous Ubuntu 10.04.

Nous verrons ainsi comme installer le tethering sur le PC puis comment l'utiliser facilement.

Cette méthode est fonctionnelle pour Android 2.1 "Eclair". Pour Android 2.2 "Froyo", il n'est pas nécessaire d'en passer par là. Cela fera l'objet un autre article... promis ;)