ActionMailer et TLS : reloaded

J'avais déjà évoqué comment se connecter à un serveur SMTP en TLS dans un billet précédent mais quelques petites choses ont changé ; finalement c'est encore plus simple.

Étant donné que cela fait un moment que le dépôt de Kyle est HS, le plugin est maintenant disponible ici :
http://svn.douglasfshearer.com/rails/plugins/action_mailer_optional_tls

Pour l'installer il suffit d'utiliser le gestionnaire de plugins en commande :
ruby script/plugin install http://svn.douglasfshearer.com/rails/plugins/action_mailer_optional_tls

Côté configuration j'évite de tout coller dans le fichier environment.rb et je passe plutôt par les initializers qui sont chargés automatiquement au boot de l'appli, et dont c'est le rôle finalement.

Tu peux donc créer le fichier .rb de ton choix (par exemple tls.rb) dans le dossier initializers avec la même config qu'auparavant :

config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_charset = "utf-8"
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
        :address => "smtp.domain.tld",
        :port => 25,
        :user_name =>'login',
        :password =>'pass',
        :authentication => :login,
        :domain => "domain.tld",
        :tls => true
}
config.action_mailer.perform_deliveries = true

Voilà pour la petite mise à jour.

Screencast français sur la réalisation d’une application Rails

Alors que je bloquais sur la capture de son sous Linux pour réaliser un screencast, j'ai passé le pas et j'ai donc réalisé un joli et assez volumineux screencast.

Le screencast que je vous propose dure pas moins de 1h20. J'y réalise une application avec le framework Ruby On Rails 2.0.2. Tout est commenté en Français ce qui est assez inédit je crois.

Au début, je réalise une application avec des méthodes agiles et création de test avant de les résoudre. Je crée l'application avec une génération par scaffold et modification pour un meilleur visuel.

Vous pouvez donc télécharger ce screencast ruby on rails en français.

Tout avis est le bienvenue. C'est un premier jet et il y a donc pas mal d'erreur.

Synchroniser Akregator et Google Reader, c’est pour bientôt.

La problématique

Même si on est de plus en plus dans une perspective full web où tout et n'importe quoi se transforme en webapp, dans bien des cas rien ne vaut une bonne application desktop.

Bien souvent, si l'on utilise un service online, c'est parce qu'on peut l'utiliser partout, et retrouver ses données dans l'état dans lequel on les a laissées.
Dans mon cas c'est ce dernier point qui m'a fait switcher d'Akregator vers Google Reader. Il est vrai que c'est pénible de n'avoir aucune donnée synchronisée d'un poste à l'autre.

Toutefois Akregator semble avoir fait pas mal d'avancées en la matière et de petites choses se mettent en place.
Un module de synchronisation a été créé et permet pour l'instant de synchroniser les flux en ajout et en suppression.
Pour l'instant il n'est pas possible de synchroniser les articles et leur état.

D'après l'équipe KDE en charge de ce module la difficulté n'est pas réellement technique puisque les API de google sont assez simples à utiliser.
Ce qui pose problème c'est que les informations ne sont pas stockées de la même manière d'un gestionnaire de flux à l'autre.
Toute la difficulté est de faire un module le plus générique possible puisque l'objectif est de pouvoir se synchroniser avec un maximum d'agrégateurs en ligne.

Disponible pour quand ?

Le module de synchronisation des flux uniquement devrait être disponible dans KDE 4.1.
Pour une synchronisation complète il faudra attendre la sortie du nouveau gestionnaire d'informations personnelles de KDE : Akonadi, ce qui devrait coïncider avec la version 4.2 de KDE.

Une preview ?

Suivi des évolutions des objets Model

Voici un nouveau billet rapportant quelques nouveautés de Rails edge futur 2.1 en cours de développement. Cette amélioration est du coté des Models. Désormais, ils arrivent à savoir quel attribut a changé ou non. Grâce à cette fonctionnalité, de nouvelles méthodes par introspection on été ajouté.

article = Article.find(:first)
article.changed?  #=> false

# Vérifie les changements des attributs individuellement
# avec attr_name_changed? accessor
article.title  #=> "Title"
article.title = "New Title"
article.title_changed? #=> true

