On se tutoie ?

Aller au contenu | Aller au menu | Aller à la recherche

jeudi, mars 25 2010

Génération d'url avec des ressources imbriquées en rails

Je suis tombé récemment sur ce qui me semble être un bug dans la génération d'url pour les nested resources, d'ailleurs je l'ai remonté;

Prenons un exemple d'une famille avec plusieurs personnes

map.resources :families, :has_many => :people

La définition des resources dans le fichier de routes permet la mise à disposition des générateurs d'urls. Par exemple:

family_people_path(1) => /families/1/people

Par contre le passage d'un id ou objet nil devrait générer une exception. Or dans une vue ou un contrôleur:

family_people_path(nil) => /families//people

Pourtant en console une exception est bien lancée:

include ActionController::UrlWriter
family_people_path(nil)
ActionController::RoutingError: family_people_url failed to generate from {:action=>"index", :family_id=>nil, :controller=>"people"}, expected: {:action=>"index", :controller=>"people"}, diff: {:family_id=>nil}

Est ce que cela signifie que les exceptions de génération d'URL sont capturées (et étouffées) à un plus haut niveau dans une application rails ?

mardi, janvier 12 2010

I18n et formulaires imbriqués en rails

En rails 2.3.4 je trouve le comportement du error_messages un peu surprenant avec les formulaires imbriqués.

class Person < ActiveRecord::Base
  accepts_nested_attributes_for :address, :allow_destroy => true
end
class Person < ActiveRecord::Base
  validates_presence_of :label
end
<% form_for(@person) do |f| -%>
  <% f.fields_for :address do |address| %>
    <p>
      <%= address.label :label %>
      <%= address.text_field :label %>
    </p>
  <% end -%>
<% end -%>

D'après http://weblog.rubyonrails.org/2009/1/26/nested-model-forms, les erreurs sont recopiées dans l'objet parent. Ils disent que c'est sujet à changement mais apparement c'est toujours le cas. En créant les objets depuis la console:

>> p  = Person.new
>> p.build_address
>> p.save
>> p.errors
=>
#<ActiveRecord::Errors:0x102d94560 @errors={"address_label"=>[#<ActiveRecord::Error:0x102d7be48 …

Du coup dans mon fichier de traduction je mets logiquement:

person:
  address_label: "foo"

Perdu ! En maintant les mains dans le cambouis vendor/rails je suis remonté jusqu'à generate_full_message qui se base en fait sur la classe de base de l'objet (imbriqué ou non). Du coup il va chercher dans:

address:
  address_label: "foo"

C'est pas vraiment logique, surtout que dans 99% des cas on a déjà la traduction:

address:
  label: "foo"

Ce serait cool s'il pouvait aller le chercher là.
Ah et interdiction de répondre t-as-qu-a-faire-un-patch :-)

jeudi, janvier 7 2010

Résolution 2010

Passer définitivement de: french_layout.png

à: bepo_layout.png

jeudi, décembre 10 2009

Quelques conseils concernant la création d'entreprise

Je ne suis généralement pas fan des billets de blog dont les titres ressemblent à « 10 conseils pour devenir riche et beau », car ils semblent généralement inscrits dans une démarche de SEO plutôt que d'information qualitative.

Les conseils ci-dessous peuvent sembler du bon sens, mais pour ma part je les acquis au fil du temps et j'aurai aimé les mettre en place dès le début.

Pour trouver des marchés n'hésitez pas à vous présenter auprès de vos concurrents.

Une société qui fait le même métier que vous n'est pas forcément votre ennemie. Elle peut généralement avoir des coups de rush ou des besoins de compétences externes.
Généralement ils vous confieront des petits bouts de projets au début et si le courant passe bien et que vous faites bien votre travail cela peut devenir récurrent ; surtout dans un contexte où l'on n'a pas envie de louper un marché tout en étant frileux sur les embauches.

Ne vous laissez pas envahir par la paperasse.

Sans organisation la paperasse devient vite une vraie galère, surtout pour s'y retrouver.
Personnellement j'utilise une arborescence assez simple, je crée un dossier pour le mois, par exemple 2009-11 avec des sous dossiers comme courrier, documents, factures, releves, fax…
Et dès que je reçois un document je le classe. S'il est numérique c'est vite fait, si c'est papier je le scanne. Pensez aussi à leur donner des noms explicites.

Sauvegarder vos documents.

Quelque soit le domaine d'activité il faut faire des sauvegardes, de préférence une locale + une externe. Pour la locale j'utilise deux disque montés en RAID et time machine.
Pour la distante rsync vers un serveur. Ceux qui veulent quelque chose de simple peuvent se tourner vers des solutions prêtes à l'emploi comme dropbox.

La prise de notes en réunion

