Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

July 28 2014

Vacances !!!1

July 25 2014

Ajoutez la couleur dominante derrière vos images

Si vous pouvez extraire la couleur dominante d’une photo, une petite touche sympa à ajouter sur votre site est de se servir de celle-ci tant que votre image n’est pas chargée.

Voici un exemple sur cults3d.com :

Chargement d'une page sur Cults 3D

HTML

En HTML, le plus simple est d’appliquer la couleur dominante sur son style inline. C’est cette couleur qui apparaîtra durant le chargement

<img style="background: #f3de56" src="…" width="120" height="120" />

Avec Rails

Si vous utilisez la librairie Carrierwave dans votre application Rails, vous pouvez extraire facilement la couleur dominante à chaque upload grâce à ma gemme ruby carrierwave-processing-dominant_color.

Avec WordPress

Si vous utilisez WordPress, ajoutez l’extension dominant-color et ça sauvegardera la couleur dominante à chaque upload de medias. Vous pourrez même éditer la couleur choisie, directement dans l’administration.

July 23 2014

EasouSpider le robot qui ne sait pas parler l’utf8

Photo de Mathieu mangeant une araignée

Ces derniers jours je recevait une trentaine d’emails par jour m’indiquant qu’une erreur avait éclatée sur cults3d.com. Ces exceptions provenaient toutes d’un robot chinois, EasouSpider, qui parcoure le Web pour remplir son moteur de recherche.

Ce robot ne sait pas parler l’unicode comme tout le monde et envoie dans les formulaires des valeurs mal encodées, ce qui fâche Ruby on Rails. Le problème est surtout que Rails ne traite l’erreur que bien trop tard, lorsqu’on essaie de lire les paramètres de la requête. Et là l’erreur est une incompréhensible ArgumentError :

invalid %-encoding (Q/B0*ÜHܘ0ÅÅ1 0 U GB1 0 U.…

La solution est de créer un middleware Rack qui va déclencher et traiter cette erreur avant que le reste de l’application ne reçoive la requête. Rails est fait de tas de petits modules comme celui-ci qui s’empilent et qui préparent la requête.

Pour ajouter facilement ce middleware à mon application j’ai créé une gemme Ruby, avec un nom particulièrement court. Pour régler ce problème dorénavant, il suffit d’ajouter à son Gemfile :

gem "handle_invalid_percent_encoding_requests"

Depuis, plus aucun message d’erreur. Je dors beaucoup mieux la nuit.

July 17 2014

Retrouver les clefs de localisation facilement avec Rails

Photo de Drapeaux Lego

J’utilise Locale avec Ruby on Rails pour permettre à n’importe qui dans l’équipe de modifier les textes d’un site quelle que soit la langue.

Néanmoins, ce n’est pas évident pour celui qui n’a pas le code sous les yeux de retrouver quel texte correspond à quelle clef.

L’Astuce

Une petite astuce est d’ajouter à son ApplicationController la méthode suivante :

# Print out the keys if you add `?_locale_keys=1` in your params
def t(key, options = {})
  if !Rails.env.production? and defined?(params) and params[:_locale_keys]
    scope_key_by_partial(key)
  else
    super
  end
end

Cela vous permet d’afficher toutes les clefs d’une page en ajoutant le paramètre _locale_keys à vos URLs, par exemple : http://example.com/?_locale_keys=1.

Voici un exemple sur cults3d.com où chaque texte est remplacé par sa clef :

Le site web Cults3D avec Locale Keys allumé

Sécurité

Il n’y a pas de risque de permettre à tout le monde d’afficher les clefs de localisation. Néanmoins par pudeur et pour éviter que ces pages disgracieuses n’apparaissent dans un moteur de recherche, on teste que l’environnement soit celui de production.

Vous pouvez également remplacer ce test par un test qui vérifie que l’utilisateur est un administrateur, par exemple.

June 13 2014

ActionMailer n’aime pas vos URLs (par défaut)

Faire un lien dans un email dans une application Ruby on Rails devrait être aussi simple que de faire un lien dans le reste de l’application, non ?

Photo of a miniature train, by Sunny

Problème

Mais voilà, un simple link_to root_url renvoie une exception car il faut un nom de domaine pour faire une URL. Pour ça il faut configurer un nom de domaine par défaut pour chaque environnement.

En développement un site varie beaucoup selon les configurations et les tests. Par exemple foo.dev, localhost, sunny.local et 192.168.1.42.foo.xip.io, sont des noms de domaines possibles et utiles pour mon application en développement. Le port (80, 3000, 8080) et le protocole (http ou https) sont également des paramètres qui peuvent changer lors des différents tests.

En production votre nom de domaine peut également varier. Par exemple en.cults3d.com et fr.cults3d.com sont deux noms de domaines utilisés par la même application, en même temps. Il est donc impossible de trouver un nom de domaine par défaut à utiliser sur chaque lien.

C’est pénible de devoir spécifier le domaine à chaque fois, c’est source de bugs.

Solution

Pour éviter cette configuration « en dur » il existe une manipulation simple qui consiste à modifier l’URL par défaut à chaque requête.

En ajoutant à son application_controller.rb :

before_filter :make_action_mailer_use_request_host_and_protocol
def make_action_mailer_use_request_host_and_protocol
  ActionMailer::Base.default_url_options[:protocol] = request.protocol
  ActionMailer::Base.default_url_options[:host] = request.host_with_port
end

Sécurité

Attention, cette solution ne vous prémunit pas contre le host injection exploit.

Si votre site déclenche un email (demande de mot de passe par exemple) et qu’un méchant indique comme hôte « evil.com » alors vous allez envoyer des emails ayant des liens en « evil.com ».

Si votre site utilise du cache ces attaques touchent sans doute déjà votre application ! Pour s’en prémunir, ajoutez donc un filtre des noms de domaines autorisés en production.

Thread Safety

Cette solution (corrigez-moi si je me trompe) souffre d’un problème de race condition. Non, ce n’est pas un problème de racisme envers certains noms de domaines qu’elle ne peut pas blairer.

Le problème est plutôt qu’une requête plus lente peut modifier sans le vouloir le domaine d’une autre requête. Une meilleure solution thread-safe existe sans doute. Si vous avez une piste élégante je suis preneur.

Gem ça

Et parce qu’une ligne de code testée dans une librairie dédiée vaut mieux que 2 lignes copié-collées dans votre projet, vous pouvez également ajouter ce code grâce à ma petite gemme :
action_mailer_auto_url_options.

Photo of a miniature train, by Sunny

June 11 2014

Mont Choisy Beach
Mont Choisy Beach
Mont Choisy Beach
Whale
Catamaran to Îlot Gabriel
Îlot Gabriel
Îlot Gabriel
Îlot Gabriel Gecko
Îlot Gabriel Chapel
Jardin botanique de Pamplemousses
Jardin botanique de Pamplemousses
Jardin botanique de Pamplemousses
Trickster elders
Lakaz serenity
Mauritian snail
Passage Saint Sébastien Rainbow
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.

Don't be the product, buy the product!

Schweinderl