# Accès au valeur précédente avec attr_name_was accessor
article.title_was  #=> "Title"

# On peux voit l'ancienne et nouvelle valeur avec attr_name_change accessor
article.title_change  #=> ["Title", "New Title"]

On peux aussi savoir quel champs ont changé et suivant quel valeur :

# Recupere une liste des attribut qui ont changé
article.changed  #=> ['title']

# Récupére un hash des attributs qui ont changé avec leur précédente et nouvelle valeurs
article.changes  #=> { 'title' => ["Title", "New Title"] }

Dès que vous enregistrez votre enregistrement alors cette fonctionnalité est complètement réinitialisée.

Un des grand avantage de cette fonctionnalité est l'ajout d'une nouvelle fonctionnalité possible au niveau de la mise à jour des données en Base de donnée. En effet, la requête généré peux être beaucoup plus faible. Actuellement, à chaque mise à jour, la requête SQL généré est composé de tous les champs de l'objet. Désormais on peux activer une option d'ActiveRecord pour permettre cela.

article = Article.find(:first)
article.title  #=> "Title"
article.subject  #=> "Edge Rails"

# Mise a jour d'un seul attribut
article.title = "New Title"

# Seulement l'attribut mis à jour est updaté dans la Base de donnée
article.save
  #=>  "UPDATE articles SET title = 'New Title' WHERE id = 1"

Pour activer cette option, il faut mettre : ActiveRecord::Base.partial_updates = true

Par contre pour les champs updated_at/on, ils ne seront modifié que dans le cas où un champs a réellement été modifié.

Activer la capture du son sous Linux pour xvidcap

Voulant tenter de faire des screencasts, j'ai jeté mon dévolu juste xvidcap. Durant, mon test, je n'arrivais pas à faire de capture du son. J'avais bien branché mon micro et je pouvais l'entendre dans les enceintes. Mais il n'était pas capturé. je vais donc indiquer toutes les modifications que j'ai réalisé pour que ça marche, car ce n'est pas la première fois que j'ai ce genre de problème.

XvidCap n'écoute que OSS

En effet, xvidcap n'écoute que le point /dev/dsp, il faut donc réaliser la compatibilité OSS si vous utilisez alsa.

Activer la capture du micro

Ensuite, il faut penser à vérifier que la capture du son soit bien activé dans alsamixer. Pour cela, il suffit d'aller sur la partie Capture d'alsamixer. Pour y arriver, une petite tabulation suffit. Le screenshot suivant montre le cas de capture désactivé.

screenshot d alsamixer avec la capture son desactive

Il suffit ensuite d'aller sur les éléments désactivés et d'appuyer sur espace pour valider la capture. On obtient ainsi l'écran suivant :

screenshot d alsamixer avec la capture son active

J'ai ainsi pu enfin réussir mon test de screencast pour réaliser les screencasts que je souhaite.

La vie en quelques définitions …

Bernard Werber, mon auteur préféré, a publié une liste de quelques définitions frappées au coin du bon sens.

Je pense que la plupart de ceux qui lisent ce blog seront particulièrement sensibles à la définition du consultant.

Contribution à Protoflow, un effet de coverflow en javascript

À la recherche du script cover flow

Dans le cadre de la réalisation d'un projet spécifique j'étais à la recherche d'un effet javascript permettant de simuler un coverflow sur une collection d'images.

Je suis d'abord tombé sur imageflow, que j'ai testé et qui fonctionne bien.

Mais de préférence je souhaitais un script basé sur prototype pour profiter de son incroyable potentiel puisqu'il est intégré à rails de base.
Je suis donc tombé sur Protoflow.

Protoflow plus sexy, mais avec moins de features

Le souci avec Protoflow c'est qu'il possédait moins de fonctionnalités qu'imageFlow, comme la gestion du clavier, de la souris et quelques soucis comme la mauvaise gestion des liens englobant les images.

