20 jan 11
TimeZone coté navigateur & RubyOnRails
Il est parfois utile d’afficher les dates et les heures selon la TimeZone de l’utilisateur dans nos applications Web.
Il y a la manière que l’on retrouve le plus (pénible à mon gout) qui consiste à la faire choisir à l’utlisateur via un énorme <select>, ceci qui ressemble à peu près à ça :

De plus, il faut ensuite stocker cette TimeZone en base de données ou dans un cookie. Bref, pénible pour le développeur et pour l’utilisateur.
C’est pourquoi, le mieux serait d’obtenir la TimeZone du navigateur directement. Malheureusement, les navigateurs n’envoient pas de header HTTP avec la TimeZone configurée sur la machine (un peu comme pour les locales). La seule manière donc, est d’utiliser Javascript.
Dans le petit script ci-dessous, on va stocker dans un cookie l’UTC offset.
var TimeZone = (function () { function getOffset() { return -(new Date().getTimezoneOffset()) * 60; } function init() { var offset = getOffset(); if (offset != Cookie.get('time_zone_offset')) Cookie.set('time_zone_offset', offset); } return { 'init': init } })(); document.observe('dom:loaded', TimeZone.init);
Note : les méthodes Cookie.get et Cookie.set sont issues d’un autre bout de Javascript. Demandez-moi si vous en avez besoin.
Maintenant coté serveur (Rails), on va changer la TimeZone en fonction de la valeur de ce cookie :
class ApplicationController < ActionController::Base before_filter :set_time_zone_from_cookies private def set_time_zone_from_cookies if cookies['time_zone_offset'].present? Time.zone = cookies['time_zone_offset'].to_i else Time.zone = Rails.configuration.time_zone end end end
On se retrouve maintenant avec les dates et les heures qui s’affichent correctement partout dans le monde.
16 avr 09
Mix Drum ‘n’ Bass : deuxième partie
Après mes premiers essais, il est temps de remettre ça !
Alors c’est simple, pour écouter c’est là :
… et pour télécharger l’intégralité du mix c’est ici.
Le mix fait 40 minutes pour 20 titres :
- Aphrodite – Mind Breaks
- Xample – Contra
- Phetsta – Dutty Funk
- State Of Mind – Real McCoy
- Logistics – Toytown
- State Of Mind – City On Fire
- Culture Shock – Machine
- Sub Focus – Swamp Thing
- Moving Fusion – Now’s The Time
- Moving Fusion – Guy Fawkes
- State Of Mind – Deadzone
- Hive – Neo Remix
- Chase & Status – Pieces
- State Of Mind – Dark Man
- Sub Focus – Scarecrow
- Calibre – Two Drop
- Logistics, Shimon & Andy C – Colour Wheel
- Teebee – Warehouse
- Akira – Expedition
- Alix Perez – Dubrock
09 jan 09
Andy C – Global Gathering 2008
Je suis tombé il y a peu sur un très très bon live d’Andy C. Cela vaut le coup d’être partagé (pour ceux qui supportent la D&B), alors voilà :
Et pour le télécharger c’est là.
23 juin 08
Fixtures on Rails 2.1
Suite à mon précédent billet concernant la création d’un jeu de données propre à une migration en utilisant les fixtures ainsi qu’aux nouveautés concernant les migrations dans rails 2.1, quelques ajustements ont du être effectués.
Les fichiers de migrations sont désormais préfixées par un timestamp (exemple : db/migrate/20080618211857_create_admin_user.rb) et non plus par un simple identifiant incrémental. Vos fichiers de fixtures doivent désormais être préfixés par ce même timestamp (exemple : db/fixtures/20080618211857_users.yml).
Voici donc le script lib/create_fixtures.rb mis à jour :
module MigrateFixtures FIXTURES_LOCATION = File.dirname(__FILE__) + '/../db/fixtures' MIGRATIONS_LOCATION = File.dirname(__FILE__) + '/../db/migrate' def self.extended(object) class << object alias_method :migrate_without_fixtures, :migrate unless method_defined?(:migrate_without_fixtures) alias_method :migrate, :migrate_with_fixtures end end def migrate_with_fixtures(direction) migrate_without_fixtures(direction) return if :down == direction migration = current_migration cnx = ActiveRecord::Base.connection files = fixture_files.find_all do |file| file =~ /\/#{migration}_/ end files.each do |file| table_name = file.gsub(/.*\/\d+_(.*)\.yml/, '\1') say_with_time("Adding #{table_name} fixtures") do Fixtures.new(cnx, table_name, nil, file.gsub(/(.*)\.yml/, '\1')).insert_fixtures end end end private def current_migration version = ActiveRecord::Migrator.current_version file = migration_files.find do |f| version = '%03d' % version if version.to_s.size < 3 f =~ /\/#{version}_/ end index = migration_files.index file file = index ? migration_files[index + 1] : migration_files.first file.gsub(/.*\/(\d+)_.*/, '\1') end def fixture_files @fixture_files ||= Dir["#{FIXTURES_LOCATION}/[0-9]*_*.yml"].sort end def migration_files @migration_files ||= Dir["#{MIGRATIONS_LOCATION}/[0-9]*_*.rb"].sort end end ActiveRecord::Migration.extend(MigrateFixtures)
Note : Cette version est compatible avec les anciennes version de rails.
27 avr 08
iSport
Voici une petite appli Web adaptée pour iPhone / iPod Touch : iSport.
Elle permet d’avoir les informations sportives ainsi que les résultats des matchs en direct (pour l’instant, que Fooball, Tennis, Basket US et Rugby).
La chose utilise Ruby, Rails, Hpricot et comme d’habitude : Prototype.
Quelques screenshots pour la peine :


Des retours et / ou commentaires sont les bienvenus !
15 avr 08
mount /dev/null
Ce matin un collègue a trouvé un gentil mot de notre administrateur système :

29 fév 08
Diff SVN
En regardant le script de davux, permettant la colorisation d’un diff, je me suis dit qu’il devait y avoir une possibilité d’intégrer ça de manière simple à subversion.
Collez ce petit script dans un fichier (nous allons prendre ici /usr/local/bin/colorized_diff) et rendez le exécutable :
#! /bin/sh plus='^[[0;32m' minus='^[[0;31m' diff "$@" | sed 's/^+.*$/'"$plus"'&^[[0m/; s/^-.*$/'"$minus"'&^[[0m/'
Ensuite, modifiez le fichier ~/.subversion/config pour y rajouter ou modifier la ligne suivante dans la section [helpers]:
diff-cmd = /usr/local/bin/colorized_diff
Vous pouvez omettre le chemin (/usr/local/bin) si il est dans votre PATH. Maintenant, un svn diff dans un shell vous affichera les lignes supprimées en rouge et les lignes ajoutées en vert. C’est pas plus mignon ?
Note : ^[ est le caractère d’échappement, vous pouvez le taper dans vim en faisant Ctrl-V puis Echap

