Spoil

Désolé pour la mauvaise qualité de la photo, prise avec mon nokia e71 à la fnac.

Arrivée prévue fin 2008 - début 2009 …



Eric il a pas tort

J’ai tendance à ne pas apprécier le contenu que Eric Dupin place sur son blog, presse-citron.
Pseudo-expert qui fait des billets sur des sujets qu’il ne maitrise pas dans le but de rentabiliser un blog lu par des gens qui le fanatisent. Très peu pour moi.

Cependant je suis plutôt d’accord avec son dernier billet, fermé pour cause d’inventaire.
Passons tous le problème personnel.

Mais le web est constitué de boulets trollers qui s’imaginent être à l’abri de tout derrière leur écran. Alors que comme tout sur le web, l’anonymat y est virtuel. Et Eric n’est pas le seul à subir ces boulets qui sont très forts dans la critique négative mais ne connaissent pas la critique constructive.

Comme exemple, je prendrais simplement le cas du forum dmoz sur WebRankInfo, dont la seule utilité était de permettre aux webmasters de s’informer sur l’ODP et de converser de manière directe avec les éditeurs.
Ce forum a été fermé il y a de cela un an et demi suite justement à ces trollers qui rendaient sa gestion intenable.
J’y était modérateur à cette époque. Et les trolls à cet endroit étaient plus que déprimants de mon point de vue d’éditeur.

Alors monsieur Dupin, mon seul message, c’est : tu n’es pas tout seul à supporter ce genre de messages quasi permanence. Courage. Tu verra avec le temps, tu apprends à simplement les ignorer et les oublier 3 secondes après les avoir lus.

Note : j’ai des problèmes de batterie en ce moment. Impossible d’utiliser mon appareil jusqu’à ce que deux colis qui viennent de Hong Kong soient arrivés à Lyon. Donc en attendant, pas de photo de fin d’article. Désolé.



Paris Web 2008

J’étais, hier, aux ateliers de Paris Web 2008. Petit compte rendu des divers ateliers auxquels j’ai participé :)

Javascript De(ux) Zéro
mat nous proposait un rappel pas superflus des bases de Javascript, de ses fonctionnalités avancées, des diverses incompatibilités inter navigateurs et des évolutions du langage.

Performance Web côté client
Eric Despet et Nicole Sulivan ont pris divers sites en exemple afin de les analyser, de signaler leurs problèmes de performances et de proposer des solutions pour les corriger.

Comment rendre mes vidéos accessibles ?
Sébastien Delorme nous présentait les diverses manières de rendres des vidéos (diffusées sur le web ou pas) accessibles. Création et synchronisation de sous-titres, création et synchronisation de commentaires audio.
Application de ces sous-titres et commentaires audio dans RealPlayer et dans divers lecteurs flash.

Optimiser ses CSS
Pascale Lambert-Charreteur, assistée de Stéphane Deschamps et d’un troisième que je ne connais pas, nous présentaient diverses techniques afin de préserver sa feuille de style CSS propre, lisible et légère.

A tous ces ateliers plus intéressants les uns que les autres, il faut ajouter :
Un repas le midi avec Pascal Martin, gérant de la société Linterweb qui développe notamment Wikiwix (et plein d’autres choses en rapport avec la recherche et/ou Wikipédia).
Un repas sympa, passé à discuter de ses divers projets et de ses évolutions futures.

Puis pour finir la soirée en beauté, j’ai retrouvé tuisp, inistea, rome et sahinler pour un repas entre éditeurs dmoz.

Malheureusement, pas de photos de ce week-end à Paris. En effet, bien que j’ai mis la batterie de mon appareil à recharger jeudi toute la journée et que je ne l’ait pas utilisée entre temps, je me suis rendu compte samedi matin que je n’avais plus d’énergie.
La raison exacte de ce déchargement aussi rapide est encore un mystère. Mais que je résoudrai bientôt. Désolé, la photo de fin d’article n’est donc pas récente.



