Ruby on Rails propose des méthodes « create_table » et une fonctionnalité « db:migrate », qui permetten de créer la base de données de votre application.
Des exemples sur « Migration » sont disponibles avec l’API du framework.

Par défaut, l’outil crée un champ « id », qui est la clé primaire de votre table.
Vous pouvez modifier cela avec les options « id » et « primary_key » lors de l’appel à la fonction create_table.
Ainsi, pour créer une table « test » sans clé primaire, il vous faut faire :

create_table :test, :id => false do |t|
end

Vous pouvez également créer une table avec une clé primaire qui se nommerait « myId »

create_table :test, :primary_key => "myId" do |t|
end

Mais vous pouvez également désirer créer une table avec deux champs comprenant la clé primaire. Vous pouvez essayer de mettre deux champs dans primary_key malheureusement, cela ne fonctionne pas (vraissemblablement car certains SGBDR ne gèrent pas la création de clé primaires constituées de deux champs).

Il va donc falloir tricher. Sachez déjà que notre base ne sera pas en 3e forme normale.

Créeons donc d’abord une table « user_access » avec deux champs : user_id et access_id

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end

Maintenant il nous faut déclarer nos deux champs comme étant des index.

add_index :user_access, [:user_id, :access_id], :unique

Nous créeons donc un index unique contenant nos deux champs. Nous n’avons pas de clé primaire à proprement parler. Mais le SGBDR traitera la chose de la même manière.

Le code en entier :

class AddUserAccess < ActiveRecord::Migration
def self.up

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end
add_index :user_access, [:user_id, :access_id], :unique
end
end

Heh toi la ! Si tu es concerné par un ou plusieurs des éléments suivants, je te conseille fortement de lire ce billet !

  • Tu a téléchargé Firefox 10 fois rien que le jour du download day pour permettre à mozilla d’être dans le livre des records
  • Tu a installé Firefox sur les machines de toute ta famille, de tous tes amis et même de ton chien (ou de ton chat si tu t’appelles glooze)
  • Tu teste Firefox 3 depuis la première béta sans pouvoir utiliser tes extensions favorites parce qu’elles sont pas à jour
  • Tu colle des stickers firefox partout dans le tram, les bus, le métro et même sur ta voiture
  • Ton animal préféré est le panda roux
  • Tu te balades pieds nus au boulot

Ben tu peut aller te faire voir parce que tu es pas invité à la soirée firefox 3 à Paris ce soir. Qu’est-ce que tu veut mon grand, t’es pas un VIP. Ton engagement dans Firefox et le logiciel libre est pas assez grand.
Un peu de bonne volonté bon sang !

Ils en parlent aussi :

Suite à l’invitation de Denis [Edit]et à celle de Sarah [/Edit] et à l’initiative de Tibaud, je dois raconter mon programme pour ces trois mois d’été afin de repartir d’un pied de « winner » à l’automne (ou de « jeune espoir du web » comme dirait Dievochka).

Pour moi donc l’été sera studieux puisque pas de vacances. Je finis en effet mon stage de fin d’études chez la société O2Sources.
Il n’est même pas question de chomer ou d’être moins productif à cause de la canicule de ces derniers jours puisque nous lançons un nouveau projet la semaine prochaine qui sera développé avec Ruby on Rails. Je n’en parle pas pour l’instant. Mais mes articles sur RoR de la semaine dernière sont en rapport avec celui-ci ;-)

D’un point de vue personnel, je bosse à fond sur RefStats, avec une refonte totale de l’interface utilisateur prévue pour septembre (du moins j’espère qu’elle sera prête).
Et une réflexion sur le développement d’une API permettant l’utilisation des services. Mon but à long terme sera d’avoir un robot qui récupère et stocke les données en local, une API qui permette de les obtenir.
Et une interface utilisateur open source dans le but de favoriser l’utilisation des données sur une application interne et le développement d’une communauté autour de l’outil.
Mais on en est encore très loin ! :-)

Parce que bon comme c’est l’été, on sors aussi.

Niveau photo, je vais m’acheter un nouvel objectif. Mon choix va probablement se tourner vers le Tokina 11-16mm. De cela, je vous en reparlerai bientôt car j’aurai besoin de celui-ci pour le week-end du 19-20 juillet. Je le commanderai donc avant le 10 juillet.

Après pour la rentrée, mon stage se termine le 25 aout. Après cela, je suis en vacances.
Je déménagerai donc la dernière semaine d’aout de ma petite chambre d’étudiant à environ 2km de la, dans le centre-ville de Villeurbanne. Une grande maison ou nous serons six à vivre en collocation.
Je mets à exécution le « mais qui se soigne » du slogan de ce blog.