En effet ces liens étaient désactivés en changeant leur cible (href à #), ce qui empêchait l'utilisation combinée d'effets comme lightbox.

J'ai décidé de mettre les mains dans le cambouis et de soumettre mes retours.
J'ai donc envoyé un patch pour accroitre le nombre de fonctionnalités.

Finalement le patch a été intégré \o/
Je trouve ça sympa de contribuer sur des projets externes de temps en temps.

Sortie de Ruby 1.8.7-preview1

Akinori Musha a annoncé la mise à disposition de la première preview de Ruby 1.8.7. Certains ajouts de Ruby 1.9.0 sont disponibles dans 1.8.7-preview1 : Object#tap, Integer#odd?, Integer#even?, Integer#pred, GC#stress, tout ce qui tourne autour des Enumerators (les méthodes d’Array ou d’Enumerable qui retournent un Enumerator si elles sont appelées sans bloc, comme Enumerable#find, etc.), reduce comme alias pour Enumerable#inject, Method#receiver, Method#owner… Securerandom a été rajoutée dans la stdlib. La liste complète des nouveautés est disponible ici

  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.bz2
  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.gz
  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.zip

Checksums:

  • MD5 (ruby-1.8.7-preview1.tar.bz2) = a916996720d8891f4f0bf0c9fbb5bb6c
  • SHA256 (ruby-1.8.7-preview1.tar.bz2) = e432ab1ab9b4570c0b7fe5c0c2730de0fda4c49a47811ea3a9170a311cf110b9
  • SIZE (ruby-1.8.7-preview1.tar.bz2) = 4007006
  • MD5 (ruby-1.8.7-preview1.tar.gz) = 522b8a1dffb04984a602d1d85b355a1a
  • SHA256 (ruby-1.8.7-preview1.tar.gz) = 19f17c9546a61dddf1a44d5f9b460e34a01440195b5375ce70000f89fa425f68
  • SIZE (ruby-1.8.7-preview1.tar.gz) = 4705632
  • MD5 (ruby-1.8.7-preview1.zip) = a754af64daa0613055b58813da50cd7d
  • SHA256 (ruby-1.8.7-preview1.zip) = 45fbbf34f04a750cf72d5e9a8a23412a57fd933dd077d3f23fd7be62e3478b32
  • SIZE (ruby-1.8.7-preview1.zip) = 5788496

Sortie de Ruby 1.8.7-preview1

Akinori Musha a annoncé la mise à disposition de la première preview de Ruby 1.8.7. Certains ajouts de Ruby 1.9.0 sont disponibles dans 1.8.7-preview1 : Object#tap, Integer#odd?, Integer#even?, Integer#pred, GC#stress, tout ce qui tourne autour des Enumerators (les méthodes d’Array ou d’Enumerable qui retournent un Enumerator si elles sont appelées sans bloc, comme Enumerable#find, etc.), reduce comme alias pour Enumerable#inject, Method#receiver, Method#owner… Securerandom a été rajoutée dans la stdlib. La liste complète des nouveautés est disponible ici

  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.bz2
  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.gz
  • ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-preview1.tar.zip

Checksums:

  • MD5 (ruby-1.8.7-preview1.tar.bz2) = a916996720d8891f4f0bf0c9fbb5bb6c
  • SHA256 (ruby-1.8.7-preview1.tar.bz2) = e432ab1ab9b4570c0b7fe5c0c2730de0fda4c49a47811ea3a9170a311cf110b9
  • SIZE (ruby-1.8.7-preview1.tar.bz2) = 4007006
  • MD5 (ruby-1.8.7-preview1.tar.gz) = 522b8a1dffb04984a602d1d85b355a1a
  • SHA256 (ruby-1.8.7-preview1.tar.gz) = 19f17c9546a61dddf1a44d5f9b460e34a01440195b5375ce70000f89fa425f68
  • SIZE (ruby-1.8.7-preview1.tar.gz) = 4705632
  • MD5 (ruby-1.8.7-preview1.zip) = a754af64daa0613055b58813da50cd7d
  • SHA256 (ruby-1.8.7-preview1.zip) = 45fbbf34f04a750cf72d5e9a8a23412a57fd933dd077d3f23fd7be62e3478b32
  • SIZE (ruby-1.8.7-preview1.zip) = 5788496

TicTac… Shoes