J’en ai pas pris pendant tout l’été. Alors j’en prends maintenant qu’il fait encore moins beau !
Je pars donc en vacances de dimanche au dimanche suivant dans un coin paumé de Saone-et-Loire.

Bonnes vacances à ceux qui en ont et bon courage aux autres. Et à la semaine prochaine.

Twitter, Facebook, LinkedIn, Pownce, Jaiku, Myspace, …

Chacun de ces réseaux sociaux (et de tous les autres) pris séparément peut avoir une utilité sympathique.
Mais pris tous ensemble, cela donne Ping.fm.

Et la franchement, ça devient n’importe quoi.
Le « web 2.0″ se veut plus humain et communautaire non ?

Le but n’est pas de permettre  chacun des internautes de spammer à volonté et de se faire spammer encore plus.
Ou alors j’ai zappé un chapitre.

Autant je trouve une utilité à Facebook qui permet de rester en contact avec des vieux amis.
Pareil pour Twitter que j’utilise beaucoup pour discuter avec d’autres geeks que je ne connaissait pas forcément quand on a commencé à tweeter ensemble et qui sont des bons contacts aujourd’hui.

Autant quand je vois ce genre de services dont le seul but est, il faut bien l’avouer, de spammer tous ses contacts avec des liens « cliquez sur mon dernier billet à deux balles sur le digg-like à la mode », j’ai envie de débrancher mon cable Ethernet, d’éteindre mon pc et de m’exiler sur une ile.

Note : oui, ce billet a plein de liens spammant. Mais c’est normal, je prends ma revanche sur tous ceux qui font pire et ce à longueur de journée.

Tout projet impliquant plusieurs personnes et particulièrement lorsque ces personnes sont bénévoles nécessite de motiver ces personnes afin de les garder dans ce projet et de leur donner toujours envie de donner de leur temps :-)

Motiver des bénévoles n’est pas toujours chose évidente. Il faut trouver le moyen de leur donner envie de rester et de donner du temps … sans pour autant les rémunérer.
Mais que peut-on leur donner en échange ?

La réponse est pourtant plutôt simple (sur le papier du moins) : communiquez, communiquez, recommuniquez et récompensez.

La communication
Le défaut énorme de dmoz vu de l’extérieur est son manque de communication. Les webmasters se plaignent de ne pas savoir si leur site est encore en attente ou non; si il est listable ou non; pourquoi des éditeurs visitent leur site mais celui-ci ne se retrouve pas listé etc.

Et pourtant nous communiquons dès que nous le pouvons, que ce soit via le forum public ou via le blog des éditeurs francophones.
Cette communication est cependant contrôlée. Nous choisissons ce que nous disons afin d’éviter de dévoiler certaines de nos méthodes de fonctionnement aux spammeurs.

Mais les utilisateurs d’un projet communautaire ne sont pas ceux qu’il faut motiver.
C’est les participants à ce projet qu’il faut motiver.

Et pour motiver les éditeurs, nous communiquons beaucoup plus !
Par les forums internes évidemment.
Mais également en assignant à chaque nouvel éditeur un « coach ». Plusieurs éditeurs séniors ont accepté de s’occuper de gérer les nouveaux en vérifiant régulièrement les catégories qu’ils éditent et en leur envoyant des emails en cas d’erreurs afin que celles-ci soient corrigées.

Nous communiquons evidemment également en transmettant régulièrement (tous les deux-trois mois environ) un email à chacun des éditeurs francophones en leur signalant les dernières actualités de la branche.

Une newsletter publique est également publiée une à deux fois par an. Vous pouvez voir celle de mars dernier.

Par ailleurs nous tentons le plus régulièrement possible d’organiser des rencontres entre éditeurs dans les grandes villes.
Chez les francophones, Paris et Lyon sont les plus actives au niveau des rencontres d’éditeurs. Mais les Belges et les Suisses ne s’en sortent pas trop mal non plus ;-)