Les banques à la masse niveau sécurité

Aujourd’hui, je renouvelle l’un de mes noms de domaine. Par carte de crédit bien évidemment.
Et la, pour la première fois, ma banque, le Crédit Agricole, me demande de définir un mot de passe que je devrai apparemment retaper à chaque utilisation de ma carte.

Sur le coup, je me dis “ouah, super idée. Enfin la faille de sécurité énorme au niveau des paiements par carte bancaire sur Internet ne demandant pas de code va être corrigée”.

Je tape donc un code. Et la, surprise !
Il y a des conditions requises au niveau du mot de passe.

Mais, contrairement à ce que l’on est habitué à avoir, c’est à dire des conditions favorisant la sécurité, on a ici le contraire.

  • Le code ne peut contenir que des caractères alphanumériques.
  • Il a une longueur de 6 caractères. Pas plus, pas moins.
  • Il doit contenir au moins un chiffre et une lettre.

Rien à redire sur le dernier. C’est les deux autres qui sont nuls.
Pourquoi limiter à 6 caractères ?? Encore dire “6 caractères minimum”, je comprendrais. Mais si j’ai envie de mettre un mot de passe à 8 caractères, c’est plus sécurisé et ça coute pas plus cher.

Et pourquoi limiter aux caractères alphanumériques ? Si j’ai envie de mettre un “;” ou un “^” dans mon mot de passe, en quoi ça gène le stockage ou que ce soit ??
Les banques ont 10 ans de retard d’un point de vue sécurité. Et pourtant on ne peut pas dire que les données qu’ils font transiter ne sont pas sensibles.



Zend Framework et Mysqli

Je publie ce billet un peu rapidement comme une note car j’ai eu du mal à trouver l’information lorsque j’en ai eu besoin.

La documentation de Zend Framework n’indique que les informations de connexion pour SQLite dans app.ini.
Mais tout le monde n’utilise pas SQLite (et pour donner un avis totalement personnel, je dirais heureusement).

Voici donc les informations requises pour la configuration de MySQL dans votre application utilisant Zend Framework.

[general]
database.adapter = “MYSQLI”
database.params.host = “localhost”
database.params.username = “root”
database.params.password = “”
database.params.dbname = “myDatabase”

Et puis rien que pour le fun, Oracle :
[general]
database.adapter = “Oracle”
database.params.host = “localhost”
database.params.username = “root”
database.params.password = “”
database.params.dbname = “myDatabase”

SQL Server
[general]
database.adapter = “Pdo_Mssql”
database.params.host = “localhost”
database.params.username = “root”
database.params.password = “”
database.params.dbname = “myDatabase”

Et PostgreSQL
[general]
database.adapter = “Pdo_Pgsql”
database.params.host = “localhost”
database.params.username = “root”
database.params.password = “”
database.params.dbname = “myDatabase”



Rails : ajouter une erreur de validation

Vous le savez probablement déjà (sinon, je ne peux que vous conseiller de voir les bases de Ruby on Rails) comment il est facile de valider des données avec notre framework préféré :)

if mesDonnees.save
#Les données ont bien été sauvegardées
else
# Il y a une erreur. mesDonnees.errors la contient il n'y a plus qu'à l'afficher.
end

Après, il n’y a plus qu’à ajouter des paramètres de validation des données dans le modèle.
Mais maintenant, supposons d’autres cas de validation un peu particuliers, qui ne rentrent pas dans le cas “normal”.

Vous n’avez qu’à créer une nouvelle méthode qui valide vos données (l’exemple ci-dessous est totalement bidon) :

def validates_roxitude(*attribut)
reg = Regexp.new '/^ruby(.*?)rox$/'
self.errors.add('rox', 'Hey, Ruby ça rox. Faut le dire !') unless reg.match attribut
end

Ici, nous mettons donc une erreur sauf si le champ “monChamp” commence par ruby et se termine par rox.

