Self.migrate(5.0.3) 5
Et bien voilà, ce blog, toujours propulsé par Typo bénéficie maintenant de la dernière version: 5.0.3.
Impréssionnante évolution dans l’arrière boutique.
Vous aurez remarqué, mon thème était tout cassé, du coup, je suis de retour avec Scribbish. J’adore :)
Un grand bravo a l’équipe !
Et XUL alors ! 3
Non de XUL !
Ce matin en lisant ce billet du sur lemondeinformatique.fr au sujet des risques liés à Ajax j’ai été surpris… Surpris par ce passage:
Ted Farrell, architecte en chef et vice-président outils et middleware d’Oracle, rappelle déjà qu’en raison de la jeunesse des technologies, les entreprises doivent être prudentes quand au choix de leur solution : il y a deux grands frameworks sur le marché, et entre Microsoft et Adobe, il vaut mieux qu’elles ne se trompent pas car elles risqueraient alors de se retrouver coincées pour des années.
Hmmm. On parles ici de Flex © Adobe Systems Inc. et SilverLight © Microsoft Corporation. je suppose.
Mais, arrêtez moi si je me trompe… Non, ..., personne ? bon, Flex et Silverlight ne sont pas les pendants de Xul ? Alors pourquoi on en parle pas plus ? Surtout que là, pour la peine, avec Xul on reste ouvert !
Rappel: XUL c’est eXtensible User Language (il me semble). En gros c’est du XML pour la description d’interface, CSS pour la présentation et Javascript pour l’interaction dans l’interface. Que de la technologie existante, ouverte, spécifié, standard...
Alors le bon pour choix pour ne pas s’enfermer ne serais pas XUL ? Ah oui. LE pépin de XUL. Il faut soit Firefox ou alors un XulRunner ...
Quoique, On voit apparaître doucement des moteurs reprenant les spécifications de XUL comme Lark (du XUL on Rails). Et a mon avis on a pas fini d’en voir… Je crois, et depuis un moment, que XUL est la bonne technologie pour les interfaces dit riche.
Cool URIs don't change 3
“good links are eternal links” (ou qqchose du genre)
Mais effectivement quelque chose du genre:
Et c’est pour respecter cette règle que le sauveur d’URI a encore frappé.
Il y a un moment maintenant, j’utilisais Dotclear, un bon moteur de blog en PHP. Mais voilà. Depuis je suis passé à Typo un moteur de blog en Ruby on Rails. Les URI de l’ancien blog on été indexé, et du coup ne pointe plus sur rien. Merci à Sunny de me l’avoir signalé.
Même mieux que ça, ce sauveur d’URI perdu a poussé le vice jusqu’à me fournir l’expression régulière qui va bien pour rediriger les anciennes URI vers les nouvelles.
Du coup, les URI du genre :
http://www.typouype.org/index.php/?2006/03/04/45-logo-debian-vs-logo-gnome
(si vous en rencontré encore) sont maintenant redirigées au bon endroit : http://www.typouype.org/articles/2006/03/04/logo-debian-vs-logo-gnome
Merci encore Sunny,
et n’oubliez pas:
Cool URIs don’t change !
Je ne traduit pas, c’est nul en français, et puis moi aussi je suis nul en anglais :-)
et bien sur à condition de faire ce qu’il faut pour qu’elles ne changent pas ;-)
Edit:
Je vous colle ici nonchalamment (comme dirais les gens du GCU-squad) la petite règle pour Lighttpd
$HTTP["host"] == "www.typouype.org" {
url.redirect = (
"^/index.php/(\?|)([0-9]+/[0-9]+/[0-9]+)/[0-9]+-(.*)$"
=> "/articles/$2/$3"
)
}
Ruby: new vs initialize
Pour certain c’est une évidence, mais un vieux mail sur la liste de diffusion de ruby_core ma donné envie de me pencher sur la question.
Venant du monde Java (enfin je n’en suis pas encore sorti), je suis un habitué du:
MacLasse monObjet = MacLasse.new();
pour Ruby ça devient:
mon_objet = Mac_lasse.new
Bon à part le typage dur de java versus le typage dynamique de ruby, pas de gros changement sur l’interprétation de la façon d’instancier un objet entre ces deux langages.
Par contre c’est sur la classe elle même que ça change pas mal.
En java MacLasse ressemble à ça:
public class MacLasse {
public MacLasse(){
// code a executer lors de l'instanciation de l'objet
}
}
et en ruby on se retrouve avec ça:
class Mac_lasse
def initialize
// code a executer lors de l'instanciation de l'objet
end
end
Cette methode en java s’appel un constructeur (ça c’est pour ceux du fond qui suivent pas hein ! ). On l’obtient en définissant une methode portant le même nom que la classe.
Pour ruby, peut importe le nom de la classe, on utilise une methode initialize.
Alors initialize est-elle une methode de type constructeur ?
Non. et en Java non plus finalement. Ces deux methode ne construisent pas l’instance, elle l’initialise. Elles permettent de préparer l’instance avant de la rendre. En java comme en Ruby, on peut très bien ce passer de ces methodes.
Maintenant on va s’éloigner de Java…
En Ruby on pourrais définir une methode new en lieu et place d’initialize. Non mais qu’est-ce que je raconte, heureusement y’en a au premier rang qui suivent. Merci.
Je reprend. En ruby on peut surcharger la methode new (Object#new) en plus de la methode initialize. Le seul hic, c’est qu’il faut faire attention. Cette methode new est censé créer l’instance de la class. Il faut donc penser à renvoyer la bonne instance en fin de methode (new pour les voisins du radiateur).
Voyons plutôt un petit bout de code:
class Test_initialize
def initialize
"test_initialiaze"
end
end
class Test_new
def self.new(*args)
"test_new"
end
end
class Test_new_2
def self.new(*args)
"test_new_2"
Object.new
end
end
test = Test_initialize.new
puts test.class # Test_initialize
test = Test_new.new("args")
puts test.class # String
test = Test_new_2.new("args")
puts test.class # Object
On le voit assez bien je pense: Surcharger new ne doit pas se faire à la légère. Utilisé initialize pour initialiser l’instance semble bien plus logique.
Là dessus Ruby montre bien un de ces principe de base qui veux que le langage soit simple et logique. Contrairement a Java ou l’on parle de constructeur en lieu et place de methode d’initialisation.
C’est de la sémantique c’est sur, mais le principe est là. J’aime ruby et j’aime bien java quand même :-)
Rake: sauvegarde de base de donnée 2
La bricabox hébergent ce blog, lacomte de jean-mi ainsi que l’eternel teaser (ou le teaser eternel tout dépend du point de vue comme d’habitude) zlab tourne avec OpenBSD, LighTTPD et Ruby on Rails.
Après ce link dropping permettant de vous cadrer le sujet, je vais vous parlé de Rake. C’est un peu la make, la fourmi travailleuse de ruby. Bien intégré avec Rails, ce petit outil vous permet de réalisé des scripts divers et varié. Non pas forcement de la compilation, puisque non nécessaire en général avec ruby, mais on peut par exemple lancer les test unitaires, et dans notre cas faire un backup de la base de donnée.
Et oui, cette outils manquais sur la bricabox. Les sauvegardes était à la charge de chacun, et manuel (peu de problème cependant pour le teaser zlab ;-)).
Je me suis inspiré de ce que j’ai pu trouver ici et là sur la toile, mais mis à mon goût. 3 taches sont disponible dans ce Rakefile:
- backup Executer un dump de la base mysql pointé par l’environnement rails (config/database.yml).
- clean_backup Nettoyer la liste des fichiers de backup disponible. Dans le cas de la bricabox, nous avons opté pour une sauvegarde journalière avec rotation à la semaine. On ne garde donc sur l’emplacement prévu à cette effet que 7 fichiers de backup. Charge a nous d’en faire une copie ailleurs de temps à autres ;-).
- mail Pas grand chose à voir avec le backup, mais j’en ai eu besoin. Peut-être il faudrais que je le sorte de là pour le mettre ailleurs… plus tard. Cette tache vas nous permettre d’envoyer un mail contenant les liens vers les fichiers de backup (pour un téléchargement en local si besoin/envie).
Pour exécuter une tache rake avec Rails, rien de plus simple. On se place dans le répertoire racine de l’application (ici typo huhu, il en manquais un dans le link dropping :-p). Puis on appel l’exécutable rake avec le nom de la tache à exécuter, ainsi que ces paramètres:
/usr/local/bin/rake db:backup DIR=/home/toto/backup RAILS_ENV=production
Les taches utilisent (enfin c’est conseillé) les espaces de noms de Ruby. Cela permet de ne pas trop ce mélanger les pinceaux.
namespace :db do desc "Backup the database to a file. Options: DIR=base_dir RAILS_ENV=production" task :backup => [:environment] do (...)
Si vous souhaitez vous inspirer de ce que nous avons mis en place libre à vous (pas de licence, donc domaine public ;-)).
au passage…
J’aime regardé du code (enfin quand il est beau hein). Oui je suis un voyeur, prenez moi pour un fou. Mais laissé moi vous montrer ici quelques lignes de ce fichier.
def all_backups
dir = Dir.new(backup_folder)
dir.entries.select{|e| e =~ /^#{RAILS_ENV}_dump_(.*)$/}.sort.reverse
end
Certain l’aurons compris, il s’agit de filtrer la liste des fichiers d’un répertoire pour ne récupérer que ceux qu’il nous faut.
Les regexp c’est beau, et j’ai encore tant à apprendre pour m’en servir au mieux. Ruby c’est beau, et j’ai encore tant à apprendre pour m’en servir au mieux.
c’est le refrain d’un futur teaser vocal :-p
La tache mail mérite sûrement d’être reprise, amélioré, intégrer au système de notification contenu dans Typo. Mais pour le moment ça marche comme ça
Et non je ne suis pas en vacance. Je n’avais rien a poster, c’est tout :-p