En communiquant avec les membres de la communauté, nous tentons ainsi au maximum de ne pas se contenter d’être en relation avec eux « seulement » pour l’édition. Mais nous lions de vrais contacts avec eux.
De vraies amitiés se sont ainsi crées, pas seulement par mail mais également « en vrai » (biz à stegozor).

Les récompenses
Tout travail mérite salaire dit-on.
Cependant dans un projet ou tous les membres sont bénévoles, il est difficile voir impossible de payer ceux-ci en billets verts (ou bleus).

Il faut donc trouver des solutions alternatives pour permettre aux membres d’un projet de trouver leur satisfaction dans celui-ci.

C’est entre autre pour cela qu’existent les « mozzie awards », qui sont un vote réalisé environ une fois par an et dans lequel les éditeurs votent pour l’éditeur auquel ils souhaitent attribuer un awards.
Une cinquantaine d’awards sont distribués au final.

Best Français Editor
Cutest Couple

Pour finir, le maitre mot à retenir pour motiver et conserver les bénévoles d’un projet, c’est donc bien : la communication.

Qui a dit que je faisait encore un billet avec un titre trop « complexe » ?

Il peut arriver que vous ayez besoin, dans un même formulaire, d’ajouter plusieurs uplets en même temps.
L’exemple le plus flagrant est dans le cas d’option.

Dans le screenshot ci-dessus par exemple, le lien « ajouter une option » exécute une fonction javascript qui ajoute trois champs permettant de remplir une option supplémentaire.
De même le bouton supprimer enlève l’option juste au dessus.

Ignorons le manque de design.

Afin d’avoir quelque chose de propre, nous pouvons utiliser l’attribut index. Ainsi, pour un champ de texte de base, nous pouvons allons avoir :

<%= f.text_field :modele, :champ, :index => identifiant %>

Ou identifiant est un nombre unique qui caractérise l’entrée.
En ajoutant cela à tous vos champs, ceux-ci ressembleront à cela :

<input id="modele_1_champ" name="modele[1][champ]" size="30" type="text" />

Dans votre contrôleur, vous n’aurez alors plus qu’à faire quelque chose comme :
params[:modele].each do |modele|
@modele = Modele.new(modele)
@modele.save()
end

C’est cool, ça fonctionne :-)
Cependant c’est tout pas beau car on répète inutilement un identifiant à chaque fois.
Et c’est la que fields_for fait son apparition.
Remplaçons le code précédent :

<% fields_for :modele, variable, :index => identifiant do |f| %>
<%= f.text_field :name %>
<% end %>

Ou variable est une variable qui contiendra la à attribuer à chacun de nos champs, obtenue par :
variable = Modele.find(:all)

Nous définissons une boucle permettant de déclarer de multiples champs avec un index et ce sans répéter celui-ci :-)

Note : un bug qui a été corrigé en juin 2008 apporte un bug avec les listes de sélection, ne leur déclarant pas d’identifiant.
Pour le corriger, il faut remplacer le fichier (sous Windows) <emplacement vers Aptana>/org.jruby_1.1.0.5965_RC2p2/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_view\helpers par celui-ci.

Derrière ce titre très (trop) long se cache un bug sur lequel je me suis cogné la tête pendant trois bonnes semaines (pas en permanence evidemment. Je pouvais me permettre de passer à autre chose dans le même projet).

J’utilise le plugin exifr dans une application Rails. J’avais cette erreur :

NameError (uninitialized constant EXIFR::JPEG):

Avec, évidemment, aucune information dans le log d’erreur d’ou pouvait provenir le fait qu’il n’arrive pas à charger la méthode JPEG de la classe EXIFR.
Alors que, qui plus est, la classe EXIFR est chargée …

Au final, j’ai compris en farfouillant un certain temps (c’est le genre de farfouillage qui est long parce qu’il faut redémarrer le serveur local toutes les 3 minutes).

Pour au final réaliser que j’ai une autre classe JPEG, qui entre en conflit.
En effet, pour Rails, JPEG, c’est ma classe. Il essaye donc de récupérer je ne sais quelle information de celle-ci. Information qui n’existe pas evidemment, d’ou mon erreur.
Erreur résolue en renommant la dernière classe citée en JPG. Mais beaucoup de temps perdu pour au final pas grand chose.