Et à partir du 1er septembre on est reparti puisque je passe du status de stagiaire à celui de salarié chez O2Sources !

Voila ! Je passe donc maintenant la chaine à xuxu qui lague et qui si il ne prends pas la suite va avoir à subir de multiples spoils toute cette semaine.
A Dievochka juste « parce que ».
Et à pocky parce qu’il m’en fallait un troisième et que c’est le premier que je vois dans twitter.

Lorsque l’on aime regarder des photos, on voudrait pouvoir en avoir tout le temps sur son écran.
Pas super pratique d’avoir une photo lorsque l’on est en même temps en train de surfer sur internet …

C’est à ce problème que remédie Pickrfox, puisque l’extension ouvre une barre latérale contenant diverses photos sur flickr. Celles de vos amis, de vos contacts, les votres ou plus simplement toutes les dernières photos postées …
Et vous pouvez même, pour chacune des photos affichées, mettre celle-ci en favoris et/ou poster un commentaire dessus :-)
Cool non ?

Taizé

Hier soir a eu lieu le premier apéro Ruby on Rails à Lyon.
Et malgré le peu de personnes présentes, cela fut une excellente occasion pour discuter entre passionnés du framework et du langage en général.

Nous avons donc pu discuter plus sérieusement et de manière « IRL » de l’organisation d’un RailsCamp Lyonnais à l’automne prochain et avons envisagé la possibilité de proposer une conférence Ruby on Rails pendant les JDLL des 17 et 18 octobre prochain.
Tout cela est evidemment à rediscuter. Mais le bilan de ce premier apéro est plutôt positif. On essayera d’en refaire donc (dans un endroit avec le wifi à la demande générale).

Vous pouvez evidemment regarder mes photos.

Après avoir compris comment installer de nouveaux paquets gem sous Aptana, voyons comment en utiliser un.

Lorsque vous prenez une photo avec un appareil numérique, quel qu’il soit, diverses données sont fournies avec l’image. Notamment au niveau des conditions de prise de vue, de la configuration de l’appareil. Ou encore du logiciel de retouche utilisé. C’est ce que l’on appelle les données exif.
Il peut être sympathique d’obtenir et d’afficher ces données. C’est ce que permet exifr.

Tout d’abord, apparemment, l’image doit forcément être en local. Il n’est pas possible d’obtenir directement les données d’une image distante.
A moins évidemment de rapatrier l’image en local et de la traiter ;)

Après avoir installé le gem, nous le chargeons donc avant la déclaration de notre contrôleur :

require 'exifr'

Puis dans une action, nous chargeons la photo de notre choix :

@image = EXIFR::JPEG.new('/home/mon_image.jpg')

Nous avons donc maintenant un objet @image qui contient les informations exif de notre photo.
Ainsi, vous pourrez connaitre la marque de l’appareil utilisé avec :

puts @image.exif.model

Et obtenir toutes les informations disponibles avec (dans la vue) :

    <% @image.exif.to_hash.each_pair do |k,v| %>

  • <%=k.to_s.rjust(30) %> : <%=v.to_s %>
  • <% end %>

Pour exemple, voici les informations exif de la « photo de fin de billet » ci-dessous :

  • make : Canon
  • model : Canon EOS 350D DIGITAL
  • x_resolution : 240
  • y_resolution : 240
  • resolution_unit : 2
  • date_time : mer. juin 18 16:43:28 +0200 2008
  • artist : unknown
  • exposure_time : 1/60
  • f_number : 4
  • exposure_program : 3
  • iso_speed_ratings : 1600
  • date_time_original : mer. juin 18 11:38:48 +0200 2008
  • date_time_digitized : mer. juin 18 11:38:48 +0200 2008
  • shutter_speed_value : 5906891/1000000
  • aperture_value : 4
  • exposure_bias_value : 0
  • max_aperture_value : 95/32
  • metering_mode : 5
  • flash : 16
  • focal_length : 90
  • focal_plane_x_resolution : 1728000/437
  • focal_plane_y_resolution : 384000/97
  • focal_plane_resolution_unit : 2
  • custom_rendered : 0
  • exposure_mode : 0
  • white_balance : 0
  • scene_capture_type : 0

Il y a un truc super bien avec ruby, c’est les gem !
En gros, le fonctionnement est similaire à aptitude de debian. Diverses fonctions (install, update, uninstall) permettent d’installer de multiples paquets permettant d’installer les diverses extensions de ruby et rails.
Ces extensions sont multiples. Du support de divers serveurs de bases de données à la récupération des données exif d’une photo.