La prise de notes lors d'un rendez vous est quelque chose de complexe, surtout quand ça s'éternise.
Quand vous notez vous n'êtes pas attentif et vice-versa. Et qui n'a jamais eu le souci d'avoir à déchiffrer ses propres notes ?
Si vous avez le malheur de vouloir vous y replonger quelques jours plus tard vous n'y comprenez plus rien. Si vous êtes un fan des notes il faut le faire tout de suite.
Comme je ne le suis pas, j'utilise une autre solution: le magnétophone. Ca me permet d'avoir toute l'attention possible lors de l'entretien sans en perdre une miette.

Au début pour débriefer c'est plus long mais avec un appareil mp3 il suffit de charger les entretiens sur son ordinateur et on navigue facilement dans les enregistrements.
L'un des autres avantages c'est ce que cela vous oblige et oblige votre client à une grande transparence. Fini les « tu ne me l'as pas dit » ou « on avez validé ça à l'oral ».

Conclusion

Finalement l'essentiel de ces points traitent de méthodologie, mais quand on maitrise son métier l'organisation est de loin la chose la plus complexe lorsqu'on se met à son compte.

jeudi, octobre 29 2009

Y a comme un écho…

vendredi, octobre 16 2009

Intégration bidirectionnelle de lastfm dans spotify