Alors que si j’avais été en PHP, j’aurais eu des $ devant mes variables, des () pour chacune de mes méthodes.
Et il aurait été sans aucun problème capable de savoir que en mettant EXIFR::JPEG, je cherche à appeller la méthode JPEG de la classe EXIFR. Et pas à faire un mixe entre mes classes EXIFR et JPEG.

P.S. : à l’url de cette page « php-rox », il faut ajouter un « (ou pas) » quand même.

La librairie ImageScience permet de créer des miniatures d’images très simplement.

Exemple :
ImageScience.with_image(@image) do |img|
img.thumbnail(100) do |thumb|
thumb.save @thumb_image
end

Ok, jusque la, c’est super simple. On génère notre miniature :-)
C’est avant que c’est un tantinet plus compliqué (ou pas), lorsque l’on désire installer ImageScience.
Ici, on ne prends pour exemple que le cas d’une plateforme Debian.

En considérant que Ruby, Rails et gem sont déjà installés. Si ce n’est pas le cas, je vous invite à regarder ici.

Installons donc ImageScience.
gem install image_science

Cool et simple non ?
Cependant si vous installez cela comme ça, vous n’irez pas très loin.
Vous allez en effet vous confronter à une erreur similaire à celle-ci :

CompilationError (error executing « gcc -shared -fPIC -Wall -g -fno-
strict-aliasing -O2 -fPIC -I /usr/lib/ruby/1.8/i486-linux -I /usr/
include -L/usr/lib -o \ »/nonexistent/.ruby_inline/
Inline_ImageScience_aa58.so\ » \ »/nonexistent/.ruby_inline/
Inline_ImageScience_aa58.c\ » -lfreeimage -lstdc++ « : 256
Renamed /nonexistent/.ruby_inline/Inline_ImageScience_aa58.c to /
nonexistent/.ruby_inline/Inline_ImageScience_aa58.c.bad):
/usr/lib/ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:449:in
`build’
/usr/lib/ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:654:in
`inline’
/usr/lib/ruby/gems/1.8/gems/image_science-1.1.3/lib/
image_science.rb:84

En effet, ImageScience requiert l’installation de FreeImage, une librairie en C qui permet la manipulation d’images.

Son installation (sous Debian) est également très simple (le problème pour moi a surtout été de trouver que le problème venait de FreeImage ;-) ).
wget http://kent.dl.sourceforge.net/sourceforge/freeimage/FreeImage3100.zip
unzip FreeImage3100.zip
cd FreeImage
make
make install

Zou ! ImageScience et FreeImage sont installés, tout doit fonctionner correctement. Vous générez vos miniature.

Il peut arriver cependant que vous ayez une erreur du genre de celle-ci :

Errno::EACCES (Permission denied – /nonexistent):

En effet, afin d’utiliser FreeImage, ImageScience crée des documents C qu’il compile en live. Pour cela il doit avoir accès à un répertoire, qui est défini ainsi :
env = ENV['INLINEDIR'] || ENV['HOME']

INLINEDIR doit être configuré dans le fichier environnment.rb (répertoire config).
J’ai par exemple mis
ENV['INLINEDIR'] = File.join(File.dirname(__FILE__),'../tmp')
Ainsi mon inlinedir est situé dans le répertoire tmp de mon application.

Il faut ensuite donner les droits à ce répertoire à l’utilisateur avec lequel l’application est lancée.
Si vous êtes dans un environnement Apache/Passenger, vous pouvez personnaliser cet utilisateur en ajoutant, dans votre configuration de apache :
PassengerDefaultUser www-data
Ou www-data est l’utilisateur evidemment.

O2Sources, l’agence web qui rox propose aujourd’hui (merci à Thanh) un nouveau thème gratuit pour Wordpress.
Nommé Pink Chinese, le bébé est en fait né il y a quelques mois, quasiment en même temps que Cyclo. Mais il n’est baptisé que aujourd’hui.