Il n’y a plus qu’à forcer la validation avec cette méthode et le tour est joué !
class monModel < ActiveRecord::Base
validates_roxitude :monChamp
end



Bro Code


Note aux personnes de la gente féminine : veuillez lire l’article sur l’image à gauche et passer votre chemin.

Chez O2Sources, on aime beaucoup la série How I Met Your Mother.
D’ailleurs le mercredi, c’est le rituel, de regarder l’épisode qui a été diffusé aux Etats-Unis le lundi précédent.


Alors quand on a entendu parler d’un Bro Code (ignorants, passez votre chemin), on a sauté sur l’occasion et on a fait une commande groupée.
Nous nous sommes donc retrouvés aujourd’hui à tous venir en costard au boulot (ignorants, passez votre chemin) et à prêter serment sur le Bro Code afin de toujours respecter ses sacro-saints commandements.



Nokia e71


J’ai changé de téléphone portable il y a de cela bientôt deux semaines. Après avoir eu un Sagem myx6 pendant plus de deux ans, j’avais envie de montrer ma geekitude de manière plus poussée.

C’est ainsi que j’ai décidé de me tourner vers le nouveau Nokia, le e71.

Avec le forfait qui va bien évidemment. Origami Star chez orange, m’apportant ainsi la connexion Internet de manière théoriquement illimitée et (parce que j’ai moins de 26 ans), les textos illimités.

Et pour l’instant, j’en suis franchement très content. Que cela soit au niveau téléphonie, au niveau internet ou au niveau lecteur MP3, je n’aurais pas pu faire mieux :)
Alors si vous devez choisir un nouveau téléphone, vous savez ce que je vous conseille ;)



SQL : créer un nouvel uplet si la requête ne retourne aucun résultat

Supposons le contexte suivant : vous avez une application traduite en plusieurs langues.
Pour chacune des langues, vous avez une ou plusieurs chaines de caractères. Et dans votre application, vous faites, par exemple :

__(’maChaine’);

Ainsi, la chaine appropriée est affichée en fonction de la langue que vous avez sélectionnée.
Suite à cela, vous avez une base de données qui contient chacune de vos chaines avec la langue et la valeur dans cette même langue.

Lorsque vous appellez la fonction __() avec la valeur de votre choix, vous faites donc un appel à votre base de données qui vous retourne la valeur de la chaine pour la langue en cours.

Le problème, c’est que lorsque vous développez votre application, vous ne pensez pas toujours à ajouter la chaine à chaque fois que vous la placez dans votre code source. Cela serait un tantinet lourd.

La procédure stockée suivante vous permet dont de faire la requête de selection adéquate en fonction de la chaine de caractères et de la langue.
Et si il n’y a aucun élément de retourné, elle en ajoutera un dans la base, avec la chaine vide.

Après, vous n’avez plus qu’à remplir toutes les chaines qui ont été ajoutées lorsque vous surfez dans votre application :)

CREATE PROCEDURE getTrads
@chaine varchar(150),
@langue int
AS
BEGIN
SELECT valeur FROM params_langue
WHERE chaine = @chaine
AND id_langue = @langue
IF (@@Rowcount < 1)
INSERT INTO [params_langue] ([chaine], [valeur], [id_langue]) VALUES (@chaine, ”, @langue)
END

Note : cette procédure a été construire pour fonctionner sous SQL Server. Elle n’est pas forcément portable sur tous les SGBDR. Notamment la variable @@Rowcount, qui peut ne pas être disponible partout.

Puis appellez votre procédure stockée :

EXECUTE getTrads
"maChaine", 1

Ou 1 est l’identifiant de votre langue (vous pouvez remplacer cet identifiant par son nom si vous le désirez. Mais je vous le déconseille).



Paris Web 2008 (ateliers)

Les inscriptions pour les ateliers de Paris Web sont ouvertes !
Inscrivez-vous rapidement. Y’aura pas de la place pour tout le monde !!