En mode console, c’est très simple ! Pour installer un gem, il suffit de faire :

gem install nom-du-gem

Mais dans un environnement de développement avec Aptana/Radrails, installer un gem de cette manière ne l’installera pas dans l’application. Il faut donc « bidouiller » un peu.
Allez donc dans le menu « Window » > « Show view » > « Other ». La fenêtre suivante s’affiche

Sélectionnez le menu « Ruby » puis « RubyGems » (comme c’est fait ici quoi). Puis valider.
La, un nouvel onglet va s’ouvrir normalement en bas de votre fenêtre aptana. Mais cela peut dépendre de votre configuration.

Ce nouvel onglet vous fournit la liste de tous les gems déjà installés.
A droite sont situés de multiples boutons permettant de recharger la liste, d’en installer de nouveaux, d’en supprimer ou de mettre à jour tous vos gems.

Cliquez sur celui le plus à droite (le « + » vert) pour en installer un autre. La, la liste s’affiche. Il ne vous reste plus qu’à choisir celui qui vous ferait plaisir, à cliquer sur « OK » et attendre un petit peu pour que l’installation se fasse.
Aptana peut parfois être long pour lancer ce genre de processus. Il me faut attendre environ 20 à 30 secondes avant que celle-ci ne commence.
Par ailleurs une fois que l’installation est faite, il semble qu’il faille redémarrer le serveur pour que le nouveau gem soit pris en compte.

Après avoir installé tous les gem qui nous intéressent, le prochain article concernera l’utilisation du gem « exifr », permettant de récupérer les informations exif d’une image locale.

Tout « bon » développeur le sait pourtant. Il ne faut jamais croire son application exhaustive et nommer ses classes et fonctions par des noms trop génériques.
Cela est encore plus valable lorsque l’on développe pour le monde du libre.

Ainsi, CakePHP définit une classe « Cache ». Classe que phpBB définit également … Rendant totalement impossible toute inclusion de l’identification de phpBB à une application conçue avec CakePHP.
Merci messieurs les développeurs de chez CakePHP et phpBB. Et vivement PHP 5.3 et les espaces de noms !

Il peut arriver que vous cherchiez à concevoir une application web et que de par le principe de cette conception, vous ayez besoin de toujours charger le même fichier quelque soit l’url appellée. Sauf si le fichier existe déjà (le cas d’une image par exemple).

La solution qui semblerait la plus simple au premier abord est de trifouiller avec ErrorDocument dans le .htaccess

ErrorDocument 404 /index.php

Ca fonctionne puisque à partir du moment ou votre fichier n’existe pas, vous êtes redirigé vers votre index.php. Vous n’avez alors plus qu’à afficher votre contenu. Et surtout ne pas oublier de forcer le code HTTP 200 au lieu de 404. Sans quoi votre site ne sera jamais indexé par les moteurs de recherche (et vous êtes en contradiction avec la norme du protocole HTTP). Cette solution est intéressante notemment si vous n’avez pas accès à l’URL rewriting.

 

Une autre, que je trouve plus propre, consiste à utiliser l’URL rewriting.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Qu’est-ce que c’est que toutes ces lignes ?

RewriteEngine On

Ici, on se contente d’activer l’url rewriting.

 

RewriteCond %{REQUEST_FILENAME} !-d

Si l’url existe et est un répertoire, on ignore les lignes suivantes

RewriteCond %{REQUEST_FILENAME} !-f

Si l’url existe et est un fichier, on ignore la ligne suivante

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Et donc, si ce n’est ni un fichier, ni un répertoire, on redirige l’url vers index.php. Ici, on passe également l’URL de la page en GET.

Cette astuce est utilisée dans divers frameworks. Notemment CakePHP et Ruby on Rails.

Entre temps

Et hier soir

Pourquoi rester chez un hébergeur lorsque l’un de ses concurrents vous propose une machine deux fois plus puissante pour le même prix ?
Depuis le début de la semaine, ce nouveau serveur de production (nommé laetitia) est arrivé et j’ai fait progressivement les migrations de mes divers sites depuis l’ancien serveur (nommé agnès).

L’arrivée de ce nouveau serveur marque donc la fin de ma migration vers mon nouvel environnement de développement. Après l’arrivée du serveur de développement, norris il y a un mois, ce changement de serveur de production me permet d’utiliser les données du serveur svn de norris en production.
Désolé mais je n’ai pas de photo de laetitia.

 
Fork me on GitHub