Plus léger que Cyclo, j’aime beaucoup ce nouveau thème :-)

Pendant ce temps la, j’ai vraiment hâte d’être riche !

Vous vous souvenez de Witamine, l’émission de webradion pour webmasters ?
Pendant plus d’un an, Audrey et tous les chroniqueurs vous ont fait profiter d’une émission d’une heure chaque semaine.

Cependant il y a eu quelques soucis. La webradio (Zikosport) qui offrait une heure d’antenne par semaine pour l’émission s’est arrêtée.
Audrey, l’animatrice de l’émission, n’a actuellement plus le temps pour diverses raisons personnelles et professionnelles.

Alors je me suis dit « ça serait bête d’arrêter quelque chose qui marchait aussi bien. Et si on recommencait à plusieurs ? »
De la, j’ai contacté Audrey afin de lui proposer de constituer non pas une émission mais une webradio (en utilisant la technologie proposée par Radionomy) et qui serait non pas animée par une seule personne mais par une communauté de volontaires.
Ainsi si l’un des membres n’a, pour une raison ou une autre, plus le temps, le projet peut continuer à fonctionner de la même manière. C’est pérenne sur le temps; ça prends moins de temps à chacun et c’est cool ! :-)

Alors pour l’instant on a pas encore commencé et j’en suis juste à essayer de rassembler du monde qui serait motivé. Mais si vous vous sentez intéressés pour participer, que ce soit en faisant des podcasts, de la com’ ou tout autre chose qui vous passerait par la tête et qui pourrait être utile, je vous invite à vous inscrire et à venir en parler sur le forum créé pour l’occasion.

Lights on a bridge

De multiples hébergeurs (notemment OVH en dédié) proposent à leurs utilisateurs de configurer plusieurs adresses ip sur leur machine.
Cela peut permettre par exemple de configurer, sur la machine et sur le port 80, deux serveurs web.
Un Apache et un Lighttpd.
Le second transmettant les fichiers statiques beaucoup plus rapidement et en consommant moins de ressources machines, c’est une bonne méthode d’optimisation de vos ressources système.

Aucun problème pour les connexions entrantes donc.
J’ai cependant eu envie de me confronter à autre chose. Les connexions sortantes en PHP avec Curl.
Comment sélectionner laquelle de mes deux ips je veux que mon script utilise pour faire appel à une page externe ?

Ne sachant pas trop ou chercher, je me suis dit au début « il doit y avoir une fonction native, ou un truc dans la configuration ». Queue d’ale.

Cependant après quelques recherches, j’ai trouvé la solution, qui était sous mon nez !
Pour ceux qui ne savent pas comment fonctionne curl, celui-ci possède une fonction curl_setopt qui permet de paramétrer votre appel distant.
Ainsi vous pouvez ajouter des paramètres en POST, modifier le referer, ajouter des cookies, ajouter une identification http ou ssl etc. Les possibilitées sont illimitées.

Et c’est la que l’une des options fait son apparition. CURLOPT_INTERFACE, qui prends comme paramètre … une IP ou un nom d’hôte.
Et le script utilisera l’ip définie.

Ainsi je change mon ip en faisant :
curl_setopt($ch, CURLOPT_INTERFACE, $myIp);

Notez cependant que vous ne pouvez bien evidemment pas utiliser n’importe quelle ip. Seules celles configurées sur votre carte réseau le sont. Cela serait trop facile.
Vous pouvez cependant tester cela même si vous n’avez qu’une seule ip sur votre machine. Faites appel à une page locale et utilisez votre ip distante ainsi que 127.0.0.1 :-)

Je n’ai donc ensuite eu plus qu’a récupérer aléatoirement l’une ou l’autre de mes ip et mes appels externes se font à 50% sur une de mes ip et à 50% sur l’autre.
Je viens de diviser par deux les chances que l’ip de mon serveur ne se fasse bannir par Google avec les appels faits par RefStats.

 
Fork me on GitHub