Petite pensée furtive: avec spotify on peut scrobbler les titres qu'on écoute vers lastfm mais ce qui serait sympa, c'est en retour de récupérer les recommandations de lastfm (ce qui est possible avec l'API) pour proposer une radio sur mesure, ou au moins qui se rapprocherait de nos goûts.

Parce qu'aujourd'hui je ne sais pas comment est fait l'algo permettant de choisir les musiques quand on utilise la radio, mais je pense qu'il a été codé avec les pieds qu'il ne doit pas prendre en compte ce qu'on a déjà écouté.

lundi, octobre 12 2009

Internet Explorer accepte n'importe quoi

Raison de plus pour ne plus l'accepter !

Tout à commencer par le classique:

Client: Ça marche pas quand je rentre dans ma fiche produit.
Développeur: Ça marche chez moi ©.

Voilà le contexte: L'application, en ruby on rails, permet de faire une recherche de produit. Parmi la liste des produits trouvés on peut entrer dans sa fiche et depuis celle-ci faire un export au format excel.

Là en rails on se dit que c'est assez cool à faire. On commence par enregistrer le type Mime des fichers excel dans l'initializer qui va bien (mime_types.rb):

Mime::Type.register "application/vnd.ms-excel", :xls

Ensuite dans l'action il suffit de distinguer les différents formats de rendu:

respond_to do |format|
  format.html
  format.xls {
    # some stuff
  }
end

et dans la vue utiliser la route formatée en passant l'extension enregistrée précédemment (xls).

Sur les navigateurs modernes ça fonctionne bien, sauf que pour mon client sous IE, quand il cliquait sur le lien permettant d'accéder à la fiche produit il avait directement le fichier excel.

Là je commence à me dire qu'il y a un souci dans les headers accept d'IE. Sauf que quand j'essaie de reproduire le le bug sur mon windows virtuel pas moyen. Que ce soit IE7 ou 8 ça fonctionne normalement.

Voilà à quoi ressemble les en-têtes http accept d'un IE standard (je les ai récupérés sur le net d'une personne sous windows 7):
image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */*

Là ça fonctionne, mon lien « classique » ne correspond à aucune des type mime précédent, du coup je passe dans le * et pour IE comme il ne sait pas trop quoi en faire il le traite comme du HTML. Que je sache pour les autres navigateurs c'est l'inverse. On regarde d'abord si ce n'est pas du html, du xhtml+xml ou du xml et après on avise.

Mais pour Internet Explorer le web c'est d'abord des documents binaires, pas du texte.

Pour en revenir au problème là ou ça devient vicieux c'est que les en-têtes http accept sont différents si Office est installé sur la machine (ce qui est le cas pour client et pas moi). Là ça devient:
image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/x-silverlight-2-b2, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

C'est la que le format excel prend le pas. Donc dans la négociation avec le serveur, IE demande en priorité du format excel plutôt qu'html.

Ca a été remonté sur le tracker de ruby on rails, même si ça n'a rien à voir avec le framework. Toutefois une solution est proposé pour contourner ce comportement d'IE, c'est de forcer le passage du paramètre format à HTML s'il n'est pas défini. Il faut savoir que ce n'est pas fiable à 100% puisque ça se base sur le user agent qui peut être modifié. Mais forcer le format à html pour les navigateurs qui fonctionne déjà correctement ne devrait pas avoir de conséquences fâcheuses.

Avant de tomber sur cette solution j'ai essayé d'utiliser une route formatée dans laquelle je spécifié html comme format mais ça n'a pas fonctionné. Je me retrouvais bien avec un lien se terminant par .html mais le format n'était toujours pas récupéré dans les paramètres de l'action, je ne sais pas vraiment pourquoi.

Bref, encore un post sur le net pour dire une chose: « Meurs IE, meurs ! »

mercredi, octobre 7 2009

Appartement de 63m² à louer au cœur du vieux Lille

Un peu plus d'un an après avoir quitté Paris, je m'éloigne un peu de Lille, direction la campagne.

Pour ceux que ça intéresse, j'ai fait une page spéciale décrivant l'appartement, agrémentée de quelques photos.

Pour ceux que ça n'intéresse pas, n'hésitez pas à faire suivre à vos contacts, ce serait sympa.

Si vous avez une question, c'est par ici.

PS : Si j'en parle c'est juste pour éviter de payer le préavis, je n'ai pas de commission de la part de l'agence.

vendredi, septembre 25 2009

Retour d'expérience sur Snow Leopard

Tout n'a pas fonctionné out of the box. Bizarrement c'est sur le matériel le plus ancien que j'ai eu le moins de souci (un macbook de 2006).

En même temps je ne m'en sers pas pour bosser.

Problème sur toutes les machines: mon compte stocké en NFS n'était plus monté. En fait la gestion des points de montage a changé dans snow leopard ; j'ai fait un micro-billet là dessus. Une fois re-configuré c'est bon.

Sur le macbookpro j'avais un problème de mise en veille. Capot fermé la machine sortait de veille toute les deux minutes. Résultat la batterie était vidée en quelques heures.

Pour ça j'ai supprimé les fichiers com.apple.AutoWake.plist et com.apple.PowerManagement.plist du dossier /Library/Preferences/SystemConfiguration. Au redémarrage le fichier com.apple.PowerManagement.plist était recréé et la mise en veille fonctionnait de nouveau.

Sur le macpro j'ai eu d'autres soucis. Aucune application XUL (firefox, thunderbird ou miro) ne voulait se lancer. En passant en mode verbeux il semble que ça venait de sqlite. J'ai tenté une réinstallation sans conviction et ça a fonctionné.

J'ai aussi eu pas mal de soucis avec les macports, principalement dû à l'architecture 64bits, pas mal de packages ne fonctionnait pas ou plus.

J'ai fait un dump de tous les packages que j'avais installé dans un fichier plat:

$ port installed > installed_ports

et ensuite j'ai tout désinstallé:

# port -f uninstall installed
# rm -rf /opt/local \
/Applications/MacPorts \
/Applications/DarwinPorts \
/Library/Tcl/macports1.0 \
/Library/Tcl/darwinports1.0 \
/Library/LaunchDaemons/org.macports.* \
/Library/StartupItems/DarwinPortsStartup \
/Library/Receipts/MacPorts*.pkg \
/Library/Receipts/DarwinPorts*.pkg \
~/.macports

Une fois fait, j'ai installé xcode 3.2, macports 1.8.0 et j'ai réinstallé tous les packages précédemment supprimés.

Pour les gems c'est pareil, il faut parfois penser à passer le flag de l'archi (64bits), comme pour le gem postgres:

# env ARCHFLAGS="-arch x86_64" gem install pg

Voilà les deux trois soucis que j'ai rencontré. A part ça ça ronronne et j'ai remarqué qu'on pouvait même installer htop avec port maintenant. Je ne sais pas de quand ça date mais ça donne des trucs sympas sur un macpro :-) :

Les coeurs du mac pro

Note: On peut maintenant s'inscrire par email aux commentaires.

dimanche, septembre 13 2009

En route vers spotify premium

Bon je viens de m'inscrire pour un mois sur spotify premium.

Ce qui me plait c'est que pour une fois j'ai le sentiment qu'on fait confiance à l'utilisateur. Comment acheter de la musique si on ne peut même pas se faire une idée avant ? Aujourd'hui le mieux qu'on propose c'est 30 secondes d'écoute par titre, pas terrible.

Au lieu de toujours considérer les consommateurs comme des pirates en herbe, c'est quand même plus sympa de leur faire confiance. En tout cas c'est ce qui me donne envie d'acheter.

Il faut le dire cette offre a quand même un vrai goût de licence globale.

Ce qui me plait:

  • La qualité
  • Le catalogue
  • L'existence d'une application iPhone

Ce qui me manquent:

  • La possibilité de piloter spotify via une application iphone (comme remote pour iTunes)
  • La possibilité d'uploader son propre contenu pour le retrouver en ligne

Ca peut paraitre étrange d'envoyer du contenu local pour le ré-écouter en streaming mais il y a des morceaux qu'on ne trouvera jamais en ligne, comme des extraits radios, des rips de vinyls…

Bien sûr ce contenu ne serait accessible que sur son propre compte.

- page 2 de 10 -